Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Added no-argument constructor to LuceneServlet, handy for web.xml set…

…ting when running via Tomcat. Extracted configuration handling to Config class, used by Main and LuceneServlet's no-arg constructor.
  • Loading branch information...
commit 2977df20ee4dfc4f85d33e9605c931eb32eeb576 1 parent 9d3402a
Cliffano Subagio cliffano authored
278 src/main/java/com/github/rnewson/couchdb/lucene/LuceneServlet.java
View
@@ -30,6 +30,7 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.HierarchicalINIConfiguration;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
@@ -47,47 +48,54 @@
public final class LuceneServlet extends HttpServlet {
- private static final Logger LOG = Logger.getLogger(LuceneServlet.class);
+ private static final Logger LOG = Logger.getLogger(LuceneServlet.class);
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- private final HttpClient client;
+ private final HttpClient client;
- private final Map<Database, DatabaseIndexer> indexers = new HashMap<Database, DatabaseIndexer>();
+ private final Map<Database, DatabaseIndexer> indexers = new HashMap<Database, DatabaseIndexer>();
- private final HierarchicalINIConfiguration ini;
+ private final HierarchicalINIConfiguration ini;
- private final File root;
+ private final File root;
- private final Map<Database, Thread> threads = new HashMap<Database, Thread>();
-
- public LuceneServlet(final HttpClient client, final File root,
- final HierarchicalINIConfiguration ini) {
- this.client = client;
- this.root = root;
- this.ini = ini;
- }
+ private final Map<Database, Thread> threads = new HashMap<Database, Thread>();
+
+ public LuceneServlet() throws ConfigurationException, IOException {
+ final Config config = new Config();
+ this.client = config.getClient();
+ this.root = config.getDir();
+ this.ini = config.getConfiguration();
+ }
+
+ public LuceneServlet(final HttpClient client, final File root,
+ final HierarchicalINIConfiguration ini) {
+ this.client = client;
+ this.root = root;
+ this.ini = ini;
+ }
- private void cleanup(final HttpServletRequest req,
- final HttpServletResponse resp) throws IOException, JSONException {
- final Couch couch = getCouch(req);
- final Set<String> dbKeep = new HashSet<String>();
- final JSONArray databases = couch.getAllDatabases();
- for (int i=0; i< databases.length(); i++) {
- final Database db = couch.getDatabase(databases.getString(i));
- final UUID uuid = db.getUuid();
- if (uuid == null) {
- continue;
- }
- dbKeep.add(uuid.toString());
+ private void cleanup(final HttpServletRequest req,
+ final HttpServletResponse resp) throws IOException, JSONException {
+ final Couch couch = getCouch(req);
+ final Set<String> dbKeep = new HashSet<String>();
+ final JSONArray databases = couch.getAllDatabases();
+ for (int i=0; i< databases.length(); i++) {
+ final Database db = couch.getDatabase(databases.getString(i));
+ final UUID uuid = db.getUuid();
+ if (uuid == null) {
+ continue;
+ }
+ dbKeep.add(uuid.toString());
- final Set<String> viewKeep = new HashSet<String>();
+ final Set<String> viewKeep = new HashSet<String>();
- for (final DesignDocument ddoc : db.getAllDesignDocuments()) {
- for (final View view : ddoc.getAllViews().values()) {
- viewKeep.add(view.getDigest());
- }
- }
+ for (final DesignDocument ddoc : db.getAllDesignDocuments()) {
+ for (final View view : ddoc.getAllViews().values()) {
+ viewKeep.add(view.getDigest());
+ }
+ }
// Delete all indexes except the keepers.
final File[] dirs = DatabaseIndexer.uuidDir(root, db.getUuid()).listFiles();
@@ -104,127 +112,127 @@ private void cleanup(final HttpServletRequest req,
}
}
}
- }
-
- // Delete all directories except the keepers.
- for (final File dir : root.listFiles()) {
- if (!dbKeep.contains(dir.getName())) {
- LOG.info("Cleaning old index at " + dir);
- FileUtils.deleteDirectory(dir);
- }
- }
-
- resp.setStatus(202);
- ServletUtils.sendJsonSuccess(req, resp);
- }
-
- private Couch getCouch(final HttpServletRequest req) throws IOException {
- final Configuration section = ini.getSection(new PathParts(req)
- .getKey());
- final String url = section.containsKey("url") ? section
- .getString("url") : null;
- return new Couch(client, url);
- }
-
- private synchronized DatabaseIndexer getIndexer(final Database database)
- throws IOException, JSONException {
- DatabaseIndexer result = indexers.get(database);
- Thread thread = threads.get(database);
- if (result == null || thread == null || !thread.isAlive()) {
- result = new DatabaseIndexer(client, root, database, ini);
- thread = new Thread(result);
- thread.start();
- result.awaitInitialization();
- if (result.isClosed()) {
- return null;
- } else {
- indexers.put(database, result);
- threads.put(database, thread);
- }
- }
-
- return result;
- }
-
- private DatabaseIndexer getIndexer(final HttpServletRequest req)
- throws IOException, JSONException {
- final Couch couch = getCouch(req);
- final Database database = couch.getDatabase(new PathParts(req)
- .getDatabaseName());
- return getIndexer(database);
- }
-
- private void handleWelcomeReq(final HttpServletRequest req,
- final HttpServletResponse resp) throws ServletException,
- IOException, JSONException {
- final Package p = this.getClass().getPackage();
- final JSONObject welcome = new JSONObject();
- welcome.put("couchdb-lucene", "Welcome");
- welcome.put("version", p.getImplementationVersion());
- ServletUtils.sendJson(req, resp, welcome);
- }
-
- @Override
- protected void doGet(final HttpServletRequest req,
- final HttpServletResponse resp) throws ServletException,
- IOException {
- try {
+ }
+
+ // Delete all directories except the keepers.
+ for (final File dir : root.listFiles()) {
+ if (!dbKeep.contains(dir.getName())) {
+ LOG.info("Cleaning old index at " + dir);
+ FileUtils.deleteDirectory(dir);
+ }
+ }
+
+ resp.setStatus(202);
+ ServletUtils.sendJsonSuccess(req, resp);
+ }
+
+ private Couch getCouch(final HttpServletRequest req) throws IOException {
+ final Configuration section = ini.getSection(new PathParts(req)
+ .getKey());
+ final String url = section.containsKey("url") ? section
+ .getString("url") : null;
+ return new Couch(client, url);
+ }
+
+ private synchronized DatabaseIndexer getIndexer(final Database database)
+ throws IOException, JSONException {
+ DatabaseIndexer result = indexers.get(database);
+ Thread thread = threads.get(database);
+ if (result == null || thread == null || !thread.isAlive()) {
+ result = new DatabaseIndexer(client, root, database, ini);
+ thread = new Thread(result);
+ thread.start();
+ result.awaitInitialization();
+ if (result.isClosed()) {
+ return null;
+ } else {
+ indexers.put(database, result);
+ threads.put(database, thread);
+ }
+ }
+
+ return result;
+ }
+
+ private DatabaseIndexer getIndexer(final HttpServletRequest req)
+ throws IOException, JSONException {
+ final Couch couch = getCouch(req);
+ final Database database = couch.getDatabase(new PathParts(req)
+ .getDatabaseName());
+ return getIndexer(database);
+ }
+
+ private void handleWelcomeReq(final HttpServletRequest req,
+ final HttpServletResponse resp) throws ServletException,
+ IOException, JSONException {
+ final Package p = this.getClass().getPackage();
+ final JSONObject welcome = new JSONObject();
+ welcome.put("couchdb-lucene", "Welcome");
+ welcome.put("version", p.getImplementationVersion());
+ ServletUtils.sendJson(req, resp, welcome);
+ }
+
+ @Override
+ protected void doGet(final HttpServletRequest req,
+ final HttpServletResponse resp) throws ServletException,
+ IOException {
+ try {
doGetInternal(req, resp);
} catch (final JSONException e) {
resp.sendError(500);
}
- }
+ }
private void doGetInternal(final HttpServletRequest req, final HttpServletResponse resp)
throws ServletException, IOException, JSONException {
switch (StringUtils.countMatches(req.getRequestURI(), "/")) {
- case 1:
- handleWelcomeReq(req, resp);
- return;
- case 5:
- final DatabaseIndexer indexer = getIndexer(req);
- if (indexer == null) {
- ServletUtils.sendJsonError(req, resp, 500, "error_creating_index");
- return;
- }
-
- if (req.getParameter("q") == null) {
- indexer.info(req, resp);
- } else {
- indexer.search(req, resp);
- }
- return;
- }
-
- ServletUtils.sendJsonError(req, resp, 400, "bad_request");
+ case 1:
+ handleWelcomeReq(req, resp);
+ return;
+ case 5:
+ final DatabaseIndexer indexer = getIndexer(req);
+ if (indexer == null) {
+ ServletUtils.sendJsonError(req, resp, 500, "error_creating_index");
+ return;
+ }
+
+ if (req.getParameter("q") == null) {
+ indexer.info(req, resp);
+ } else {
+ indexer.search(req, resp);
+ }
+ return;
+ }
+
+ ServletUtils.sendJsonError(req, resp, 400, "bad_request");
}
- @Override
- protected void doPost(final HttpServletRequest req,
- final HttpServletResponse resp) throws ServletException,
- IOException {
- try {
+ @Override
+ protected void doPost(final HttpServletRequest req,
+ final HttpServletResponse resp) throws ServletException,
+ IOException {
+ try {
doPostInternal(req, resp);
} catch (final JSONException e) {
resp.sendError(500);
}
- }
+ }
private void doPostInternal(final HttpServletRequest req, final HttpServletResponse resp)
throws IOException, JSONException {
switch (StringUtils.countMatches(req.getRequestURI(), "/")) {
- case 3:
- if (req.getPathInfo().endsWith("/_cleanup")) {
- cleanup(req, resp);
- return;
- }
- break;
- case 6:
- final DatabaseIndexer indexer = getIndexer(req);
- indexer.admin(req, resp);
- return;
- }
- ServletUtils.sendJsonError(req, resp, 400, "bad_request");
+ case 3:
+ if (req.getPathInfo().endsWith("/_cleanup")) {
+ cleanup(req, resp);
+ return;
+ }
+ break;
+ case 6:
+ final DatabaseIndexer indexer = getIndexer(req);
+ indexer.admin(req, resp);
+ return;
+ }
+ ServletUtils.sendJsonError(req, resp, 400, "bad_request");
}
}
36 src/main/java/com/github/rnewson/couchdb/lucene/Main.java
View
@@ -17,13 +17,7 @@
*/
import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import org.apache.commons.configuration.HierarchicalINIConfiguration;
-import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
-import org.apache.commons.io.FileUtils;
-import org.apache.http.client.HttpClient;
import org.apache.log4j.Logger;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Handler;
@@ -42,30 +36,13 @@
* Run couchdb-lucene.
*/
public static void main(String[] args) throws Exception {
- final HierarchicalINIConfiguration configuration = new HierarchicalINIConfiguration(
- Main.class.getClassLoader().getResource("couchdb-lucene.ini"));
- configuration.setReloadingStrategy(new FileChangedReloadingStrategy());
-
- final File dir = new File(configuration.getString("lucene.dir", "indexes"));
-
- if (!dir.exists() && !dir.mkdir()) {
- LOG.error("Could not create " + dir.getCanonicalPath());
- System.exit(1);
- }
- if (!dir.canRead()) {
- LOG.error(dir + " is not readable.");
- System.exit(1);
- }
- if (!dir.canWrite()) {
- LOG.error(dir + " is not writable.");
- System.exit(1);
- }
- LOG.info("Index output goes to: " + dir.getCanonicalPath());
+ final Config config = new Config();
+ final File dir = config.getDir();
final Server server = new Server();
final SelectChannelConnector connector = new SelectChannelConnector();
- connector.setHost(configuration.getString("lucene.host", "localhost"));
- connector.setPort(configuration.getInt("lucene.port", 5985));
+ connector.setHost(config.getConfiguration().getString("lucene.host", "localhost"));
+ connector.setPort(config.getConfiguration().getInt("lucene.port", 5985));
LOG.info("Accepting connections with " + connector);
@@ -73,10 +50,7 @@ public static void main(String[] args) throws Exception {
server.setStopAtShutdown(true);
server.setSendServerVersion(false);
- HttpClientFactory.setIni(configuration);
- final HttpClient httpClient = HttpClientFactory.getInstance();
-
- final LuceneServlet servlet = new LuceneServlet(httpClient, dir, configuration);
+ final LuceneServlet servlet = new LuceneServlet(config.getClient(), dir, config.getConfiguration());
final Context context = new Context(server, "/", Context.NO_SESSIONS | Context.NO_SECURITY);
context.addServlet(new ServletHolder(servlet), "/*");
Please sign in to comment.
Something went wrong with that request. Please try again.