import jp.sourceforge.stigmata.utils.WellknownClassManager;
import org.objectweb.asm.ClassVisitor;
-import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;
++import org.objectweb.asm.Opcodes;
+
/**
*
package jp.sourceforge.stigmata.resolvers;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.io.File;
+import java.util.ServiceLoader;
-public class StigmataHomeManager{
+ /**
+ *
+ * @author Haruaki Tamada
+ */
+public class StigmataHomeManager implements StigmataHomeResolver{
private String home;
- private List<StigmataHomeResolver> resolvers = new ArrayList<StigmataHomeResolver>();
- public StigmataHomeManager(){
- resolvers.add(new DefaultStigmataHomeResolver());
- resolvers.add(new MacOSXStigmataHomeResolver());
- resolvers.add(new WindowsStigmataHomeResolver());
- resolvers.add(new PropertyStigmataHomeResolver());
+ @Override
+ public String getStigmataHome(){
+ if(home == null){
+ home = resolveHome();
+ }
+ return home;
}
- public String getStigmataHome(){
+ private String resolveHome(){
+ ServiceLoader<StigmataHomeResolver> loader = ServiceLoader.load(StigmataHomeResolver.class);
+ String home = null;
+ String name = System.getProperty("os.name");
+
+ for(StigmataHomeResolver resolver: loader){
+ if(resolver.isTarget(name)){
+ home = resolver.getStigmataHome();
+ break;
+ }
+ }
if(home == null){
- String home = null;
- String osName = System.getProperty("os.name");
- for(StigmataHomeResolver resolver: resolvers){
- if(resolver.isTarget(osName)){
- try{
- home = resolver.getStigmataHome();
- } catch(IOException e){
- }
- }
- if(home != null){
- this.home = home;
- break;
- }
+ home = System.getProperty("stigmata.home");
+ if(home == null){
+ home = System.getenv("STIGMATA_HOME");
+ }
+ if(home == null){
+ home = getUserHome() + File.separator + ".stigmata";
}
}
return home;
--- /dev/null
- return targetClass.newInstance();\r
+ package jp.sourceforge.stigmata.spi;\r
+ \r
+ import java.io.Serializable;\r
++import java.lang.reflect.Constructor;\r
+ \r
+ import jp.sourceforge.stigmata.BirthmarkComparator;\r
+ import jp.sourceforge.stigmata.BirthmarkExtractor;\r
+ import jp.sourceforge.stigmata.BirthmarkPreprocessor;\r
+ \r
+ public class ReflectedBirthmarkService implements BirthmarkService, Serializable{\r
+ private static final long serialVersionUID = 4090172591560046236L;\r
+ \r
+ private String type;\r
+ private String description;\r
+ private String extractorClass;\r
+ private String comparatorClass;\r
+ private String preprocessorClass;\r
+ \r
+ private transient BirthmarkExtractor extractor;\r
+ private transient BirthmarkComparator comparator;\r
+ private transient BirthmarkPreprocessor preprocessor;\r
+ \r
+ public ReflectedBirthmarkService(String type, String description,\r
+ String extractorClass, String comparatorClass){\r
+ this(type, description, extractorClass, comparatorClass, null);\r
+ }\r
+ \r
++ public String toString(){\r
++ return String.format("%s, extractor=%s, comparator=%s", type, extractorClass, comparatorClass);\r
++ }\r
++\r
+ /**\r
+ * \r
+ * @param type\r
+ * @param description\r
+ * @param extractorClass\r
+ * @param comparatorClass\r
+ * @param preprocessorClass\r
+ * @throws NullPointerException one of type, extractorClass, and comparatorClass is null. \r
+ */\r
+ public ReflectedBirthmarkService(String type, String description,\r
+ String extractorClass, String comparatorClass, String preprocessorClass){\r
+ if(type == null || extractorClass == null || comparatorClass == null){\r
+ throw new NullPointerException();\r
+ }\r
+ this.type = type;\r
+ this.description = description;\r
+ this.extractorClass = extractorClass;\r
+ this.comparatorClass = comparatorClass;\r
+ this.preprocessorClass = preprocessorClass;\r
+ }\r
+ \r
+ @Override\r
+ public String getType(){\r
+ return type;\r
+ }\r
+ \r
+ @Override\r
+ public String getDescription(){\r
+ return description;\r
+ }\r
+ \r
+ @Override\r
+ public synchronized BirthmarkPreprocessor getPreprocessor(){\r
+ if(preprocessor == null && preprocessorClass != null){\r
+ preprocessor = instantiateClass(preprocessorClass, BirthmarkPreprocessor.class);\r
+ }\r
+ return preprocessor;\r
+ }\r
+ \r
+ private <T> T instantiateClass(String name, Class<T> type){\r
+ try{\r
+ Class<? extends T> targetClass = Class.forName(name).asSubclass(type);\r
++ Constructor<? extends T> constructor = targetClass.getConstructor(BirthmarkService.class);\r
++ return constructor.newInstance(this);\r
+ } catch(Exception e){\r
++ e.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+ \r
++ public String getExtractorClassName(){\r
++ return extractorClass;\r
++ }\r
++\r
+ @Override\r
+ public BirthmarkExtractor getExtractor(){\r
+ if(extractor == null){\r
+ extractor = instantiateClass(extractorClass, BirthmarkExtractor.class);\r
+ }\r
+ return extractor;\r
+ }\r
+ \r
++ public String getComparatorClassName(){\r
++ return comparatorClass;\r
++ }\r
++\r
+ @Override\r
+ public synchronized BirthmarkComparator getComparator(){\r
+ if(comparator == null){\r
+ comparator = instantiateClass(comparatorClass, BirthmarkComparator.class);\r
+ }\r
+ return comparator;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isExperimental(){\r
+ return true;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isUserDefined(){\r
+ return true;\r
+ }\r
+ \r
+ }\r
}
public void export(PrintWriter out) throws IOException{
-- out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-- out.println("<stigmata>");
++ try{
++ out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
++ out.println("<stigmata>");
-- exportServices(out);
-- exportFilters(out);
-- exportWellknownClasses(out);
-- exportClasspath(out);
-- exportProperties(out);
++ exportServices(out);
++ exportFilters(out);
++ exportWellknownClasses(out);
++ exportClasspath(out);
++ exportProperties(out);
-- out.println("</stigmata>");
-- out.flush();
++ out.println("</stigmata>");
++ out.flush();
++ } finally{
++ out.close();
++ }
}
private void exportProperties(PrintWriter out) throws IOException{
if(service.isExperimental() && service instanceof BirthmarkService){
out.println(" <birthmark-service>");
out.printf(" <type>%s</type>%n", service.getType());
- out.printf(" <display-name>%s</display-name>%n", service.getDisplayType());
- out.printf(" <description>%s</description>%n", service.getDescription());
- out.printf(" <extractor>%s</extractor>%n", service.getExtractorClassName());
- out.printf(" <comparator>%s</comparator>%n", service.getComparatorClassName());
+ if(service instanceof ReflectedBirthmarkService){
- out.printf(" <description>%s</description>%n", service.getDescription());
- out.printf(" <extractor>%s</extractor>%n", service.getExtractor().getClass().getName());
- out.printf(" <comparator>%s</comparator>%n", service.getComparator().getClass().getName());
++ ReflectedBirthmarkService rbs = (ReflectedBirthmarkService)service;
++ out.printf(" <description>%s</description>%n", rbs.getDescription());
++ out.printf(" <extractor>%s</extractor>%n", rbs.getExtractorClassName());
++ out.printf(" <comparator>%s</comparator>%n", rbs.getComparatorClassName());
+ }
out.println(" </birthmark-service>");
}
}
<birthmark-services>
<birthmark-service>
<type>uc_seq</type>
-- <display-name>Used Classes (compare as sequence)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor
<birthmark-service>
<type>uc_dp</type>
-- <display-name>Used Classes (DP matching)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor
<birthmark-service>
<type>uc_ed</type>
-- <display-name>Used Classes (Edit distance)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor
<birthmark-service>
<type>is_ed</type>
-- <display-name>Inheritance Structure (Edit distance)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor
<birthmark-service>
<type>is_dp</type>
-- <display-name>Inheritance Structure (DP matching)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor
<birthmark-service>
<type>smc_dp</type>
-- <display-name>Sequence of Method Calls (DP matching)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor
<birthmark-service>
<type>smc_ed</type>
-- <display-name>Sequence of Method Calls (Edit distance)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor
<birthmark-service>
<type>cvfv_ed</type>
-- <display-name>Constant Value of Field Variable (Edit distance)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor
<birthmark-service>
<type>cvfv_dp</type>
-- <display-name>Constant Value of Field Variable (DP matching)</display-name>
<description></description>
<extractor>
jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor