OSDN Git Service

update initialization process: ServiceRegistry#lookupService unified to BirthmarkEnvi...
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Tue, 25 Sep 2007 09:03:43 +0000 (09:03 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Tue, 25 Sep 2007 09:03:43 +0000 (09:03 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@214 acee48c3-7b26-0410-bdac-b3d0e5314bbc

src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java
src/main/java/jp/naist/se/stigmata/Stigmata.java
src/main/java/jp/naist/se/stigmata/filter/ComparisonPairFilterManager.java
src/main/java/jp/naist/se/stigmata/format/FormatManager.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkDefinitionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/filter/FilterEditingPane.java
src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java

index c48c9ad..446611c 100644 (file)
@@ -71,12 +71,17 @@ public class BirthmarkEnvironment{
     private ComparisonPairFilterManager filterManager;\r
 \r
     /**\r
+     * \r
+     */\r
+    private ClassLoader loader;\r
+\r
+    /**\r
      * constructor for root environment\r
      */\r
     private BirthmarkEnvironment(boolean flag){\r
         manager = new WellknownClassManager();\r
         classpathContext = ClasspathContext.getDefaultContext();\r
-        filterManager = new ComparisonPairFilterManager();\r
+        filterManager = new ComparisonPairFilterManager(this);\r
     }\r
 \r
     /**\r
@@ -86,7 +91,7 @@ public class BirthmarkEnvironment{
         this.parent = parent;\r
         this.manager = new WellknownClassManager(parent.getWellknownClassManager());\r
         this.classpathContext = new ClasspathContext(parent.getClasspathContext());\r
-        this.filterManager = new ComparisonPairFilterManager(parent.getFilterManager());\r
+        this.filterManager = new ComparisonPairFilterManager(this, parent.getFilterManager());\r
     }\r
 \r
     /**\r
@@ -213,13 +218,20 @@ public class BirthmarkEnvironment{
         return services;\r
     }\r
 \r
+    public <T> Iterator<T> lookupProviders(Class<T> providerClass){\r
+        Iterator<T> iterator;\r
+        if(loader != null) iterator = ServiceRegistry.lookupProviders(providerClass, loader);\r
+        else               iterator = ServiceRegistry.lookupProviders(providerClass);\r
+        return iterator;\r
+    }\r
+\r
     /**\r
      * return birthmark services lookup from current class path.\r
      */\r
     public synchronized BirthmarkSpi[] findServices(){\r
         List<BirthmarkSpi> list = getServiceList();\r
 \r
-        for(Iterator<BirthmarkSpi> i = ServiceRegistry.lookupProviders(BirthmarkSpi.class); i.hasNext();){\r
+        for(Iterator<BirthmarkSpi> i = lookupProviders(BirthmarkSpi.class); i.hasNext(); ){\r
             BirthmarkSpi spi = i.next();\r
             if(getService(spi.getType()) == null){\r
                 list.add(spi);\r
@@ -257,4 +269,8 @@ public class BirthmarkEnvironment{
     public ComparisonPairFilterManager getFilterManager(){\r
         return filterManager;\r
     }\r
+\r
+    void setClassLoader(ClassLoader loader){\r
+        this.loader = loader;\r
+    }\r
 }\r
index 6028a1b..6999cbb 100755 (executable)
@@ -7,16 +7,22 @@ package jp.naist.se.stigmata;
 import java.io.File;\r
 import java.io.FileInputStream;\r
 import java.io.FileNotFoundException;\r
+import java.io.FileWriter;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
+import java.io.PrintWriter;\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+import java.net.URLClassLoader;\r
 import java.util.ArrayList;\r
 import java.util.Iterator;\r
 import java.util.List;\r
 \r
-import javax.imageio.spi.ServiceRegistry;\r
-\r
 import jp.naist.se.stigmata.event.BirthmarkEngineListener;\r
+import jp.naist.se.stigmata.format.FormatManager;\r
 import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
+import jp.naist.se.stigmata.ui.swing.ExtensionFilter;\r
+import jp.naist.se.stigmata.utils.ConfigFileExporter;\r
 import jp.naist.se.stigmata.utils.ConfigFileImporter;\r
 \r
 /**\r
@@ -104,9 +110,13 @@ public class Stigmata{
         }\r
 \r
         if(filePath == null){\r
-            File file = new File("stigmata.xml");\r
+            String currentDirectory = System.getProperty("execution.directory");\r
+            if(currentDirectory == null){\r
+                currentDirectory = System.getProperty("user.dir");\r
+            }\r
+            File file = new File(currentDirectory, "stigmata.xml");\r
             if(!file.exists()){\r
-                file = new File(System.getProperty("user.home"), ".stigmata.xml");\r
+                file = new File(System.getProperty("user.home"), ".stigmata/stigmata.xml");\r
                 if(!file.exists()){\r
                     file = null;\r
                 }\r
@@ -130,15 +140,62 @@ public class Stigmata{
         if(defaultEnvironment == null){\r
             defaultEnvironment = BirthmarkEnvironment.getDefaultEnvironment();\r
         }\r
+        buildStigmataDirectory();\r
+\r
+        defaultEnvironment.setClassLoader(buildClassLoader());\r
         try {\r
             ConfigFileImporter parser = new ConfigFileImporter(defaultEnvironment);\r
             parser.parse(in);\r
         } catch(IOException e){\r
             throw new ApplicationInitializationError(e);\r
         }\r
-        for(Iterator<BirthmarkSpi> i = ServiceRegistry.lookupProviders(BirthmarkSpi.class); i.hasNext(); ){\r
+        for(Iterator<BirthmarkSpi> i = defaultEnvironment.lookupProviders(BirthmarkSpi.class); i.hasNext(); ){\r
             BirthmarkSpi service = i.next();\r
             defaultEnvironment.addService(service);\r
         }\r
+        FormatManager.updateServices(defaultEnvironment);\r
+        exportConfigFile();\r
+    }\r
+\r
+    private ClassLoader buildClassLoader(){\r
+        File file = new File(System.getProperty("user.home"), ".stigmata/plugins");\r
+        File[] jarfiles = file.listFiles(new ExtensionFilter("jar"));\r
+        if(jarfiles != null && jarfiles.length > 0){\r
+            try{\r
+                URL[] urls = new URL[jarfiles.length];\r
+                for(int i = 0; i < jarfiles.length; i++){\r
+                    urls[i] = jarfiles[i].toURI().toURL();\r
+                }\r
+                return new URLClassLoader(urls);\r
+            } catch(MalformedURLException e){\r
+            }\r
+        }\r
+        return null;\r
+    }\r
+\r
+    private void buildStigmataDirectory(){\r
+        File file = new File(System.getProperty("user.home"), ".stigmata");\r
+        if(file.exists() && !file.isFile()){\r
+            File dest = new File(file.getParent(), ".stigmata.back");\r
+            file.renameTo(dest);\r
+        }\r
+        if(!file.exists()){\r
+            file.mkdirs();\r
+        }\r
+        File pluginDir = new File(file, "plugins");\r
+        if(!pluginDir.exists()){\r
+            pluginDir.mkdirs();\r
+        }\r
+    }\r
+\r
+    private void exportConfigFile(){\r
+        try{\r
+            File file = new File(System.getProperty("user.home"), ".stigmata/stigmata.xml");\r
+            if(file.exists()){\r
+                ConfigFileExporter exporter = new ConfigFileExporter(defaultEnvironment);\r
+                exporter.export(new PrintWriter(new FileWriter(file)));\r
+            }\r
+        } catch(IOException e){\r
+        }\r
     }\r
 }\r
index 0cde93b..316ca90 100644 (file)
@@ -11,8 +11,7 @@ import java.util.Iterator;
 import java.util.List;\r
 import java.util.Map;\r
 \r
-import javax.imageio.spi.ServiceRegistry;\r
-\r
+import jp.naist.se.stigmata.BirthmarkEnvironment;\r
 import jp.naist.se.stigmata.ComparisonPairFilter;\r
 import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
 import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
@@ -29,12 +28,18 @@ public class ComparisonPairFilterManager{
     private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();\r
     private ComparisonPairFilterManager parent;\r
 \r
-    public ComparisonPairFilterManager(ComparisonPairFilterManager parent){\r
+    public ComparisonPairFilterManager(BirthmarkEnvironment env, ComparisonPairFilterManager parent){\r
         this.parent = parent;\r
+        for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){\r
+            ComparisonPairFilterSpi service = i.next();\r
+            if(getService(service.getFilterName()) != null){\r
+                services.put(service.getFilterName(), service);\r
+            }\r
+        }\r
     }\r
 \r
-    public ComparisonPairFilterManager(){\r
-        for(Iterator<ComparisonPairFilterSpi> i = ServiceRegistry.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){\r
+    public ComparisonPairFilterManager(BirthmarkEnvironment env){\r
+        for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){\r
             ComparisonPairFilterSpi service = i.next();\r
             services.put(service.getFilterName(), service);\r
         }\r
index f815010..ce40ae3 100644 (file)
@@ -8,6 +8,8 @@ import java.util.HashMap;
 import java.util.Iterator;\r
 import java.util.Map;\r
 import javax.imageio.spi.ServiceRegistry;\r
+\r
+import jp.naist.se.stigmata.BirthmarkEnvironment;\r
 import jp.naist.se.stigmata.format.csv.CsvResultFormatService;\r
 import jp.naist.se.stigmata.spi.ResultFormatSpi;\r
 \r
@@ -24,7 +26,15 @@ public class FormatManager{
     private FormatManager(){\r
         for(Iterator<ResultFormatSpi> i = ServiceRegistry.lookupProviders(ResultFormatSpi.class); i.hasNext(); ){\r
             ResultFormatSpi spi = i.next();\r
-            formats.put(spi.getFormat(), spi);\r
+            addService(spi);\r
+        }\r
+    }\r
+\r
+    public static void updateServices(BirthmarkEnvironment environment){\r
+        FormatManager instance = getInstance();\r
+        for(Iterator<ResultFormatSpi> i = environment.lookupProviders(ResultFormatSpi.class); i.hasNext(); ){\r
+            ResultFormatSpi spi = i.next();\r
+            instance.addService(spi);\r
         }\r
     }\r
 \r
@@ -39,4 +49,8 @@ public class FormatManager{
     public ResultFormatSpi getService(String format){\r
         return formats.get(format);\r
     }\r
+\r
+    private void addService(ResultFormatSpi service){\r
+        formats.put(service.getFormat(), service);\r
+    }\r
 }\r
index e9d0ed9..8d1d434 100644 (file)
@@ -15,7 +15,6 @@ import java.util.ArrayList;
 import java.util.Iterator;\r
 import java.util.List;\r
 \r
-import javax.imageio.spi.ServiceRegistry;\r
 import javax.swing.Box;\r
 import javax.swing.BoxLayout;\r
 import javax.swing.DefaultListModel;\r
@@ -318,12 +317,12 @@ public class BirthmarkDefinitionPane extends JPanel{
 \r
         public void initData(){\r
             comparator.addItem("");\r
-            for(Iterator<BirthmarkComparatorSpi> i = ServiceRegistry.lookupProviders(BirthmarkComparatorSpi.class); i.hasNext();){\r
+            for(Iterator<BirthmarkComparatorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkComparatorSpi.class); i.hasNext();){\r
                 BirthmarkComparatorSpi service = i.next();\r
                 comparator.addItem(service.getComparatorClassName());\r
             }\r
             extractor.addItem("");\r
-            for(Iterator<BirthmarkExtractorSpi> i = ServiceRegistry.lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){\r
+            for(Iterator<BirthmarkExtractorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){\r
                 BirthmarkExtractorSpi service = i.next();\r
                 extractor.addItem(service.getExtractorClassName());\r
             }\r
index 86ef544..89ce783 100644 (file)
@@ -17,7 +17,6 @@ import java.util.Iterator;
 import java.util.List;\r
 import java.util.Map;\r
 \r
-import javax.imageio.spi.ServiceRegistry;\r
 import javax.swing.Box;\r
 import javax.swing.JButton;\r
 import javax.swing.JComboBox;\r
@@ -25,8 +24,8 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;\r
 \r
 import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
 import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
+import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
 import jp.naist.se.stigmata.ui.swing.BirthmarkServiceListener;\r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
 import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
@@ -109,7 +108,8 @@ public class FilterEditingPane extends JPanel{
         cardComponent.add(dummyPanel, "");\r
         combo.addItem("");\r
 \r
-        for(Iterator<ComparisonPairFilterComponentService> i = ServiceRegistry.lookupProviders(ComparisonPairFilterComponentService.class); i.hasNext();){\r
+        \r
+        for(Iterator<ComparisonPairFilterComponentService> i = stigmata.getEnvironment().lookupProviders(ComparisonPairFilterComponentService.class); i.hasNext();){\r
             ComparisonPairFilterComponentService service = i.next();\r
             String name = service.getDisplayFilterName();\r
 \r
index e41f373..84dacdd 100755 (executable)
@@ -44,21 +44,28 @@ public class UCBirthmarkExtractorTest{
 \r
         Birthmark birthmark = array[0].getBirthmark("uc");\r
         Assert.assertEquals("uc", birthmark.getType());\r
-        Assert.assertEquals(11, birthmark.getElementCount());\r
+        Assert.assertEquals(18, birthmark.getElementCount());\r
 \r
         BirthmarkElement[] elements = birthmark.getElements();\r
         int index = 0;\r
         Assert.assertEquals("java.io.File",                      elements[index++].getValue());\r
+        Assert.assertEquals("java.io.FileFilter",                elements[index++].getValue());\r
         Assert.assertEquals("java.io.FileInputStream",           elements[index++].getValue());\r
+        Assert.assertEquals("java.io.FileWriter",                elements[index++].getValue());\r
         Assert.assertEquals("java.io.InputStream",               elements[index++].getValue());\r
+        Assert.assertEquals("java.io.PrintWriter",               elements[index++].getValue());\r
+        Assert.assertEquals("java.io.Writer",                    elements[index++].getValue());\r
         Assert.assertEquals("java.lang.Class",                   elements[index++].getValue());\r
+        Assert.assertEquals("java.lang.ClassLoader",             elements[index++].getValue());\r
         Assert.assertEquals("java.lang.Object",                  elements[index++].getValue());\r
         Assert.assertEquals("java.lang.String",                  elements[index++].getValue());\r
         Assert.assertEquals("java.lang.System",                  elements[index++].getValue());\r
+        Assert.assertEquals("java.net.URI",                      elements[index++].getValue());\r
+        Assert.assertEquals("java.net.URL",                      elements[index++].getValue());\r
+        Assert.assertEquals("java.net.URLClassLoader",           elements[index++].getValue());\r
         Assert.assertEquals("java.util.ArrayList",               elements[index++].getValue());\r
         Assert.assertEquals("java.util.Iterator",                elements[index++].getValue());\r
         Assert.assertEquals("java.util.List",                    elements[index++].getValue());\r
-        Assert.assertEquals("javax.imageio.spi.ServiceRegistry", elements[index++].getValue());\r
     }\r
 \r
     @Test\r