package com.senseidb.clue; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.URI; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.store.Directory; import com.senseidb.clue.commands.ClueCommand; import com.senseidb.clue.commands.HelpCommand; public class ClueApplication { private final ClueContext ctx; private final ClueCommand helpCommand; private final Directory dir; private static ClueConfiguration config; static { try { config = ClueConfiguration.load(); } catch (Exception e) { throw new RuntimeException(e); } } public ClueContext getContext() { return ctx; } public ClueConfiguration getConfiguration() { return config; } public ClueContext newContext(Directory dir, ClueConfiguration config, boolean interactiveMode) throws Exception { return new ClueContext(dir, config, interactiveMode); } public ClueApplication(String idxLocation, boolean interactiveMode) throws Exception{ dir = config.getDirBuilder().build(new URI(idxLocation)); if (!DirectoryReader.indexExists(dir)){ System.out.println("lucene index does not exist at: "+idxLocation); System.exit(1); } ctx = newContext(dir, config, interactiveMode); helpCommand = ctx.getCommand(HelpCommand.CMD_NAME); } public void handleCommand(String cmdName, String[] args, PrintStream out){ ClueCommand cmd = ctx.getCommand(cmdName); if (cmd == null){ out.println(cmdName+" is not supported:"); cmd = helpCommand; } try{ cmd.execute(args, out); } catch(Exception e){ e.printStackTrace(); } } public void run() throws IOException { while(true){ String line = ctx.readCommand(); if (line == null || line.isEmpty()) continue; line = line.trim(); String[] parts = line.split("\\s"); if (parts.length > 0){ String cmd = parts[0]; String[] cmdArgs = new String[parts.length - 1]; System.arraycopy(parts, 1, cmdArgs, 0, cmdArgs.length); handleCommand(cmd, cmdArgs, System.out); } } } public void shutdown() throws Exception { ctx.shutdown(); dir.close(); } public static void main(String[] args) throws Exception { if (args.length < 1){ System.out.println("usage: <index location> <command> <command args>"); System.exit(1); } String idxLocation = args[0]; final ClueApplication app; if (args.length > 1){ String cmd = args[1]; if ("readonly".equalsIgnoreCase(cmd)) { if (args.length > 2) { cmd = args[2]; app = new ClueApplication(idxLocation, false); String[] cmdArgs; cmdArgs = new String[args.length - 3]; System.arraycopy(args, 3, cmdArgs, 0, cmdArgs.length); app.ctx.setReadOnlyMode(true); app.handleCommand(cmd, cmdArgs, System.out); app.shutdown(); } } else { app = new ClueApplication(idxLocation, false); String[] cmdArgs; cmdArgs = new String[args.length - 2]; System.arraycopy(args, 2, cmdArgs, 0, cmdArgs.length); app.handleCommand(cmd, cmdArgs, System.out); app.shutdown(); } return; } app = new ClueApplication(idxLocation, true); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { try { app.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }); app.run(); } }