<scope>compile</scope>
</dependency>
<dependency>
+ <groupId>stax</groupId>
+ <artifactId>stax</artifactId>
+ <version>1.2.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.7.0</version>
<executions>
<execution>
<id>copy-dependencies</id>
- <phase>package</phase>
+ <phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
* @see #filter(ComparisonResultSet)\r
* @see BirthmarkContext#getFilterTypes()\r
*/\r
- public synchronized ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public synchronized ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(target, context);\r
* @see #filter(ComparisonResultSet)\r
* @see BirthmarkContext#getFilterTypes()\r
*/\r
- public synchronized ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public synchronized ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(targetX, targetY, context);\r
return new ComparisonPair(bs1, bs2, context);\r
}\r
\r
- public synchronized ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public synchronized ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
\r
ExtractionResultSet er = extract(target, context);\r
return crs;\r
}\r
\r
- public synchronized ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public synchronized ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
\r
ExtractionResultSet er = extract(targetX, targetY, context);\r
return crs;\r
}\r
\r
- public synchronized ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+ public synchronized ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkStoreException{\r
operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
ExtractionResultSet er = extract(target, null, context);\r
operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
return er;\r
}\r
\r
- public synchronized ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+ public synchronized ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkStoreException{\r
operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
\r
}\r
}\r
\r
- private BirthmarkSet[] extractImpl(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException{\r
+ private BirthmarkSet[] extractImpl(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException, BirthmarkStoreException{\r
ClassFileArchive[] archives = createArchives(target, environment);\r
BirthmarkContext context = er.getContext();\r
ExtractionUnit unit = context.getExtractionUnit();\r
}\r
}\r
}\r
- for(BirthmarkSet bs: map.values()){\r
- er.addBirthmarkSet(et, bs);\r
+ try{\r
+ for(BirthmarkSet bs: map.values()){\r
+ er.addBirthmarkSet(et, bs);\r
+ }\r
+ }catch(BirthmarkStoreException e){\r
}\r
}\r
\r
}\r
\r
private void extractFromClass(ClassFileArchive[] archives, ExtractionResultSet er,\r
- ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{\r
BirthmarkContext context = er.getContext();\r
\r
for(ClassFileArchive archive: archives){\r
}\r
}\r
\r
- private void extractFromProduct(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ private void extractFromProduct(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{\r
BirthmarkContext context = er.getContext();\r
\r
for(ClassFileArchive archive: archives){\r
--- /dev/null
+package jp.naist.se.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This exception class will be thrown when birthmark storing is failed.
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkStoreException extends BirthmarkException{
+ private static final long serialVersionUID = -7106053809841281816L;
+
+ public BirthmarkStoreException(){
+ }
+
+ public BirthmarkStoreException(String message, Throwable cause){
+ super(message, cause);
+ }
+
+ public BirthmarkStoreException(String message){
+ super(message);
+ }
+
+ public BirthmarkStoreException(Throwable cause){
+ super(cause);
+ }
+}
*/\r
public enum BirthmarkStoreTarget{\r
MEMORY,\r
+ XMLFILE,\r
+ MEMORY_SINGLE,\r
// DERBY,\r
// FILE,\r
// MYSQL, \r
* @version $Revision$ $Date$\r
*/\r
public interface ExtractionResultSet extends Iterable<BirthmarkSet>{\r
+ public BirthmarkStoreTarget getStoreTarget();\r
+\r
/**\r
* returns an environment of extraction result.\r
*/\r
* birthmarks is parsed and store into target database in this method.\r
* @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH \r
*/\r
- public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
+ public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;\r
\r
/**\r
* remove all of birthmark-set this object has, then, adds each birthmark-sets to this object. \r
* @see #addBirthmarkSet(ExtractionTarget, BirthmarkSet)\r
* @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH \r
*/\r
- public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets);\r
+ public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException;\r
\r
/**\r
* remove specified birthmark-set from specified extraction target.\r
context.addFilterType(filters[i]);\r
}\r
}\r
+ if(cl.hasOption("store-target")){\r
+ String value = cl.getOptionValue("store-target");\r
+ BirthmarkStoreTarget bst = BirthmarkStoreTarget.valueOf(value);\r
+ if(bst == null){\r
+ bst = BirthmarkStoreTarget.MEMORY;\r
+ }\r
+ context.setStoreTarget(bst);\r
+ }\r
if(cl.hasOption("extraction-unit")){\r
ExtractionUnit unit = ExtractionUnit.valueOf(cl.getOptionValue("extraction-unit"));\r
context.setExtractionUnit(unit);\r
\r
import java.util.Locale;\r
\r
+import jp.naist.se.stigmata.Birthmark;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
\r
public String getVendorName(){\r
return getClass().getPackage().getImplementationVendor();\r
}\r
+\r
+ public Birthmark buildBirthmark(){\r
+ return getExtractor().createBirthmark();\r
+ }\r
+\r
+ public BirthmarkElement buildBirthmarkElement(String value){\r
+ if(value == null){\r
+ return NullBirthmarkElement.getInstance();\r
+ }\r
+ return new BirthmarkElement(value);\r
+ }\r
}\r
private int count = 1;\r
\r
public FrequencyBirthmarkElement(String value){\r
- this(value, 1);\r
+ super(parseValue(value));\r
+ if(!value.equals(super.getValue())){\r
+ int number = new Integer(value.substring(0, value.indexOf(":")));\r
+ this.count = number;\r
+ }\r
}\r
\r
public FrequencyBirthmarkElement(String value, int count){\r
public int getValueCount(){\r
return count;\r
}\r
+\r
+ private static String parseValue(String value){\r
+ if(value.indexOf(":") > 0){\r
+ int index = value.indexOf(":");\r
+ String num = value.substring(0, index);\r
+ String val = value.substring(index + 1);\r
+ try{\r
+ // is number?\r
+ new Integer(num);\r
+ return val;\r
+ } catch(NumberFormatException e){\r
+ }\r
+ }\r
+ return value;\r
+ }\r
}\r
\r
TypeAndValueBirthmarkElement e = elements.get(name);\r
if(e == null){\r
- e = new TypeAndValueBirthmarkElement(name, desc, value);\r
+ e = new TypeAndValueBirthmarkElement(desc, value);\r
}\r
else{\r
if(value != null){\r
if(className.equals(owner) && opcode == Opcodes.PUTFIELD){\r
TypeAndValueBirthmarkElement e = elements.get(name);\r
if(e == null){\r
- e = new TypeAndValueBirthmarkElement(name, desc, constant);\r
+ e = new TypeAndValueBirthmarkElement(desc, constant);\r
}\r
\r
if(e.getValue() == null && constant != null){\r
*/\r
\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.BirthmarkExtractor;\r
import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
import jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator;\r
* @version $Revision$ $Date$\r
*/\r
public class ConstantValueOfFieldVariableBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
- private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
+ private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
private BirthmarkExtractor extractor = new ConstantValueOfFieldVariableBirthmarkExtractor(this);\r
\r
public String getType(){\r
public boolean isUserDefined(){\r
return false;\r
}\r
+\r
+ @Override\r
+ public BirthmarkElement buildBirthmarkElement(String value) {\r
+ String signature = value.substring(0, value.indexOf('='));\r
+ String subValue = value.substring(value.indexOf('=') + 1);\r
+ Object elementValue = subValue;\r
+\r
+ if(subValue.equals("null")){\r
+ elementValue = null;\r
+ }\r
+ else{\r
+ switch(signature.charAt(0)){\r
+ case 'Z':{\r
+ if(value.equals("true")) elementValue = Boolean.TRUE;\r
+ else elementValue = Boolean.FALSE;\r
+ break;\r
+ }\r
+ case 'C': elementValue = new Character(subValue.charAt(0)); break;\r
+ case 'D': elementValue = new Double(subValue); break;\r
+ case 'F': elementValue = new Float(subValue); break;\r
+ case 'S': elementValue = new Short(subValue); break;\r
+ case 'B': elementValue = new Byte(subValue); break;\r
+ case 'I': elementValue = new Integer(subValue); break;\r
+ default: elementValue = value; break;\r
+ }\r
+ }\r
+ return new TypeAndValueBirthmarkElement(signature, elementValue);\r
+ }\r
}\r
public class TypeAndValueBirthmarkElement extends BirthmarkElement implements Serializable{
private static final long serialVersionUID = 237098465735321L;
- private String fieldName;
private String signature;
private Serializable serialValue;
private transient Object value;
/**
* @param value
*/
- public TypeAndValueBirthmarkElement(String fieldName, String signature, Object value){
- super(fieldName + "=" + value);
- this.fieldName = fieldName;
+ public TypeAndValueBirthmarkElement(String signature, Object value){
+ super(signature + "=" + value);
this.signature = signature;
setValue(value);
}
- public String getFieldName(){
- return fieldName;
- }
-
public String getSignature(){
return signature;
}
}
public String toString(){
- return signature + " = " + value;
+ return signature + "=" + value;
}
public int hashCode(){
- return fieldName.hashCode() + signature.hashCode();
+ return signature.hashCode() + value.hashCode();
}
public boolean equals(Object o){
*/\r
\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.BirthmarkExtractor;\r
import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmarkElement;\r
import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
\r
public boolean isUserDefined(){\r
return false;\r
}\r
+\r
+ @Override\r
+ public BirthmarkElement buildBirthmarkElement(String value) {\r
+ return new FrequencyBirthmarkElement(value);\r
+ }\r
}\r
return new UsedClassesBirthmarkExtractVisitor(writer, birthmark, environment);
}
+ @Override
public ExtractionUnit[] getAcceptableUnits(){
return new ExtractionUnit[] {
ExtractionUnit.CLASS, ExtractionUnit.PACKAGE, ExtractionUnit.ARCHIVE,
*/\r
\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.BirthmarkExtractor;\r
import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmarkElement;\r
import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
\r
public boolean isUserDefined(){\r
return false;\r
}\r
+\r
+ public BirthmarkElement createBirthmarkElement(String value){\r
+ return new FrequencyBirthmarkElement(value);\r
+ }\r
}\r
\r
return opcodeVisitor;\r
}\r
-\r
}\r
*/\r
\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.BirthmarkExtractor;\r
import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
import jp.naist.se.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator;\r
public boolean isUserDefined(){\r
return false;\r
}\r
+\r
+ @Override\r
+ public BirthmarkElement buildBirthmarkElement(String value) {\r
+ value = value.trim();\r
+ if(value.startsWith("{") && value.endsWith("}")){\r
+ String[] param = value.substring(1, value.length() - 1).split(", *");\r
+ KGram<Integer> kgram = new KGram<Integer>(param.length);\r
+ for(int i = 0; i < param.length; i++){\r
+ kgram.set(i, new Integer(param[i].trim()));\r
+ }\r
+ return new KGramBasedBirthmarkElement<Integer>(kgram);\r
+ }\r
+ return null;\r
+ }\r
}\r
*/\r
\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.BirthmarkExtractor;\r
import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
import jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator;\r
public boolean isUserDefined(){\r
return false;\r
}\r
+\r
+ @Override\r
+ public BirthmarkElement buildBirthmarkElement(String value) {\r
+ String className = value.substring(0, value.indexOf('#'));\r
+ String methodName = value.substring(value.indexOf('#') + 1, value.lastIndexOf('!'));\r
+ String signature = value.substring(value.lastIndexOf('!') + 1);\r
+\r
+ return new MethodCallBirthmarkElement(className, methodName, signature);\r
+ }\r
}\r
@Override\r
public void printResult(PrintWriter out, ComparisonPair pair){\r
out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
- out.println("<birthmark>");\r
+ out.println("<birthmark-result-set>");\r
out.println(" <extracted-birthmarks>");\r
list.printBirthmarkSet(out, pair.getTarget1());\r
list.printBirthmarkSet(out, pair.getTarget2());\r
out.println(" <comparison-result-set>");\r
printComparisonPair(out, pair);\r
out.println(" </comparison-result-set>");\r
- out.println("</birthmark>");\r
+ out.println("</birthmark-result-set>");\r
out.flush();\r
}\r
\r
@Override\r
public void printResult(PrintWriter out, ComparisonResultSet resultset){\r
out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
- out.println("<birthmark>");\r
+ out.println("<birthmark-result-set>");\r
out.println(" <comparison-result-set>");\r
for(ComparisonPair pair: resultset){\r
printComparisonPair(out, pair);\r
}\r
out.println(" </comparison-result-set>");\r
- out.println("</birthmark>");\r
+ out.println("</birthmark-result-set>");\r
out.flush();\r
}\r
\r
public class BirthmarkExtractionListXmlFormat extends AbstractBirthmarkExtractionResultFormat{\r
public void printResult(PrintWriter out, ExtractionResultSet ers){\r
out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
- out.println("<birthmark>");\r
+ out.println("<birthmark-result-set>");\r
out.println(" <extracted-birthmarks>");\r
for(Iterator<BirthmarkSet> i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){\r
printBirthmarkSet(out, i.next());\r
}\r
out.println(" </extracted-birthmarks>");\r
- out.println("</birthmark>");\r
+ out.println("</birthmark-result-set>");\r
out.flush();\r
}\r
\r
public class BirthmarkServiceListXmlFormat extends AbstractBirthmarkServiceListFormat{\r
public void printResult(PrintWriter out, BirthmarkSpi[] spilist){\r
out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
- out.println("<birthmark>");\r
+ out.println("<birthmark-result-set>");\r
out.println(" <birthmark-services>");\r
for(BirthmarkSpi spi: spilist){\r
out.println(" <birthmark-service>");\r
out.println(" </birthmark-service>");\r
}\r
out.println(" </birthmark-services>");\r
- out.println("</birthmark>");\r
+ out.println("</birthmark-result-set>");\r
\r
out.flush();\r
}\r
public abstract Iterator<BirthmarkSet> pairSources();\r
\r
public synchronized BirthmarkSet[] getPairSources(){\r
- return AbstractComparisonResultSet.<BirthmarkSet>getArrays(pairSources());\r
+ return AbstractComparisonResultSet.<BirthmarkSet>getArrays(pairSources(), new BirthmarkSet[0]);\r
}\r
\r
public int getPairCount(){\r
}\r
\r
public synchronized ComparisonPair[] getPairs(){\r
- return AbstractComparisonResultSet.<ComparisonPair>getArrays(iterator());\r
+ return AbstractComparisonResultSet.<ComparisonPair>getArrays(iterator(), new ComparisonPair[0]);\r
}\r
\r
public ComparisonPair getPairAt(int index){\r
}\r
\r
@SuppressWarnings("unchecked")\r
- static synchronized <T> T[] getArrays(Iterator<T> i){\r
+ static synchronized <T> T[] getArrays(Iterator<T> i, T[] array){\r
List<Object> list = new ArrayList<Object>();\r
- Object o = null;\r
while(i.hasNext()){\r
- o = i.next();\r
list.add(i.next());\r
}\r
- int size = 0;\r
- if(o != null) size = list.size();\r
- T[] array = (T[])Array.newInstance(o.getClass(), size);\r
+\r
+ if(list.size() > array.length){\r
+ array = (T[])Array.newInstance(array.getClass().getComponentType(), list.size());\r
+ }\r
for(int index = 0; index < list.size(); index++){\r
array[index] = (T)list.get(index);\r
}\r
* $Id$\r
*/\r
\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\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.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreException;\r
import jp.naist.se.stigmata.ExtractionResultSet;\r
import jp.naist.se.stigmata.ExtractionTarget;\r
\r
return context;\r
}\r
\r
- public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
+ public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;\r
\r
public abstract void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
\r
* @return all of BirthmarkSet this instance have. elements is obtained from birthmarkSet.\r
*/\r
public synchronized BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){\r
- return AbstractComparisonResultSet.<BirthmarkSet>getArrays(birthmarkSets(target));\r
+ return AbstractComparisonResultSet.<BirthmarkSet>getArrays(birthmarkSets(target), new BirthmarkSet[0]);\r
}\r
\r
- public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets){\r
+ public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException{\r
removeAllBirthmarkSets(target);\r
for(int i = 0; i < sets.length; i++){\r
addBirthmarkSet(target, sets[i]);\r
this.tableType = flag;\r
}\r
\r
+ protected String generateId(){\r
+ SimpleDateFormat cdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");\r
+ return cdf.format(Calendar.getInstance().getTime());\r
+ }\r
}\r
\r
import jp.naist.se.stigmata.BirthmarkContext;\r
import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreException;\r
import jp.naist.se.stigmata.ComparisonPair;\r
import jp.naist.se.stigmata.ExtractionResultSet;\r
import jp.naist.se.stigmata.ExtractionTarget;\r
}\r
\r
private static ExtractionResultSet createExtractionResultSet(ComparisonPair[] pairs, BirthmarkContext context){\r
- ExtractionResultSet ers = new MemoryExtractionResultSet(context, false);\r
- for(int i = 0; i < pairs.length; i++){\r
- ers.addBirthmarkSet(ExtractionTarget.TARGET_X, pairs[i].getTarget1());\r
- ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, pairs[i].getTarget2());\r
+ ExtractionResultSet ers = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
+ ers.setTableType(false);\r
+ try{\r
+ for(int i = 0; i < pairs.length; i++){\r
+ ers.addBirthmarkSet(ExtractionTarget.TARGET_X, pairs[i].getTarget1());\r
+ ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, pairs[i].getTarget2());\r
+ }\r
+ }catch(BirthmarkStoreException e){\r
+ throw new InternalError("never thrown BirthmarkStoreException is thrown");\r
}\r
return ers;\r
}\r
\r
private static ExtractionResultSet createExtractionResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, BirthmarkContext context){\r
- ExtractionResultSet ers = new MemoryExtractionResultSet(context, true);\r
- ers.setBirthmarkSets(ExtractionTarget.TARGET_X, targetX);\r
- ers.setBirthmarkSets(ExtractionTarget.TARGET_Y, targetY);\r
+ ExtractionResultSet ers = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
+ ers.setTableType(true);\r
+ try{\r
+ ers.setBirthmarkSets(ExtractionTarget.TARGET_X, targetX);\r
+ ers.setBirthmarkSets(ExtractionTarget.TARGET_Y, targetY);\r
+ }catch(BirthmarkStoreException e){\r
+ throw new InternalError("never thrown BirthmarkStoreException is thrown");\r
+ }\r
return ers;\r
}\r
\r
private Map<String, Class<? extends ExtractionResultSet>> map = new HashMap<String, Class<? extends ExtractionResultSet>>();\r
\r
private ExtractionResultSetFactory(){\r
- map.put(BirthmarkStoreTarget.MEMORY.name(), MemoryExtractionResultSet.class);\r
+ map.put(BirthmarkStoreTarget.MEMORY.name(), MemoryExtractionResultSet.class);\r
+ map.put(BirthmarkStoreTarget.XMLFILE.name(), XmlFileExtractionResultSet.class);\r
+ map.put(BirthmarkStoreTarget.MEMORY_SINGLE.name(), SingleExtractionResultSet.class);\r
}\r
\r
public static ExtractionResultSetFactory getInstance(){\r
\r
import jp.naist.se.stigmata.BirthmarkContext;\r
import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
import jp.naist.se.stigmata.ExtractionTarget;\r
import jp.naist.se.stigmata.utils.MultipleIterator;\r
\r
super(context, tableType);\r
}\r
\r
+ public BirthmarkStoreTarget getStoreTarget(){\r
+ return BirthmarkStoreTarget.MEMORY;\r
+ }\r
+\r
public void removeAllBirthmarkSets(ExtractionTarget target){\r
switch(target){\r
case TARGET_X:\r
\r
import jp.naist.se.stigmata.BirthmarkContext;\r
import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
import jp.naist.se.stigmata.ExtractionTarget;\r
import jp.naist.se.stigmata.utils.NullIterator;\r
\r
super(context, false);\r
}\r
\r
+ public BirthmarkStoreTarget getStoreTarget(){\r
+ return BirthmarkStoreTarget.MEMORY_SINGLE;\r
+ }\r
+\r
public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){\r
this.bs = set;\r
}\r
--- /dev/null
+package jp.naist.se.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.EndElement;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
+
+import jp.naist.se.stigmata.Birthmark;
+import jp.naist.se.stigmata.BirthmarkContext;
+import jp.naist.se.stigmata.BirthmarkElement;
+import jp.naist.se.stigmata.BirthmarkEnvironment;
+import jp.naist.se.stigmata.BirthmarkSet;
+import jp.naist.se.stigmata.BirthmarkStoreException;
+import jp.naist.se.stigmata.BirthmarkStoreTarget;
+import jp.naist.se.stigmata.ExtractionTarget;
+import jp.naist.se.stigmata.spi.BirthmarkSpi;
+
+/**
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
+ private File targetFile;
+ private boolean addmode = true;
+ private int size;
+ private boolean first = true;
+ private List<URL> addList = new ArrayList<URL>();
+ private PrintWriter out;
+
+ public XmlFileExtractionResultSet(BirthmarkContext context, boolean tableType){
+ super(context, tableType);
+
+ createTargetFile();
+ }
+
+ public XmlFileExtractionResultSet(BirthmarkContext context){
+ super(context);
+
+ createTargetFile();
+ }
+
+ public BirthmarkStoreTarget getStoreTarget(){
+ return BirthmarkStoreTarget.XMLFILE;
+ }
+
+ @Override
+ public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException{
+ if(addmode){
+ size++;
+ if(first){
+ first = false;
+ try{
+ out = new PrintWriter(new FileWriter(targetFile));
+ printHeader(out);
+ }catch(IOException e){
+ e.printStackTrace();
+ }
+ }
+ if(out == null){
+ first = true;
+ throw new BirthmarkStoreException("destination is closed on some reason");
+ }
+ addList.add(set.getLocation());
+ writeBirthmarkSet(out, set);
+ }
+ else{
+ throw new BirthmarkStoreException("destination is already closed.");
+ }
+ }
+
+ @Override
+ public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
+ checkMode();
+
+ return new BirthmarkSetStAXIterator(targetFile, addList, getEnvironment());
+ }
+
+ @Override
+ public int getBirthmarkSetSize(ExtractionTarget target){
+ return size;
+ }
+
+ @Override
+ public void removeAllBirthmarkSets(ExtractionTarget target){
+ targetFile.delete();
+ size = 0;
+ addList.clear();
+ }
+
+ @Override
+ public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
+ boolean removeFlag = addList.remove(set.getLocation());
+ if(removeFlag){
+ size--;
+ }
+ }
+
+ private void writeBirthmarkSet(PrintWriter out, BirthmarkSet set){
+ out.println(" <extracted-birthmark>");
+ out.printf(" <class-name>%s</class-name>%n", set.getName());
+ out.printf(" <location>%s</location>%n", set.getLocation());
+ for(Birthmark birthmark: set){
+ out.printf(" <birthmark type=\"%s\" count=\"%d\">%n", birthmark.getType(), birthmark.getElementCount());
+ for(BirthmarkElement element: birthmark){
+ out.printf(" <element>%s</element>%n", normalize(String.valueOf(element)));
+ }
+ out.printf(" </birthmark>%n");
+ }
+ out.println(" </extracted-birthmark>");
+ }
+
+ private String normalize(String element){
+ element = element.replaceAll("&", "&");
+ element = element.replaceAll("<", "<");
+ element = element.replaceAll(">", ">");
+ element = element.replaceAll("\"", """);
+ return element;
+ }
+
+ private void createTargetFile(){
+ targetFile = new File(BirthmarkEnvironment.getStigmataHome(), "extracted_birthmarks/" + generateId() + ".xml");
+ if(!targetFile.getParentFile().exists()){
+ targetFile.getParentFile().mkdirs();
+ }
+ }
+
+ private void printHeader(PrintWriter out){
+ out.println("<birthmark-result-set>");
+ out.println(" <extracted-birthmarks>");
+ }
+
+ private void printFooter(PrintWriter out){
+ out.println(" </extracted-birthmarks>");
+ out.println("</birthmark-result-set>");
+ }
+
+ private synchronized void checkMode(){
+ if(addmode){
+ addmode = false;
+ printFooter(out);
+ out.close();
+ }
+ }
+
+ private static class BirthmarkSetStAXIterator implements Iterator<BirthmarkSet>{
+ private XMLEventReader reader = null;
+ private BirthmarkSet nextObject;
+ private List<URL> validItems;
+ private BirthmarkEnvironment env;
+
+ public BirthmarkSetStAXIterator(File file, List<URL> validItems, BirthmarkEnvironment env){
+ try{
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ BufferedReader in = new BufferedReader(new FileReader(file));
+ reader = factory.createXMLEventReader(in);
+ } catch(FileNotFoundException e){
+ } catch(XMLStreamException e){
+ }
+ this.validItems = validItems;
+ this.env = env;
+ try{
+ nextObject = findNext();
+ } catch(XMLStreamException e){
+ e.printStackTrace();
+ }
+ }
+
+ public boolean hasNext(){
+ boolean flag = nextObject != null;
+ if(!flag){
+ try{
+ reader.close();
+ } catch(XMLStreamException e){
+ e.printStackTrace();
+ }
+ }
+ return flag;
+ }
+
+ public BirthmarkSet next(){
+ BirthmarkSet next = nextObject;
+ try{
+ nextObject = findNext();
+ } catch(XMLStreamException e){
+ e.printStackTrace();
+ }
+ return next;
+ }
+
+ public void remove(){
+ }
+
+ private BirthmarkSet findNext() throws XMLStreamException{
+ String className = null;
+ BirthmarkSet bs = null;
+ Birthmark birthmark = null;
+ BirthmarkSpi service = null;
+
+ while(reader.hasNext()){
+ XMLEvent event = reader.peek();
+ if(event.isStartElement()){
+ StartElement se = event.asStartElement();
+ if(se.getName().getLocalPart().equals("class-name")) className = reader.getElementText();
+ else if(se.getName().getLocalPart().equals("location")){
+ String location = reader.getElementText();
+ if(className == null || location == null){
+ throw new XMLStreamException("incompatible with definition");
+ }
+ try{
+ URL url = new URL(location);
+ if(!validItems.contains(url)){
+ while(reader.hasNext()){
+ XMLEvent xmlevent = reader.nextTag();
+ if(xmlevent.isEndElement() &&
+ xmlevent.asEndElement().getName().getLocalPart().equals("extracted-birthmark")){
+ break;
+ }
+ }
+ continue;
+ }
+ bs = new BirthmarkSet(className, url);
+ } catch(MalformedURLException e){
+ e.printStackTrace();
+ }
+ }
+ else if(se.getName().getLocalPart().equals("element")){
+ BirthmarkElement be = service.buildBirthmarkElement(reader.getElementText());
+ birthmark.addElement(be);
+ }
+ else if(se.getName().getLocalPart().equals("birthmark")){
+ String type = se.getAttributeByName(new QName("type")).getValue();
+ service = env.getService(type);
+ birthmark = service.buildBirthmark();
+ bs.addBirthmark(birthmark);
+ }
+ }
+ else if(event.isEndElement()){
+ EndElement ee = event.asEndElement();
+ if(ee.getName().getLocalPart().equals("extracted-birthmark")){
+ reader.nextEvent();
+ break;
+ }
+ }
+ reader.nextEvent();
+ }
+ return bs;
+ }
+ }
+}
\r
import java.util.Locale;\r
\r
+import jp.naist.se.stigmata.Birthmark;\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
import jp.naist.se.stigmata.BirthmarkExtractor;\r
\r
/**\r
\r
public String getExtractorClassName();\r
\r
+ public Birthmark buildBirthmark();\r
+\r
+ public BirthmarkElement buildBirthmarkElement(String elementValue);\r
+\r
/**\r
* returns a extractor for the birthmark of this service.\r
*/\r
private Birthmark birthmark;
public BirthmarkTreeNode(Birthmark birthmark){
- super(birthmark.getType() + "("
- + birthmark.getElementCount() + ")");
+ super(String.format("%s (%d)", birthmark.getType(), birthmark.getElementCount()));
setBirthmark(birthmark);
}
public BirthmarkTreeNode(BirthmarkSet birthmark){
- super(birthmark.getName() + "(" +
- + birthmark.getSumOfElementCount() + ")");
+ super(String.format("%s (%d)", birthmark.getName(), birthmark.getSumOfElementCount()));
setBirthmark(birthmark);
}
\r
import jp.naist.se.stigmata.BirthmarkContext;\r
import jp.naist.se.stigmata.BirthmarkEnvironment;\r
+import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
import jp.naist.se.stigmata.ComparisonMethod;\r
import jp.naist.se.stigmata.ExtractionUnit;\r
import jp.naist.se.stigmata.Stigmata;\r
BirthmarkContext context = new BirthmarkContext(generateEnvironment());\r
context.setBirthmarkTypes(birthmarks.getSelectedServiceTypes());\r
context.setExtractionUnit(parseExtractionUnit());\r
+ BirthmarkStoreTarget bst = BirthmarkStoreTarget.MEMORY;\r
+ if(context.getEnvironment().getProperty("birthmark.store.target") != null){\r
+ bst = BirthmarkStoreTarget.valueOf(context.getEnvironment().getProperty("birthmark.store.target"));\r
+ }\r
+ if(bst == null){\r
+ bst = BirthmarkStoreTarget.MEMORY;\r
+ }\r
+ context.setStoreTarget(bst);\r
\r
return context;\r
}\r
import jp.naist.se.stigmata.BirthmarkComparator;\r
import jp.naist.se.stigmata.BirthmarkEnvironment;\r
import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreException;\r
import jp.naist.se.stigmata.ComparisonResultSet;\r
import jp.naist.se.stigmata.ExtractionResultSet;\r
import jp.naist.se.stigmata.ExtractionTarget;\r
);\r
if(file != null){\r
ExtractionResultSet ers = new MemoryExtractionResultSet(extraction.getContext(), extraction.isTableType());\r
- for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
- BirthmarkSet bs = i.next();\r
- ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs));\r
- }\r
- for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
- BirthmarkSet bs = i.next();\r
- ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs));\r
+ try{\r
+ for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
+ BirthmarkSet bs = i.next();\r
+ ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs));\r
+ }\r
+ for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
+ BirthmarkSet bs = i.next();\r
+ ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs));\r
+ }\r
+ } catch(BirthmarkStoreException e){\r
}\r
this.extraction = ers;\r
obfuscator.outputNameMappings(file);\r
});\r
saveMenu.addActionListener(new ActionListener(){\r
public void actionPerformed(ActionEvent e){\r
- control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), ".stigmata.xml"));\r
+ control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml"));\r
}\r
});\r
\r
component.setBorder(new TitledBorder(Messages.getString(label + ".border")));\r
}\r
try{\r
- Method[] methods = component.getClass().getMethods();\r
Icon icon = getIcon(label + ".icon");\r
if(icon != null){\r
+ Method[] methods = component.getClass().getMethods();\r
for(Method m: methods){\r
if(m.getName().equals("setIcon")){\r
m.invoke(component, icon);\r
<!ELEMENT comparison-result (target1,target2,birthmark-similarities,similarity)>\r
<!ELEMENT comparison-result-set (comparison-result*)>\r
\r
-<!ELEMENT birthmark ((birthmark-services|extracted-birthmarks|comparison-result-set)+)>\r
+<!ELEMENT birthmark-result-set ((birthmark-services|extracted-birthmarks|comparison-result-set)+)>\r
\r
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
- <ref name="birthmark"/>
+ <ref name="birthmark-result-set"/>
</start>
- <define name="birthmark">
- <element name="birthmark">
+ <define name="birthmark-result-set">
+ <element name="birthmark-result-set">
<optional>
<ref name="birthmark-services"/>
</optional>
${implementation.vendor} 2004-2007,\r
All right reserved.\r
</p><p>\r
+Latest version is available at\r
+<a href="http://stigmata.sourceforge.jp/">http://stigmata.sourceforge.jp/</a>.\r
+Stigmata is developed on Java SE 5.\r
+</p>\r
+<h2>Dependencies</h2>\r
Stigmata uses ASM library for engineering Java bytecode.<br>\r
<a href="http://asm.objectweb.org/">http://asm.objectweb.org/</a>\r
</p><p>\r
</p><p>\r
Stigmata uses icons provided by FAMFAMFAM.<br>\r
<a href="http://www.famfamfam.com/">http://www.famfamfam.com/</a>\r
-</p><p>\r
+<h2>License & Copyright</h2>\r
Copyright 2004-2007 Haruaki Tamada\r
</p><p>\r
Licensed under the Apache License, Version 2.0 (the "License");\r
${implementation.vendor} 2004-2007,\r
All right reserved.\r
</p><p>\r
+Stigmata \82Ì\8dÅ\90V\83o\81[\83W\83\87\83\93\82Í\r
+<a href="http://stigmata.sourceforge.jp/">http://stigmata.sourceforge.jp/</a>\r
+\82©\82ç\8eæ\93¾\89Â\94\\82Å\82·\81D\82Ü\82½\81CStigmata \82Í Java SE 5 \82Å\8aJ\94\82³\82ê\82Ä\82¢\82Ü\82·\81D\r
+</p>\r
+<h2>\88Ë\91¶\83\89\83C\83u\83\89\83\8a</h2>\r
Stigmata\82Í Java \83o\83C\83g\83R\81[\83h\82ð\88µ\82¤\82½\82ß\81CASM\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81D<br>\r
<a href="http://asm.objectweb.org/">http://asm.objectweb.org/</a>\r
</p><p>\r
Stigmata\82ÍFAMFAMFAM\82ª\92ñ\8b\9f\82µ\82Ä\82¢\82é\83A\83C\83R\83\93\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81D<br>\r
<a href="http://www.famfamfam.com/">http://www.famfamfam.com/</a>\r
</p>\r
-<hr>\r
+<h2>\83\89\83C\83Z\83\93\83X&\92\98\8dì\8c </h2>\r
<p>\r
Copyright 2004-2007 \8bÊ\93c \8ft\8fº (Haruaki Tamada)\r
</p><p>\r
<long-option>store-target</long-option>
<argument>REQUIRED</argument>
<argument-name>STORE_TARGET</argument-name>
- <description>This option represents how to store extracted birthmarks. Available value is only MEMORY.</description>
+ <description>This option represents how to store extracted birthmarks. Available values are MEMORY, and XMLFILE.</description>
</definition>
</definitions>
<name>extractor.kmc.KValue</name>
<value>4</value>
</property>
+ <property>
+ <name>birthmark.store.target</name>
+ <value>MEMORY</value>
+ </property>
<!--
<property>
<property-name>name</property-name>