import jp.naist.se.stigmata.event.BirthmarkEngineAdapter;\r
import jp.naist.se.stigmata.event.BirthmarkEngineEvent;\r
import jp.naist.se.stigmata.event.WarningMessages;\r
+import jp.naist.se.stigmata.hook.Phase;\r
+import jp.naist.se.stigmata.hook.StigmataHookManager;\r
import jp.naist.se.stigmata.printer.BirthmarkServicePrinter;\r
import jp.naist.se.stigmata.printer.ComparisonResultSetPrinter;\r
import jp.naist.se.stigmata.printer.ExtractionResultSetPrinter;\r
printHelp(context.getEnvironment(), options);\r
return;\r
}\r
+ StigmataHookManager.getInstance().runHook(Phase.SETUP, context.getEnvironment());\r
\r
if(mode.equals("list")){\r
listBirthmarks(context, format);\r
StigmataFrame frame = new StigmataFrame(stigmata, context.getEnvironment());\r
frame.setVisible(true);\r
}\r
+\r
+ if(!mode.equals("gui")){\r
+ StigmataHookManager.getInstance().runHook(Phase.TEAR_DOWN, context.getEnvironment());\r
+ }\r
+ else{\r
+ final BirthmarkEnvironment env = context.getEnvironment();\r
+ Runtime.getRuntime().addShutdownHook(new Thread(){\r
+ public void run(){\r
+ StigmataHookManager.getInstance().runHook(\r
+ Phase.TEAR_DOWN, env\r
+ );\r
+ }\r
+ });\r
+ }\r
}\r
}\r
\r
--- /dev/null
+package jp.naist.se.stigmata.hook;
+
+/*
+ * $Id$
+ */
+
+import jp.naist.se.stigmata.spi.StigmataHookSpi;
+
+/**
+ *
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractStigmataHookService implements StigmataHookSpi{
+ public StigmataRuntimeHook afterComparison(){
+ return null;
+ }
+
+ public StigmataRuntimeHook afterExtraction(){
+ return null;
+ }
+
+ public StigmataRuntimeHook afterFiltering(){
+ return null;
+ }
+
+ public StigmataRuntimeHook beforeComparison(){
+ return null;
+ }
+
+ public StigmataRuntimeHook beforeExtraction(){
+ return null;
+ }
+
+ public StigmataRuntimeHook beforeFiltering(){
+ return null;
+ }
+
+ public StigmataHook onSetup(){
+ return null;
+ }
+
+ public StigmataHook onTearDown(){
+ return null;
+ }
+}
--- /dev/null
+package jp.naist.se.stigmata.hook;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+import jp.naist.se.stigmata.BirthmarkEnvironment;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public class MultipleStigmataHook implements StigmataHook, StigmataRuntimeHook{\r
+ private List<StigmataHook> hooks = new ArrayList<StigmataHook>();\r
+ private List<StigmataRuntimeHook> runtimeHooks = new ArrayList<StigmataRuntimeHook>();\r
+\r
+ public void onHook(Phase phase, BirthmarkContext context){\r
+ for(StigmataRuntimeHook hook: runtimeHooks){\r
+ if(hook != null){\r
+ hook.onHook(phase, context);\r
+ }\r
+ }\r
+ }\r
+\r
+ public void onHook(Phase phase, BirthmarkEnvironment env){\r
+ for(StigmataHook hook: hooks){\r
+ if(hook != null){\r
+ hook.onHook(phase, env);\r
+ }\r
+ }\r
+ }\r
+\r
+ public void addHook(StigmataHook hook){\r
+ hooks.add(hook);\r
+ }\r
+\r
+ public void removeHook(StigmataHook hook){\r
+ hooks.remove(hook);\r
+ }\r
+\r
+ public int getHookCount(){\r
+ return hooks.size();\r
+ }\r
+\r
+ public StigmataHook getHook(int index){\r
+ return hooks.get(index);\r
+ }\r
+\r
+ public void addRuntimeHook(StigmataRuntimeHook hook){\r
+ runtimeHooks.add(hook);\r
+ }\r
+\r
+ public void removeRuntimeHook(StigmataRuntimeHook hook){\r
+ runtimeHooks.remove(hook);\r
+ }\r
+\r
+ public int getRuntimeHookCount(){\r
+ return runtimeHooks.size();\r
+ }\r
+\r
+ public StigmataRuntimeHook getRuntimeHook(int index){\r
+ return runtimeHooks.get(index);\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+package jp.naist.se.stigmata.hook;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public enum Phase{\r
+ SETUP,\r
+ TEAR_DOWN,\r
+ BEFORE_EXTRACTION,\r
+ AFTER_EXTRACTION,\r
+ BEFORE_COMPARISON,\r
+ AFTER_COMPARISON,\r
+ BEFORE_FILTERING,\r
+ AFTER_FILTERING,\r
+}
\ No newline at end of file
--- /dev/null
+package jp.naist.se.stigmata.hook;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import jp.naist.se.stigmata.BirthmarkEnvironment;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date\r
+ */\r
+public interface StigmataHook{\r
+ public void onHook(Phase phase, BirthmarkEnvironment env);\r
+}
\ No newline at end of file
--- /dev/null
+package jp.naist.se.stigmata.hook;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import java.util.Iterator;\r
+\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+import jp.naist.se.stigmata.BirthmarkEnvironment;\r
+import jp.naist.se.stigmata.spi.StigmataHookSpi;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date\r
+ */\r
+public class StigmataHookManager{\r
+ private static final StigmataHookManager manager = new StigmataHookManager();\r
+\r
+ /**\r
+ * private constructor for singleton pattern.\r
+ */\r
+ private StigmataHookManager(){\r
+ }\r
+\r
+ public static StigmataHookManager getInstance(){\r
+ return manager;\r
+ }\r
+\r
+ public void runHook(Phase phase, BirthmarkContext context){\r
+ StigmataRuntimeHook hook = buildHook(phase, context.getEnvironment());\r
+ hook.onHook(phase, context);\r
+ }\r
+\r
+ public void runHook(Phase phase, BirthmarkEnvironment env){\r
+ StigmataHook hook = buildHook(phase, env);\r
+ hook.onHook(phase, env);\r
+ }\r
+\r
+ private MultipleStigmataHook buildHook(Phase phase, BirthmarkEnvironment env){\r
+ MultipleStigmataHook hooks = new MultipleStigmataHook();\r
+\r
+ for(Iterator<StigmataHookSpi> i = env.lookupProviders(StigmataHookSpi.class); i.hasNext(); ){\r
+ StigmataHookSpi service = i.next();\r
+\r
+ switch(phase){\r
+ case SETUP:\r
+ hooks.addHook(service.onSetup());\r
+ break;\r
+ case TEAR_DOWN:\r
+ hooks.addHook(service.onTearDown());\r
+ break;\r
+ case BEFORE_EXTRACTION:\r
+ hooks.addRuntimeHook(service.beforeExtraction());\r
+ break;\r
+ case AFTER_EXTRACTION:\r
+ hooks.addRuntimeHook(service.afterExtraction());\r
+ break;\r
+ case BEFORE_COMPARISON:\r
+ hooks.addRuntimeHook(service.beforeComparison());\r
+ break;\r
+ case AFTER_COMPARISON:\r
+ hooks.addRuntimeHook(service.afterComparison());\r
+ break;\r
+ case BEFORE_FILTERING:\r
+ hooks.addRuntimeHook(service.beforeFiltering());\r
+ break;\r
+ case AFTER_FILTERING:\r
+ hooks.addRuntimeHook(service.afterFiltering());\r
+ break;\r
+ default:\r
+ throw new InternalError("invalid phase: " + phase);\r
+ }\r
+ }\r
+ return hooks;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+package jp.naist.se.stigmata.hook;\r
+\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date\r
+ */\r
+public interface StigmataRuntimeHook{\r
+ public void onHook(Phase phase, BirthmarkContext context);\r
+}
\ No newline at end of file
--- /dev/null
+package jp.naist.se.stigmata.spi;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import jp.naist.se.stigmata.hook.StigmataHook;\r
+import jp.naist.se.stigmata.hook.StigmataRuntimeHook;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public interface StigmataHookSpi{\r
+ public StigmataHook onSetup();\r
+\r
+ public StigmataHook onTearDown();\r
+\r
+ public StigmataRuntimeHook beforeExtraction();\r
+\r
+ public StigmataRuntimeHook afterExtraction();\r
+\r
+ public StigmataRuntimeHook beforeComparison();\r
+\r
+ public StigmataRuntimeHook afterComparison();\r
+\r
+ public StigmataRuntimeHook beforeFiltering();\r
+\r
+ public StigmataRuntimeHook afterFiltering();\r
+}
\ No newline at end of file