OSDN Git Service

merge hooking service
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 1 Nov 2007 05:23:56 +0000 (05:23 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 1 Nov 2007 05:23:56 +0000 (05:23 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@266 acee48c3-7b26-0410-bdac-b3d0e5314bbc

src/main/java/jp/naist/se/stigmata/Main.java
src/main/java/jp/naist/se/stigmata/hook/AbstractStigmataHookService.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/hook/MultipleStigmataHook.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/hook/Phase.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/hook/StigmataHook.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/hook/StigmataHookManager.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/hook/StigmataRuntimeHook.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/spi/StigmataHookSpi.java [new file with mode: 0755]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.StigmataHookSpi [new file with mode: 0755]

index a67bc06..004d54a 100644 (file)
@@ -20,6 +20,8 @@ import java.util.List;
 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
@@ -84,6 +86,7 @@ public final class Main{
                 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
@@ -98,6 +101,20 @@ public final class Main{
                 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
diff --git a/src/main/java/jp/naist/se/stigmata/hook/AbstractStigmataHookService.java b/src/main/java/jp/naist/se/stigmata/hook/AbstractStigmataHookService.java
new file mode 100755 (executable)
index 0000000..68e0f25
--- /dev/null
@@ -0,0 +1,47 @@
+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;
+    }
+}
diff --git a/src/main/java/jp/naist/se/stigmata/hook/MultipleStigmataHook.java b/src/main/java/jp/naist/se/stigmata/hook/MultipleStigmataHook.java
new file mode 100755 (executable)
index 0000000..25d7530
--- /dev/null
@@ -0,0 +1,69 @@
+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
diff --git a/src/main/java/jp/naist/se/stigmata/hook/Phase.java b/src/main/java/jp/naist/se/stigmata/hook/Phase.java
new file mode 100755 (executable)
index 0000000..cd528f2
--- /dev/null
@@ -0,0 +1,21 @@
+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
diff --git a/src/main/java/jp/naist/se/stigmata/hook/StigmataHook.java b/src/main/java/jp/naist/se/stigmata/hook/StigmataHook.java
new file mode 100755 (executable)
index 0000000..b9e7558
--- /dev/null
@@ -0,0 +1,16 @@
+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
diff --git a/src/main/java/jp/naist/se/stigmata/hook/StigmataHookManager.java b/src/main/java/jp/naist/se/stigmata/hook/StigmataHookManager.java
new file mode 100755 (executable)
index 0000000..a38ee1f
--- /dev/null
@@ -0,0 +1,78 @@
+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
diff --git a/src/main/java/jp/naist/se/stigmata/hook/StigmataRuntimeHook.java b/src/main/java/jp/naist/se/stigmata/hook/StigmataRuntimeHook.java
new file mode 100755 (executable)
index 0000000..0528104
--- /dev/null
@@ -0,0 +1,12 @@
+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
diff --git a/src/main/java/jp/naist/se/stigmata/spi/StigmataHookSpi.java b/src/main/java/jp/naist/se/stigmata/spi/StigmataHookSpi.java
new file mode 100755 (executable)
index 0000000..2a31e82
--- /dev/null
@@ -0,0 +1,31 @@
+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
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.StigmataHookSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.StigmataHookSpi
new file mode 100755 (executable)
index 0000000..e69de29