OSDN Git Service

change package name. jp.naist.se.stigmata -> jp.sourceforge.stigmata
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 3 Jul 2008 03:04:34 +0000 (03:04 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 3 Jul 2008 03:04:34 +0000 (03:04 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@285 acee48c3-7b26-0410-bdac-b3d0e5314bbc

288 files changed:
README.txt
pom.xml
src/bin/stigmata.nsi
src/main/assembly/macosx/Info.plist
src/main/java/jp/sourceforge/stigmata/ApplicationInitializationError.java [moved from src/main/java/jp/naist/se/stigmata/ApplicationInitializationError.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/Birthmark.java [moved from src/main/java/jp/naist/se/stigmata/Birthmark.java with 97% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkComparator.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkComparisonFailedException.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkComparisonFailedException.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkContext.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkContext.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkElement.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkElement.java with 97% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkElementClassNotFoundException.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkElementClassNotFoundException.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkEngine.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkEngine.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkEnvironment.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkException.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkException.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkExtractionFailedException.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkExtractionFailedException.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkExtractor.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkSet.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkSet.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkSpiComparator.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkSpiComparator.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkStoreException.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkStoreException.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkStoreTarget.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkStoreTarget.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/BirthmarkTypeMismatchException.java [moved from src/main/java/jp/naist/se/stigmata/BirthmarkTypeMismatchException.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ComparisonMethod.java [moved from src/main/java/jp/naist/se/stigmata/ComparisonMethod.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ComparisonPair.java [moved from src/main/java/jp/naist/se/stigmata/ComparisonPair.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ComparisonPairElement.java [moved from src/main/java/jp/naist/se/stigmata/ComparisonPairElement.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ComparisonPairFilter.java [moved from src/main/java/jp/naist/se/stigmata/ComparisonPairFilter.java with 79% similarity]
src/main/java/jp/sourceforge/stigmata/ComparisonPairFilterSet.java [moved from src/main/java/jp/naist/se/stigmata/ComparisonPairFilterSet.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ComparisonResultSet.java [moved from src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ExtractionResultSet.java [moved from src/main/java/jp/naist/se/stigmata/ExtractionResultSet.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ExtractionTarget.java [moved from src/main/java/jp/naist/se/stigmata/ExtractionTarget.java with 82% similarity]
src/main/java/jp/sourceforge/stigmata/ExtractionUnit.java [moved from src/main/java/jp/naist/se/stigmata/ExtractionUnit.java with 70% similarity]
src/main/java/jp/sourceforge/stigmata/ExtractorNotFoundException.java [moved from src/main/java/jp/naist/se/stigmata/ExtractorNotFoundException.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/FilterNotFoundException.java [moved from src/main/java/jp/naist/se/stigmata/FilterNotFoundException.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/Main.java [moved from src/main/java/jp/naist/se/stigmata/Main.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/Stigmata.java [moved from src/main/java/jp/naist/se/stigmata/Stigmata.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/ASMBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/ASMBirthmarkExtractor.java with 83% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/AbstractBirthmark.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/AbstractBirthmark.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/AbstractBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/AbstractBirthmarkExtractor.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/AbstractBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/AbstractBirthmarkService.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/BirthmarkExtractVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/BirthmarkExtractVisitor.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/BirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/BirthmarkService.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/FrequencyBirthmark.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmark.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/FrequencyBirthmarkElement.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmarkElement.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/NullBirthmarkElement.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/NullBirthmarkElement.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/PlainBirthmark.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/PlainBirthmark.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/ValueCountable.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/ValueCountable.java with 82% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/AbstractBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/AbstractBirthmarkComparator.java with 75% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/AbstractBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/AbstractBirthmarkComparatorService.java with 82% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/CosineSimilarityBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/CosineSimilarityBirthmarkComparator.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/CosineSimilarityBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/CosineSimilarityBirthmarkComparatorService.java with 71% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/DPMatchingBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/DPMatchingBirthmarkComparator.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/DPMatchingBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/DPMatchingBirthmarkComparatorService.java with 71% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/EditDistanceBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/EditDistanceBirthmarkComparator.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/EditDistanceBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/EditDistanceBirthmarkComparatorService.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/ExtendedEditDistanceBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/ExtendedEditDistanceBirthmarkComparator.java with 83% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/ExtendedEditDistanceBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/ExtendedEditDistanceBirthmarkComparatorService.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/LogicalAndBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/LogicalAndBirthmarkComparator.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/LogicalAndBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/LogicalAndBirthmarkComparatorService.java with 71% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/PlainBirthmarkComparator.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/PlainBirthmarkComparator.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/comparators/PlainBirthmarkComparatorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/comparators/PlainBirthmarkComparatorService.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkExtractVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkExtractVisitor.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkExtractor.java with 69% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkService.java with 81% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/cvfv/TypeAndValueBirthmarkElement.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/TypeAndValueBirthmarkElement.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/AbstractBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/AbstractBirthmarkExtractorService.java with 82% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/BirthmarkExtractorFactory.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/BirthmarkExtractorFactory.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/ConstantValueOfFieldVariableBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/ConstantValueOfFieldVariableBirthmarkExtractorService.java with 63% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/FrequencyMethodCallBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyMethodCallBirthmarkExtractorService.java with 63% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/FrequencyUsedClassesBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyUsedClassesBirthmarkExtractorService.java with 63% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/InheritanceStructureBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/InheritanceStructureBirthmarkExtractorService.java with 63% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/KGramBasedBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/KGramBasedBirthmarkExtractorService.java with 64% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/SequentialMethodCallBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/SequentialMethodCallBirthmarkExtractorService.java with 63% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/extractors/UsedClassesBirthmarkExtractorService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/extractors/UsedClassesBirthmarkExtractorService.java with 64% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkExtractor.java with 66% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkService.java with 66% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkExtractor.java with 64% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkService.java with 65% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java with 78% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractor.java with 77% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/is/InheritanceStructureBirthmarkService.java with 69% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/kgram/KGram.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGram.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/kgram/KGramBasedBirthmarkElement.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkElement.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/kgram/KGramBasedBirthmarkExtractVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkExtractVisitor.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/kgram/KGramBasedBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkExtractor.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/kgram/KGramBasedBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkService.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/kgram/OpcodeExtractionMethodVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/kgram/OpcodeExtractionMethodVisitor.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/smc/MethodCallBirthmarkElement.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/smc/MethodCallBirthmarkElement.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkExtractVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkExtractVisitor.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkExtractor.java with 68% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkService.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/uc/UsedClassesBirthmark.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/uc/UsedClassesBirthmark.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/uc/UsedClassesBirthmarkExtractVisitor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/uc/UsedClassesBirthmarkExtractVisitor.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/uc/UsedClassesBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/uc/UsedClassesBirthmarkExtractor.java with 71% similarity]
src/main/java/jp/sourceforge/stigmata/birthmarks/uc/UsedClassesBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/birthmarks/uc/UsedClassesBirthmarkService.java with 68% similarity]
src/main/java/jp/sourceforge/stigmata/event/BirthmarkEngineAdapter.java [moved from src/main/java/jp/naist/se/stigmata/event/BirthmarkEngineAdapter.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/event/BirthmarkEngineEvent.java [moved from src/main/java/jp/naist/se/stigmata/event/BirthmarkEngineEvent.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/event/BirthmarkEngineListener.java [moved from src/main/java/jp/naist/se/stigmata/event/BirthmarkEngineListener.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/event/OperationStage.java [moved from src/main/java/jp/naist/se/stigmata/event/OperationStage.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/event/OperationType.java [moved from src/main/java/jp/naist/se/stigmata/event/OperationType.java with 82% similarity]
src/main/java/jp/sourceforge/stigmata/event/WarningMessages.java [moved from src/main/java/jp/naist/se/stigmata/event/WarningMessages.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/filter/AbstractComparisonPairFilter.java [moved from src/main/java/jp/naist/se/stigmata/filter/AbstractComparisonPairFilter.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/filter/AbstractComparisonPairFilterService.java [moved from src/main/java/jp/naist/se/stigmata/filter/AbstractComparisonPairFilterService.java with 76% similarity]
src/main/java/jp/sourceforge/stigmata/filter/BirthmarkElementCountComparisonPairFilter.java [moved from src/main/java/jp/naist/se/stigmata/filter/BirthmarkElementCountComparisonPairFilter.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/filter/BirthmarkElementCountComparisonPairFilterService.java [moved from src/main/java/jp/naist/se/stigmata/filter/BirthmarkElementCountComparisonPairFilterService.java with 81% similarity]
src/main/java/jp/sourceforge/stigmata/filter/ComparisonPairFilterManager.java [moved from src/main/java/jp/naist/se/stigmata/filter/ComparisonPairFilterManager.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/filter/Criterion.java [moved from src/main/java/jp/naist/se/stigmata/filter/Criterion.java with 83% similarity]
src/main/java/jp/sourceforge/stigmata/filter/FilterTarget.java [moved from src/main/java/jp/naist/se/stigmata/filter/FilterTarget.java with 79% similarity]
src/main/java/jp/sourceforge/stigmata/filter/FilteredComparisonResultSet.java [moved from src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/filter/SimilarityComparisonPairFilter.java [moved from src/main/java/jp/naist/se/stigmata/filter/SimilarityComparisonPairFilter.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/filter/SimilarityComparisonPairFilterService.java [moved from src/main/java/jp/naist/se/stigmata/filter/SimilarityComparisonPairFilterService.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/filter/TargetNameComparisonPairFilter.java [moved from src/main/java/jp/naist/se/stigmata/filter/TargetNameComparisonPairFilter.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/filter/TargetNameComparisonPairFilterService.java [moved from src/main/java/jp/naist/se/stigmata/filter/TargetNameComparisonPairFilterService.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/filter/TotalElementCountComparisonPairFilter.java [moved from src/main/java/jp/naist/se/stigmata/filter/TotalElementCountComparisonPairFilter.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/filter/TotalElementCountComparisonPairFilterService.java [moved from src/main/java/jp/naist/se/stigmata/filter/TotalElementCountComparisonPairFilterService.java with 81% similarity]
src/main/java/jp/sourceforge/stigmata/hook/AbstractStigmataHookService.java [moved from src/main/java/jp/naist/se/stigmata/hook/AbstractStigmataHookService.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/hook/MultipleStigmataHook.java [moved from src/main/java/jp/naist/se/stigmata/hook/MultipleStigmataHook.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/hook/Phase.java [moved from src/main/java/jp/naist/se/stigmata/hook/Phase.java with 82% similarity]
src/main/java/jp/sourceforge/stigmata/hook/StigmataHook.java [moved from src/main/java/jp/naist/se/stigmata/hook/StigmataHook.java with 63% similarity]
src/main/java/jp/sourceforge/stigmata/hook/StigmataHookManager.java [moved from src/main/java/jp/naist/se/stigmata/hook/StigmataHookManager.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/hook/StigmataRuntimeHook.java [moved from src/main/java/jp/naist/se/stigmata/hook/StigmataRuntimeHook.java with 64% similarity]
src/main/java/jp/sourceforge/stigmata/printer/AbstractBirthmarkServicePrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/AbstractBirthmarkServicePrinter.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/printer/AbstractComparisonPairPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/AbstractComparisonPairPrinter.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/printer/AbstractComparisonResultSetPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/AbstractComparisonResultSetPrinter.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/printer/AbstractExtractionResultSetPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/AbstractExtractionResultSetPrinter.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/printer/BirthmarkServicePrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/BirthmarkServicePrinter.java with 75% similarity]
src/main/java/jp/sourceforge/stigmata/printer/ComparisonPairPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/ComparisonPairPrinter.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/printer/ComparisonResultSetPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/ComparisonResultSetPrinter.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/printer/ExtractionResultSetPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/ExtractionResultSetPrinter.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/printer/Printer.java [moved from src/main/java/jp/naist/se/stigmata/printer/Printer.java with 75% similarity]
src/main/java/jp/sourceforge/stigmata/printer/PrinterManager.java [moved from src/main/java/jp/naist/se/stigmata/printer/PrinterManager.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/printer/csv/BirthmarkServiceCsvPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/csv/BirthmarkServiceCsvPrinter.java with 77% similarity]
src/main/java/jp/sourceforge/stigmata/printer/csv/ComparisonPairCsvPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/csv/ComparisonPairCsvPrinter.java with 75% similarity]
src/main/java/jp/sourceforge/stigmata/printer/csv/ComparisonResultSetCsvPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/csv/ComparisonResultSetCsvPrinter.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/printer/csv/CsvResultPrinterService.java [moved from src/main/java/jp/naist/se/stigmata/printer/csv/CsvResultPrinterService.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/printer/csv/ExtractionResultSetCsvPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/csv/ExtractionResultSetCsvPrinter.java with 74% similarity]
src/main/java/jp/sourceforge/stigmata/printer/xml/BirthmarkServiceXmlPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/xml/BirthmarkServiceXmlPrinter.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/printer/xml/ComparisonPairXmlPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/xml/ComparisonPairXmlPrinter.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/printer/xml/ComparisonResultSetXmlPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/xml/ComparisonResultSetXmlPrinter.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/printer/xml/ExtractionResultSetXmlPrinter.java [moved from src/main/java/jp/naist/se/stigmata/printer/xml/ExtractionResultSetXmlPrinter.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/printer/xml/XmlResultPrinterService.java [moved from src/main/java/jp/naist/se/stigmata/printer/xml/XmlResultPrinterService.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/reader/ClassFileArchive.java [moved from src/main/java/jp/naist/se/stigmata/reader/ClassFileArchive.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/reader/ClassFileEntry.java [moved from src/main/java/jp/naist/se/stigmata/reader/ClassFileEntry.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/reader/ClasspathContext.java [moved from src/main/java/jp/naist/se/stigmata/reader/ClasspathContext.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/reader/DefaultClassFileArchive.java [moved from src/main/java/jp/naist/se/stigmata/reader/DefaultClassFileArchive.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/reader/JarClassFileArchive.java [moved from src/main/java/jp/naist/se/stigmata/reader/JarClassFileArchive.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/reader/WarClassFileArchive.java [moved from src/main/java/jp/naist/se/stigmata/reader/WarClassFileArchive.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/result/AbstractComparisonResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/AbstractComparisonResultSet.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/result/AbstractExtractionResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/result/CertainPairComparisonResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/CertainPairComparisonResultSet.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/result/MemoryExtractedBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/result/MemoryExtractedBirthmarkService.java with 64% similarity]
src/main/java/jp/sourceforge/stigmata/result/MemoryExtractionResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResultSet.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/result/RDBExtractedBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/result/RDBExtractedBirthmarkService.java with 64% similarity]
src/main/java/jp/sourceforge/stigmata/result/RDBExtractionResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/RDBExtractionResultSet.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/result/RoundRobinComparisonResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/result/SingleExtractionResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/SingleExtractionResultSet.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/result/XmlFileExtractedBirthmarkService.java [moved from src/main/java/jp/naist/se/stigmata/result/XmlFileExtractedBirthmarkService.java with 73% similarity]
src/main/java/jp/sourceforge/stigmata/result/XmlFileExtractionResultSet.java [moved from src/main/java/jp/naist/se/stigmata/result/XmlFileExtractionResultSet.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/result/history/ExtractedBirthmarkHistory.java [moved from src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistory.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/result/history/ExtractedBirthmarkServiceManager.java [moved from src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkServiceManager.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/result/history/MemoryExtractedBirthmarkHistory.java [moved from src/main/java/jp/naist/se/stigmata/result/history/MemoryExtractedBirthmarkHistory.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/result/history/RDBExtractedBirthmarkHistory.java [moved from src/main/java/jp/naist/se/stigmata/result/history/RDBExtractedBirthmarkHistory.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/result/history/XmlFileExtractedBirthmarkHistory.java [moved from src/main/java/jp/naist/se/stigmata/result/history/XmlFileExtractedBirthmarkHistory.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/spi/AbstractServiceProvider.java [moved from src/main/java/jp/naist/se/stigmata/spi/AbstractServiceProvider.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/spi/BirthmarkComparatorSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/BirthmarkComparatorSpi.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/spi/BirthmarkExtractorSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/BirthmarkExtractorSpi.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/spi/BirthmarkSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/BirthmarkSpi.java with 83% similarity]
src/main/java/jp/sourceforge/stigmata/spi/ComparisonPairFilterSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/ComparisonPairFilterSpi.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/spi/ExtractedBirthmarkSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/ExtractedBirthmarkSpi.java with 67% similarity]
src/main/java/jp/sourceforge/stigmata/spi/ResultPrinterSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/ResultPrinterSpi.java with 65% similarity]
src/main/java/jp/sourceforge/stigmata/spi/ServiceProvider.java [moved from src/main/java/jp/naist/se/stigmata/spi/ServiceProvider.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/spi/StigmataHookSpi.java [moved from src/main/java/jp/naist/se/stigmata/spi/StigmataHookSpi.java with 75% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkDefinitionPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkDefinitionPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkExtractionResultPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java with 83% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkSelectablePane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelectablePane.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkSelection.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelection.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkSelectionCheckSetPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelectionCheckSetPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkSelectionListPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelectionListPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkServiceListCellRenderer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkServiceListCellRenderer.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkServiceListener.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkServiceListener.java with 69% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkTree.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkTree.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/BirthmarkTreeNode.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkTreeNode.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/ClassNameObfuscator.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/ClassNameObfuscator.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/ClasspathSettingsPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/ClippedLRListCellRenderer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/ClippedLRListCellRenderer.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/CompareTableCellRenderer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/CompareTableCellRenderer.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/ControlPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/DataChangeListener.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/DataChangeListener.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/ExtensionFilter.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/ExtensionFilter.java with 97% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/ExtractedHistoryPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/ExtractedHistoryPane.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/FileIOManager.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/FileIOManager.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/FilterManagementPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/FilterManagementPane.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/FilterSelectionPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/FilterSelectionPane.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/GUIUtility.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/GUIUtility.java with 96% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/PairComparisonPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonPane.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/PairComparisonResultSetPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonResultSetPane.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/PopupButton.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/PopupButton.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/PropertyEditPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/PropertyEditPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/RoundRobinComparisonResultPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/StigmataFrame.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/TargetSelectionPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/TargetSelectionPane.java with 96% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/UnsupportedFormatException.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/UnsupportedFormatException.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/WellknownClassesSettingsPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/WellknownClassesSettingsPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/AboutAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/AboutAction.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/ChangeColorAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/ChangeColorAction.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/LicenseAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/LicenseAction.java with 74% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/LinkFollower.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/LinkFollower.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/PopupShowAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/PopupShowAction.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/SaveAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/SaveAction.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/ShowTextAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/ShowTextAction.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/actions/UpdateBirthmarkCellColorAction.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/actions/UpdateBirthmarkCellColorAction.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/AbstractComparisonPairFilterComponentService.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/AbstractComparisonPairFilterComponentService.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/BirthmarkElementCountComparisonPairFilterComponentService.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/BirthmarkElementCountComparisonPairFilterComponentService.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/ComparisonPairFilterComponentService.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/ComparisonPairFilterComponentService.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/ComparisonPairFilterListener.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/ComparisonPairFilterListener.java with 75% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/ComparisonPairFilterPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/ComparisonPairFilterPane.java with 84% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/ComparisonPairFilterRetainable.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/ComparisonPairFilterRetainable.java with 72% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/FilterEditingPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/FilterEditingPane.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/FilterSetDefinitionPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/FilterSetDefinitionPane.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/SimilarityComparisonPairFilterComponentService.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/SimilarityComparisonPairFilterComponentService.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/TargetNameComparisonPairFilterComponentService.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/TargetNameComparisonPairFilterComponentService.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/filter/TotalElementCountComparisonPairFilterComponentService.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/filter/TotalElementCountComparisonPairFilterComponentService.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/graph/SimilarityDistributionGraphPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/graph/SimilarityDistributionGraphPane.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/Coordinate.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/Coordinate.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/GeometoryType.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/GeometoryType.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/LabelMap.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/LabelMap.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MDSGraphPanel.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphPanel.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MDSGraphViewer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphViewer.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MDSImageExporter.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSImageExporter.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MDSMethod.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSMethod.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MDSPointsLocationExporter.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSPointsLocationExporter.java with 81% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MarkDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MarkDrawer.java with 80% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/MarkIcon.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/MarkIcon.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/PointComponent.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/PointComponent.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/AbstractMarkDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/AbstractMarkDrawer.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/CircleDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/CircleDrawer.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/CrossDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/CrossDrawer.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/DownerTriangleDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/DownerTriangleDrawer.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/DrawerFactory.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/DrawerFactory.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/LineMarkDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/LineMarkDrawer.java with 85% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/RectangleDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/RectangleDrawer.java with 88% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/RhombusDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/RhombusDrawer.java with 91% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/StarDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/StarDrawer.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/UpperTriangleDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/UpperTriangleDrawer.java with 90% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/mds/mark/XMarkDrawer.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/XMarkDrawer.java with 87% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/tab/EditableGlassPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/tab/EditableGlassPane.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/tab/EditableTabbedPane.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/tab/EditableTabbedPane.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/ui/swing/tab/EditableTabbedPaneFocusTraversalPolicy.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/tab/EditableTabbedPaneFocusTraversalPolicy.java with 92% similarity]
src/main/java/jp/sourceforge/stigmata/utils/ArrayIterator.java [moved from src/main/java/jp/naist/se/stigmata/utils/ArrayIterator.java with 89% similarity]
src/main/java/jp/sourceforge/stigmata/utils/AsciiDataWritable.java [moved from src/main/java/jp/naist/se/stigmata/utils/AsciiDataWritable.java with 70% similarity]
src/main/java/jp/sourceforge/stigmata/utils/BinaryDataWritable.java [moved from src/main/java/jp/naist/se/stigmata/utils/BinaryDataWritable.java with 71% similarity]
src/main/java/jp/sourceforge/stigmata/utils/ConfigFileExporter.java [moved from src/main/java/jp/naist/se/stigmata/utils/ConfigFileExporter.java with 93% similarity]
src/main/java/jp/sourceforge/stigmata/utils/ConfigFileImporter.java [moved from src/main/java/jp/naist/se/stigmata/utils/ConfigFileImporter.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/utils/LocalizedDescriptionManager.java [moved from src/main/java/jp/naist/se/stigmata/utils/LocalizedDescriptionManager.java with 94% similarity]
src/main/java/jp/sourceforge/stigmata/utils/MultipleIterator.java [moved from src/main/java/jp/naist/se/stigmata/utils/MultipleIterator.java with 97% similarity]
src/main/java/jp/sourceforge/stigmata/utils/Names.java [moved from src/main/java/jp/naist/se/stigmata/utils/Names.java with 96% similarity]
src/main/java/jp/sourceforge/stigmata/utils/NullIterator.java [moved from src/main/java/jp/naist/se/stigmata/utils/NullIterator.java with 86% similarity]
src/main/java/jp/sourceforge/stigmata/utils/Utility.java [moved from src/main/java/jp/naist/se/stigmata/utils/Utility.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/utils/WarClassLoader.java [moved from src/main/java/jp/naist/se/stigmata/utils/WarClassLoader.java with 95% similarity]
src/main/java/jp/sourceforge/stigmata/utils/WellknownClassJudgeRule.java [moved from src/main/java/jp/naist/se/stigmata/utils/WellknownClassJudgeRule.java with 98% similarity]
src/main/java/jp/sourceforge/stigmata/utils/WellknownClassManager.java [moved from src/main/java/jp/naist/se/stigmata/utils/WellknownClassManager.java with 96% similarity]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkComparatorSpi [deleted file]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkExtractorSpi [deleted file]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi [deleted file]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ComparisonPairFilterSpi [deleted file]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi [deleted file]
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ResultPrinterSpi [deleted file]
src/main/resources/META-INF/services/jp.naist.se.stigmata.ui.swing.filter.ComparisonPairFilterComponentService [deleted file]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkComparatorSpi [new file with mode: 0755]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkExtractorSpi [new file with mode: 0755]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkSpi [new file with mode: 0755]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi [new file with mode: 0755]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi [new file with mode: 0755]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ResultPrinterSpi [new file with mode: 0755]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.StigmataHookSpi [moved from src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.StigmataHookSpi with 100% similarity]
src/main/resources/META-INF/services/jp.sourceforge.stigmata.ui.swing.filter.ComparisonPairFilterComponentService [new file with mode: 0755]
src/main/resources/resources/options.properties
src/main/resources/resources/options_ja.source
src/main/resources/resources/stigmata.xml
src/site/apt/download.apt
src/site/apt/index.apt
src/site/site.xml
src/test/java/jp/sourceforge/stigmata/ServiceListTest.java [moved from src/test/java/jp/naist/se/stigmata/ServiceListTest.java with 94% similarity]
src/test/java/jp/sourceforge/stigmata/StigmataTest.java [moved from src/test/java/jp/naist/se/stigmata/StigmataTest.java with 74% similarity]
src/test/java/jp/sourceforge/stigmata/birthmarks/BirthmarkCompareTest.java [moved from src/test/java/jp/naist/se/stigmata/birthmarks/BirthmarkCompareTest.java with 69% similarity]
src/test/java/jp/sourceforge/stigmata/birthmarks/cvfv/CVFVBirthmarkExtractorTest.java [moved from src/test/java/jp/naist/se/stigmata/birthmarks/cvfv/CVFVBirthmarkExtractorTest.java with 70% similarity]
src/test/java/jp/sourceforge/stigmata/birthmarks/is/ISBirthmarkExtractorTest.java [moved from src/test/java/jp/naist/se/stigmata/birthmarks/is/ISBirthmarkExtractorTest.java with 75% similarity]
src/test/java/jp/sourceforge/stigmata/birthmarks/kgram/KGramTest.java [moved from src/test/java/jp/naist/se/stigmata/birthmarks/kgram/KGramTest.java with 98% similarity]
src/test/java/jp/sourceforge/stigmata/birthmarks/smc/SmcBirthmarkExtractorTest.java [moved from src/test/java/jp/naist/se/stigmata/birthmarks/smc/SmcBirthmarkExtractorTest.java with 93% similarity]
src/test/java/jp/sourceforge/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java [moved from src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java with 87% similarity]

index e6669e8..e0abb54 100755 (executable)
 * Author
 
   Name:        Haruaki TAMADA, Ph.D.
-  Affiliation: Software Engineering Laboratory, Graduate School of
-               Information and Science, Nara Institute of Science and
-               Technology
-  E-mail:      harua-t[ at ]is.naist.jp
-  Web Page:    http://se.naist.jp/~harua-t/
+  Affiliation: Department of Computer Science, Faculty of Computer
+               Science and Engineering, Kyoto Sangyo University
+  E-mail:      tama3[ at ]users.sourceforge.jp
+  Web Page:    http://stigmata.sourceforge.jp/
 
   Please notify us some bugs and requests to 
   mailto:stigmata-info[ at ]lists.sourceforge.jp
diff --git a/pom.xml b/pom.xml
index b5116bc..94c78c9 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <project>
   <modelVersion>4.0.0</modelVersion>
-  <groupId>jp.naist.se</groupId>
+  <groupId>jp.sourceforge</groupId>
   <artifactId>stigmata</artifactId>
   <version>1.2.0</version>
   <name>stigmata</name>
     <developer>
       <id>tama</id>
       <name>Haruaki TAMADA</name>
-      <email>harua-t[ at ]is.naist.jp</email>
-      <organization>NAIST, Software Engineering Lab.</organization>
-      <organizationUrl>http://se.naist.jp/</organizationUrl>
+      <email>tama3[ at ]users.sourceforge.jp</email>
+      <organization>sourceforge.jp</organization>
+      <organizationUrl>http://sourceforge.jp/</organizationUrl>
       <timezone>-9</timezone>
     </developer>
   </developers>
 
   <organization>
-    <name>Software Engineering Lab., NAIST</name>
-    <url>http://se.naist.jp/</url>
+    <name>Kyoto Sangyo University, Japan</name>
+    <url>http://www.kyoto-su.ac.jp/</url>
   </organization>
 
   <dependencies>
         <configuration>
           <archive>
             <manifest>
-              <mainClass>jp.naist.se.stigmata.Main</mainClass>
+              <mainClass>jp.sourceforge.stigmata.Main</mainClass>
               <addClasspath>true</addClasspath>
               <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
             </manifest>
index 497578e..c712bec 100755 (executable)
@@ -24,9 +24,9 @@ ShowInstDetails nevershow
 \r
 VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Stigmata"\r
 VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "Stigmata: Java birthmark toolkit"\r
-VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Software Engineering Lab., NAIST, Japan"\r
+VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Kyoto Sangyo University, Japan"\r
 VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "${VERSION}"\r
-VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright (C) 2004-2007 by Haruaki Tamada"\r
+VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright (C) 2004-2008 by Haruaki Tamada"\r
 VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Java birthmark toolkit"\r
 VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${VERSION}"\r
 \r
@@ -69,10 +69,12 @@ Section "running-stigmata"
   File "..\..\target\commons-logging-1.0.3.jar"\r
   File "..\..\target\BrowserLauncher2-1.3.jar"\r
   File "..\..\target\Jama-1.0.2.jar"\r
-  File "..\..\target\xmlcli-1.2.2.jar"\r
   File "..\..\target\asm-all-2.2.3.jar"\r
   File "..\..\target\stax-1.2.0.jar"\r
   File "..\..\target\stax-api-1.0.1.jar"\r
+  File "..\..\target\xmlcli-1.2.2.jar"\r
+  File "..\..\target\mds-1.0.0.jar"\r
+  File "..\..\target\i18n-1.0.1.jar"\r
   StrCpy $R0 '$R0 -Dexecution.directory="$EXEDIR" -jar "${JARFILE}" $R1'\r
 \r
   !ifdef SPLASH_IMAGE\r
@@ -84,16 +86,18 @@ Section "running-stigmata"
 \r
   ExecWait "$R0"\r
   Delete "$TEMP\${JARFILE}"\r
-  Delete "$TEMP\target\commons-beanutils-1.7.0.jar"\r
-  Delete "$TEMP\target\commons-cli-1.1.jar"\r
-  Delete "$TEMP\target\commons-dbutils-1.1.jar"\r
-  Delete "$TEMP\target\commons-logging-1.0.3.jar"\r
-  Delete "$TEMP\target\BrowserLauncher2-1.3.jar"\r
-  Delete "$TEMP\target\Jama-1.0.2.jar"\r
-  Delete "$TEMP\target\xmlcli-1.2.2.jar"\r
-  Delete "$TEMP\target\asm-all-2.2.3.jar"\r
-  Delete "$TEMP\target\stax-1.2.0.jar"\r
-  Delete "$TEMP\target\stax-api-1.0.1.jar"\r
+  Delete "$TEMP\commons-beanutils-1.7.0.jar"\r
+  Delete "$TEMP\commons-cli-1.1.jar"\r
+  Delete "$TEMP\commons-dbutils-1.1.jar"\r
+  Delete "$TEMP\commons-logging-1.0.3.jar"\r
+  Delete "$TEMP\BrowserLauncher2-1.3.jar"\r
+  Delete "$TEMP\Jama-1.0.2.jar"\r
+  Delete "$TEMP\asm-all-2.2.3.jar"\r
+  Delete "$TEMP\stax-1.2.0.jar"\r
+  Delete "$TEMP\stax-api-1.0.1.jar"\r
+  Delete "$TEMP\xmlcli-1.2.2.jar"\r
+  Delete "$TEMP\mds-1.0.0.jar"\r
+  Delete "$TEMP\i18n-1.0.1.jar"\r
 \r
   Quit\r
 \r
@@ -131,4 +135,4 @@ Function GetParameters
   Pop $R2\r
   Pop $R1\r
   Exch $R0\r
-FunctionEnd
\ No newline at end of file
+FunctionEnd\r
index 069993f..09be90f 100755 (executable)
@@ -25,7 +25,7 @@
     <key>Java</key>
     <dict>
       <key>MainClass</key>
-      <string>jp.naist.se.stigmata.Main</string>
+      <string>jp.sourceforge.stigmata.Main</string>
       <key>JVMVersion</key>
       <string>1.5+</string>
       <key>ClassPath</key>
@@ -41,6 +41,8 @@
         <string>$JAVAROOT/BrowserLauncher2-1.3.jar</string>
         <string>$JAVAROOT/Jama-1.0.2.jar</string>
         <string>$JAVAROOT/xmlcli-1.2.2.jar</string>
+        <string>$JAVAROOT/mds-1.0.0.jar</string>
+        <string>$JAVAROOT/i18n-1.0.1.jar</string>
       </array>
       <key>Properties</key>
       <dict>
@@ -1,31 +1,31 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * Thrown an application fails to launch in initialization.\r
- * This error causes invalid deployment. \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ApplicationInitializationError extends Error{\r
-    private static final long serialVersionUID = 32097456654328L;\r
-\r
-    public ApplicationInitializationError(){\r
-    }\r
-\r
-    public ApplicationInitializationError(String message){\r
-        super(message);\r
-    }\r
-\r
-    public ApplicationInitializationError(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-\r
-    public ApplicationInitializationError(Throwable cause){\r
-        super(cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * Thrown an application fails to launch in initialization.
+ * This error causes invalid deployment. 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ApplicationInitializationError extends Error{
+    private static final long serialVersionUID = 32097456654328L;
+
+    public ApplicationInitializationError(){
+    }
+
+    public ApplicationInitializationError(String message){
+        super(message);
+    }
+
+    public ApplicationInitializationError(String message, Throwable cause){
+        super(message, cause);
+    }
+
+    public ApplicationInitializationError(Throwable cause){
+        super(cause);
+    }
+}
@@ -1,30 +1,30 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * Thrown to indicate failed to compare two birthmarks. \r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkComparisonFailedException extends BirthmarkException{\r
-    private static final long serialVersionUID = 3194872113405859851L;\r
-\r
-    public BirthmarkComparisonFailedException(){\r
-    }\r
-\r
-    public BirthmarkComparisonFailedException(String message){\r
-        super(message);\r
-    }\r
-\r
-    public BirthmarkComparisonFailedException(Throwable cause){\r
-        super(cause);\r
-    }\r
-\r
-    public BirthmarkComparisonFailedException(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * Thrown to indicate failed to compare two birthmarks. 
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkComparisonFailedException extends BirthmarkException{
+    private static final long serialVersionUID = 3194872113405859851L;
+
+    public BirthmarkComparisonFailedException(){
+    }
+
+    public BirthmarkComparisonFailedException(String message){
+        super(message);
+    }
+
+    public BirthmarkComparisonFailedException(Throwable cause){
+        super(cause);
+    }
+
+    public BirthmarkComparisonFailedException(String message, Throwable cause){
+        super(message, cause);
+    }
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-/**\r
- * Birthmark runtime context.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkContext{\r
-    private BirthmarkEnvironment environment;\r
-\r
-    private ComparisonMethod method = ComparisonMethod.ROUND_ROBIN_SAME_PAIR;\r
-    private ExtractionUnit unit = ExtractionUnit.CLASS;\r
-    private BirthmarkStoreTarget store = BirthmarkStoreTarget.MEMORY;\r
-\r
-    private List<String> birthmarkTypes = new ArrayList<String>();\r
-    private List<String> filterTypes = new ArrayList<String>();\r
-    private Map<String, String> nameMappings = new HashMap<String, String>();\r
-\r
-    /**\r
-     * self constructor.\r
-     */\r
-    public BirthmarkContext(BirthmarkContext context){\r
-        this.environment = context.getEnvironment();\r
-        this.method = context.getComparisonMethod();\r
-        this.unit = context.getExtractionUnit();\r
-        this.birthmarkTypes = new ArrayList<String>(context.birthmarkTypes);\r
-        this.filterTypes = new ArrayList<String>(context.filterTypes);\r
-        this.nameMappings = new HashMap<String, String>(context.nameMappings);\r
-    }\r
-\r
-    public BirthmarkContext(BirthmarkEnvironment environment){\r
-        this.environment = environment;\r
-    }\r
-\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return environment;\r
-    }\r
-\r
-    public boolean hasNameMapping(){\r
-        return getNameMappingCount() > 0;\r
-    }\r
-\r
-    public int getNameMappingCount(){\r
-        return nameMappings.size();\r
-    }\r
-\r
-    public String getNameMapping(String key){\r
-        return nameMappings.get(key);\r
-    }\r
-\r
-    public void addNameMapping(String name1, String name2){\r
-        nameMappings.put(name1, name2);\r
-    }\r
-\r
-    public void removeNameMapping(String name1){\r
-        nameMappings.remove(name1);\r
-    }\r
-\r
-    public Map<String, String> getNameMappings(){\r
-        return Collections.unmodifiableMap(nameMappings);\r
-    }\r
-\r
-    public Iterator<Map.Entry<String, String>> nameMappingEntries(){\r
-        return getNameMappings().entrySet().iterator();\r
-    }\r
-\r
-    public void setNameMappings(Map<String, String> mappings){\r
-        nameMappings.clear();\r
-        for(Iterator<Map.Entry<String, String>> i = mappings.entrySet().iterator(); i.hasNext(); ){\r
-            Map.Entry<String, String> entry = i.next();\r
-            addNameMapping(entry.getKey(), entry.getValue());\r
-        }\r
-    }\r
-\r
-    public void setBirthmarkTypes(String[] types){\r
-        birthmarkTypes.clear();\r
-        for(int i = 0; i < types.length; i++){\r
-            addBirthmarkType(types[i]);\r
-        }\r
-    }\r
-\r
-    public void addBirthmarkType(String type){\r
-        if(!birthmarkTypes.contains(type)){\r
-            birthmarkTypes.add(type);\r
-        }\r
-    }\r
-\r
-    public void removeBirthmarkType(String type){\r
-        birthmarkTypes.remove(type);\r
-    }\r
-\r
-    public synchronized String[] getBirthmarkTypes(){\r
-        return birthmarkTypes.toArray(new String[getBirthmarkTypeSize()]);\r
-    }\r
-\r
-    public int getBirthmarkTypeSize(){\r
-        return birthmarkTypes.size();\r
-    }\r
-\r
-    public ComparisonMethod getComparisonMethod(){\r
-        return method;\r
-    }\r
-\r
-    public void setComparisonMethod(ComparisonMethod method){\r
-        this.method = method;\r
-    }\r
-\r
-    public ExtractionUnit getExtractionUnit(){\r
-        return unit;\r
-    }\r
-\r
-    public void setExtractionUnit(ExtractionUnit unit){\r
-        this.unit = unit;\r
-    }\r
-\r
-    public BirthmarkStoreTarget getStoreTarget(){\r
-        return store;\r
-    }\r
-\r
-    public void setStoreTarget(BirthmarkStoreTarget store){\r
-        this.store = store;\r
-    }\r
-\r
-    public boolean hasFilter(){\r
-        return filterTypes.size() > 0;\r
-    }\r
-\r
-    public void setFilterTypes(String[] filterTypes){\r
-        if(filterTypes != null){\r
-            for(int i = 0; i < filterTypes.length; i++){\r
-                addFilterType(filterTypes[i]);\r
-            }\r
-        }\r
-    }\r
-\r
-    public void addFilterType(String filterType){\r
-        if(filterType != null){\r
-            filterTypes.add(filterType);\r
-        }\r
-    }\r
-\r
-    public void removeFilterType(String filterType){\r
-        filterTypes.remove(filterType);\r
-    }\r
-\r
-    public synchronized String[] getFilterTypes(){\r
-        return filterTypes.toArray(new String[getFilterTypesCount()]);\r
-    }\r
-\r
-    public Iterator<String> filterTypes(){\r
-        return filterTypes.iterator();\r
-    }\r
-\r
-    public int getFilterTypesCount(){\r
-        return filterTypes.size();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Birthmark runtime context.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkContext{
+    private BirthmarkEnvironment environment;
+
+    private ComparisonMethod method = ComparisonMethod.ROUND_ROBIN_SAME_PAIR;
+    private ExtractionUnit unit = ExtractionUnit.CLASS;
+    private BirthmarkStoreTarget store = BirthmarkStoreTarget.MEMORY;
+
+    private List<String> birthmarkTypes = new ArrayList<String>();
+    private List<String> filterTypes = new ArrayList<String>();
+    private Map<String, String> nameMappings = new HashMap<String, String>();
+
+    /**
+     * self constructor.
+     */
+    public BirthmarkContext(BirthmarkContext context){
+        this.environment = context.getEnvironment();
+        this.method = context.getComparisonMethod();
+        this.unit = context.getExtractionUnit();
+        this.birthmarkTypes = new ArrayList<String>(context.birthmarkTypes);
+        this.filterTypes = new ArrayList<String>(context.filterTypes);
+        this.nameMappings = new HashMap<String, String>(context.nameMappings);
+    }
+
+    public BirthmarkContext(BirthmarkEnvironment environment){
+        this.environment = environment;
+    }
+
+    public BirthmarkEnvironment getEnvironment(){
+        return environment;
+    }
+
+    public boolean hasNameMapping(){
+        return getNameMappingCount() > 0;
+    }
+
+    public int getNameMappingCount(){
+        return nameMappings.size();
+    }
+
+    public String getNameMapping(String key){
+        return nameMappings.get(key);
+    }
+
+    public void addNameMapping(String name1, String name2){
+        nameMappings.put(name1, name2);
+    }
+
+    public void removeNameMapping(String name1){
+        nameMappings.remove(name1);
+    }
+
+    public Map<String, String> getNameMappings(){
+        return Collections.unmodifiableMap(nameMappings);
+    }
+
+    public Iterator<Map.Entry<String, String>> nameMappingEntries(){
+        return getNameMappings().entrySet().iterator();
+    }
+
+    public void setNameMappings(Map<String, String> mappings){
+        nameMappings.clear();
+        for(Iterator<Map.Entry<String, String>> i = mappings.entrySet().iterator(); i.hasNext(); ){
+            Map.Entry<String, String> entry = i.next();
+            addNameMapping(entry.getKey(), entry.getValue());
+        }
+    }
+
+    public void setBirthmarkTypes(String[] types){
+        birthmarkTypes.clear();
+        for(int i = 0; i < types.length; i++){
+            addBirthmarkType(types[i]);
+        }
+    }
+
+    public void addBirthmarkType(String type){
+        if(!birthmarkTypes.contains(type)){
+            birthmarkTypes.add(type);
+        }
+    }
+
+    public void removeBirthmarkType(String type){
+        birthmarkTypes.remove(type);
+    }
+
+    public synchronized String[] getBirthmarkTypes(){
+        return birthmarkTypes.toArray(new String[getBirthmarkTypeSize()]);
+    }
+
+    public int getBirthmarkTypeSize(){
+        return birthmarkTypes.size();
+    }
+
+    public ComparisonMethod getComparisonMethod(){
+        return method;
+    }
+
+    public void setComparisonMethod(ComparisonMethod method){
+        this.method = method;
+    }
+
+    public ExtractionUnit getExtractionUnit(){
+        return unit;
+    }
+
+    public void setExtractionUnit(ExtractionUnit unit){
+        this.unit = unit;
+    }
+
+    public BirthmarkStoreTarget getStoreTarget(){
+        return store;
+    }
+
+    public void setStoreTarget(BirthmarkStoreTarget store){
+        this.store = store;
+    }
+
+    public boolean hasFilter(){
+        return filterTypes.size() > 0;
+    }
+
+    public void setFilterTypes(String[] filterTypes){
+        if(filterTypes != null){
+            for(int i = 0; i < filterTypes.length; i++){
+                addFilterType(filterTypes[i]);
+            }
+        }
+    }
+
+    public void addFilterType(String filterType){
+        if(filterType != null){
+            filterTypes.add(filterType);
+        }
+    }
+
+    public void removeFilterType(String filterType){
+        filterTypes.remove(filterType);
+    }
+
+    public synchronized String[] getFilterTypes(){
+        return filterTypes.toArray(new String[getFilterTypesCount()]);
+    }
+
+    public Iterator<String> filterTypes(){
+        return filterTypes.iterator();
+    }
+
+    public int getFilterTypesCount(){
+        return filterTypes.size();
+    }
+}
@@ -1,56 +1,56 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-/**\r
- * Thrown if extracting birthmark is failed to find a class definition.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkElementClassNotFoundException extends\r
-               BirthmarkExtractionFailedException {\r
-    private static final long serialVersionUID = 3256723476854L;\r
-\r
-    /**\r
-     * class name list, which names are failed to load.\r
-     */\r
-    private List<String> classnames = new ArrayList<String>();\r
-\r
-    /**\r
-     * \r
-     */\r
-    public void addClassName(String name){\r
-       classnames.add(name);\r
-    }\r
-\r
-    @Override\r
-    public boolean isFailed(){\r
-       return super.isFailed() || classnames.size() > 0;\r
-    }\r
-\r
-    /**\r
-     * returns an array of class names which are failed loading.\r
-     */\r
-    public synchronized String[] getClassNames(){\r
-       return classnames.toArray(new String[classnames.size()]);\r
-    }\r
-\r
-    @Override\r
-    public String getMessage(){\r
-       StringBuffer sb = new StringBuffer();\r
-       boolean first = true;\r
-       for(String value: classnames){\r
-           if(!first){\r
-               sb.append(", ");\r
-           }\r
-           sb.append(value);\r
-       }\r
-       return new String(sb);\r
-    }\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Thrown if extracting birthmark is failed to find a class definition.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkElementClassNotFoundException extends
+               BirthmarkExtractionFailedException {
+    private static final long serialVersionUID = 3256723476854L;
+
+    /**
+     * class name list, which names are failed to load.
+     */
+    private List<String> classnames = new ArrayList<String>();
+
+    /**
+     * 
+     */
+    public void addClassName(String name){
+       classnames.add(name);
+    }
+
+    @Override
+    public boolean isFailed(){
+       return super.isFailed() || classnames.size() > 0;
+    }
+
+    /**
+     * returns an array of class names which are failed loading.
+     */
+    public synchronized String[] getClassNames(){
+       return classnames.toArray(new String[classnames.size()]);
+    }
+
+    @Override
+    public String getMessage(){
+       StringBuffer sb = new StringBuffer();
+       boolean first = true;
+       for(String value: classnames){
+           if(!first){
+               sb.append(", ");
+           }
+           sb.append(value);
+       }
+       return new String(sb);
+    }
 }
\ No newline at end of file
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.MalformedURLException;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Stack;\r
-\r
-import jp.naist.se.stigmata.birthmarks.extractors.BirthmarkExtractorFactory;\r
-import jp.naist.se.stigmata.event.BirthmarkEngineEvent;\r
-import jp.naist.se.stigmata.event.BirthmarkEngineListener;\r
-import jp.naist.se.stigmata.event.OperationStage;\r
-import jp.naist.se.stigmata.event.OperationType;\r
-import jp.naist.se.stigmata.event.WarningMessages;\r
-import jp.naist.se.stigmata.filter.ComparisonPairFilterManager;\r
-import jp.naist.se.stigmata.filter.FilteredComparisonResultSet;\r
-import jp.naist.se.stigmata.hook.Phase;\r
-import jp.naist.se.stigmata.hook.StigmataHookManager;\r
-import jp.naist.se.stigmata.reader.ClassFileArchive;\r
-import jp.naist.se.stigmata.reader.ClassFileEntry;\r
-import jp.naist.se.stigmata.reader.ClasspathContext;\r
-import jp.naist.se.stigmata.reader.DefaultClassFileArchive;\r
-import jp.naist.se.stigmata.reader.JarClassFileArchive;\r
-import jp.naist.se.stigmata.reader.WarClassFileArchive;\r
-import jp.naist.se.stigmata.result.CertainPairComparisonResultSet;\r
-import jp.naist.se.stigmata.result.RoundRobinComparisonResultSet;\r
-\r
-/**\r
- * core engine for extracting/comparing/filtering birthmarks.\r
- * \r
- * This class is not thread safe.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkEngine{\r
-    private BirthmarkEnvironment environment;\r
-    private List<BirthmarkEngineListener> listeners = new ArrayList<BirthmarkEngineListener>();\r
-    private Stack<WarningMessages> stack = new Stack<WarningMessages>();\r
-    private WarningMessages warnings;\r
-    private OperationType latestOperationType;\r
-    private OperationType targetType;\r
-    private BirthmarkExtractorFactory factory;\r
-\r
-    /**\r
-     * constructor.\r
-     */\r
-    public BirthmarkEngine(BirthmarkEnvironment env){\r
-        this.environment = env;\r
-        factory = new BirthmarkExtractorFactory(env);\r
-    }\r
-\r
-    /**\r
-     * returns an environment of this object.\r
-     */\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return environment;\r
-    }\r
-\r
-    public void addBirthmarkEngineListener(BirthmarkEngineListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void removeBirthmarkEngineListener(BirthmarkEngineListener listener){\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    /**\r
-     * filters comparison of birthmarks from target files.\r
-     * @see #extract(String[], BirthmarkContext)\r
-     * @see #compare(String[], BirthmarkContext)\r
-     * @see #filter(ComparisonResultSet)\r
-     * @see BirthmarkContext#getFilterTypes()\r
-     */\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
-        crs = filter(crs);\r
-\r
-        operationDone(OperationType.FILTER_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\r
-    /**\r
-     * filters comparison of birthmarks from given two targets targetx, and targetY\r
-     * @see #extract(String[], String[], BirthmarkContext)\r
-     * @see #compare(String[], String[], BirthmarkContext)\r
-     * @see #filter(ComparisonResultSet)\r
-     * @see BirthmarkContext#getFilterTypes()\r
-     */\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
-        crs = filter(crs);\r
-\r
-        operationDone(OperationType.FILTER_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\r
-    /**\r
-     * filters comparison of birthmarks from given extraction result set.\r
-     * @see #compare(ExtractionResultSet)\r
-     * @see #filter(ComparisonResultSet)\r
-     * @see ExtractionResultSet#getContext()\r
-     * @see BirthmarkContext#getFilterTypes()\r
-     */\r
-    public synchronized ComparisonResultSet filter(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
-        operationStart(OperationType.FILTER_BIRTHMARKS);\r
-\r
-        ComparisonResultSet crs = compare(er);\r
-        crs = filter(crs);\r
-\r
-        operationDone(OperationType.FILTER_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\r
-    /**\r
-     * filters comparison of birthmarks.\r
-     * @see ExtractionResultSet#getContext()\r
-     * @see BirthmarkContext#getFilterTypes()\r
-     */\r
-    public synchronized ComparisonResultSet filter(ComparisonResultSet crs) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
-        operationStart(OperationType.FILTER_BIRTHMARKS);\r
-        StigmataHookManager.getInstance().runHook(Phase.BEFORE_FILTERING, crs.getContext());\r
-\r
-        String[] filterTypes = crs.getContext().getFilterTypes();\r
-\r
-        if(filterTypes != null){\r
-            List<ComparisonPairFilterSet> filterList = new ArrayList<ComparisonPairFilterSet>();\r
-            ComparisonPairFilterManager manager = environment.getFilterManager();\r
-            for(int i = 0; i < filterTypes.length; i++){\r
-                ComparisonPairFilterSet fset = manager.getFilterSet(filterTypes[i]);\r
-                if(fset != null){\r
-                    filterList.add(fset);\r
-                }\r
-                else{\r
-                    warnings.addMessage(new FilterNotFoundException("filter not found"), filterTypes[i]);\r
-                }\r
-            }\r
-            ComparisonPairFilterSet[] cpfs = filterList.toArray(new ComparisonPairFilterSet[filterList.size()]);\r
-\r
-            crs = new FilteredComparisonResultSet(crs, cpfs);\r
-        }\r
-\r
-        StigmataHookManager.getInstance().runHook(Phase.AFTER_FILTERING, crs.getContext());\r
-        operationDone(OperationType.FILTER_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\r
-    /**\r
-     * compares two given birthmarks and returns comparison pair.\r
-     */\r
-    public synchronized ComparisonPair compareDetails(BirthmarkSet bs1, BirthmarkSet bs2, BirthmarkContext context) throws BirthmarkComparisonFailedException{\r
-        return new ComparisonPair(bs1, bs2, context);\r
-    }\r
-\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
-        ComparisonResultSet crs = compare(er);\r
-\r
-        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\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
-        ComparisonResultSet crs = compare(er);\r
-\r
-        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\r
-    public synchronized ComparisonResultSet compare(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
-        operationStart(OperationType.COMPARE_BIRTHMARKS);\r
-        BirthmarkContext context = er.getContext();\r
-\r
-        StigmataHookManager.getInstance().runHook(Phase.BEFORE_COMPARISON, context);\r
-        ComparisonResultSet crs = null;\r
-        switch(context.getComparisonMethod()){\r
-        case ROUND_ROBIN_SAME_PAIR:\r
-            crs = new RoundRobinComparisonResultSet(er, true);\r
-            break;\r
-        case ROUND_ROBIN_WITHOUT_SAME_PAIR:\r
-            crs = new RoundRobinComparisonResultSet(er, false);\r
-            break;\r
-        case ROUND_ROBIN_XY:\r
-            crs = new RoundRobinComparisonResultSet(er, true);\r
-        case GUESSED_PAIR:\r
-            crs = new CertainPairComparisonResultSet(er);\r
-            break;\r
-        case SPECIFIED_PAIR:\r
-            crs = new CertainPairComparisonResultSet(er, context.getNameMappings());\r
-            break;\r
-        }\r
-\r
-        StigmataHookManager.getInstance().runHook(Phase.AFTER_COMPARISON, context);\r
-        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
-\r
-        return crs;\r
-    }\r
-\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, BirthmarkStoreException{\r
-        operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
-        ExtractionResultSet er = context.getEnvironment().getHistoryManager().createDefaultResultSet(context);\r
-\r
-        try{\r
-            StigmataHookManager.getInstance().runHook(Phase.BEFORE_EXTRACTION, context);\r
-\r
-            switch(context.getComparisonMethod()){\r
-            case ROUND_ROBIN_SAME_PAIR:\r
-            case ROUND_ROBIN_WITHOUT_SAME_PAIR:\r
-                er.setTableType(false);\r
-                String[] targetXY = mergeTarget(targetX, targetY);\r
-                extractImpl(targetXY, er, ExtractionTarget.TARGET_XY);\r
-                break;\r
-            case GUESSED_PAIR:\r
-            case SPECIFIED_PAIR:\r
-            case ROUND_ROBIN_XY:\r
-            default:\r
-                if(targetX == null || targetY == null){\r
-                    throw new BirthmarkExtractionFailedException("targetX or targetY is null");\r
-                }\r
-                er.setTableType(true);\r
-                extractImpl(targetX, er, ExtractionTarget.TARGET_X);\r
-                extractImpl(targetY, er, ExtractionTarget.TARGET_Y);\r
-                break;\r
-            }\r
-            return er;\r
-        } catch(IOException e){\r
-            throw new BirthmarkExtractionFailedException(e);\r
-        } finally{\r
-            StigmataHookManager.getInstance().runHook(Phase.AFTER_EXTRACTION, context);\r
-            operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
-        }\r
-    }\r
-\r
-    private String[] mergeTarget(String[] t1, String[] t2){\r
-        List<String> list = new ArrayList<String>();\r
-        addToList(list, t1);\r
-        addToList(list, t2);\r
-\r
-        return list.toArray(new String[list.size()]);\r
-    }\r
-\r
-    private void addToList(List<String> list, String[] target){\r
-        if(target != null){\r
-            for(String s: target){\r
-                list.add(s);\r
-            }\r
-        }\r
-    }\r
-\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
-        BirthmarkSet[] extractResult = null;\r
-        if(unit == ExtractionUnit.CLASS){\r
-            extractFromClass(archives, er, et);\r
-        }\r
-        else if(unit == ExtractionUnit.PACKAGE){\r
-            extractFromPackage(archives, er, et);\r
-        }\r
-        else if(unit == ExtractionUnit.ARCHIVE){\r
-            extractFromProduct(archives, er, et);\r
-        }\r
-\r
-        return extractResult;\r
-    }\r
-\r
-    private byte[] inputStreamToByteArray(InputStream in) throws IOException{\r
-        ByteArrayOutputStream bout = new ByteArrayOutputStream();\r
-        int read;\r
-        byte[] dataBuffer = new byte[512];\r
-        while((read = in.read(dataBuffer, 0, dataBuffer.length)) != -1){\r
-            bout.write(dataBuffer, 0, read);\r
-        }\r
-        byte[] data = bout.toByteArray();\r
-\r
-        bout.close();\r
-        return data;\r
-    }\r
-\r
-    private void extractFromPackage(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
-        Map<String, BirthmarkSet> map = new HashMap<String, BirthmarkSet>();\r
-        BirthmarkContext context = er.getContext();\r
-\r
-        for(ClassFileArchive archive: archives){\r
-            for(ClassFileEntry entry: archive){\r
-                try{\r
-                    String name = entry.getClassName();\r
-                    String packageName = parsePackageName(name);\r
-                    BirthmarkSet bs = map.get(packageName);\r
-                    if(bs == null){\r
-                        bs = new BirthmarkSet(packageName, archive.getLocation());\r
-                        map.put(packageName, bs);\r
-                    }\r
-\r
-                    byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
-                    for(String birthmarkType: context.getBirthmarkTypes()){\r
-                        try{\r
-                            BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);\r
-                            if(extractor.isAcceptable(ExtractionUnit.PACKAGE)){\r
-                                Birthmark b = bs.getBirthmark(extractor.getProvider().getType());\r
-                                if(b == null){\r
-                                    b = extractor.createBirthmark();\r
-                                    bs.addBirthmark(b);\r
-                                }\r
-                                extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment());\r
-                            }\r
-                        } catch(ExtractorNotFoundException e){\r
-                            warnings.addMessage(e, birthmarkType);\r
-                        }\r
-                    }\r
-                } catch(IOException e){\r
-                    warnings.addMessage(e, archive.getName());\r
-                }\r
-            }\r
-        }\r
-        try{\r
-            for(BirthmarkSet bs: map.values()){\r
-                er.addBirthmarkSet(et, bs);\r
-            }\r
-        }catch(BirthmarkStoreException e){\r
-        }\r
-    }\r
-\r
-    private String parsePackageName(String name){\r
-        String n = name.replace('/', '.');\r
-        int index = n.lastIndexOf('.');\r
-        if(index > 0){\r
-            n = n.substring(0, index - 1);\r
-        }\r
-\r
-        return n;\r
-    }\r
-\r
-    private void extractFromClass(ClassFileArchive[] archives, ExtractionResultSet er,\r
-            ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{\r
-        BirthmarkContext context = er.getContext();\r
-\r
-        for(ClassFileArchive archive: archives){\r
-            for(ClassFileEntry entry: archive){\r
-                try{\r
-                    BirthmarkSet birthmarkset = new BirthmarkSet(entry.getClassName(), entry.getLocation());\r
-                    byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
-\r
-                    for(String birthmarkType: context.getBirthmarkTypes()){\r
-                        try{\r
-                            BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);\r
-                            if(extractor.isAcceptable(ExtractionUnit.CLASS)){\r
-                                Birthmark b = extractor.extract(new ByteArrayInputStream(data), er.getEnvironment());\r
-                                birthmarkset.addBirthmark(b);\r
-                            }\r
-                        } catch(ExtractorNotFoundException e){\r
-                            warnings.addMessage(e, birthmarkType);\r
-                        }\r
-                    }\r
-                    er.addBirthmarkSet(et, birthmarkset);\r
-                } catch(IOException e){\r
-                    warnings.addMessage(e, entry.getClassName());\r
-                }\r
-            }\r
-        }\r
-    }\r
-\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
-            BirthmarkSet birthmarkset = new BirthmarkSet(archive.getName(), archive.getLocation());\r
-\r
-            for(ClassFileEntry entry: archive){\r
-                try{\r
-                    byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
-                    for(String birthmarkType: context.getBirthmarkTypes()){\r
-                        try{\r
-                            BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);\r
-                            if(extractor.isAcceptable(ExtractionUnit.ARCHIVE)){\r
-                                Birthmark b = birthmarkset.getBirthmark(birthmarkType);\r
-                                if(b == null){\r
-                                    b = extractor.createBirthmark();\r
-                                    birthmarkset.addBirthmark(b);\r
-                                }\r
-                                extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment());\r
-                            }\r
-                        } catch(ExtractorNotFoundException e){\r
-                            warnings.addMessage(e, birthmarkType);\r
-                        } \r
-                    }\r
-                } catch(IOException e){\r
-                    warnings.addMessage(e, entry.getClassName());\r
-                }\r
-            }\r
-            if(birthmarkset.getBirthmarksCount() != 0){\r
-                er.addBirthmarkSet(et, birthmarkset);\r
-            }\r
-        }\r
-    }\r
-\r
-    private ClassFileArchive[] createArchives(String[] files, BirthmarkEnvironment environment) throws IOException, MalformedURLException{\r
-        ClasspathContext bytecode = environment.getClasspathContext();\r
-        List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();\r
-        for(int i = 0; i < files.length; i++){\r
-            try{\r
-                if(files[i].endsWith(".class")){\r
-                    archives.add(new DefaultClassFileArchive(files[i]));\r
-                }\r
-                else if(files[i].endsWith(".jar") || files[i].endsWith(".zip")){\r
-                    archives.add(new JarClassFileArchive(files[i]));\r
-                    bytecode.addClasspath(new File(files[i]).toURI().toURL());\r
-                }\r
-                else if(files[i].endsWith(".war")){\r
-                    archives.add(new WarClassFileArchive(files[i]));\r
-                }\r
-            } catch(IOException e){\r
-                warnings.addMessage(e, files[i]);\r
-            }\r
-        }\r
-        return archives.toArray(new ClassFileArchive[archives.size()]);\r
-    }\r
-\r
-    private void operationStart(OperationType type){\r
-        if(warnings == null){\r
-            warnings = new WarningMessages(type);\r
-            fireEvent(new BirthmarkEngineEvent(OperationStage.OPERATION_START, type, warnings));\r
-            latestOperationType = type;\r
-            targetType = type;\r
-        }\r
-        stack.push(warnings);\r
-        /*\r
-         * call subOperationStart method only once when some operation is occured.\r
-         * Ex. extraction, comparison, filtering\r
-         */\r
-        if(latestOperationType != type){\r
-            fireEvent(new BirthmarkEngineEvent(OperationStage.SUB_OPERATION_START, type, warnings));\r
-            latestOperationType = type;\r
-        }\r
-    }\r
-\r
-    private void operationDone(OperationType type){\r
-        if(latestOperationType != type && targetType != type){\r
-            fireEvent(new BirthmarkEngineEvent(OperationStage.SUB_OPERATION_DONE, type, warnings));\r
-            latestOperationType = type;\r
-        }\r
-        stack.pop();\r
-        if(stack.size() == 0){\r
-            fireEvent(new BirthmarkEngineEvent(OperationStage.OPERATION_DONE, type, warnings));\r
-            warnings = null;\r
-            latestOperationType = null;\r
-        }\r
-    }\r
-\r
-    private void fireEvent(BirthmarkEngineEvent e){\r
-        for(BirthmarkEngineListener listener: listeners){\r
-            switch(e.getStage()){\r
-            case OPERATION_START:\r
-                listener.operationStart(e);\r
-                break;\r
-            case SUB_OPERATION_START:\r
-                listener.subOperationStart(e);\r
-                break;\r
-            case SUB_OPERATION_DONE:\r
-                listener.subOperationDone(e);\r
-                break;\r
-            case OPERATION_DONE:\r
-                listener.operationDone(e);\r
-                break;\r
-            default:\r
-                throw new InternalError("unknown stage: " + e.getStage());\r
-            }\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+
+import jp.sourceforge.stigmata.birthmarks.extractors.BirthmarkExtractorFactory;
+import jp.sourceforge.stigmata.event.BirthmarkEngineEvent;
+import jp.sourceforge.stigmata.event.BirthmarkEngineListener;
+import jp.sourceforge.stigmata.event.OperationStage;
+import jp.sourceforge.stigmata.event.OperationType;
+import jp.sourceforge.stigmata.event.WarningMessages;
+import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
+import jp.sourceforge.stigmata.filter.FilteredComparisonResultSet;
+import jp.sourceforge.stigmata.hook.Phase;
+import jp.sourceforge.stigmata.hook.StigmataHookManager;
+import jp.sourceforge.stigmata.reader.ClassFileArchive;
+import jp.sourceforge.stigmata.reader.ClassFileEntry;
+import jp.sourceforge.stigmata.reader.ClasspathContext;
+import jp.sourceforge.stigmata.reader.DefaultClassFileArchive;
+import jp.sourceforge.stigmata.reader.JarClassFileArchive;
+import jp.sourceforge.stigmata.reader.WarClassFileArchive;
+import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
+import jp.sourceforge.stigmata.result.RoundRobinComparisonResultSet;
+
+/**
+ * core engine for extracting/comparing/filtering birthmarks.
+ * 
+ * This class is not thread safe.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkEngine{
+    private BirthmarkEnvironment environment;
+    private List<BirthmarkEngineListener> listeners = new ArrayList<BirthmarkEngineListener>();
+    private Stack<WarningMessages> stack = new Stack<WarningMessages>();
+    private WarningMessages warnings;
+    private OperationType latestOperationType;
+    private OperationType targetType;
+    private BirthmarkExtractorFactory factory;
+
+    /**
+     * constructor.
+     */
+    public BirthmarkEngine(BirthmarkEnvironment env){
+        this.environment = env;
+        factory = new BirthmarkExtractorFactory(env);
+    }
+
+    /**
+     * returns an environment of this object.
+     */
+    public BirthmarkEnvironment getEnvironment(){
+        return environment;
+    }
+
+    public void addBirthmarkEngineListener(BirthmarkEngineListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeBirthmarkEngineListener(BirthmarkEngineListener listener){
+        listeners.remove(listener);
+    }
+
+    /**
+     * filters comparison of birthmarks from target files.
+     * @see #extract(String[], BirthmarkContext)
+     * @see #compare(String[], BirthmarkContext)
+     * @see #filter(ComparisonResultSet)
+     * @see BirthmarkContext#getFilterTypes()
+     */
+    public synchronized ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{
+        operationStart(OperationType.FILTER_BIRTHMARKS);
+
+        ComparisonResultSet crs = compare(target, context);
+        crs = filter(crs);
+
+        operationDone(OperationType.FILTER_BIRTHMARKS);
+
+        return crs;
+    }
+
+    /**
+     * filters comparison of birthmarks from given two targets targetx, and targetY
+     * @see #extract(String[], String[], BirthmarkContext)
+     * @see #compare(String[], String[], BirthmarkContext)
+     * @see #filter(ComparisonResultSet)
+     * @see BirthmarkContext#getFilterTypes()
+     */
+    public synchronized ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{
+        operationStart(OperationType.FILTER_BIRTHMARKS);
+
+        ComparisonResultSet crs = compare(targetX, targetY, context);
+        crs = filter(crs);
+
+        operationDone(OperationType.FILTER_BIRTHMARKS);
+
+        return crs;
+    }
+
+    /**
+     * filters comparison of birthmarks from given extraction result set.
+     * @see #compare(ExtractionResultSet)
+     * @see #filter(ComparisonResultSet)
+     * @see ExtractionResultSet#getContext()
+     * @see BirthmarkContext#getFilterTypes()
+     */
+    public synchronized ComparisonResultSet filter(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{
+        operationStart(OperationType.FILTER_BIRTHMARKS);
+
+        ComparisonResultSet crs = compare(er);
+        crs = filter(crs);
+
+        operationDone(OperationType.FILTER_BIRTHMARKS);
+
+        return crs;
+    }
+
+    /**
+     * filters comparison of birthmarks.
+     * @see ExtractionResultSet#getContext()
+     * @see BirthmarkContext#getFilterTypes()
+     */
+    public synchronized ComparisonResultSet filter(ComparisonResultSet crs) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{
+        operationStart(OperationType.FILTER_BIRTHMARKS);
+        StigmataHookManager.getInstance().runHook(Phase.BEFORE_FILTERING, crs.getContext());
+
+        String[] filterTypes = crs.getContext().getFilterTypes();
+
+        if(filterTypes != null){
+            List<ComparisonPairFilterSet> filterList = new ArrayList<ComparisonPairFilterSet>();
+            ComparisonPairFilterManager manager = environment.getFilterManager();
+            for(int i = 0; i < filterTypes.length; i++){
+                ComparisonPairFilterSet fset = manager.getFilterSet(filterTypes[i]);
+                if(fset != null){
+                    filterList.add(fset);
+                }
+                else{
+                    warnings.addMessage(new FilterNotFoundException("filter not found"), filterTypes[i]);
+                }
+            }
+            ComparisonPairFilterSet[] cpfs = filterList.toArray(new ComparisonPairFilterSet[filterList.size()]);
+
+            crs = new FilteredComparisonResultSet(crs, cpfs);
+        }
+
+        StigmataHookManager.getInstance().runHook(Phase.AFTER_FILTERING, crs.getContext());
+        operationDone(OperationType.FILTER_BIRTHMARKS);
+
+        return crs;
+    }
+
+    /**
+     * compares two given birthmarks and returns comparison pair.
+     */
+    public synchronized ComparisonPair compareDetails(BirthmarkSet bs1, BirthmarkSet bs2, BirthmarkContext context) throws BirthmarkComparisonFailedException{
+        return new ComparisonPair(bs1, bs2, context);
+    }
+
+    public synchronized ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{
+        operationStart(OperationType.COMPARE_BIRTHMARKS);
+
+        ExtractionResultSet er = extract(target, context);
+        ComparisonResultSet crs = compare(er);
+
+        operationDone(OperationType.COMPARE_BIRTHMARKS);
+
+        return crs;
+    }
+
+    public synchronized ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{
+        operationStart(OperationType.COMPARE_BIRTHMARKS);
+
+        ExtractionResultSet er = extract(targetX, targetY, context);
+        ComparisonResultSet crs = compare(er);
+
+        operationDone(OperationType.COMPARE_BIRTHMARKS);
+
+        return crs;
+    }
+
+    public synchronized ComparisonResultSet compare(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{
+        operationStart(OperationType.COMPARE_BIRTHMARKS);
+        BirthmarkContext context = er.getContext();
+
+        StigmataHookManager.getInstance().runHook(Phase.BEFORE_COMPARISON, context);
+        ComparisonResultSet crs = null;
+        switch(context.getComparisonMethod()){
+        case ROUND_ROBIN_SAME_PAIR:
+            crs = new RoundRobinComparisonResultSet(er, true);
+            break;
+        case ROUND_ROBIN_WITHOUT_SAME_PAIR:
+            crs = new RoundRobinComparisonResultSet(er, false);
+            break;
+        case ROUND_ROBIN_XY:
+            crs = new RoundRobinComparisonResultSet(er, true);
+        case GUESSED_PAIR:
+            crs = new CertainPairComparisonResultSet(er);
+            break;
+        case SPECIFIED_PAIR:
+            crs = new CertainPairComparisonResultSet(er, context.getNameMappings());
+            break;
+        }
+
+        StigmataHookManager.getInstance().runHook(Phase.AFTER_COMPARISON, context);
+        operationDone(OperationType.COMPARE_BIRTHMARKS);
+
+        return crs;
+    }
+
+    public synchronized ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkStoreException{
+        operationStart(OperationType.EXTRACT_BIRTHMARKS);
+        ExtractionResultSet er = extract(target, null, context);
+        operationDone(OperationType.EXTRACT_BIRTHMARKS);
+        return er;
+    }
+
+    public synchronized ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkStoreException{
+        operationStart(OperationType.EXTRACT_BIRTHMARKS);
+        ExtractionResultSet er = context.getEnvironment().getHistoryManager().createDefaultResultSet(context);
+
+        try{
+            StigmataHookManager.getInstance().runHook(Phase.BEFORE_EXTRACTION, context);
+
+            switch(context.getComparisonMethod()){
+            case ROUND_ROBIN_SAME_PAIR:
+            case ROUND_ROBIN_WITHOUT_SAME_PAIR:
+                er.setTableType(false);
+                String[] targetXY = mergeTarget(targetX, targetY);
+                extractImpl(targetXY, er, ExtractionTarget.TARGET_XY);
+                break;
+            case GUESSED_PAIR:
+            case SPECIFIED_PAIR:
+            case ROUND_ROBIN_XY:
+            default:
+                if(targetX == null || targetY == null){
+                    throw new BirthmarkExtractionFailedException("targetX or targetY is null");
+                }
+                er.setTableType(true);
+                extractImpl(targetX, er, ExtractionTarget.TARGET_X);
+                extractImpl(targetY, er, ExtractionTarget.TARGET_Y);
+                break;
+            }
+            return er;
+        } catch(IOException e){
+            throw new BirthmarkExtractionFailedException(e);
+        } finally{
+            StigmataHookManager.getInstance().runHook(Phase.AFTER_EXTRACTION, context);
+            operationDone(OperationType.EXTRACT_BIRTHMARKS);
+        }
+    }
+
+    private String[] mergeTarget(String[] t1, String[] t2){
+        List<String> list = new ArrayList<String>();
+        addToList(list, t1);
+        addToList(list, t2);
+
+        return list.toArray(new String[list.size()]);
+    }
+
+    private void addToList(List<String> list, String[] target){
+        if(target != null){
+            for(String s: target){
+                list.add(s);
+            }
+        }
+    }
+
+    private BirthmarkSet[] extractImpl(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException, BirthmarkStoreException{
+        ClassFileArchive[] archives = createArchives(target, environment);
+        BirthmarkContext context = er.getContext();
+        ExtractionUnit unit = context.getExtractionUnit();
+
+        BirthmarkSet[] extractResult = null;
+        if(unit == ExtractionUnit.CLASS){
+            extractFromClass(archives, er, et);
+        }
+        else if(unit == ExtractionUnit.PACKAGE){
+            extractFromPackage(archives, er, et);
+        }
+        else if(unit == ExtractionUnit.ARCHIVE){
+            extractFromProduct(archives, er, et);
+        }
+
+        return extractResult;
+    }
+
+    private byte[] inputStreamToByteArray(InputStream in) throws IOException{
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        int read;
+        byte[] dataBuffer = new byte[512];
+        while((read = in.read(dataBuffer, 0, dataBuffer.length)) != -1){
+            bout.write(dataBuffer, 0, read);
+        }
+        byte[] data = bout.toByteArray();
+
+        bout.close();
+        return data;
+    }
+
+    private void extractFromPackage(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{
+        Map<String, BirthmarkSet> map = new HashMap<String, BirthmarkSet>();
+        BirthmarkContext context = er.getContext();
+
+        for(ClassFileArchive archive: archives){
+            for(ClassFileEntry entry: archive){
+                try{
+                    String name = entry.getClassName();
+                    String packageName = parsePackageName(name);
+                    BirthmarkSet bs = map.get(packageName);
+                    if(bs == null){
+                        bs = new BirthmarkSet(packageName, archive.getLocation());
+                        map.put(packageName, bs);
+                    }
+
+                    byte[] data = inputStreamToByteArray(entry.getLocation().openStream());
+                    for(String birthmarkType: context.getBirthmarkTypes()){
+                        try{
+                            BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);
+                            if(extractor.isAcceptable(ExtractionUnit.PACKAGE)){
+                                Birthmark b = bs.getBirthmark(extractor.getProvider().getType());
+                                if(b == null){
+                                    b = extractor.createBirthmark();
+                                    bs.addBirthmark(b);
+                                }
+                                extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment());
+                            }
+                        } catch(ExtractorNotFoundException e){
+                            warnings.addMessage(e, birthmarkType);
+                        }
+                    }
+                } catch(IOException e){
+                    warnings.addMessage(e, archive.getName());
+                }
+            }
+        }
+        try{
+            for(BirthmarkSet bs: map.values()){
+                er.addBirthmarkSet(et, bs);
+            }
+        }catch(BirthmarkStoreException e){
+        }
+    }
+
+    private String parsePackageName(String name){
+        String n = name.replace('/', '.');
+        int index = n.lastIndexOf('.');
+        if(index > 0){
+            n = n.substring(0, index - 1);
+        }
+
+        return n;
+    }
+
+    private void extractFromClass(ClassFileArchive[] archives, ExtractionResultSet er,
+            ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{
+        BirthmarkContext context = er.getContext();
+
+        for(ClassFileArchive archive: archives){
+            for(ClassFileEntry entry: archive){
+                try{
+                    BirthmarkSet birthmarkset = new BirthmarkSet(entry.getClassName(), entry.getLocation());
+                    byte[] data = inputStreamToByteArray(entry.getLocation().openStream());
+
+                    for(String birthmarkType: context.getBirthmarkTypes()){
+                        try{
+                            BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);
+                            if(extractor.isAcceptable(ExtractionUnit.CLASS)){
+                                Birthmark b = extractor.extract(new ByteArrayInputStream(data), er.getEnvironment());
+                                birthmarkset.addBirthmark(b);
+                            }
+                        } catch(ExtractorNotFoundException e){
+                            warnings.addMessage(e, birthmarkType);
+                        }
+                    }
+                    er.addBirthmarkSet(et, birthmarkset);
+                } catch(IOException e){
+                    warnings.addMessage(e, entry.getClassName());
+                }
+            }
+        }
+    }
+
+    private void extractFromProduct(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{
+        BirthmarkContext context = er.getContext();
+
+        for(ClassFileArchive archive: archives){
+            BirthmarkSet birthmarkset = new BirthmarkSet(archive.getName(), archive.getLocation());
+
+            for(ClassFileEntry entry: archive){
+                try{
+                    byte[] data = inputStreamToByteArray(entry.getLocation().openStream());
+                    for(String birthmarkType: context.getBirthmarkTypes()){
+                        try{
+                            BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);
+                            if(extractor.isAcceptable(ExtractionUnit.ARCHIVE)){
+                                Birthmark b = birthmarkset.getBirthmark(birthmarkType);
+                                if(b == null){
+                                    b = extractor.createBirthmark();
+                                    birthmarkset.addBirthmark(b);
+                                }
+                                extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment());
+                            }
+                        } catch(ExtractorNotFoundException e){
+                            warnings.addMessage(e, birthmarkType);
+                        } 
+                    }
+                } catch(IOException e){
+                    warnings.addMessage(e, entry.getClassName());
+                }
+            }
+            if(birthmarkset.getBirthmarksCount() != 0){
+                er.addBirthmarkSet(et, birthmarkset);
+            }
+        }
+    }
+
+    private ClassFileArchive[] createArchives(String[] files, BirthmarkEnvironment environment) throws IOException, MalformedURLException{
+        ClasspathContext bytecode = environment.getClasspathContext();
+        List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();
+        for(int i = 0; i < files.length; i++){
+            try{
+                if(files[i].endsWith(".class")){
+                    archives.add(new DefaultClassFileArchive(files[i]));
+                }
+                else if(files[i].endsWith(".jar") || files[i].endsWith(".zip")){
+                    archives.add(new JarClassFileArchive(files[i]));
+                    bytecode.addClasspath(new File(files[i]).toURI().toURL());
+                }
+                else if(files[i].endsWith(".war")){
+                    archives.add(new WarClassFileArchive(files[i]));
+                }
+            } catch(IOException e){
+                warnings.addMessage(e, files[i]);
+            }
+        }
+        return archives.toArray(new ClassFileArchive[archives.size()]);
+    }
+
+    private void operationStart(OperationType type){
+        if(warnings == null){
+            warnings = new WarningMessages(type);
+            fireEvent(new BirthmarkEngineEvent(OperationStage.OPERATION_START, type, warnings));
+            latestOperationType = type;
+            targetType = type;
+        }
+        stack.push(warnings);
+        /*
+         * call subOperationStart method only once when some operation is occured.
+         * Ex. extraction, comparison, filtering
+         */
+        if(latestOperationType != type){
+            fireEvent(new BirthmarkEngineEvent(OperationStage.SUB_OPERATION_START, type, warnings));
+            latestOperationType = type;
+        }
+    }
+
+    private void operationDone(OperationType type){
+        if(latestOperationType != type && targetType != type){
+            fireEvent(new BirthmarkEngineEvent(OperationStage.SUB_OPERATION_DONE, type, warnings));
+            latestOperationType = type;
+        }
+        stack.pop();
+        if(stack.size() == 0){
+            fireEvent(new BirthmarkEngineEvent(OperationStage.OPERATION_DONE, type, warnings));
+            warnings = null;
+            latestOperationType = null;
+        }
+    }
+
+    private void fireEvent(BirthmarkEngineEvent e){
+        for(BirthmarkEngineListener listener: listeners){
+            switch(e.getStage()){
+            case OPERATION_START:
+                listener.operationStart(e);
+                break;
+            case SUB_OPERATION_START:
+                listener.subOperationStart(e);
+                break;
+            case SUB_OPERATION_DONE:
+                listener.subOperationDone(e);
+                break;
+            case OPERATION_DONE:
+                listener.operationDone(e);
+                break;
+            default:
+                throw new InternalError("unknown stage: " + e.getStage());
+            }
+        }
+    }
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.beans.PropertyChangeEvent;\r
-import java.beans.PropertyChangeListener;\r
-import java.io.File;\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import javax.imageio.spi.ServiceRegistry;\r
-\r
-import jp.naist.se.stigmata.filter.ComparisonPairFilterManager;\r
-import jp.naist.se.stigmata.reader.ClasspathContext;\r
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkServiceManager;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.naist.se.stigmata.utils.WellknownClassManager;\r
-\r
-/**\r
- * This class represents the context for extracting/comparing birthmarks.\r
- * \r
- * @author  Haruaki TAMADA\r
- * @version  $Revision$ $Date$\r
- */\r
-public class BirthmarkEnvironment{\r
-    /**\r
-     * Default environment. All instance of this class is based on default environment.\r
-     */\r
-    private static BirthmarkEnvironment DEFAULT_ENVIRONMENT = new BirthmarkEnvironment(true);\r
-\r
-    /**\r
-     * home directory path.\r
-     */\r
-    private static String HOME_DIRECTORY_PATH;\r
-\r
-    /**\r
-     * parent of this environment.\r
-     */\r
-    private BirthmarkEnvironment parent;\r
-\r
-    /**\r
-     * context for classpath.\r
-     */\r
-    private ClasspathContext classpathContext;\r
-\r
-    /**\r
-     * wellknown class manager. This object judge a class is user made class or\r
-     * wellknown class.\r
-     */\r
-    private WellknownClassManager manager;\r
-\r
-    /**\r
-     * collection of services.\r
-     */\r
-    private Map<String, BirthmarkSpi> services = new HashMap<String, BirthmarkSpi>();\r
-\r
-    /**\r
-     * properties manager.\r
-     */\r
-    private Map<String, String> properties = new HashMap<String, String>();\r
-\r
-    /**\r
-     * listeners for updating properties.\r
-     */\r
-    private List<PropertyChangeListener> propertyListeners = new ArrayList<PropertyChangeListener>();\r
-\r
-    /**\r
-     * filter manager.\r
-     */\r
-    private ComparisonPairFilterManager filterManager;\r
-\r
-    /**\r
-     * history manager.\r
-     */\r
-    private ExtractedBirthmarkServiceManager historyManager;\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 = new ClasspathContext();\r
-        filterManager = new ComparisonPairFilterManager(this);\r
-        historyManager = new ExtractedBirthmarkServiceManager(this);\r
-    }\r
-\r
-    /**\r
-     * constructor for specifying parent environment.\r
-     */\r
-    public BirthmarkEnvironment(BirthmarkEnvironment parent){\r
-        this.parent = parent;\r
-        this.manager = new WellknownClassManager(parent.getWellknownClassManager());\r
-        this.classpathContext = new ClasspathContext(parent.getClasspathContext());\r
-        this.filterManager = new ComparisonPairFilterManager(this, parent.getFilterManager());\r
-        this.historyManager = new ExtractedBirthmarkServiceManager(this, parent.getHistoryManager());\r
-    }\r
-\r
-    /**\r
-     * returns the default birthmark environment.\r
-     */\r
-    public static final BirthmarkEnvironment getDefaultEnvironment(){\r
-        return DEFAULT_ENVIRONMENT;\r
-    }\r
-\r
-    public static synchronized final String getStigmataHome(){\r
-        if(HOME_DIRECTORY_PATH == null){\r
-            String stigmataHome = System.getProperty("stigmata.home");\r
-            if(stigmataHome == null){\r
-                stigmataHome = System.getenv("STIGMATA_HOME");\r
-            }\r
-            if(stigmataHome == null){\r
-                String parent = System.getProperty("user.home");\r
-                if(parent == null){\r
-                    parent = System.getenv("HOME");\r
-                }\r
-                if(parent == null){\r
-                    parent = ".";\r
-                }\r
-                // for windows\r
-                if(parent.startsWith("C:\\Documents and Settings\\")){\r
-                    stigmataHome = parent + File.separator + "Application Data" + File.separator + "stigmata";\r
-                }\r
-                else{\r
-                    stigmataHome = parent + File.separator + ".stigmata";\r
-                }\r
-            }\r
-            HOME_DIRECTORY_PATH = stigmataHome;\r
-        }\r
-        return HOME_DIRECTORY_PATH;\r
-    }\r
-\r
-    static void resetSettings(){\r
-        DEFAULT_ENVIRONMENT = new BirthmarkEnvironment(false);\r
-    }\r
-\r
-    public BirthmarkEnvironment getParent(){\r
-        return parent;\r
-    }\r
-\r
-    /**\r
-     * remove property mapped given key.\r
-     */\r
-    public void removeProperty(String key){\r
-        String old = properties.get(key);\r
-        properties.remove(key);\r
-        firePropertyEvent(new PropertyChangeEvent(this, key, old, null));\r
-    }\r
-\r
-    /**\r
-     * add given property.\r
-     */\r
-    public void addProperty(String key, String value){\r
-        boolean contains = properties.containsKey(key);\r
-        String old = getProperty(key);\r
-        properties.put(key, value);\r
-\r
-        // value is updated?\r
-        if(!((old != null && old.equals(value)) ||\r
-             (contains && old == null && value == null))){\r
-            firePropertyEvent(new PropertyChangeEvent(this, key, old, value));\r
-        }\r
-    }\r
-\r
-    /**\r
-     * returns the property mapped given key\r
-     */\r
-    public String getProperty(String key){\r
-        String value = properties.get(key);\r
-        if(value == null && parent != null){\r
-            value = parent.getProperty(key);\r
-        }\r
-        return value;\r
-    }\r
-\r
-    /**\r
-     * fire property change event to listeners.\r
-     * @param e Event object.\r
-     */\r
-    private void firePropertyEvent(PropertyChangeEvent e){\r
-        for(PropertyChangeListener listener: propertyListeners){\r
-            listener.propertyChange(e);\r
-        }\r
-    }\r
-\r
-    /**\r
-     * add listener for updating properties.\r
-     */\r
-    public void addPropertyListener(PropertyChangeListener listener){\r
-        propertyListeners.add(listener);\r
-    }\r
-\r
-    /**\r
-     * remove specified listener.\r
-     */\r
-    public void removePropertyListener(PropertyChangeListener listener){\r
-        propertyListeners.remove(listener);\r
-    }\r
-\r
-    public void clearProperties(){\r
-        properties.clear();\r
-    }\r
-\r
-    public Iterator<String> propertyKeys(){\r
-        Set<String> set = new HashSet<String>();\r
-        if(parent != null){\r
-            for(Iterator<String> i = parent.propertyKeys(); i.hasNext(); ){\r
-                set.add(i.next());\r
-            }\r
-        }\r
-        set.addAll(properties.keySet());\r
-        return set.iterator();\r
-    }\r
-\r
-    /**\r
-     * returns the classpath context.\r
-     */\r
-    public ClasspathContext getClasspathContext(){\r
-        return classpathContext;\r
-    }\r
-\r
-    /**\r
-     * add given birthmark service to this environment.\r
-     */\r
-    public synchronized void addService(BirthmarkSpi service){\r
-        if(parent == null || parent.getService(service.getType()) == null){\r
-            services.put(service.getType(), service);\r
-        }\r
-    }\r
-\r
-    /**\r
-     * remove given birthmark service from this environment.\r
-     */\r
-    public void removeService(String type){\r
-        services.remove(type);\r
-    }\r
-\r
-    /**\r
-     * return birthmark service registered with given birthmark type.\r
-     */\r
-    public BirthmarkSpi getService(String type){\r
-        BirthmarkSpi service = services.get(type);\r
-        if(service == null && parent != null){\r
-            service = parent.getService(type);\r
-        }\r
-        return service;\r
-    }\r
-\r
-    /**\r
-     * return all birthmark services searching traverse to root environment.\r
-     */\r
-    public synchronized BirthmarkSpi[] getServices(){\r
-        List<BirthmarkSpi> list = getServiceList();\r
-        BirthmarkSpi[] services = list.toArray(new BirthmarkSpi[list.size()]);\r
-        Arrays.sort(services, new BirthmarkSpiComparator());\r
-\r
-        return services;\r
-    }\r
-\r
-    public <T> Iterator<T> lookupProviders(Class<T> providerClass){\r
-        Iterator<T> iterator;\r
-        if(loader != null){\r
-            iterator = ServiceRegistry.lookupProviders(providerClass, loader);\r
-        }\r
-        else{\r
-            iterator = ServiceRegistry.lookupProviders(providerClass);\r
-        }\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 = lookupProviders(BirthmarkSpi.class); i.hasNext(); ){\r
-            BirthmarkSpi spi = i.next();\r
-            if(getService(spi.getType()) == null){\r
-                list.add(spi);\r
-            }\r
-        }\r
-        BirthmarkSpi[] services = list.toArray(new BirthmarkSpi[list.size()]);\r
-        Arrays.sort(services, new BirthmarkSpiComparator());\r
-\r
-        return services;\r
-    }\r
-\r
-    /**\r
-     * return wellknown class manager.\r
-     */\r
-    public WellknownClassManager getWellknownClassManager(){\r
-        return manager;\r
-    }\r
-\r
-    public ComparisonPairFilterManager getFilterManager(){\r
-        return filterManager;\r
-    }\r
-\r
-    public ExtractedBirthmarkServiceManager getHistoryManager(){\r
-        return historyManager;\r
-    }\r
-\r
-    void setClassLoader(ClassLoader loader){\r
-        this.loader = loader;\r
-    }\r
-\r
-    /**\r
-     * find the all birthmark services searching to root environment.\r
-     */\r
-    private List<BirthmarkSpi> getServiceList(){\r
-        List<BirthmarkSpi> list = new ArrayList<BirthmarkSpi>();\r
-        if(parent != null){\r
-            for(BirthmarkSpi spi : parent.getServices()){\r
-                list.add(spi);\r
-            }\r
-        }\r
-        for(String key : services.keySet()){\r
-            list.add(services.get(key));\r
-        }\r
-        return list;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.imageio.spi.ServiceRegistry;
+
+import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
+import jp.sourceforge.stigmata.reader.ClasspathContext;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkServiceManager;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.utils.WellknownClassManager;
+
+/**
+ * This class represents the context for extracting/comparing birthmarks.
+ * 
+ * @author  Haruaki TAMADA
+ * @version  $Revision$ $Date$
+ */
+public class BirthmarkEnvironment{
+    /**
+     * Default environment. All instance of this class is based on default environment.
+     */
+    private static BirthmarkEnvironment DEFAULT_ENVIRONMENT = new BirthmarkEnvironment(true);
+
+    /**
+     * home directory path.
+     */
+    private static String HOME_DIRECTORY_PATH;
+
+    /**
+     * parent of this environment.
+     */
+    private BirthmarkEnvironment parent;
+
+    /**
+     * context for classpath.
+     */
+    private ClasspathContext classpathContext;
+
+    /**
+     * wellknown class manager. This object judge a class is user made class or
+     * wellknown class.
+     */
+    private WellknownClassManager manager;
+
+    /**
+     * collection of services.
+     */
+    private Map<String, BirthmarkSpi> services = new HashMap<String, BirthmarkSpi>();
+
+    /**
+     * properties manager.
+     */
+    private Map<String, String> properties = new HashMap<String, String>();
+
+    /**
+     * listeners for updating properties.
+     */
+    private List<PropertyChangeListener> propertyListeners = new ArrayList<PropertyChangeListener>();
+
+    /**
+     * filter manager.
+     */
+    private ComparisonPairFilterManager filterManager;
+
+    /**
+     * history manager.
+     */
+    private ExtractedBirthmarkServiceManager historyManager;
+
+    /**
+     * 
+     */
+    private ClassLoader loader;
+
+    /**
+     * constructor for root environment
+     */
+    private BirthmarkEnvironment(boolean flag){
+        manager = new WellknownClassManager();
+        classpathContext = new ClasspathContext();
+        filterManager = new ComparisonPairFilterManager(this);
+        historyManager = new ExtractedBirthmarkServiceManager(this);
+    }
+
+    /**
+     * constructor for specifying parent environment.
+     */
+    public BirthmarkEnvironment(BirthmarkEnvironment parent){
+        this.parent = parent;
+        this.manager = new WellknownClassManager(parent.getWellknownClassManager());
+        this.classpathContext = new ClasspathContext(parent.getClasspathContext());
+        this.filterManager = new ComparisonPairFilterManager(this, parent.getFilterManager());
+        this.historyManager = new ExtractedBirthmarkServiceManager(this, parent.getHistoryManager());
+    }
+
+    /**
+     * returns the default birthmark environment.
+     */
+    public static final BirthmarkEnvironment getDefaultEnvironment(){
+        return DEFAULT_ENVIRONMENT;
+    }
+
+    public static synchronized final String getStigmataHome(){
+        if(HOME_DIRECTORY_PATH == null){
+            String stigmataHome = System.getProperty("stigmata.home");
+            if(stigmataHome == null){
+                stigmataHome = System.getenv("STIGMATA_HOME");
+            }
+            if(stigmataHome == null){
+                String parent = System.getProperty("user.home");
+                if(parent == null){
+                    parent = System.getenv("HOME");
+                }
+                if(parent == null){
+                    parent = ".";
+                }
+                // for windows
+                if(parent.startsWith("C:\\Documents and Settings\\")){
+                    stigmataHome = parent + File.separator + "Application Data" + File.separator + "stigmata";
+                }
+                else{
+                    stigmataHome = parent + File.separator + ".stigmata";
+                }
+            }
+            HOME_DIRECTORY_PATH = stigmataHome;
+        }
+        return HOME_DIRECTORY_PATH;
+    }
+
+    static void resetSettings(){
+        DEFAULT_ENVIRONMENT = new BirthmarkEnvironment(false);
+    }
+
+    public BirthmarkEnvironment getParent(){
+        return parent;
+    }
+
+    /**
+     * remove property mapped given key.
+     */
+    public void removeProperty(String key){
+        String old = properties.get(key);
+        properties.remove(key);
+        firePropertyEvent(new PropertyChangeEvent(this, key, old, null));
+    }
+
+    /**
+     * add given property.
+     */
+    public void addProperty(String key, String value){
+        boolean contains = properties.containsKey(key);
+        String old = getProperty(key);
+        properties.put(key, value);
+
+        // value is updated?
+        if(!((old != null && old.equals(value)) ||
+             (contains && old == null && value == null))){
+            firePropertyEvent(new PropertyChangeEvent(this, key, old, value));
+        }
+    }
+
+    /**
+     * returns the property mapped given key
+     */
+    public String getProperty(String key){
+        String value = properties.get(key);
+        if(value == null && parent != null){
+            value = parent.getProperty(key);
+        }
+        return value;
+    }
+
+    /**
+     * fire property change event to listeners.
+     * @param e Event object.
+     */
+    private void firePropertyEvent(PropertyChangeEvent e){
+        for(PropertyChangeListener listener: propertyListeners){
+            listener.propertyChange(e);
+        }
+    }
+
+    /**
+     * add listener for updating properties.
+     */
+    public void addPropertyListener(PropertyChangeListener listener){
+        propertyListeners.add(listener);
+    }
+
+    /**
+     * remove specified listener.
+     */
+    public void removePropertyListener(PropertyChangeListener listener){
+        propertyListeners.remove(listener);
+    }
+
+    public void clearProperties(){
+        properties.clear();
+    }
+
+    public Iterator<String> propertyKeys(){
+        Set<String> set = new HashSet<String>();
+        if(parent != null){
+            for(Iterator<String> i = parent.propertyKeys(); i.hasNext(); ){
+                set.add(i.next());
+            }
+        }
+        set.addAll(properties.keySet());
+        return set.iterator();
+    }
+
+    /**
+     * returns the classpath context.
+     */
+    public ClasspathContext getClasspathContext(){
+        return classpathContext;
+    }
+
+    /**
+     * add given birthmark service to this environment.
+     */
+    public synchronized void addService(BirthmarkSpi service){
+        if(parent == null || parent.getService(service.getType()) == null){
+            services.put(service.getType(), service);
+        }
+    }
+
+    /**
+     * remove given birthmark service from this environment.
+     */
+    public void removeService(String type){
+        services.remove(type);
+    }
+
+    /**
+     * return birthmark service registered with given birthmark type.
+     */
+    public BirthmarkSpi getService(String type){
+        BirthmarkSpi service = services.get(type);
+        if(service == null && parent != null){
+            service = parent.getService(type);
+        }
+        return service;
+    }
+
+    /**
+     * return all birthmark services searching traverse to root environment.
+     */
+    public synchronized BirthmarkSpi[] getServices(){
+        List<BirthmarkSpi> list = getServiceList();
+        BirthmarkSpi[] services = list.toArray(new BirthmarkSpi[list.size()]);
+        Arrays.sort(services, new BirthmarkSpiComparator());
+
+        return services;
+    }
+
+    public <T> Iterator<T> lookupProviders(Class<T> providerClass){
+        Iterator<T> iterator;
+        if(loader != null){
+            iterator = ServiceRegistry.lookupProviders(providerClass, loader);
+        }
+        else{
+            iterator = ServiceRegistry.lookupProviders(providerClass);
+        }
+        return iterator;
+    }
+
+    /**
+     * return birthmark services lookup from current class path.
+     */
+    public synchronized BirthmarkSpi[] findServices(){
+        List<BirthmarkSpi> list = getServiceList();
+
+        for(Iterator<BirthmarkSpi> i = lookupProviders(BirthmarkSpi.class); i.hasNext(); ){
+            BirthmarkSpi spi = i.next();
+            if(getService(spi.getType()) == null){
+                list.add(spi);
+            }
+        }
+        BirthmarkSpi[] services = list.toArray(new BirthmarkSpi[list.size()]);
+        Arrays.sort(services, new BirthmarkSpiComparator());
+
+        return services;
+    }
+
+    /**
+     * return wellknown class manager.
+     */
+    public WellknownClassManager getWellknownClassManager(){
+        return manager;
+    }
+
+    public ComparisonPairFilterManager getFilterManager(){
+        return filterManager;
+    }
+
+    public ExtractedBirthmarkServiceManager getHistoryManager(){
+        return historyManager;
+    }
+
+    void setClassLoader(ClassLoader loader){
+        this.loader = loader;
+    }
+
+    /**
+     * find the all birthmark services searching to root environment.
+     */
+    private List<BirthmarkSpi> getServiceList(){
+        List<BirthmarkSpi> list = new ArrayList<BirthmarkSpi>();
+        if(parent != null){
+            for(BirthmarkSpi spi : parent.getServices()){
+                list.add(spi);
+            }
+        }
+        for(String key : services.keySet()){
+            list.add(services.get(key));
+        }
+        return list;
+    }
+}
@@ -1,31 +1,31 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This exception represents occuring some exceptions caused birthmarking.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkException extends Exception{\r
-    private static final long serialVersionUID = -6422474631148213820L;\r
-\r
-    public BirthmarkException(){\r
-        super();\r
-    }\r
-\r
-    public BirthmarkException(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-\r
-    public BirthmarkException(String message){\r
-        super(message);\r
-    }\r
-\r
-    public BirthmarkException(Throwable cause){\r
-        super(cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This exception represents occuring some exceptions caused birthmarking.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkException extends Exception{
+    private static final long serialVersionUID = -6422474631148213820L;
+
+    public BirthmarkException(){
+        super();
+    }
+
+    public BirthmarkException(String message, Throwable cause){
+        super(message, cause);
+    }
+
+    public BirthmarkException(String message){
+        super(message);
+    }
+
+    public BirthmarkException(Throwable cause){
+        super(cause);
+    }
+}
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkExtractionFailedException extends BirthmarkException {\r
-       private static final long serialVersionUID = 21932436457235L;\r
-\r
-       private List<Throwable> causes = new ArrayList<Throwable>();\r
-\r
-       public BirthmarkExtractionFailedException() {\r
-               super();\r
-       }\r
-\r
-       public BirthmarkExtractionFailedException(String arg0, Throwable cause) {\r
-               super(arg0, cause);\r
-       }\r
-\r
-       public BirthmarkExtractionFailedException(String arg0) {\r
-               super(arg0);\r
-       }\r
-\r
-       public BirthmarkExtractionFailedException(Throwable cause) {\r
-               super(cause);\r
-       }\r
-\r
-       public boolean isFailed(){\r
-               return causes.size() != 0;\r
-       }\r
-\r
-       public void addCause(Throwable cause){\r
-               causes.add(cause);\r
-       }\r
-\r
-       public void addCauses(Throwable[] causeList){\r
-               for(Throwable throwable: causeList){\r
-                       causes.add(throwable);\r
-               }\r
-       }\r
-\r
-       public Throwable[] getCauses(){\r
-               return causes.toArray(new Throwable[causes.size()]);\r
-       }\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkExtractionFailedException extends BirthmarkException {
+       private static final long serialVersionUID = 21932436457235L;
+
+       private List<Throwable> causes = new ArrayList<Throwable>();
+
+       public BirthmarkExtractionFailedException() {
+               super();
+       }
+
+       public BirthmarkExtractionFailedException(String arg0, Throwable cause) {
+               super(arg0, cause);
+       }
+
+       public BirthmarkExtractionFailedException(String arg0) {
+               super(arg0);
+       }
+
+       public BirthmarkExtractionFailedException(Throwable cause) {
+               super(cause);
+       }
+
+       public boolean isFailed(){
+               return causes.size() != 0;
+       }
+
+       public void addCause(Throwable cause){
+               causes.add(cause);
+       }
+
+       public void addCauses(Throwable[] causeList){
+               for(Throwable throwable: causeList){
+                       causes.add(throwable);
+               }
+       }
+
+       public Throwable[] getCauses(){
+               return causes.toArray(new Throwable[causes.size()]);
+       }
 }
\ No newline at end of file
@@ -1,77 +1,77 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.InputStream;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * extract birthmarks from given Java bytecode stream.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkExtractor{\r
-    /**\r
-     * returns service provider interface of this extractor.\r
-     */\r
-    public BirthmarkSpi getProvider();\r
-\r
-    /**\r
-     * create new birthmark.\r
-     */\r
-    public Birthmark createBirthmark();\r
-\r
-    /**\r
-     * Does extractor accept given extraction unit. \r
-     */\r
-    public boolean isAcceptable(ExtractionUnit unit);\r
-\r
-    /**\r
-     * returns accepted extraction unit list.\r
-     */\r
-    public ExtractionUnit[] getAcceptableUnits();\r
-\r
-    /**\r
-     * extract birthmark from given stream.\r
-     */\r
-    public Birthmark extract(InputStream in) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given byte array.\r
-     */\r
-    public Birthmark extract(byte[] bytecode) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given stream with given environment.\r
-     */\r
-    public Birthmark extract(InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given byte array with given environment.\r
-     */\r
-    public Birthmark extract(byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given stream and add element to given birthmark object.\r
-     */\r
-    public Birthmark extract(Birthmark birthmark, InputStream in) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given byte array and add element to given birthmark object.\r
-     */\r
-    public Birthmark extract(Birthmark birthmark, byte[] bytecode) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given stream with given environment and add element to given birthmark object.\r
-     */\r
-    public Birthmark extract(Birthmark birthmark, InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * extract birthmark from given byte array with given environment and add element to given birthmark object.\r
-     */\r
-    public Birthmark extract(Birthmark birthmark, byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.io.InputStream;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * extract birthmarks from given Java bytecode stream.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkExtractor{
+    /**
+     * returns service provider interface of this extractor.
+     */
+    public BirthmarkSpi getProvider();
+
+    /**
+     * create new birthmark.
+     */
+    public Birthmark createBirthmark();
+
+    /**
+     * Does extractor accept given extraction unit. 
+     */
+    public boolean isAcceptable(ExtractionUnit unit);
+
+    /**
+     * returns accepted extraction unit list.
+     */
+    public ExtractionUnit[] getAcceptableUnits();
+
+    /**
+     * extract birthmark from given stream.
+     */
+    public Birthmark extract(InputStream in) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given byte array.
+     */
+    public Birthmark extract(byte[] bytecode) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given stream with given environment.
+     */
+    public Birthmark extract(InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given byte array with given environment.
+     */
+    public Birthmark extract(byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given stream and add element to given birthmark object.
+     */
+    public Birthmark extract(Birthmark birthmark, InputStream in) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given byte array and add element to given birthmark object.
+     */
+    public Birthmark extract(Birthmark birthmark, byte[] bytecode) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given stream with given environment and add element to given birthmark object.
+     */
+    public Birthmark extract(Birthmark birthmark, InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;
+
+    /**
+     * extract birthmark from given byte array with given environment and add element to given birthmark object.
+     */
+    public Birthmark extract(Birthmark birthmark, byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.net.URL;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-/**\r
- * This class manages a set of birthmarks which extracted from a target.\r
- *\r
- * @author  Haruaki TAMADA\r
- * @version  $Revision$ $Date$\r
- */\r
-public class BirthmarkSet implements Iterable<Birthmark>{\r
-    /**\r
-     * this object name.\r
-     */\r
-    private String name;\r
-\r
-    /**\r
-     * location of target is loaded from.\r
-     */\r
-    private URL location;\r
-\r
-    /**\r
-     * map for birthmarks.\r
-     */\r
-    private Map<String, Birthmark> birthmarks = new HashMap<String, Birthmark>();\r
-\r
-    /**\r
-     * constructor.\r
-     */\r
-    public BirthmarkSet(String name, URL location){\r
-        this.name = name;\r
-        this.location = location;\r
-    }\r
-\r
-    /**\r
-     * return the sum of all element count of birthmarks this instance has.\r
-     */\r
-    public int getSumOfElementCount(){\r
-        int count = 0;\r
-        for(Iterator<String> i = birthmarkTypes(); i.hasNext();){\r
-            Birthmark birthmark = getBirthmark(i.next());\r
-            count += birthmark.getElementCount();\r
-        }\r
-        return count;\r
-    }\r
-\r
-    /**\r
-     * return the number of birthmarks.\r
-     */\r
-    public int getBirthmarksCount(){\r
-        return birthmarks.size();\r
-    }\r
-\r
-    /**\r
-     * return the name.\r
-     */\r
-    public String getName(){\r
-        return name;\r
-    }\r
-\r
-    /**\r
-     * return the location.\r
-     */\r
-    public URL getLocation(){\r
-        return location;\r
-    }\r
-\r
-    /**\r
-     * add given birthmark to this instance.\r
-     * @throws NullPointerException given birthmark is null.\r
-     */\r
-    public void addBirthmark(Birthmark birthmark){\r
-        if(birthmark == null){\r
-            throw new NullPointerException("given birthmark is null");\r
-        }\r
-        birthmarks.put(birthmark.getType(), birthmark);\r
-    }\r
-\r
-    /**\r
-     * return the given type of birthmark.\r
-     */\r
-    public Birthmark getBirthmark(String type){\r
-        return birthmarks.get(type);\r
-    }\r
-\r
-    /**\r
-     * does this object have the given birthmark type.\r
-     */\r
-    public boolean hasBirthmark(String type){\r
-        return birthmarks.get(type) != null;\r
-    }\r
-\r
-    /**\r
-     * returns an array containing all of the birthmarks in this object.\r
-     */\r
-    public Birthmark[] getBirthmarks(){\r
-        Birthmark[] b = new Birthmark[getBirthmarksCount()];\r
-        int index = 0;\r
-        for(Iterator<String> i = birthmarkTypes(); i.hasNext();){\r
-            b[index] = getBirthmark(i.next());\r
-            index++;\r
-        }\r
-        return b;\r
-    }\r
-\r
-    /**\r
-     * returns an iterator over the birthmarks in this birthmark-set.\r
-     */\r
-    public Iterator<Birthmark> iterator(){\r
-        return birthmarks.values().iterator();\r
-    }\r
-\r
-    /**\r
-     * returns an iterator over the birthmark types.\r
-     */\r
-    public Iterator<String> birthmarkTypes(){\r
-        return birthmarks.keySet().iterator();\r
-    }\r
-\r
-    /**\r
-     * returns an array of birthmark types.\r
-     */\r
-    public synchronized String[] getBirthmarkTypes(){\r
-        return birthmarks.keySet().toArray(new String[birthmarks.size()]);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * This class manages a set of birthmarks which extracted from a target.
+ *
+ * @author  Haruaki TAMADA
+ * @version  $Revision$ $Date$
+ */
+public class BirthmarkSet implements Iterable<Birthmark>{
+    /**
+     * this object name.
+     */
+    private String name;
+
+    /**
+     * location of target is loaded from.
+     */
+    private URL location;
+
+    /**
+     * map for birthmarks.
+     */
+    private Map<String, Birthmark> birthmarks = new HashMap<String, Birthmark>();
+
+    /**
+     * constructor.
+     */
+    public BirthmarkSet(String name, URL location){
+        this.name = name;
+        this.location = location;
+    }
+
+    /**
+     * return the sum of all element count of birthmarks this instance has.
+     */
+    public int getSumOfElementCount(){
+        int count = 0;
+        for(Iterator<String> i = birthmarkTypes(); i.hasNext();){
+            Birthmark birthmark = getBirthmark(i.next());
+            count += birthmark.getElementCount();
+        }
+        return count;
+    }
+
+    /**
+     * return the number of birthmarks.
+     */
+    public int getBirthmarksCount(){
+        return birthmarks.size();
+    }
+
+    /**
+     * return the name.
+     */
+    public String getName(){
+        return name;
+    }
+
+    /**
+     * return the location.
+     */
+    public URL getLocation(){
+        return location;
+    }
+
+    /**
+     * add given birthmark to this instance.
+     * @throws NullPointerException given birthmark is null.
+     */
+    public void addBirthmark(Birthmark birthmark){
+        if(birthmark == null){
+            throw new NullPointerException("given birthmark is null");
+        }
+        birthmarks.put(birthmark.getType(), birthmark);
+    }
+
+    /**
+     * return the given type of birthmark.
+     */
+    public Birthmark getBirthmark(String type){
+        return birthmarks.get(type);
+    }
+
+    /**
+     * does this object have the given birthmark type.
+     */
+    public boolean hasBirthmark(String type){
+        return birthmarks.get(type) != null;
+    }
+
+    /**
+     * returns an array containing all of the birthmarks in this object.
+     */
+    public Birthmark[] getBirthmarks(){
+        Birthmark[] b = new Birthmark[getBirthmarksCount()];
+        int index = 0;
+        for(Iterator<String> i = birthmarkTypes(); i.hasNext();){
+            b[index] = getBirthmark(i.next());
+            index++;
+        }
+        return b;
+    }
+
+    /**
+     * returns an iterator over the birthmarks in this birthmark-set.
+     */
+    public Iterator<Birthmark> iterator(){
+        return birthmarks.values().iterator();
+    }
+
+    /**
+     * returns an iterator over the birthmark types.
+     */
+    public Iterator<String> birthmarkTypes(){
+        return birthmarks.keySet().iterator();
+    }
+
+    /**
+     * returns an array of birthmark types.
+     */
+    public synchronized String[] getBirthmarkTypes(){
+        return birthmarks.keySet().toArray(new String[birthmarks.size()]);
+    }
+}
@@ -1,45 +1,45 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Comparator;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class BirthmarkSpiComparator implements Comparator<BirthmarkSpi>{\r
-    /**\r
-     * default constructor\r
-     */\r
-    public BirthmarkSpiComparator(){\r
-    }\r
-\r
-    public int hashCode(){\r
-        return System.identityHashCode(this);\r
-    }\r
-\r
-    public int compare(BirthmarkSpi s1, BirthmarkSpi s2){\r
-        if(s1.isExpert() && !s2.isExpert()){\r
-            return 1;\r
-        }\r
-        else if(!s1.isExpert() && s2.isExpert()){\r
-            return -1;\r
-        }\r
-        else{\r
-            return s1.getType().compareTo(s2.getType());\r
-        }\r
-    }\r
-\r
-    public boolean equals(Object o){\r
-        String className = null;\r
-        if(o != null){\r
-            className = o.getClass().getName();\r
-        }\r
-        return o != null && className.equals(getClass().getName());\r
-    }\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.Comparator;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class BirthmarkSpiComparator implements Comparator<BirthmarkSpi>{
+    /**
+     * default constructor
+     */
+    public BirthmarkSpiComparator(){
+    }
+
+    public int hashCode(){
+        return System.identityHashCode(this);
+    }
+
+    public int compare(BirthmarkSpi s1, BirthmarkSpi s2){
+        if(s1.isExpert() && !s2.isExpert()){
+            return 1;
+        }
+        else if(!s1.isExpert() && s2.isExpert()){
+            return -1;
+        }
+        else{
+            return s1.getType().compareTo(s2.getType());
+        }
+    }
+
+    public boolean equals(Object o){
+        String className = null;
+        if(o != null){
+            className = o.getClass().getName();
+        }
+        return o != null && className.equals(getClass().getName());
+    }
 }
\ No newline at end of file
@@ -1,64 +1,64 @@
-package jp.naist.se.stigmata;\r
-\r
-import java.io.Serializable;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This class represents how to store extracted birthmarks.\r
- * memory?, databases?, or files?\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkStoreTarget implements Serializable, Comparable<BirthmarkStoreTarget>{\r
-    private static final long serialVersionUID = -4225861589804166362L;\r
-\r
-    private static final Map<String, BirthmarkStoreTarget> TARGETS = new HashMap<String, BirthmarkStoreTarget>();\r
-\r
-    public static BirthmarkStoreTarget MEMORY = new BirthmarkStoreTarget(0, "MEMORY");\r
-    public static BirthmarkStoreTarget XMLFILE = new BirthmarkStoreTarget(1, "XMLFILE");\r
-    public static BirthmarkStoreTarget MEMORY_SINGLE = new BirthmarkStoreTarget(2, "MEMORY_SINGLE");\r
-    public static BirthmarkStoreTarget RDB = new BirthmarkStoreTarget(3, "RDB");\r
-\r
-    private final String name;\r
-    private final int ordinal;\r
-\r
-    private BirthmarkStoreTarget(int index, String name){\r
-        this.name = name;\r
-        this.ordinal = index;\r
-        TARGETS.put(name, this);\r
-    }\r
-\r
-    public String name(){\r
-        return name;\r
-    }\r
-\r
-    public int ordinal(){\r
-        return ordinal;\r
-    }\r
-\r
-    public boolean equals(Object o){\r
-        return this == o;\r
-    }\r
-\r
-    public int compareTo(BirthmarkStoreTarget other){\r
-        return ordinal - other.ordinal;\r
-    }\r
-\r
-    public static BirthmarkStoreTarget valueOf(String name){\r
-        return TARGETS.get(name);\r
-    }\r
-\r
-    public static BirthmarkStoreTarget createTarget(String name){\r
-        BirthmarkStoreTarget bst = TARGETS.get(name);\r
-        if(bst == null){\r
-            bst = new BirthmarkStoreTarget(TARGETS.size(), name);\r
-        }\r
-        return bst;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This class represents how to store extracted birthmarks.
+ * memory?, databases?, or files?
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkStoreTarget implements Serializable, Comparable<BirthmarkStoreTarget>{
+    private static final long serialVersionUID = -4225861589804166362L;
+
+    private static final Map<String, BirthmarkStoreTarget> TARGETS = new HashMap<String, BirthmarkStoreTarget>();
+
+    public static BirthmarkStoreTarget MEMORY = new BirthmarkStoreTarget(0, "MEMORY");
+    public static BirthmarkStoreTarget XMLFILE = new BirthmarkStoreTarget(1, "XMLFILE");
+    public static BirthmarkStoreTarget MEMORY_SINGLE = new BirthmarkStoreTarget(2, "MEMORY_SINGLE");
+    public static BirthmarkStoreTarget RDB = new BirthmarkStoreTarget(3, "RDB");
+
+    private final String name;
+    private final int ordinal;
+
+    private BirthmarkStoreTarget(int index, String name){
+        this.name = name;
+        this.ordinal = index;
+        TARGETS.put(name, this);
+    }
+
+    public String name(){
+        return name;
+    }
+
+    public int ordinal(){
+        return ordinal;
+    }
+
+    public boolean equals(Object o){
+        return this == o;
+    }
+
+    public int compareTo(BirthmarkStoreTarget other){
+        return ordinal - other.ordinal;
+    }
+
+    public static BirthmarkStoreTarget valueOf(String name){
+        return TARGETS.get(name);
+    }
+
+    public static BirthmarkStoreTarget createTarget(String name){
+        BirthmarkStoreTarget bst = TARGETS.get(name);
+        if(bst == null){
+            bst = new BirthmarkStoreTarget(TARGETS.size(), name);
+        }
+        return bst;
+    }
+}
@@ -1,32 +1,32 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This exception class be thrown when birthmark types are different in some\r
- * operation such as merging, and comparing.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkTypeMismatchException extends BirthmarkException{\r
-    private static final long serialVersionUID = -6198325117696243731L;\r
-\r
-    public BirthmarkTypeMismatchException(){\r
-        super();\r
-    }\r
-\r
-    public BirthmarkTypeMismatchException(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-\r
-    public BirthmarkTypeMismatchException(String message){\r
-        super(message);\r
-    }\r
-\r
-    public BirthmarkTypeMismatchException(Throwable cause){\r
-        super(cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This exception class be thrown when birthmark types are different in some
+ * operation such as merging, and comparing.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkTypeMismatchException extends BirthmarkException{
+    private static final long serialVersionUID = -6198325117696243731L;
+
+    public BirthmarkTypeMismatchException(){
+        super();
+    }
+
+    public BirthmarkTypeMismatchException(String message, Throwable cause){
+        super(message, cause);
+    }
+
+    public BirthmarkTypeMismatchException(String message){
+        super(message);
+    }
+
+    public BirthmarkTypeMismatchException(Throwable cause){
+        super(cause);
+    }
+}
@@ -1,42 +1,42 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This enum represents birthmark comparison method. let <it>X</it> be a set of\r
- * target <it>{ x1, x2, ..., xn, }</it> and <it>Y</it> be a set of target\r
- * <it>{ y1, y2, ..., ym, }</it>.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public enum ComparisonMethod{\r
-    /**\r
-     * This constants represents comparing all combination between <it>X</it>\r
-     * and <it>Y</it>. <it>x1 - y1, x1 - y2, x1 - y3, ..., xn - ym-1, xn, ym</it>.\r
-     */\r
-    ROUND_ROBIN_XY,\r
-    /**\r
-     * This constants represents comparing all combination between <it>X</it>.\r
-     * <it>x1 - x1, x1 - x2, x1 - x3, ..., xn - xn-1 xn, xn</it>.\r
-     */\r
-    ROUND_ROBIN_SAME_PAIR,\r
-    /**\r
-     * This constants represents comparing all combination between <it>X</it>.\r
-     * <it>x1 - x1, x1 - x2, x1 - x3, ..., xn - xn-1 xn, xn</it>.\r
-     */\r
-    ROUND_ROBIN_WITHOUT_SAME_PAIR,\r
-    /**\r
-     * This constants represents comparing some pairs. The pair is guessed by\r
-     * its name. If x1 and y3 have same name, then the pair of x1 and y3 is\r
-     * compared.\r
-     */\r
-    GUESSED_PAIR,\r
-    /**\r
-     * This constants represents comparing some pairs. The pair is specified by\r
-     * user.\r
-     */\r
-    SPECIFIED_PAIR,\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This enum represents birthmark comparison method. let <it>X</it> be a set of
+ * target <it>{ x1, x2, ..., xn, }</it> and <it>Y</it> be a set of target
+ * <it>{ y1, y2, ..., ym, }</it>.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public enum ComparisonMethod{
+    /**
+     * This constants represents comparing all combination between <it>X</it>
+     * and <it>Y</it>. <it>x1 - y1, x1 - y2, x1 - y3, ..., xn - ym-1, xn, ym</it>.
+     */
+    ROUND_ROBIN_XY,
+    /**
+     * This constants represents comparing all combination between <it>X</it>.
+     * <it>x1 - x1, x1 - x2, x1 - x3, ..., xn - xn-1 xn, xn</it>.
+     */
+    ROUND_ROBIN_SAME_PAIR,
+    /**
+     * This constants represents comparing all combination between <it>X</it>.
+     * <it>x1 - x1, x1 - x2, x1 - x3, ..., xn - xn-1 xn, xn</it>.
+     */
+    ROUND_ROBIN_WITHOUT_SAME_PAIR,
+    /**
+     * This constants represents comparing some pairs. The pair is guessed by
+     * its name. If x1 and y3 have same name, then the pair of x1 and y3 is
+     * compared.
+     */
+    GUESSED_PAIR,
+    /**
+     * This constants represents comparing some pairs. The pair is specified by
+     * user.
+     */
+    SPECIFIED_PAIR,
+}
@@ -1,94 +1,94 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-/**\r
- * This class represents comparison pair.\r
- * \r
- * @author  Haruaki TAMADA\r
- * @version  $Revision$ $Date$\r
- */\r
-public class ComparisonPair implements Iterable<ComparisonPairElement>{\r
-    private BirthmarkSet target1;\r
-    private BirthmarkSet target2;\r
-    private BirthmarkContext context;\r
-\r
-    /**\r
-     * constructor.\r
-     */\r
-    public ComparisonPair(BirthmarkSet target1, BirthmarkSet target2, BirthmarkContext context){\r
-        this.target1 = target1;\r
-        this.target2 = target2;\r
-        this.context = context;\r
-\r
-        if(target1.getBirthmarksCount() != target2.getBirthmarksCount()){\r
-            throw new IllegalArgumentException("birthmark count is not matched");\r
-        }\r
-    }\r
-\r
-    /**\r
-     * return a target.\r
-     * @see  #getTarget2()\r
-     */\r
-    public BirthmarkSet getTarget1(){\r
-        return target1;\r
-    }\r
-\r
-    /**\r
-     * return other target\r
-     * @see  #getTarget1()\r
-     */\r
-    public BirthmarkSet getTarget2(){\r
-        return target2;\r
-    }\r
-\r
-    /**\r
-     * calculates similarity between target1 and target2.\r
-     */\r
-    public double calculateSimilarity(){\r
-        double similarity = 0d;\r
-        int count = 0;\r
-        for(ComparisonPairElement elem: this){\r
-            double sim = elem.getSimilarity();\r
-            if(!Double.isNaN(sim) && !Double.isInfinite(sim)){\r
-                similarity += sim;\r
-                count++;\r
-            }\r
-        }\r
-        return similarity / count;\r
-    }\r
-\r
-    /**\r
-     * Returns a number of birthmarks contained a target.\r
-     * Note that other target must have same birthmarks.\r
-     */\r
-    public int getBirthmarksCount(){\r
-        return target1.getBirthmarksCount();\r
-    }\r
-\r
-    /**\r
-     * returns an iterator for comparing each birthmarks.\r
-     */\r
-    public synchronized Iterator<ComparisonPairElement> iterator(){\r
-        List<ComparisonPairElement> list = new ArrayList<ComparisonPairElement>();\r
-        BirthmarkEnvironment env = context.getEnvironment();\r
-        for(Iterator<String> i = target1.birthmarkTypes(); i.hasNext(); ){\r
-            String type = i.next();\r
-\r
-            Birthmark b1 = target1.getBirthmark(type);\r
-            Birthmark b2 = target2.getBirthmark(type);\r
-            if(b1 != null && b2 != null){\r
-                list.add(new ComparisonPairElement(\r
-                    b1, b2, env.getService(type).getComparator()\r
-                ));\r
-            }\r
-        }\r
-        return list.iterator();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This class represents comparison pair.
+ * 
+ * @author  Haruaki TAMADA
+ * @version  $Revision$ $Date$
+ */
+public class ComparisonPair implements Iterable<ComparisonPairElement>{
+    private BirthmarkSet target1;
+    private BirthmarkSet target2;
+    private BirthmarkContext context;
+
+    /**
+     * constructor.
+     */
+    public ComparisonPair(BirthmarkSet target1, BirthmarkSet target2, BirthmarkContext context){
+        this.target1 = target1;
+        this.target2 = target2;
+        this.context = context;
+
+        if(target1.getBirthmarksCount() != target2.getBirthmarksCount()){
+            throw new IllegalArgumentException("birthmark count is not matched");
+        }
+    }
+
+    /**
+     * return a target.
+     * @see  #getTarget2()
+     */
+    public BirthmarkSet getTarget1(){
+        return target1;
+    }
+
+    /**
+     * return other target
+     * @see  #getTarget1()
+     */
+    public BirthmarkSet getTarget2(){
+        return target2;
+    }
+
+    /**
+     * calculates similarity between target1 and target2.
+     */
+    public double calculateSimilarity(){
+        double similarity = 0d;
+        int count = 0;
+        for(ComparisonPairElement elem: this){
+            double sim = elem.getSimilarity();
+            if(!Double.isNaN(sim) && !Double.isInfinite(sim)){
+                similarity += sim;
+                count++;
+            }
+        }
+        return similarity / count;
+    }
+
+    /**
+     * Returns a number of birthmarks contained a target.
+     * Note that other target must have same birthmarks.
+     */
+    public int getBirthmarksCount(){
+        return target1.getBirthmarksCount();
+    }
+
+    /**
+     * returns an iterator for comparing each birthmarks.
+     */
+    public synchronized Iterator<ComparisonPairElement> iterator(){
+        List<ComparisonPairElement> list = new ArrayList<ComparisonPairElement>();
+        BirthmarkEnvironment env = context.getEnvironment();
+        for(Iterator<String> i = target1.birthmarkTypes(); i.hasNext(); ){
+            String type = i.next();
+
+            Birthmark b1 = target1.getBirthmark(type);
+            Birthmark b2 = target2.getBirthmark(type);
+            if(b1 != null && b2 != null){
+                list.add(new ComparisonPairElement(
+                    b1, b2, env.getService(type).getComparator()
+                ));
+            }
+        }
+        return list.iterator();
+    }
+}
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This class represents comparing two birthmarks.\r
- * @author  Haruaki TAMADA\r
- * @version  $Revision$ $Date$\r
- */\r
-public class ComparisonPairElement{\r
-    private Birthmark birthmark1;\r
-    private Birthmark birthmark2;\r
-    private BirthmarkComparator comparator;\r
-    private double similarity;\r
-    private int compareCount = -1;\r
-\r
-    public ComparisonPairElement(Birthmark birthmark1, Birthmark birthmark2,\r
-            BirthmarkComparator comparator){\r
-        this.birthmark1 = birthmark1;\r
-        this.birthmark2 = birthmark2;\r
-        this.comparator = comparator;\r
-\r
-        if(!birthmark1.getType().equals(birthmark2.getType())){\r
-            throw new IllegalArgumentException("birthmark type mismatch");\r
-        }\r
-        // cached\r
-        similarity = comparator.compare(birthmark1, birthmark2);\r
-    }\r
-\r
-    public synchronized int getComparisonCount(){\r
-        // cached\r
-        if(compareCount < 0){\r
-            compareCount = comparator.getCompareCount(birthmark1, birthmark2);\r
-        }\r
-        return compareCount;\r
-    }\r
-\r
-    /**\r
-     * returns a type of birthmarks.\r
-     */\r
-    public String getType(){\r
-        return birthmark1.getType();\r
-    }\r
-\r
-    /**\r
-     * returns similarity between two birthmarks.\r
-     */\r
-    public double getSimilarity(){\r
-        return similarity;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This class represents comparing two birthmarks.
+ * @author  Haruaki TAMADA
+ * @version  $Revision$ $Date$
+ */
+public class ComparisonPairElement{
+    private Birthmark birthmark1;
+    private Birthmark birthmark2;
+    private BirthmarkComparator comparator;
+    private double similarity;
+    private int compareCount = -1;
+
+    public ComparisonPairElement(Birthmark birthmark1, Birthmark birthmark2,
+            BirthmarkComparator comparator){
+        this.birthmark1 = birthmark1;
+        this.birthmark2 = birthmark2;
+        this.comparator = comparator;
+
+        if(!birthmark1.getType().equals(birthmark2.getType())){
+            throw new IllegalArgumentException("birthmark type mismatch");
+        }
+        // cached
+        similarity = comparator.compare(birthmark1, birthmark2);
+    }
+
+    public synchronized int getComparisonCount(){
+        // cached
+        if(compareCount < 0){
+            compareCount = comparator.getCompareCount(birthmark1, birthmark2);
+        }
+        return compareCount;
+    }
+
+    /**
+     * returns a type of birthmarks.
+     */
+    public String getType(){
+        return birthmark1.getType();
+    }
+
+    /**
+     * returns similarity between two birthmarks.
+     */
+    public double getSimilarity(){
+        return similarity;
+    }
+}
@@ -1,33 +1,33 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.filter.Criterion;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-\r
-/**\r
- * Filtering results by some criteria.\r
- * For example,\r
- * <ul>\r
- *   <li>extract comparison pairs which similarity over 0.8, and</li>\r
- *   <li>extract comparison pairs which similarity over 0.8 and element count over 10.</li>\r
- * </ul>\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonPairFilter{\r
-    public boolean isFiltered(ComparisonPair pair);\r
-\r
-    public Criterion[] getAcceptableCriteria();\r
-\r
-    public boolean isAcceptable(Criterion criterion);\r
-\r
-    public void setCriterion(Criterion criterion);\r
-\r
-    public Criterion getCriterion();\r
-\r
-    public ComparisonPairFilterSpi getService();\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.filter.Criterion;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+/**
+ * Filtering results by some criteria.
+ * For example,
+ * <ul>
+ *   <li>extract comparison pairs which similarity over 0.8, and</li>
+ *   <li>extract comparison pairs which similarity over 0.8 and element count over 10.</li>
+ * </ul>
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonPairFilter{
+    public boolean isFiltered(ComparisonPair pair);
+
+    public Criterion[] getAcceptableCriteria();
+
+    public boolean isAcceptable(Criterion criterion);
+
+    public void setCriterion(Criterion criterion);
+
+    public Criterion getCriterion();
+
+    public ComparisonPairFilterSpi getService();
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-\r
-/**\r
- * Set of {@link ComparisonPairFilter <Ccode>ComparisonPairFilter</code>}.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ComparisonPairFilterSet implements Iterable<ComparisonPairFilter>{\r
-    private List<ComparisonPairFilter> filters = new ArrayList<ComparisonPairFilter>();\r
-    private String name;\r
-    private boolean matchall = true;\r
-\r
-    public boolean isFiltered(ComparisonPair pair){\r
-        boolean flag;\r
-        if(isMatchAll()){ // all of criteria are matched?\r
-            flag = true;\r
-            for(ComparisonPairFilter filter: filters){\r
-                if(!filter.isFiltered(pair)){\r
-                    flag = false;\r
-                    break;\r
-                }\r
-            }\r
-        }\r
-        else{ // any of criteria are matched\r
-            flag = false;\r
-            for(ComparisonPairFilter filter: filters){\r
-                if(filter.isFiltered(pair)){\r
-                    flag = true;\r
-                    break;\r
-                }\r
-            }\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    /**\r
-     * returns a flag that all filters must be matched.\r
-     */\r
-    public boolean isMatchAll(){\r
-        return matchall;\r
-    }\r
-\r
-    /**\r
-     * returns a flag that any filters must be matched.\r
-     */\r
-    public boolean isMatchAny(){\r
-        return !isMatchAll();\r
-    }\r
-\r
-    /**\r
-     * filtering if all criteria is matched.\r
-     */\r
-    public void setMatchAll(){\r
-        matchall = true;\r
-    }\r
-\r
-    /**\r
-     * filtering if any criterion is matched.\r
-     */\r
-    public void setMatchAny(){\r
-        matchall = false;\r
-    }\r
-\r
-    public void setName(String name){\r
-        this.name = name;\r
-    }\r
-\r
-    public String getName(){\r
-        return name;\r
-    }\r
-\r
-    public boolean addFilter(ComparisonPairFilter o){\r
-        return filters.add(o);\r
-    }\r
-\r
-    public void removeAllFilters(){\r
-        filters.clear();\r
-    }\r
-\r
-    public ComparisonPairFilter getFilter(int index){\r
-        return filters.get(index);\r
-    }\r
-\r
-    public Iterator<ComparisonPairFilter> iterator(){\r
-        return filters.iterator();\r
-    }\r
-\r
-    public ComparisonPairFilter removeFilter(int index){\r
-        return filters.remove(index);\r
-    }\r
-\r
-    public int getFilterCount(){\r
-        return filters.size();\r
-    }\r
-\r
-    public String toString(){\r
-        StringBuilder sb = new StringBuilder("filterset{ ");\r
-        sb.append("name=").append(getName()).append(", ");\r
-        sb.append(isMatchAll()? "match_all": "match_any");\r
-        sb.append(", ").append(filters).append("}");\r
-        \r
-        return new String(sb);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * Set of {@link ComparisonPairFilter <Ccode>ComparisonPairFilter</code>}.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ComparisonPairFilterSet implements Iterable<ComparisonPairFilter>{
+    private List<ComparisonPairFilter> filters = new ArrayList<ComparisonPairFilter>();
+    private String name;
+    private boolean matchall = true;
+
+    public boolean isFiltered(ComparisonPair pair){
+        boolean flag;
+        if(isMatchAll()){ // all of criteria are matched?
+            flag = true;
+            for(ComparisonPairFilter filter: filters){
+                if(!filter.isFiltered(pair)){
+                    flag = false;
+                    break;
+                }
+            }
+        }
+        else{ // any of criteria are matched
+            flag = false;
+            for(ComparisonPairFilter filter: filters){
+                if(filter.isFiltered(pair)){
+                    flag = true;
+                    break;
+                }
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * returns a flag that all filters must be matched.
+     */
+    public boolean isMatchAll(){
+        return matchall;
+    }
+
+    /**
+     * returns a flag that any filters must be matched.
+     */
+    public boolean isMatchAny(){
+        return !isMatchAll();
+    }
+
+    /**
+     * filtering if all criteria is matched.
+     */
+    public void setMatchAll(){
+        matchall = true;
+    }
+
+    /**
+     * filtering if any criterion is matched.
+     */
+    public void setMatchAny(){
+        matchall = false;
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+
+    public String getName(){
+        return name;
+    }
+
+    public boolean addFilter(ComparisonPairFilter o){
+        return filters.add(o);
+    }
+
+    public void removeAllFilters(){
+        filters.clear();
+    }
+
+    public ComparisonPairFilter getFilter(int index){
+        return filters.get(index);
+    }
+
+    public Iterator<ComparisonPairFilter> iterator(){
+        return filters.iterator();
+    }
+
+    public ComparisonPairFilter removeFilter(int index){
+        return filters.remove(index);
+    }
+
+    public int getFilterCount(){
+        return filters.size();
+    }
+
+    public String toString(){
+        StringBuilder sb = new StringBuilder("filterset{ ");
+        sb.append("name=").append(getName()).append(", ");
+        sb.append(isMatchAll()? "match_all": "match_any");
+        sb.append(", ").append(filters).append("}");
+        
+        return new String(sb);
+    }
+}
@@ -1,55 +1,55 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Iterator;\r
-\r
-/**\r
- * result set of birthmark comparison.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonResultSet extends Iterable<ComparisonPair>{\r
-    /**\r
-     * the birthmark environment.\r
-     */\r
-    public BirthmarkEnvironment getEnvironment();\r
-\r
-    /**\r
-     * the birthmark context.\r
-     */\r
-    public BirthmarkContext getContext();\r
-\r
-    /**\r
-     * a iterator for {@link ComparisonPair <code>ComparisonPair</code>}.\r
-     */\r
-    public Iterator<ComparisonPair> iterator();\r
-\r
-    /**\r
-     * a comparison pair at given index.\r
-     */\r
-    public ComparisonPair getPairAt(int index);\r
-\r
-    /**\r
-     * all comparison pairs.\r
-     */\r
-    public ComparisonPair[] getPairs();\r
-\r
-    /**\r
-     * comparison pair count of this instance has.\r
-     */\r
-    public int getPairCount();\r
-\r
-    /**\r
-     * comparison source.\r
-     */\r
-    public BirthmarkSet[] getPairSources();\r
-\r
-    /**\r
-     * returns an array of comparison sources.\r
-     */\r
-    public Iterator<BirthmarkSet> pairSources();\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+
+/**
+ * result set of birthmark comparison.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonResultSet extends Iterable<ComparisonPair>{
+    /**
+     * the birthmark environment.
+     */
+    public BirthmarkEnvironment getEnvironment();
+
+    /**
+     * the birthmark context.
+     */
+    public BirthmarkContext getContext();
+
+    /**
+     * a iterator for {@link ComparisonPair <code>ComparisonPair</code>}.
+     */
+    public Iterator<ComparisonPair> iterator();
+
+    /**
+     * a comparison pair at given index.
+     */
+    public ComparisonPair getPairAt(int index);
+
+    /**
+     * all comparison pairs.
+     */
+    public ComparisonPair[] getPairs();
+
+    /**
+     * comparison pair count of this instance has.
+     */
+    public int getPairCount();
+
+    /**
+     * comparison source.
+     */
+    public BirthmarkSet[] getPairSources();
+
+    /**
+     * returns an array of comparison sources.
+     */
+    public Iterator<BirthmarkSet> pairSources();
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Iterator;\r
-\r
-/**\r
- * This interface represents a set of extracted birthmarks.\r
- * \r
- * @author Haruaki Tamada\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
-    public BirthmarkEnvironment getEnvironment();\r
-\r
-    /**\r
-     * returns a context of extraction result.\r
-     */\r
-    public BirthmarkContext getContext();\r
-\r
-    public String getId();\r
-\r
-    /**\r
-     * sets extraction \r
-     */\r
-    public boolean isTableType();\r
-\r
-    /**\r
-     * sets table type comparison flag.\r
-     * @see #isTableType()\r
-     */\r
-    public void setTableType(boolean flag);\r
-\r
-    /**\r
-     * returns types of extracted birthmarks.\r
-     */\r
-    public String[] getBirthmarkTypes();\r
-\r
-    public ExtractionUnit getExtractionUnit();\r
-\r
-    /**\r
-     * returns the number of target birthmark-set size (# of classes, packages, or jar files).\r
-     */\r
-    public int getBirthmarkSetSize();\r
-\r
-    /**\r
-     * returns an iterator for all of birthmark-sets.\r
-     */\r
-    public Iterator<BirthmarkSet> iterator();\r
-\r
-    /**\r
-     * returns a birthmark-set of given index.\r
-     */\r
-    public BirthmarkSet getBirthmarkSet(int index);\r
-\r
-    /**\r
-     * returns a birthmark-set of given name.\r
-     */\r
-    public BirthmarkSet getBirthmarkSet(String name);\r
-\r
-    /**\r
-     * returns an array for all of birthmark-sets.\r
-     */\r
-    public BirthmarkSet[] getBirthmarkSets();\r
-\r
-    /**\r
-     * removes given birthmark-set from this object.\r
-     */\r
-    public void removeBirthmarkSet(BirthmarkSet bs);\r
-\r
-    /**\r
-     * removes all of birthmark-set this object has.\r
-     */\r
-    public void removeAllBirthmarkSets();\r
-\r
-    /**\r
-     * returns the number of birthmark-set to specified extraction target (TARGET_X, TARGET_Y, TARGET_XY, or TARGET_BOTH).\r
-     */\r
-    public int getBirthmarkSetSize(ExtractionTarget target);\r
-\r
-    /**\r
-     * returns an iterator of birthmark-sets from specified extraction target.\r
-     */\r
-    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target);\r
-\r
-    /**\r
-     * \r
-     */\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index);\r
-\r
-    /**\r
-     * \r
-     */\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname);\r
-\r
-    /**\r
-     * \r
-     */\r
-    public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target);\r
-\r
-    /**\r
-     * adds birthmark-set to extraction target.\r
-     * This method must be called when building birthmark-set is completely finished.\r
-     * All of birthmark must be added to birthmark-set.\r
-     * Because, if the concrete class of this interface stores given birthmark-set to database,\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) throws BirthmarkStoreException;\r
-\r
-    /**\r
-     * remove all of birthmark-set this object has, then, adds each birthmark-sets to this object. \r
-     * @see #removeAllBirthmarkSets(ExtractionTarget)\r
-     * @see #addBirthmarkSet(ExtractionTarget, BirthmarkSet)\r
-     * @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH \r
-     */\r
-    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException;\r
-\r
-    /**\r
-     * remove specified birthmark-set from specified extraction target.\r
-     */\r
-    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
-\r
-    /**\r
-     * remove all birthmark-sets from specified extraction target.\r
-     */\r
-    public void removeAllBirthmarkSets(ExtractionTarget target);\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+
+/**
+ * This interface represents a set of extracted birthmarks.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface ExtractionResultSet extends Iterable<BirthmarkSet>{
+    public BirthmarkStoreTarget getStoreTarget();
+
+    /**
+     * returns an environment of extraction result.
+     */
+    public BirthmarkEnvironment getEnvironment();
+
+    /**
+     * returns a context of extraction result.
+     */
+    public BirthmarkContext getContext();
+
+    public String getId();
+
+    /**
+     * sets extraction 
+     */
+    public boolean isTableType();
+
+    /**
+     * sets table type comparison flag.
+     * @see #isTableType()
+     */
+    public void setTableType(boolean flag);
+
+    /**
+     * returns types of extracted birthmarks.
+     */
+    public String[] getBirthmarkTypes();
+
+    public ExtractionUnit getExtractionUnit();
+
+    /**
+     * returns the number of target birthmark-set size (# of classes, packages, or jar files).
+     */
+    public int getBirthmarkSetSize();
+
+    /**
+     * returns an iterator for all of birthmark-sets.
+     */
+    public Iterator<BirthmarkSet> iterator();
+
+    /**
+     * returns a birthmark-set of given index.
+     */
+    public BirthmarkSet getBirthmarkSet(int index);
+
+    /**
+     * returns a birthmark-set of given name.
+     */
+    public BirthmarkSet getBirthmarkSet(String name);
+
+    /**
+     * returns an array for all of birthmark-sets.
+     */
+    public BirthmarkSet[] getBirthmarkSets();
+
+    /**
+     * removes given birthmark-set from this object.
+     */
+    public void removeBirthmarkSet(BirthmarkSet bs);
+
+    /**
+     * removes all of birthmark-set this object has.
+     */
+    public void removeAllBirthmarkSets();
+
+    /**
+     * returns the number of birthmark-set to specified extraction target (TARGET_X, TARGET_Y, TARGET_XY, or TARGET_BOTH).
+     */
+    public int getBirthmarkSetSize(ExtractionTarget target);
+
+    /**
+     * returns an iterator of birthmark-sets from specified extraction target.
+     */
+    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target);
+
+    /**
+     * 
+     */
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index);
+
+    /**
+     * 
+     */
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname);
+
+    /**
+     * 
+     */
+    public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target);
+
+    /**
+     * adds birthmark-set to extraction target.
+     * This method must be called when building birthmark-set is completely finished.
+     * All of birthmark must be added to birthmark-set.
+     * Because, if the concrete class of this interface stores given birthmark-set to database,
+     * birthmarks is parsed and store into target database in this method.
+     * @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH 
+     */
+    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;
+
+    /**
+     * remove all of birthmark-set this object has, then, adds each birthmark-sets to this object. 
+     * @see #removeAllBirthmarkSets(ExtractionTarget)
+     * @see #addBirthmarkSet(ExtractionTarget, BirthmarkSet)
+     * @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH 
+     */
+    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException;
+
+    /**
+     * remove specified birthmark-set from specified extraction target.
+     */
+    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set);
+
+    /**
+     * remove all birthmark-sets from specified extraction target.
+     */
+    public void removeAllBirthmarkSets(ExtractionTarget target);
+}
@@ -1,18 +1,18 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This enum represents the mean of extracted birthmarks.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public enum ExtractionTarget{\r
-    TARGET_X,\r
-    TARGET_Y,\r
-    TARGET_XY,\r
-    TARGET_BOTH,\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This enum represents the mean of extracted birthmarks.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public enum ExtractionTarget{
+    TARGET_X,
+    TARGET_Y,
+    TARGET_XY,
+    TARGET_BOTH,
 }
\ No newline at end of file
@@ -1,23 +1,23 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This enum type represents birthmark extraction unit.\r
- * \r
- * The name of\r
- * {@link jp.naist.se.stigmata.BirthmarkSet <code>BirthmarkSet</code>} will be\r
- * class name, method name, package name, or product name.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public enum ExtractionUnit{\r
-    CLASS,\r
-    PACKAGE,\r
-    ARCHIVE,\r
-    @Deprecated\r
-    METHOD,\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This enum type represents birthmark extraction unit.
+ * 
+ * The name of
+ * {@link jp.sourceforge.stigmata.BirthmarkSet <code>BirthmarkSet</code>} will be
+ * class name, method name, package name, or product name.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public enum ExtractionUnit{
+    CLASS,
+    PACKAGE,
+    ARCHIVE,
+    @Deprecated
+    METHOD,
+}
@@ -1,29 +1,29 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- *\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class ExtractorNotFoundException extends BirthmarkException{\r
-    private static final long serialVersionUID = 2050231007494812969L;\r
-\r
-    public ExtractorNotFoundException(){\r
-    }\r
-\r
-    public ExtractorNotFoundException(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-\r
-    public ExtractorNotFoundException(String message){\r
-        super(message);\r
-    }\r
-\r
-    public ExtractorNotFoundException(Throwable cause){\r
-        super(cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class ExtractorNotFoundException extends BirthmarkException{
+    private static final long serialVersionUID = 2050231007494812969L;
+
+    public ExtractorNotFoundException(){
+    }
+
+    public ExtractorNotFoundException(String message, Throwable cause){
+        super(message, cause);
+    }
+
+    public ExtractorNotFoundException(String message){
+        super(message);
+    }
+
+    public ExtractorNotFoundException(Throwable cause){
+        super(cause);
+    }
+}
@@ -1,29 +1,29 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class FilterNotFoundException extends BirthmarkException{\r
-    private static final long serialVersionUID = -3981002035876805953L;\r
-\r
-    public FilterNotFoundException(){\r
-    }\r
-\r
-    public FilterNotFoundException(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-\r
-    public FilterNotFoundException(String message){\r
-        super(message);\r
-    }\r
-\r
-    public FilterNotFoundException(Throwable cause){\r
-        super(cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class FilterNotFoundException extends BirthmarkException{
+    private static final long serialVersionUID = -3981002035876805953L;
+
+    public FilterNotFoundException(){
+    }
+
+    public FilterNotFoundException(String message, Throwable cause){
+        super(message, cause);
+    }
+
+    public FilterNotFoundException(String message){
+        super(message);
+    }
+
+    public FilterNotFoundException(Throwable cause){
+        super(cause);
+    }
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.BufferedReader;\r
-import java.io.File;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.io.InputStreamReader;\r
-import java.io.PrintWriter;\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.ResourceBundle;\r
-\r
-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
-import jp.naist.se.stigmata.printer.PrinterManager;\r
-import jp.naist.se.stigmata.reader.ClasspathContext;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.utils.ConfigFileExporter;\r
-import jp.sourceforge.talisman.xmlcli.CommandLinePlus;\r
-import jp.sourceforge.talisman.xmlcli.OptionsBuilder;\r
-import jp.sourceforge.talisman.xmlcli.ResourceHelpFormatter;\r
-import jp.sourceforge.talisman.xmlcli.XmlCliConfigurationException;\r
-import jp.sourceforge.talisman.xmlcli.builder.OptionsBuilderFactory;\r
-\r
-import org.apache.commons.cli.CommandLineParser;\r
-import org.apache.commons.cli.HelpFormatter;\r
-import org.apache.commons.cli.Options;\r
-import org.apache.commons.cli.ParseException;\r
-import org.apache.commons.cli.PosixParser;\r
-import org.w3c.dom.DOMException;\r
-\r
-/**\r
- * Front end class.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public final class Main{\r
-    private PrinterManager manager = PrinterManager.getInstance();\r
-\r
-    /**\r
-     * main process.\r
-     * @throws org.apache.commons.cli.ParseException \r
-     */\r
-    public Main(String[] args) throws ParseException{\r
-        Options options = buildOptions();\r
-        CommandLineParser parser = new PosixParser();\r
-        CommandLinePlus commandLine = new CommandLinePlus(parser.parse(options, args, false));\r
-\r
-        Stigmata stigmata = Stigmata.getInstance();\r
-        stigmata.configuration(commandLine.getOptionValue("config-file"), commandLine.hasOption("reset-config"));\r
-\r
-        String[] arguments = commandLine.getArgs();\r
-\r
-        String mode = commandLine.getOptionValue("mode");\r
-        String format = commandLine.getOptionValue("format");\r
-\r
-        if(format == null){\r
-            format = "xml";\r
-        }\r
-        if(mode == null){\r
-            mode = "gui";\r
-        }\r
-        BirthmarkContext context = stigmata.createContext();\r
-        updateContext(context, commandLine);\r
-\r
-        boolean exitFlag = executeOption(context.getEnvironment(), commandLine, options);\r
-\r
-        if(!exitFlag){\r
-            if(!("gui".equals(mode) || "list".equals(mode)) && (arguments == null || arguments.length == 0)){\r
-\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
-            }\r
-            else if(mode.equals("extract")){\r
-                extractBirthmarks(stigmata, arguments, format, context);\r
-            }\r
-            else if(mode.equals("compare")){\r
-                compareBirthmarks(stigmata, arguments, format, context);\r
-            }\r
-            else if(mode.equals("gui")){\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
-    /**\r
-     * extract birthmarks.\r
-     */\r
-    private void extractBirthmarks(Stigmata stigmata, String[] args, String format,\r
-            BirthmarkContext context){\r
-        try{\r
-            context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR);\r
-            BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment());\r
-\r
-            engine.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){\r
-                public void operationDone(BirthmarkEngineEvent e){\r
-                    WarningMessages warnings = e.getMessage();\r
-                    for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){\r
-                        i.next().printStackTrace();\r
-                    }\r
-                }\r
-            });\r
-            ExtractionResultSet ers = engine.extract(args, context);\r
-\r
-            ResultPrinterSpi spi = manager.getService(format);\r
-            ExtractionResultSetPrinter formatter = spi.getExtractionResultSetPrinter();\r
-            formatter.printResult(new PrintWriter(System.out), ers);\r
-        }catch(Exception ex){\r
-            ex.printStackTrace();\r
-        }\r
-    }\r
-\r
-    /**\r
-     * \r
-     */\r
-    private void compareBirthmarks(Stigmata stigmata, String[] args, String format,\r
-            BirthmarkContext context){\r
-        try{\r
-            BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment());\r
-            context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR);\r
-            engine.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){\r
-                public void operationDone(BirthmarkEngineEvent e){\r
-                    WarningMessages warnings = e.getMessage();\r
-                    for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){\r
-                        i.next().printStackTrace();\r
-                    }\r
-                }\r
-            });\r
-\r
-            ExtractionResultSet rs = engine.extract(args, context);\r
-            ComparisonResultSet resultset = engine.compare(rs);\r
-            if(context.hasFilter()){\r
-                resultset = engine.filter(resultset);\r
-            }\r
-\r
-            ResultPrinterSpi spi = manager.getService(format);\r
-            ComparisonResultSetPrinter formatter = spi.getComparisonResultSetPrinter();\r
-            formatter.printResult(new PrintWriter(System.out), resultset);\r
-        }catch(Exception e){\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-    private void listBirthmarks(BirthmarkContext context, String format){\r
-        try{\r
-            BirthmarkSpi[] spis = context.getEnvironment().findServices();\r
-            ResultPrinterSpi spi = manager.getService(format);\r
-            BirthmarkServicePrinter formatter = spi.getBirthmarkServicePrinter();\r
-\r
-            formatter.printResult(new PrintWriter(System.out), spis);\r
-        }catch(IOException e){\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-    private void updateContext(BirthmarkContext context, CommandLinePlus cl){\r
-        BirthmarkEnvironment env = context.getEnvironment();\r
-\r
-        String[] birthmarks = getTargetBirthmarks(env, cl);\r
-        for(int i = 0; i < birthmarks.length; i++){\r
-            context.addBirthmarkType(birthmarks[i]);\r
-        }\r
-        if(cl.hasOption("filter")){\r
-            String[] filters = cl.getOptionValues("filter");\r
-            for(int i = 0; i < filters.length; i++){\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
-\r
-        addClasspath(env.getClasspathContext(), cl);\r
-    }\r
-\r
-    private String[] getTargetBirthmarks(BirthmarkEnvironment env, CommandLinePlus cl){\r
-        String[] birthmarks = cl.getOptionValues("birthmark");\r
-        if(birthmarks == null || birthmarks.length == 0){\r
-            List<String> birthmarkList = new ArrayList<String>();\r
-            for(BirthmarkSpi service: env.getServices()){\r
-                if(!service.isExpert()){\r
-                    birthmarkList.add(service.getType());\r
-                }\r
-            }\r
-            birthmarks = birthmarkList.toArray(new String[birthmarkList.size()]);\r
-        }\r
-        return birthmarks;\r
-    }\r
-\r
-    private void addClasspath(ClasspathContext context, CommandLinePlus commandLine){\r
-        String[] classpath = commandLine.getOptionValues("classpath");\r
-\r
-        if(classpath != null){\r
-            for(String cp: classpath){\r
-                try{\r
-                    File f = new File(cp);\r
-                    if(f.exists()){\r
-                        context.addClasspath(f.toURI().toURL());\r
-                    }\r
-                }catch(MalformedURLException ex){\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    private boolean executeOption(BirthmarkEnvironment env, CommandLinePlus commandLine, Options options){\r
-        boolean exitFlag = false;\r
-        if(commandLine.hasOption("help")){\r
-            printHelp(env, options);\r
-            exitFlag = true;\r
-        }\r
-        if(commandLine.hasOption("version")){\r
-            printVersion();\r
-            exitFlag = true;\r
-        }\r
-        if(commandLine.hasOption("license")){\r
-            printLicense();\r
-            exitFlag = true;\r
-        }\r
-        if(commandLine.hasOption("export-config")){\r
-            exportConfiguration(env, commandLine.getOptionValue("export-config"));\r
-            exitFlag = true;\r
-        }\r
-        return exitFlag;\r
-    }\r
-\r
-    private Options buildOptions(){\r
-        try{\r
-            OptionsBuilderFactory factory = OptionsBuilderFactory.getInstance();\r
-            URL location = getClass().getResource("/resources/options.xml");\r
-            OptionsBuilder builder = factory.createBuilder(location);\r
-            Options options = builder.buildOptions();\r
-\r
-            return options;\r
-        }catch(XmlCliConfigurationException ex){\r
-            ex.printStackTrace();\r
-        }catch(DOMException ex){\r
-            ex.printStackTrace();\r
-        }catch(IOException ex){\r
-            ex.printStackTrace();\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public void exportConfiguration(BirthmarkEnvironment env, String file){\r
-        try{\r
-            PrintWriter out;\r
-            if(file == null){\r
-                out = new PrintWriter(System.out);\r
-            }\r
-            else{\r
-                if(!file.endsWith(".xml")){\r
-                    file = file + ".xml";\r
-                }\r
-                out = new PrintWriter(new FileWriter(file));\r
-            }\r
-\r
-            new ConfigFileExporter(env).export(out);\r
-            out.close();\r
-        }catch(IOException e){\r
-        }\r
-    }\r
-\r
-    public void printHelp(BirthmarkEnvironment env, Options options){\r
-        Package p = getClass().getPackage();\r
-        ResourceBundle helpResource = ResourceBundle.getBundle("resources.options");\r
-        HelpFormatter formatter = new ResourceHelpFormatter(helpResource);\r
-        formatter.printHelp(\r
-            String.format(\r
-                helpResource.getString("cli.interface"),\r
-                p.getImplementationVersion()\r
-            ),\r
-            options\r
-        );\r
-        System.out.println();\r
-        System.out.println(helpResource.getString("cli.interface.birthmarks"));\r
-        for(BirthmarkSpi service: env.getServices()){\r
-            if(!service.isExpert()){\r
-                System.out.printf("    %-5s (%s): %s%n", service.getType(),\r
-                        service.getDisplayType(), service.getDescription());\r
-            }\r
-        }\r
-        System.out.println();\r
-        System.out.println(helpResource.getString("cli.interface.filters"));\r
-        for(ComparisonPairFilterSet filterset: env.getFilterManager().getFilterSets()){\r
-            String matchString = helpResource.getString("cli.interface.filter.matchall");\r
-            if(filterset.isMatchAny()) matchString = helpResource.getString("cli.interface.filter.matchany");\r
-            System.out.printf("    %s (%s)%n", filterset.getName(), matchString);\r
-            for(ComparisonPairFilter filter: filterset){\r
-                System.out.printf("        %s%n", filter);\r
-            }\r
-        }\r
-        System.out.println();\r
-        System.out.println(helpResource.getString("cli.interface.copyright"));\r
-        System.out.println(helpResource.getString("cli.interface.mailto"));\r
-    }\r
-\r
-    public void printLicense(){\r
-        try{\r
-            InputStream in = getClass().getResourceAsStream("/META-INF/license.txt");\r
-            BufferedReader reader = new BufferedReader(new InputStreamReader(in));\r
-            String line;\r
-\r
-            while((line = reader.readLine()) != null){\r
-                System.out.println(line);\r
-            }\r
-            reader.close();\r
-        }catch(IOException ex){\r
-            ex.printStackTrace();\r
-        }\r
-    }\r
-\r
-    public void printVersion(){\r
-        ResourceBundle helpResource = ResourceBundle.getBundle("resources.options");\r
-        Package p = getClass().getPackage();\r
-        System.out.printf("%s %s%n", helpResource.getString("cli.version.header"), p.getImplementationVersion());\r
-    }\r
-\r
-    public static void main(String[] args) throws Exception{\r
-        new Main(args);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+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 java.util.ResourceBundle;
+
+import jp.sourceforge.stigmata.event.BirthmarkEngineAdapter;
+import jp.sourceforge.stigmata.event.BirthmarkEngineEvent;
+import jp.sourceforge.stigmata.event.WarningMessages;
+import jp.sourceforge.stigmata.hook.Phase;
+import jp.sourceforge.stigmata.hook.StigmataHookManager;
+import jp.sourceforge.stigmata.printer.BirthmarkServicePrinter;
+import jp.sourceforge.stigmata.printer.ComparisonResultSetPrinter;
+import jp.sourceforge.stigmata.printer.ExtractionResultSetPrinter;
+import jp.sourceforge.stigmata.printer.PrinterManager;
+import jp.sourceforge.stigmata.reader.ClasspathContext;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.stigmata.utils.ConfigFileExporter;
+import jp.sourceforge.talisman.xmlcli.CommandLinePlus;
+import jp.sourceforge.talisman.xmlcli.OptionsBuilder;
+import jp.sourceforge.talisman.xmlcli.ResourceHelpFormatter;
+import jp.sourceforge.talisman.xmlcli.XmlCliConfigurationException;
+import jp.sourceforge.talisman.xmlcli.builder.OptionsBuilderFactory;
+
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+import org.w3c.dom.DOMException;
+
+/**
+ * Front end class.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public final class Main{
+    private PrinterManager manager = PrinterManager.getInstance();
+
+    /**
+     * main process.
+     * @throws org.apache.commons.cli.ParseException 
+     */
+    public Main(String[] args) throws ParseException{
+        Options options = buildOptions();
+        CommandLineParser parser = new PosixParser();
+        CommandLinePlus commandLine = new CommandLinePlus(parser.parse(options, args, false));
+
+        Stigmata stigmata = Stigmata.getInstance();
+        stigmata.configuration(commandLine.getOptionValue("config-file"), commandLine.hasOption("reset-config"));
+
+        String[] arguments = commandLine.getArgs();
+
+        String mode = commandLine.getOptionValue("mode");
+        String format = commandLine.getOptionValue("format");
+
+        if(format == null){
+            format = "xml";
+        }
+        if(mode == null){
+            mode = "gui";
+        }
+        BirthmarkContext context = stigmata.createContext();
+        updateContext(context, commandLine);
+
+        boolean exitFlag = executeOption(context.getEnvironment(), commandLine, options);
+
+        if(!exitFlag){
+            if(!("gui".equals(mode) || "list".equals(mode)) && (arguments == null || arguments.length == 0)){
+
+                printHelp(context.getEnvironment(), options);
+                return;
+            }
+            StigmataHookManager.getInstance().runHook(Phase.SETUP, context.getEnvironment());
+
+            if(mode.equals("list")){
+                listBirthmarks(context, format);
+            }
+            else if(mode.equals("extract")){
+                extractBirthmarks(stigmata, arguments, format, context);
+            }
+            else if(mode.equals("compare")){
+                compareBirthmarks(stigmata, arguments, format, context);
+            }
+            else if(mode.equals("gui")){
+                StigmataFrame frame = new StigmataFrame(stigmata, context.getEnvironment());
+                frame.setVisible(true);
+            }
+
+            if(!mode.equals("gui")){
+                StigmataHookManager.getInstance().runHook(Phase.TEAR_DOWN, context.getEnvironment());
+            }
+            else{
+                final BirthmarkEnvironment env = context.getEnvironment();
+                Runtime.getRuntime().addShutdownHook(new Thread(){
+                    public void run(){
+                        StigmataHookManager.getInstance().runHook(
+                            Phase.TEAR_DOWN, env
+                        );
+                    }
+                });
+            }
+        }
+    }
+
+    /**
+     * extract birthmarks.
+     */
+    private void extractBirthmarks(Stigmata stigmata, String[] args, String format,
+            BirthmarkContext context){
+        try{
+            context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR);
+            BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment());
+
+            engine.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){
+                public void operationDone(BirthmarkEngineEvent e){
+                    WarningMessages warnings = e.getMessage();
+                    for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){
+                        i.next().printStackTrace();
+                    }
+                }
+            });
+            ExtractionResultSet ers = engine.extract(args, context);
+
+            ResultPrinterSpi spi = manager.getService(format);
+            ExtractionResultSetPrinter formatter = spi.getExtractionResultSetPrinter();
+            formatter.printResult(new PrintWriter(System.out), ers);
+        }catch(Exception ex){
+            ex.printStackTrace();
+        }
+    }
+
+    /**
+     * 
+     */
+    private void compareBirthmarks(Stigmata stigmata, String[] args, String format,
+            BirthmarkContext context){
+        try{
+            BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment());
+            context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR);
+            engine.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){
+                public void operationDone(BirthmarkEngineEvent e){
+                    WarningMessages warnings = e.getMessage();
+                    for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){
+                        i.next().printStackTrace();
+                    }
+                }
+            });
+
+            ExtractionResultSet rs = engine.extract(args, context);
+            ComparisonResultSet resultset = engine.compare(rs);
+            if(context.hasFilter()){
+                resultset = engine.filter(resultset);
+            }
+
+            ResultPrinterSpi spi = manager.getService(format);
+            ComparisonResultSetPrinter formatter = spi.getComparisonResultSetPrinter();
+            formatter.printResult(new PrintWriter(System.out), resultset);
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    private void listBirthmarks(BirthmarkContext context, String format){
+        try{
+            BirthmarkSpi[] spis = context.getEnvironment().findServices();
+            ResultPrinterSpi spi = manager.getService(format);
+            BirthmarkServicePrinter formatter = spi.getBirthmarkServicePrinter();
+
+            formatter.printResult(new PrintWriter(System.out), spis);
+        }catch(IOException e){
+            e.printStackTrace();
+        }
+    }
+
+    private void updateContext(BirthmarkContext context, CommandLinePlus cl){
+        BirthmarkEnvironment env = context.getEnvironment();
+
+        String[] birthmarks = getTargetBirthmarks(env, cl);
+        for(int i = 0; i < birthmarks.length; i++){
+            context.addBirthmarkType(birthmarks[i]);
+        }
+        if(cl.hasOption("filter")){
+            String[] filters = cl.getOptionValues("filter");
+            for(int i = 0; i < filters.length; i++){
+                context.addFilterType(filters[i]);
+            }
+        }
+        if(cl.hasOption("store-target")){
+            String value = cl.getOptionValue("store-target");
+            BirthmarkStoreTarget bst = BirthmarkStoreTarget.valueOf(value);
+            if(bst == null){
+                bst = BirthmarkStoreTarget.MEMORY;
+            }
+            context.setStoreTarget(bst);
+        }
+        if(cl.hasOption("extraction-unit")){
+            ExtractionUnit unit = ExtractionUnit.valueOf(cl.getOptionValue("extraction-unit"));
+            context.setExtractionUnit(unit);
+        }
+
+        addClasspath(env.getClasspathContext(), cl);
+    }
+
+    private String[] getTargetBirthmarks(BirthmarkEnvironment env, CommandLinePlus cl){
+        String[] birthmarks = cl.getOptionValues("birthmark");
+        if(birthmarks == null || birthmarks.length == 0){
+            List<String> birthmarkList = new ArrayList<String>();
+            for(BirthmarkSpi service: env.getServices()){
+                if(!service.isExpert()){
+                    birthmarkList.add(service.getType());
+                }
+            }
+            birthmarks = birthmarkList.toArray(new String[birthmarkList.size()]);
+        }
+        return birthmarks;
+    }
+
+    private void addClasspath(ClasspathContext context, CommandLinePlus commandLine){
+        String[] classpath = commandLine.getOptionValues("classpath");
+
+        if(classpath != null){
+            for(String cp: classpath){
+                try{
+                    File f = new File(cp);
+                    if(f.exists()){
+                        context.addClasspath(f.toURI().toURL());
+                    }
+                }catch(MalformedURLException ex){
+                }
+            }
+        }
+    }
+
+    private boolean executeOption(BirthmarkEnvironment env, CommandLinePlus commandLine, Options options){
+        boolean exitFlag = false;
+        if(commandLine.hasOption("help")){
+            printHelp(env, options);
+            exitFlag = true;
+        }
+        if(commandLine.hasOption("version")){
+            printVersion();
+            exitFlag = true;
+        }
+        if(commandLine.hasOption("license")){
+            printLicense();
+            exitFlag = true;
+        }
+        if(commandLine.hasOption("export-config")){
+            exportConfiguration(env, commandLine.getOptionValue("export-config"));
+            exitFlag = true;
+        }
+        return exitFlag;
+    }
+
+    private Options buildOptions(){
+        try{
+            OptionsBuilderFactory factory = OptionsBuilderFactory.getInstance();
+            URL location = getClass().getResource("/resources/options.xml");
+            OptionsBuilder builder = factory.createBuilder(location);
+            Options options = builder.buildOptions();
+
+            return options;
+        }catch(XmlCliConfigurationException ex){
+            ex.printStackTrace();
+        }catch(DOMException ex){
+            ex.printStackTrace();
+        }catch(IOException ex){
+            ex.printStackTrace();
+        }
+        return null;
+    }
+
+    public void exportConfiguration(BirthmarkEnvironment env, String file){
+        try{
+            PrintWriter out;
+            if(file == null){
+                out = new PrintWriter(System.out);
+            }
+            else{
+                if(!file.endsWith(".xml")){
+                    file = file + ".xml";
+                }
+                out = new PrintWriter(new FileWriter(file));
+            }
+
+            new ConfigFileExporter(env).export(out);
+            out.close();
+        }catch(IOException e){
+        }
+    }
+
+    public void printHelp(BirthmarkEnvironment env, Options options){
+        Package p = getClass().getPackage();
+        ResourceBundle helpResource = ResourceBundle.getBundle("resources.options");
+        HelpFormatter formatter = new ResourceHelpFormatter(helpResource);
+        formatter.printHelp(
+            String.format(
+                helpResource.getString("cli.interface"),
+                p.getImplementationVersion()
+            ),
+            options
+        );
+        System.out.println();
+        System.out.println(helpResource.getString("cli.interface.birthmarks"));
+        for(BirthmarkSpi service: env.getServices()){
+            if(!service.isExpert()){
+                System.out.printf("    %-5s (%s): %s%n", service.getType(),
+                        service.getDisplayType(), service.getDescription());
+            }
+        }
+        System.out.println();
+        System.out.println(helpResource.getString("cli.interface.filters"));
+        for(ComparisonPairFilterSet filterset: env.getFilterManager().getFilterSets()){
+            String matchString = helpResource.getString("cli.interface.filter.matchall");
+            if(filterset.isMatchAny()) matchString = helpResource.getString("cli.interface.filter.matchany");
+            System.out.printf("    %s (%s)%n", filterset.getName(), matchString);
+            for(ComparisonPairFilter filter: filterset){
+                System.out.printf("        %s%n", filter);
+            }
+        }
+        System.out.println();
+        System.out.println(helpResource.getString("cli.interface.copyright"));
+        System.out.println(helpResource.getString("cli.interface.mailto"));
+    }
+
+    public void printLicense(){
+        try{
+            InputStream in = getClass().getResourceAsStream("/META-INF/license.txt");
+            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+            String line;
+
+            while((line = reader.readLine()) != null){
+                System.out.println(line);
+            }
+            reader.close();
+        }catch(IOException ex){
+            ex.printStackTrace();
+        }
+    }
+
+    public void printVersion(){
+        ResourceBundle helpResource = ResourceBundle.getBundle("resources.options");
+        Package p = getClass().getPackage();
+        System.out.printf("%s %s%n", helpResource.getString("cli.version.header"), p.getImplementationVersion());
+    }
+
+    public static void main(String[] args) throws Exception{
+        new Main(args);
+    }
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-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 jp.naist.se.stigmata.event.BirthmarkEngineListener;\r
-import jp.naist.se.stigmata.printer.PrinterManager;\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
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class Stigmata{\r
-    /**\r
-     * instance. singleton pattern.\r
-     */\r
-    private static Stigmata stigmata;\r
-    private BirthmarkEnvironment defaultEnvironment;\r
-    private List<BirthmarkEngineListener> listeners = new ArrayList<BirthmarkEngineListener>();\r
-\r
-    /**\r
-     * private constructor.\r
-     */\r
-    private Stigmata(){\r
-        configuration();\r
-    }\r
-\r
-    /**\r
-     * gets only instance of this class.\r
-     */\r
-    public static synchronized Stigmata getInstance(){\r
-        if(stigmata == null){\r
-            stigmata = new Stigmata();\r
-        }\r
-        return stigmata;\r
-    }\r
-\r
-    /**\r
-     * creates a new birthmark context.\r
-     */\r
-    public BirthmarkContext createContext(){\r
-        return new BirthmarkContext(createEnvironment());\r
-    }\r
-\r
-    /**\r
-     * creates a new birthmark environment.\r
-     */\r
-    public BirthmarkEnvironment createEnvironment(){\r
-        return new BirthmarkEnvironment(defaultEnvironment);\r
-    }\r
-\r
-    /**\r
-     * creates a new birthmark engine.\r
-     */\r
-    public BirthmarkEngine createEngine(){\r
-        return createEngine(createEnvironment());\r
-    }\r
-\r
-    /**\r
-     * creates a new birthmark engine with given environment.\r
-     */\r
-    public BirthmarkEngine createEngine(BirthmarkEnvironment environment){\r
-        BirthmarkEngine engine = new BirthmarkEngine(environment);\r
-        for(BirthmarkEngineListener listener: listeners){\r
-            engine.addBirthmarkEngineListener(listener);\r
-        }\r
-        return engine;\r
-    }\r
-\r
-    public void addBirthmarkEngineListener(BirthmarkEngineListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void removeBirthmarkEngineListener(BirthmarkEngineListener listener){\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    public void configuration(){\r
-        configuration(null, false);\r
-    }\r
-\r
-    public void configuration(String filePath, boolean resetFlag){\r
-        InputStream target = null;\r
-        if(filePath != null){\r
-            try{\r
-                target = new FileInputStream(filePath);\r
-            } catch(FileNotFoundException e){\r
-                filePath = null;\r
-            }\r
-        }\r
-\r
-        if(filePath == null){\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(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml");\r
-                if(!file.exists()){\r
-                    file = null;\r
-                }\r
-            }\r
-            if(file != null){\r
-                try {\r
-                    target = new FileInputStream(file);\r
-                } catch (FileNotFoundException ex) {\r
-                    // never throwed this exception;\r
-                    throw new InternalError(ex.getMessage());\r
-                }\r
-            }\r
-        }\r
-        if(target == null || resetFlag){\r
-            target = getClass().getResourceAsStream("/resources/stigmata.xml");\r
-            if(resetFlag){\r
-                defaultEnvironment = null;\r
-                BirthmarkEnvironment.resetSettings();\r
-            }\r
-        }\r
-        initConfiguration(target);\r
-    }\r
-\r
-    private void initConfiguration(InputStream in){\r
-        if(defaultEnvironment == null){\r
-            defaultEnvironment = BirthmarkEnvironment.getDefaultEnvironment();\r
-        }\r
-        buildStigmataDirectory(BirthmarkEnvironment.getStigmataHome());\r
-\r
-        defaultEnvironment.setClassLoader(buildClassLoader("plugins"));\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 = defaultEnvironment.lookupProviders(BirthmarkSpi.class); i.hasNext(); ){\r
-            BirthmarkSpi service = i.next();\r
-            defaultEnvironment.addService(service);\r
-        }\r
-        PrinterManager.updateServices(defaultEnvironment);\r
-        exportConfigFile(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml");\r
-    }\r
-\r
-    private void buildStigmataDirectory(String homeDirectory){\r
-        File file = new File(homeDirectory);\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(String parent, String fileName){\r
-        try{\r
-            File file = new File(parent, fileName);\r
-            if(!file.exists()){\r
-                ConfigFileExporter exporter = new ConfigFileExporter(defaultEnvironment);\r
-                exporter.export(new PrintWriter(new FileWriter(file)));\r
-            }\r
-        } catch(IOException e){\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-    private static ClassLoader buildClassLoader(String path){\r
-        File directory = new File(BirthmarkEnvironment.getStigmataHome(), path);\r
-        File[] jarfiles = directory.listFiles(new ExtensionFilter("jar"));\r
-\r
-        if(jarfiles == null) jarfiles = new File[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, Stigmata.class.getClassLoader());\r
-        } catch(MalformedURLException e){\r
-        }\r
-        return null;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import jp.sourceforge.stigmata.event.BirthmarkEngineListener;
+import jp.sourceforge.stigmata.printer.PrinterManager;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.ui.swing.ExtensionFilter;
+import jp.sourceforge.stigmata.utils.ConfigFileExporter;
+import jp.sourceforge.stigmata.utils.ConfigFileImporter;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class Stigmata{
+    /**
+     * instance. singleton pattern.
+     */
+    private static Stigmata stigmata;
+    private BirthmarkEnvironment defaultEnvironment;
+    private List<BirthmarkEngineListener> listeners = new ArrayList<BirthmarkEngineListener>();
+
+    /**
+     * private constructor.
+     */
+    private Stigmata(){
+        configuration();
+    }
+
+    /**
+     * gets only instance of this class.
+     */
+    public static synchronized Stigmata getInstance(){
+        if(stigmata == null){
+            stigmata = new Stigmata();
+        }
+        return stigmata;
+    }
+
+    /**
+     * creates a new birthmark context.
+     */
+    public BirthmarkContext createContext(){
+        return new BirthmarkContext(createEnvironment());
+    }
+
+    /**
+     * creates a new birthmark environment.
+     */
+    public BirthmarkEnvironment createEnvironment(){
+        return new BirthmarkEnvironment(defaultEnvironment);
+    }
+
+    /**
+     * creates a new birthmark engine.
+     */
+    public BirthmarkEngine createEngine(){
+        return createEngine(createEnvironment());
+    }
+
+    /**
+     * creates a new birthmark engine with given environment.
+     */
+    public BirthmarkEngine createEngine(BirthmarkEnvironment environment){
+        BirthmarkEngine engine = new BirthmarkEngine(environment);
+        for(BirthmarkEngineListener listener: listeners){
+            engine.addBirthmarkEngineListener(listener);
+        }
+        return engine;
+    }
+
+    public void addBirthmarkEngineListener(BirthmarkEngineListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeBirthmarkEngineListener(BirthmarkEngineListener listener){
+        listeners.remove(listener);
+    }
+
+    public void configuration(){
+        configuration(null, false);
+    }
+
+    public void configuration(String filePath, boolean resetFlag){
+        InputStream target = null;
+        if(filePath != null){
+            try{
+                target = new FileInputStream(filePath);
+            } catch(FileNotFoundException e){
+                filePath = null;
+            }
+        }
+
+        if(filePath == null){
+            String currentDirectory = System.getProperty("execution.directory");
+            if(currentDirectory == null){
+                currentDirectory = System.getProperty("user.dir");
+            }
+            File file = new File(currentDirectory, "stigmata.xml");
+            if(!file.exists()){
+                file = new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml");
+                if(!file.exists()){
+                    file = null;
+                }
+            }
+            if(file != null){
+                try {
+                    target = new FileInputStream(file);
+                } catch (FileNotFoundException ex) {
+                    // never throwed this exception;
+                    throw new InternalError(ex.getMessage());
+                }
+            }
+        }
+        if(target == null || resetFlag){
+            target = getClass().getResourceAsStream("/resources/stigmata.xml");
+            if(resetFlag){
+                defaultEnvironment = null;
+                BirthmarkEnvironment.resetSettings();
+            }
+        }
+        initConfiguration(target);
+    }
+
+    private void initConfiguration(InputStream in){
+        if(defaultEnvironment == null){
+            defaultEnvironment = BirthmarkEnvironment.getDefaultEnvironment();
+        }
+        buildStigmataDirectory(BirthmarkEnvironment.getStigmataHome());
+
+        defaultEnvironment.setClassLoader(buildClassLoader("plugins"));
+        try{
+            ConfigFileImporter parser = new ConfigFileImporter(defaultEnvironment);
+            parser.parse(in);
+        } catch(IOException e){
+            throw new ApplicationInitializationError(e);
+        }
+        for(Iterator<BirthmarkSpi> i = defaultEnvironment.lookupProviders(BirthmarkSpi.class); i.hasNext(); ){
+            BirthmarkSpi service = i.next();
+            defaultEnvironment.addService(service);
+        }
+        PrinterManager.updateServices(defaultEnvironment);
+        exportConfigFile(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml");
+    }
+
+    private void buildStigmataDirectory(String homeDirectory){
+        File file = new File(homeDirectory);
+        if(file.exists() && file.isFile()){
+            File dest = new File(file.getParent(), ".stigmata.back");
+            file.renameTo(dest);
+        }
+        if(!file.exists()){
+            file.mkdirs();
+        }
+        File pluginDir = new File(file, "plugins");
+        if(!pluginDir.exists()){
+            pluginDir.mkdirs();
+        }
+    }
+
+    private void exportConfigFile(String parent, String fileName){
+        try{
+            File file = new File(parent, fileName);
+            if(!file.exists()){
+                ConfigFileExporter exporter = new ConfigFileExporter(defaultEnvironment);
+                exporter.export(new PrintWriter(new FileWriter(file)));
+            }
+        } catch(IOException e){
+            e.printStackTrace();
+        }
+    }
+
+    private static ClassLoader buildClassLoader(String path){
+        File directory = new File(BirthmarkEnvironment.getStigmataHome(), path);
+        File[] jarfiles = directory.listFiles(new ExtensionFilter("jar"));
+
+        if(jarfiles == null) jarfiles = new File[0];
+        try{
+            URL[] urls = new URL[jarfiles.length];
+            for(int i = 0; i < jarfiles.length; i++){
+                urls[i] = jarfiles[i].toURI().toURL();
+            }
+            return new URLClassLoader(urls, Stigmata.class.getClassLoader());
+        } catch(MalformedURLException e){
+        }
+        return null;
+    }
+}
@@ -1,58 +1,58 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.BirthmarkExtractionFailedException;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-import org.objectweb.asm.ClassReader;\r
-import org.objectweb.asm.ClassWriter;\r
-\r
-/**\r
- * Abstract birthmark extractor using ASM.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class ASMBirthmarkExtractor extends AbstractBirthmarkExtractor{\r
-    public ASMBirthmarkExtractor(BirthmarkSpi spi){\r
-        super(spi);\r
-    }\r
-\r
-    @SuppressWarnings("deprecation")\r
-    public ASMBirthmarkExtractor(){\r
-        super();\r
-    }\r
-\r
-    public abstract BirthmarkExtractVisitor\r
-        createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkEnvironment environment);\r
-\r
-    @Override\r
-    public Birthmark extract(Birthmark birthmark, InputStream in,\r
-                             BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{\r
-        BirthmarkExtractionFailedException bee = new BirthmarkExtractionFailedException();\r
-\r
-        try{\r
-            ClassReader reader = new ClassReader(in);\r
-            ClassWriter writer = new ClassWriter(false);\r
-            BirthmarkExtractVisitor visitor = createExtractVisitor(writer, birthmark, environment);\r
-            reader.accept(visitor, false);\r
-\r
-            if(!visitor.isSuccess()){\r
-                bee.addCauses(visitor.getCauses());\r
-            }\r
-\r
-            return visitor.getBirthmark();\r
-        } catch(IOException e){\r
-            bee.addCause(e);\r
-            throw bee;\r
-        }\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+
+/**
+ * Abstract birthmark extractor using ASM.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class ASMBirthmarkExtractor extends AbstractBirthmarkExtractor{
+    public ASMBirthmarkExtractor(BirthmarkSpi spi){
+        super(spi);
+    }
+
+    @SuppressWarnings("deprecation")
+    public ASMBirthmarkExtractor(){
+        super();
+    }
+
+    public abstract BirthmarkExtractVisitor
+        createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkEnvironment environment);
+
+    @Override
+    public Birthmark extract(Birthmark birthmark, InputStream in,
+                             BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{
+        BirthmarkExtractionFailedException bee = new BirthmarkExtractionFailedException();
+
+        try{
+            ClassReader reader = new ClassReader(in);
+            ClassWriter writer = new ClassWriter(false);
+            BirthmarkExtractVisitor visitor = createExtractVisitor(writer, birthmark, environment);
+            reader.accept(visitor, false);
+
+            if(!visitor.isSuccess()){
+                bee.addCauses(visitor.getCauses());
+            }
+
+            return visitor.getBirthmark();
+        } catch(IOException e){
+            bee.addCause(e);
+            throw bee;
+        }
+    }
 }
\ No newline at end of file
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.birthmarks;
+package jp.sourceforge.stigmata.birthmarks;
 
 /*
  * $Id$
@@ -9,8 +9,8 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
 
 /**
  * Abstract class for concrete {@link Birthmark <code>Birthmark</code>}
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.InputStream;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.BirthmarkExtractionFailedException;\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.ExtractionUnit;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Abstract class for extracting birthmark.\r
- * @author  Haruaki TAMADA\r
- * @version  $Revision$ $Date$\r
- */\r
-public abstract class AbstractBirthmarkExtractor implements BirthmarkExtractor{\r
-    /**\r
-     * provider.\r
-     */\r
-    private BirthmarkSpi spi;\r
-\r
-    /**\r
-     * default constructor.\r
-     * @deprecated this constructor does not support service provider.\r
-     */\r
-    public AbstractBirthmarkExtractor(){\r
-    }\r
-\r
-    /**\r
-     * constructor.\r
-     * @param spi service provider.\r
-     */\r
-    public AbstractBirthmarkExtractor(BirthmarkSpi spi){\r
-        this.spi = spi;\r
-    }\r
-\r
-    /**\r
-     * returns the provider of this extractor.\r
-     */\r
-    public BirthmarkSpi getProvider(){\r
-        return spi;\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given stream.\r
-     */\r
-    public final Birthmark extract(InputStream in) throws BirthmarkExtractionFailedException{\r
-        return extract(in, BirthmarkEnvironment.getDefaultEnvironment());\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given byte array.\r
-     */\r
-    public final Birthmark extract(byte[] bytecode) throws BirthmarkExtractionFailedException{\r
-        return extract(bytecode, BirthmarkEnvironment.getDefaultEnvironment());\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given stream.\r
-     */\r
-    public final Birthmark extract(Birthmark birthmark, InputStream in) throws BirthmarkExtractionFailedException{\r
-        return extract(birthmark, in, BirthmarkEnvironment.getDefaultEnvironment());\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given byte array.\r
-     */\r
-    public final Birthmark extract(Birthmark birthmark, byte[] bytecode) throws BirthmarkExtractionFailedException{\r
-        return extract(birthmark, bytecode, BirthmarkEnvironment.getDefaultEnvironment());\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given stream with given environment.\r
-     */\r
-    public final Birthmark extract(InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{\r
-        return extract(createBirthmark(), in, environment);\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given byte array with given environment.\r
-     */\r
-    public final Birthmark extract(Birthmark birthmark, byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{\r
-        return extract(birthmark, new ByteArrayInputStream(bytecode), environment);\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given byte array with given environment.\r
-     */\r
-    public final Birthmark extract(byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{\r
-        return extract(createBirthmark(), new ByteArrayInputStream(bytecode), environment);\r
-    }\r
-\r
-    /**\r
-     * extract birthmark given stream with given environment.\r
-     */\r
-    public abstract Birthmark extract(Birthmark birthmark, InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;\r
-\r
-    /**\r
-     * create birthmark.\r
-     * @see jp.naist.se.stigmata.BirthmarkExtractor#createBirthmark()\r
-     */\r
-    public Birthmark createBirthmark(){\r
-        return new PlainBirthmark(getProvider().getType());\r
-    }\r
-\r
-    public abstract ExtractionUnit[] getAcceptableUnits();\r
-\r
-    public boolean isAcceptable(ExtractionUnit unit){\r
-        ExtractionUnit[] units = getAcceptableUnits();\r
-\r
-        for(int i = 0; i < units.length; i++){\r
-            if(units[i] == unit){\r
-                return true;\r
-            }\r
-        }\r
-        return false;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Abstract class for extracting birthmark.
+ * @author  Haruaki TAMADA
+ * @version  $Revision$ $Date$
+ */
+public abstract class AbstractBirthmarkExtractor implements BirthmarkExtractor{
+    /**
+     * provider.
+     */
+    private BirthmarkSpi spi;
+
+    /**
+     * default constructor.
+     * @deprecated this constructor does not support service provider.
+     */
+    public AbstractBirthmarkExtractor(){
+    }
+
+    /**
+     * constructor.
+     * @param spi service provider.
+     */
+    public AbstractBirthmarkExtractor(BirthmarkSpi spi){
+        this.spi = spi;
+    }
+
+    /**
+     * returns the provider of this extractor.
+     */
+    public BirthmarkSpi getProvider(){
+        return spi;
+    }
+
+    /**
+     * extract birthmark given stream.
+     */
+    public final Birthmark extract(InputStream in) throws BirthmarkExtractionFailedException{
+        return extract(in, BirthmarkEnvironment.getDefaultEnvironment());
+    }
+
+    /**
+     * extract birthmark given byte array.
+     */
+    public final Birthmark extract(byte[] bytecode) throws BirthmarkExtractionFailedException{
+        return extract(bytecode, BirthmarkEnvironment.getDefaultEnvironment());
+    }
+
+    /**
+     * extract birthmark given stream.
+     */
+    public final Birthmark extract(Birthmark birthmark, InputStream in) throws BirthmarkExtractionFailedException{
+        return extract(birthmark, in, BirthmarkEnvironment.getDefaultEnvironment());
+    }
+
+    /**
+     * extract birthmark given byte array.
+     */
+    public final Birthmark extract(Birthmark birthmark, byte[] bytecode) throws BirthmarkExtractionFailedException{
+        return extract(birthmark, bytecode, BirthmarkEnvironment.getDefaultEnvironment());
+    }
+
+    /**
+     * extract birthmark given stream with given environment.
+     */
+    public final Birthmark extract(InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{
+        return extract(createBirthmark(), in, environment);
+    }
+
+    /**
+     * extract birthmark given byte array with given environment.
+     */
+    public final Birthmark extract(Birthmark birthmark, byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{
+        return extract(birthmark, new ByteArrayInputStream(bytecode), environment);
+    }
+
+    /**
+     * extract birthmark given byte array with given environment.
+     */
+    public final Birthmark extract(byte[] bytecode, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{
+        return extract(createBirthmark(), new ByteArrayInputStream(bytecode), environment);
+    }
+
+    /**
+     * extract birthmark given stream with given environment.
+     */
+    public abstract Birthmark extract(Birthmark birthmark, InputStream in, BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException;
+
+    /**
+     * create birthmark.
+     * @see jp.sourceforge.stigmata.BirthmarkExtractor#createBirthmark()
+     */
+    public Birthmark createBirthmark(){
+        return new PlainBirthmark(getProvider().getType());
+    }
+
+    public abstract ExtractionUnit[] getAcceptableUnits();
+
+    public boolean isAcceptable(ExtractionUnit unit){
+        ExtractionUnit[] units = getAcceptableUnits();
+
+        for(int i = 0; i < units.length; i++){
+            if(units[i] == unit){
+                return true;
+            }
+        }
+        return false;
+    }
+}
@@ -1,85 +1,85 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\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
-/**\r
- * Abstract class for {@link BirthmarkSpi <code>BirthmarkSpi</code>}\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractBirthmarkService implements BirthmarkSpi{\r
-    public String getDisplayType(){\r
-        return getDisplayType(Locale.getDefault());\r
-    }\r
-\r
-    public String getDisplayType(Locale locale){\r
-        LocalizedDescriptionManager manager = LocalizedDescriptionManager.getInstance();\r
-        String type = manager.getDisplayType(locale, getType());\r
-        if(type == null){\r
-            type = getType();\r
-        }\r
-        return type;\r
-    }\r
-\r
-    public String getDescription(){\r
-        return getDescription(Locale.getDefault());\r
-    }\r
-\r
-    public String getDescription(Locale locale){\r
-        LocalizedDescriptionManager manager = LocalizedDescriptionManager.getInstance();\r
-        String description = manager.getDescription(locale, getType());\r
-        if(description == null){\r
-            description = getDefaultDescription();\r
-        }\r
-        return description;\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return getComparator().getClass().getName();\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return getExtractor().getClass().getName();\r
-    }\r
-\r
-    public abstract String getType();\r
-\r
-    public abstract String getDefaultDescription();\r
-\r
-    public boolean isExpert(){\r
-        return true;\r
-    }\r
-\r
-    public boolean isUserDefined(){\r
-        return true;\r
-    }\r
-\r
-    public String getVersion(){\r
-        return getClass().getPackage().getImplementationVersion();\r
-    }\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 || value.equals("<null>")){\r
-               return NullBirthmarkElement.getInstance();\r
-       }\r
-               return new BirthmarkElement(value);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * Abstract class for {@link BirthmarkSpi <code>BirthmarkSpi</code>}
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractBirthmarkService implements BirthmarkSpi{
+    public String getDisplayType(){
+        return getDisplayType(Locale.getDefault());
+    }
+
+    public String getDisplayType(Locale locale){
+        LocalizedDescriptionManager manager = LocalizedDescriptionManager.getInstance();
+        String type = manager.getDisplayType(locale, getType());
+        if(type == null){
+            type = getType();
+        }
+        return type;
+    }
+
+    public String getDescription(){
+        return getDescription(Locale.getDefault());
+    }
+
+    public String getDescription(Locale locale){
+        LocalizedDescriptionManager manager = LocalizedDescriptionManager.getInstance();
+        String description = manager.getDescription(locale, getType());
+        if(description == null){
+            description = getDefaultDescription();
+        }
+        return description;
+    }
+
+    public String getComparatorClassName(){
+        return getComparator().getClass().getName();
+    }
+
+    public String getExtractorClassName(){
+        return getExtractor().getClass().getName();
+    }
+
+    public abstract String getType();
+
+    public abstract String getDefaultDescription();
+
+    public boolean isExpert(){
+        return true;
+    }
+
+    public boolean isUserDefined(){
+        return true;
+    }
+
+    public String getVersion(){
+        return getClass().getPackage().getImplementationVersion();
+    }
+
+    public String getVendorName(){
+        return getClass().getPackage().getImplementationVendor();
+    }
+
+    public Birthmark buildBirthmark(){
+       return getExtractor().createBirthmark();
+    }
+
+    public BirthmarkElement buildBirthmarkElement(String value){
+       if(value == null || value.equals("<null>")){
+               return NullBirthmarkElement.getInstance();
+       }
+               return new BirthmarkElement(value);
+    }
+}
@@ -1,57 +1,57 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-\r
-import org.objectweb.asm.ClassAdapter;\r
-import org.objectweb.asm.ClassVisitor;\r
-\r
-/**\r
- * Abstract visitor class of extracting birthmarks from class file.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class BirthmarkExtractVisitor extends ClassAdapter{\r
-    private Birthmark birthmark;\r
-    private BirthmarkEnvironment environment;\r
-    private List<Throwable> causes = new ArrayList<Throwable>();\r
-\r
-    public BirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){\r
-        super(visitor);\r
-        this.birthmark = birthmark;\r
-        this.environment = environment;\r
-    }\r
-\r
-    protected BirthmarkEnvironment getEnvironment(){\r
-        return environment;\r
-    }\r
-\r
-    protected void addElement(BirthmarkElement element){\r
-        birthmark.addElement(element);\r
-    }\r
-\r
-    public Birthmark getBirthmark(){\r
-        return birthmark;\r
-    }\r
-\r
-    public synchronized void addFailur(Throwable e){\r
-        causes.add(e);\r
-    }\r
-\r
-    public boolean isSuccess(){\r
-       return causes.size() == 0;\r
-    }\r
-\r
-    public synchronized Throwable[] getCauses(){\r
-       return causes.toArray(new Throwable[causes.size()]);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassVisitor;
+
+/**
+ * Abstract visitor class of extracting birthmarks from class file.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class BirthmarkExtractVisitor extends ClassAdapter{
+    private Birthmark birthmark;
+    private BirthmarkEnvironment environment;
+    private List<Throwable> causes = new ArrayList<Throwable>();
+
+    public BirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
+        super(visitor);
+        this.birthmark = birthmark;
+        this.environment = environment;
+    }
+
+    protected BirthmarkEnvironment getEnvironment(){
+        return environment;
+    }
+
+    protected void addElement(BirthmarkElement element){
+        birthmark.addElement(element);
+    }
+
+    public Birthmark getBirthmark(){
+        return birthmark;
+    }
+
+    public synchronized void addFailur(Throwable e){
+        causes.add(e);
+    }
+
+    public boolean isSuccess(){
+       return causes.size() == 0;
+    }
+
+    public synchronized Throwable[] getCauses(){
+       return causes.toArray(new Throwable[causes.size()]);
+    }
+}
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.Constructor;\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Service provider interface for birthmarks which are defined in\r
- * configuration files.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private Class<? extends BirthmarkExtractor> extractorClass;\r
-    private Class<? extends BirthmarkComparator> comparatorClass;\r
-    private String type;\r
-    private String displayType;\r
-    private String description;\r
-    private BirthmarkExtractor extractorObject;\r
-    private BirthmarkComparator comparatorObject;\r
-    private boolean userDefined = true;\r
-    private BirthmarkEnvironment environment;\r
-\r
-    public BirthmarkService(BirthmarkEnvironment environment){\r
-        this.environment = environment;\r
-    }\r
-\r
-    public BirthmarkService(){\r
-    }\r
-\r
-    public void setBirthmarkEnvironment(BirthmarkEnvironment environment){\r
-        this.environment = environment;\r
-    }\r
-\r
-    public void setExtractorClassName(String extractor){\r
-        try{\r
-            Class<?> c;\r
-            if(environment == null){\r
-                c = Class.forName(extractor);\r
-            }\r
-            else{\r
-                c = environment.getClasspathContext().findClass(extractor);\r
-            }\r
-            extractorClass = c.asSubclass(BirthmarkExtractor.class);\r
-            extractorObject = null;\r
-        } catch(ClassNotFoundException e){\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-    public void setComparatorClassName(String comparator){\r
-        try{\r
-            Class<?> c;\r
-            if(environment == null){\r
-                c = Class.forName(comparator);\r
-            }\r
-            else{\r
-                c = environment.getClasspathContext().findClass(comparator);\r
-            }\r
-            comparatorClass = c.asSubclass(BirthmarkComparator.class);\r
-            comparatorObject = null;\r
-        } catch(ClassNotFoundException e){\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-    public void setType(String type){\r
-        this.type = type;\r
-    }\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    @Override\r
-    public String getType(){\r
-        return type;\r
-    }\r
-\r
-    public void setDisplayType(String displayType){\r
-        this.displayType = displayType;\r
-    }\r
-\r
-    public String getDisplayType(){\r
-        return displayType;\r
-    }\r
-\r
-    public void setDescription(String description){\r
-        this.description = description;\r
-    }\r
-\r
-    public String getDescription(){\r
-        String desc = description;\r
-        if(description == null){\r
-            desc = "";\r
-        }\r
-        return desc;\r
-    }\r
-\r
-    /**\r
-     * returns a description of the birthmark this service provides.\r
-     */\r
-    @Override\r
-    public String getDefaultDescription(){\r
-        return description;\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return extractorClass.getName();\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(){\r
-        if(extractorObject == null){\r
-            try{\r
-                Constructor<? extends BirthmarkExtractor> c = extractorClass.getConstructor(BirthmarkSpi.class);\r
-                extractorObject = c.newInstance(this);\r
-            } catch(Exception e){\r
-                e.printStackTrace();\r
-            }\r
-        }\r
-        return extractorObject;\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return comparatorClass.getName();\r
-    }\r
-\r
-    /**\r
-     * returns a comparator for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(){\r
-        if(comparatorObject == null){\r
-            try{\r
-                Constructor<? extends BirthmarkComparator> c = comparatorClass.getConstructor(BirthmarkSpi.class);\r
-                comparatorObject = c.newInstance(this);\r
-            } catch(Exception e){\r
-                e.printStackTrace();\r
-            }\r
-        }\r
-        return comparatorObject;\r
-    }\r
-\r
-    public boolean isUserDefined(){\r
-        return userDefined;\r
-    }\r
-\r
-    public void setUserDefined(boolean userDefined){\r
-        this.userDefined = userDefined;\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.Constructor;
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Service provider interface for birthmarks which are defined in
+ * configuration files.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private Class<? extends BirthmarkExtractor> extractorClass;
+    private Class<? extends BirthmarkComparator> comparatorClass;
+    private String type;
+    private String displayType;
+    private String description;
+    private BirthmarkExtractor extractorObject;
+    private BirthmarkComparator comparatorObject;
+    private boolean userDefined = true;
+    private BirthmarkEnvironment environment;
+
+    public BirthmarkService(BirthmarkEnvironment environment){
+        this.environment = environment;
+    }
+
+    public BirthmarkService(){
+    }
+
+    public void setBirthmarkEnvironment(BirthmarkEnvironment environment){
+        this.environment = environment;
+    }
+
+    public void setExtractorClassName(String extractor){
+        try{
+            Class<?> c;
+            if(environment == null){
+                c = Class.forName(extractor);
+            }
+            else{
+                c = environment.getClasspathContext().findClass(extractor);
+            }
+            extractorClass = c.asSubclass(BirthmarkExtractor.class);
+            extractorObject = null;
+        } catch(ClassNotFoundException e){
+            e.printStackTrace();
+        }
+    }
+
+    public void setComparatorClassName(String comparator){
+        try{
+            Class<?> c;
+            if(environment == null){
+                c = Class.forName(comparator);
+            }
+            else{
+                c = environment.getClasspathContext().findClass(comparator);
+            }
+            comparatorClass = c.asSubclass(BirthmarkComparator.class);
+            comparatorObject = null;
+        } catch(ClassNotFoundException e){
+            e.printStackTrace();
+        }
+    }
+
+    public void setType(String type){
+        this.type = type;
+    }
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    @Override
+    public String getType(){
+        return type;
+    }
+
+    public void setDisplayType(String displayType){
+        this.displayType = displayType;
+    }
+
+    public String getDisplayType(){
+        return displayType;
+    }
+
+    public void setDescription(String description){
+        this.description = description;
+    }
+
+    public String getDescription(){
+        String desc = description;
+        if(description == null){
+            desc = "";
+        }
+        return desc;
+    }
+
+    /**
+     * returns a description of the birthmark this service provides.
+     */
+    @Override
+    public String getDefaultDescription(){
+        return description;
+    }
+
+    public String getExtractorClassName(){
+        return extractorClass.getName();
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(){
+        if(extractorObject == null){
+            try{
+                Constructor<? extends BirthmarkExtractor> c = extractorClass.getConstructor(BirthmarkSpi.class);
+                extractorObject = c.newInstance(this);
+            } catch(Exception e){
+                e.printStackTrace();
+            }
+        }
+        return extractorObject;
+    }
+
+    public String getComparatorClassName(){
+        return comparatorClass.getName();
+    }
+
+    /**
+     * returns a comparator for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(){
+        if(comparatorObject == null){
+            try{
+                Constructor<? extends BirthmarkComparator> c = comparatorClass.getConstructor(BirthmarkSpi.class);
+                comparatorObject = c.newInstance(this);
+            } catch(Exception e){
+                e.printStackTrace();
+            }
+        }
+        return comparatorObject;
+    }
+
+    public boolean isUserDefined(){
+        return userDefined;
+    }
+
+    public void setUserDefined(boolean userDefined){
+        this.userDefined = userDefined;
+    }
+}
+
@@ -1,81 +1,81 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Arrays;\r
-import java.util.Comparator;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.utils.ArrayIterator;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyBirthmark extends AbstractBirthmark{\r
-    private static final long serialVersionUID = 1905526895627693908L;\r
-\r
-    private Map<String, FrequencyBirthmarkElement> counts = new HashMap<String, FrequencyBirthmarkElement>();\r
-    private String type;\r
-\r
-    public FrequencyBirthmark(String type){\r
-        this.type = type;\r
-    }\r
-\r
-    @Override\r
-    public int getElementCount(){\r
-        return counts.size();\r
-    }\r
-\r
-    @Override\r
-    public synchronized BirthmarkElement[] getElements(){\r
-        FrequencyBirthmarkElement[] elements = new FrequencyBirthmarkElement[counts.size()];\r
-        int index = 0;\r
-        for(Map.Entry<String, FrequencyBirthmarkElement> entry: counts.entrySet()){\r
-            elements[index] = entry.getValue();\r
-            index++;\r
-        }\r
-        Arrays.sort(elements, new Comparator<FrequencyBirthmarkElement>(){\r
-            public int compare(FrequencyBirthmarkElement o1, FrequencyBirthmarkElement o2){\r
-                return o1.getValueName().compareTo(o2.getValueName());\r
-            }\r
-        });\r
-        \r
-        return elements;\r
-    }\r
-\r
-    @Override\r
-    public Iterator<BirthmarkElement> iterator(){\r
-        return new ArrayIterator<BirthmarkElement>(getElements());\r
-    }\r
-\r
-    public void addElement(BirthmarkElement element){\r
-        String value;\r
-        if(element instanceof FrequencyBirthmarkElement){\r
-            FrequencyBirthmarkElement e = (FrequencyBirthmarkElement)element;\r
-            value = e.getValueName();\r
-        }\r
-        else{\r
-            value = (String)element.getValue();\r
-        }\r
-        FrequencyBirthmarkElement foundElement = counts.get(value);\r
-        if(foundElement != null){\r
-            foundElement.incrementValueCount();\r
-        }\r
-        else{\r
-            foundElement = new FrequencyBirthmarkElement(value);\r
-        }\r
-        counts.put(value, foundElement);\r
-    }\r
-\r
-    @Override\r
-    public String getType(){\r
-        return type;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.utils.ArrayIterator;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class FrequencyBirthmark extends AbstractBirthmark{
+    private static final long serialVersionUID = 1905526895627693908L;
+
+    private Map<String, FrequencyBirthmarkElement> counts = new HashMap<String, FrequencyBirthmarkElement>();
+    private String type;
+
+    public FrequencyBirthmark(String type){
+        this.type = type;
+    }
+
+    @Override
+    public int getElementCount(){
+        return counts.size();
+    }
+
+    @Override
+    public synchronized BirthmarkElement[] getElements(){
+        FrequencyBirthmarkElement[] elements = new FrequencyBirthmarkElement[counts.size()];
+        int index = 0;
+        for(Map.Entry<String, FrequencyBirthmarkElement> entry: counts.entrySet()){
+            elements[index] = entry.getValue();
+            index++;
+        }
+        Arrays.sort(elements, new Comparator<FrequencyBirthmarkElement>(){
+            public int compare(FrequencyBirthmarkElement o1, FrequencyBirthmarkElement o2){
+                return o1.getValueName().compareTo(o2.getValueName());
+            }
+        });
+        
+        return elements;
+    }
+
+    @Override
+    public Iterator<BirthmarkElement> iterator(){
+        return new ArrayIterator<BirthmarkElement>(getElements());
+    }
+
+    public void addElement(BirthmarkElement element){
+        String value;
+        if(element instanceof FrequencyBirthmarkElement){
+            FrequencyBirthmarkElement e = (FrequencyBirthmarkElement)element;
+            value = e.getValueName();
+        }
+        else{
+            value = (String)element.getValue();
+        }
+        FrequencyBirthmarkElement foundElement = counts.get(value);
+        if(foundElement != null){
+            foundElement.incrementValueCount();
+        }
+        else{
+            foundElement = new FrequencyBirthmarkElement(value);
+        }
+        counts.put(value, foundElement);
+    }
+
+    @Override
+    public String getType(){
+        return type;
+    }
+}
@@ -1,87 +1,87 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyBirthmarkElement extends BirthmarkElement implements ValueCountable{\r
-    private static final long serialVersionUID = 4454345943098520436L;\r
-\r
-    private int count = 1;\r
-\r
-    public FrequencyBirthmarkElement(String value){\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
-        super(value);\r
-        this.count = count;\r
-    }\r
-\r
-    void incrementValueCount(){\r
-        count++;\r
-    }\r
-\r
-    @Override\r
-    public boolean equals(Object o){\r
-        boolean flag = false;\r
-        if(o instanceof FrequencyBirthmarkElement){\r
-            FrequencyBirthmarkElement fmbe = (FrequencyBirthmarkElement)o;\r
-            flag = super.equals(fmbe) && getValueCount() == fmbe.getValueCount();\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    @Override\r
-    public Object getValue(){\r
-        return getValueCount() + ": " + getValueName();\r
-    }\r
-\r
-    @Override\r
-    public int hashCode(){\r
-        int hash = super.hashCode();\r
-        int shift = getValueCount() % 32;\r
-\r
-        // cyclic shift\r
-        for(int i = 0; i < shift; i++){\r
-            int v = hash & 1;\r
-            hash = hash >>> 1 | v << 31;\r
-        }\r
-\r
-        return hash;\r
-    }\r
-\r
-    public String getValueName(){\r
-        return (String)super.getValue();\r
-    }\r
-\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.trim();\r
-            } catch(NumberFormatException e){\r
-            }\r
-        }\r
-        return value;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkElement;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class FrequencyBirthmarkElement extends BirthmarkElement implements ValueCountable{
+    private static final long serialVersionUID = 4454345943098520436L;
+
+    private int count = 1;
+
+    public FrequencyBirthmarkElement(String value){
+        super(parseValue(value));
+        if(!value.equals(super.getValue())){
+            int number = new Integer(value.substring(0, value.indexOf(":")));
+            this.count = number;
+        }
+    }
+
+    public FrequencyBirthmarkElement(String value, int count){
+        super(value);
+        this.count = count;
+    }
+
+    void incrementValueCount(){
+        count++;
+    }
+
+    @Override
+    public boolean equals(Object o){
+        boolean flag = false;
+        if(o instanceof FrequencyBirthmarkElement){
+            FrequencyBirthmarkElement fmbe = (FrequencyBirthmarkElement)o;
+            flag = super.equals(fmbe) && getValueCount() == fmbe.getValueCount();
+        }
+        return flag;
+    }
+
+    @Override
+    public Object getValue(){
+        return getValueCount() + ": " + getValueName();
+    }
+
+    @Override
+    public int hashCode(){
+        int hash = super.hashCode();
+        int shift = getValueCount() % 32;
+
+        // cyclic shift
+        for(int i = 0; i < shift; i++){
+            int v = hash & 1;
+            hash = hash >>> 1 | v << 31;
+        }
+
+        return hash;
+    }
+
+    public String getValueName(){
+        return (String)super.getValue();
+    }
+
+    public int getValueCount(){
+        return count;
+    }
+
+    private static String parseValue(String value){
+        if(value.indexOf(":") > 0){
+            int index = value.indexOf(":");
+            String num = value.substring(0, index);
+            String val = value.substring(index + 1);
+            try{
+                // is number?
+                new Integer(num);
+                return val.trim();
+            } catch(NumberFormatException e){
+            }
+        }
+        return value;
+    }
+}
@@ -1,39 +1,39 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-\r
-/**\r
- * Null birthmark element.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$ \r
- */\r
-public class NullBirthmarkElement extends BirthmarkElement{\r
-    private static final long serialVersionUID = -92345638932523L;\r
-\r
-    private static final NullBirthmarkElement ELEMENT = new NullBirthmarkElement();\r
-\r
-    private NullBirthmarkElement(){\r
-        super(null);\r
-    }\r
-\r
-    public static BirthmarkElement getInstance(){\r
-        return ELEMENT;\r
-    }\r
-\r
-    public int hashCode(){\r
-        return 0;\r
-    }\r
-\r
-    public boolean equals(Object o){\r
-        return o instanceof NullBirthmarkElement;\r
-    }\r
-\r
-    public String toString(){\r
-        return "<null>";\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkElement;
+
+/**
+ * Null birthmark element.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$ 
+ */
+public class NullBirthmarkElement extends BirthmarkElement{
+    private static final long serialVersionUID = -92345638932523L;
+
+    private static final NullBirthmarkElement ELEMENT = new NullBirthmarkElement();
+
+    private NullBirthmarkElement(){
+        super(null);
+    }
+
+    public static BirthmarkElement getInstance(){
+        return ELEMENT;
+    }
+
+    public int hashCode(){
+        return 0;
+    }
+
+    public boolean equals(Object o){
+        return o instanceof NullBirthmarkElement;
+    }
+
+    public String toString(){
+        return "<null>";
+    }
+}
@@ -1,43 +1,43 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-\r
-/**\r
- * Implementation of plain birthmark.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class PlainBirthmark extends AbstractBirthmark{\r
-    private static final long serialVersionUID = 2370435723234463456L;\r
-\r
-    private String type;\r
-\r
-    public PlainBirthmark(String type){\r
-        this.type = type;\r
-    }\r
-\r
-    public PlainBirthmark(){\r
-    }\r
-\r
-    public void addElement(int index, BirthmarkElement element){\r
-        elements.add(index, element);\r
-    }\r
-\r
-    public BirthmarkElement getElement(int index){\r
-        return elements.get(index);\r
-    }\r
-\r
-    public void setType(String type){\r
-        this.type = type;\r
-    }\r
-\r
-    @Override\r
-    public String getType(){\r
-        return type;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkElement;
+
+/**
+ * Implementation of plain birthmark.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class PlainBirthmark extends AbstractBirthmark{
+    private static final long serialVersionUID = 2370435723234463456L;
+
+    private String type;
+
+    public PlainBirthmark(String type){
+        this.type = type;
+    }
+
+    public PlainBirthmark(){
+    }
+
+    public void addElement(int index, BirthmarkElement element){
+        elements.add(index, element);
+    }
+
+    public BirthmarkElement getElement(int index){
+        return elements.get(index);
+    }
+
+    public void setType(String type){
+        this.type = type;
+    }
+
+    @Override
+    public String getType(){
+        return type;
+    }
+}
@@ -1,17 +1,17 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This interface represents that the implemented class have name and its count.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ValueCountable{\r
-    public int getValueCount();\r
-\r
-    public String getValueName();\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This interface represents that the implemented class have name and its count.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface ValueCountable{
+    public int getValueCount();
+
+    public String getValueName();
+}
@@ -1,41 +1,41 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * abstract birthmark comparator.\r
- *\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractBirthmarkComparator implements BirthmarkComparator{\r
-    private BirthmarkSpi spi;\r
-\r
-    @Deprecated\r
-    public AbstractBirthmarkComparator(){\r
-    }\r
-\r
-    public AbstractBirthmarkComparator(BirthmarkSpi spi){\r
-        this.spi = spi;\r
-    }\r
-\r
-    public BirthmarkSpi getProvider(){\r
-        return spi;\r
-    }\r
-\r
-    public String getType(){\r
-        return spi.getType();\r
-    }\r
-\r
-    public abstract double compare(Birthmark b1, Birthmark b2);\r
-\r
-    public int getCompareCount(Birthmark b1, Birthmark b2){\r
-        return b1.getElementCount() + b2.getElementCount();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * abstract birthmark comparator.
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractBirthmarkComparator implements BirthmarkComparator{
+    private BirthmarkSpi spi;
+
+    @Deprecated
+    public AbstractBirthmarkComparator(){
+    }
+
+    public AbstractBirthmarkComparator(BirthmarkSpi spi){
+        this.spi = spi;
+    }
+
+    public BirthmarkSpi getProvider(){
+        return spi;
+    }
+
+    public String getType(){
+        return spi.getType();
+    }
+
+    public abstract double compare(Birthmark b1, Birthmark b2);
+
+    public int getCompareCount(Birthmark b1, Birthmark b2){
+        return b1.getElementCount() + b2.getElementCount();
+    }
+}
@@ -1,65 +1,65 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.Constructor;\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.AbstractServiceProvider;\r
-import jp.naist.se.stigmata.spi.BirthmarkComparatorSpi;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
-\r
-/**\r
- * Abstract service provider interface for comparing birthmarks.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-abstract class AbstractBirthmarkComparatorService extends AbstractServiceProvider implements BirthmarkComparatorSpi{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public abstract String getType();\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDescription(\r
-            locale, getType(), LocalizedDescriptionManager.ServiceCategory.comparator\r
-        );\r
-    }\r
-\r
-    /**\r
-     * returns a localized description of the birthmark in default locale.\r
-     */\r
-    public String getDescription(){\r
-        return getDescription(Locale.getDefault());\r
-    }\r
-\r
-    public abstract String getComparatorClassName();\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        try{\r
-            Class<?> c = Class.forName(getComparatorClassName());\r
-            Class<? extends BirthmarkComparator> clazz = c.asSubclass(BirthmarkComparator.class);\r
-            Constructor<? extends BirthmarkComparator> constructor = clazz.getConstructor(BirthmarkSpi.class);\r
-            return constructor.newInstance(service);\r
-        } catch(NoSuchMethodException e){\r
-        } catch(InstantiationException e){\r
-        } catch(InvocationTargetException e){\r
-        } catch(ClassNotFoundException e){\r
-        } catch(IllegalAccessException e){\r
-        }\r
-        return null;\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.AbstractServiceProvider;
+import jp.sourceforge.stigmata.spi.BirthmarkComparatorSpi;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * Abstract service provider interface for comparing birthmarks.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+abstract class AbstractBirthmarkComparatorService extends AbstractServiceProvider implements BirthmarkComparatorSpi{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public abstract String getType();
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDescription(
+            locale, getType(), LocalizedDescriptionManager.ServiceCategory.comparator
+        );
+    }
+
+    /**
+     * returns a localized description of the birthmark in default locale.
+     */
+    public String getDescription(){
+        return getDescription(Locale.getDefault());
+    }
+
+    public abstract String getComparatorClassName();
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        try{
+            Class<?> c = Class.forName(getComparatorClassName());
+            Class<? extends BirthmarkComparator> clazz = c.asSubclass(BirthmarkComparator.class);
+            Constructor<? extends BirthmarkComparator> constructor = clazz.getConstructor(BirthmarkSpi.class);
+            return constructor.newInstance(service);
+        } catch(NoSuchMethodException e){
+        } catch(InstantiationException e){
+        } catch(InvocationTargetException e){
+        } catch(ClassNotFoundException e){
+        } catch(IllegalAccessException e){
+        }
+        return null;
+    }
+}
+
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.birthmarks.ValueCountable;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Comparing birthmarks by cosine similarity algorithm. This class compares\r
- * birthmarks which must be implemented\r
- * {@link ValueCountable <code>ValueCountable</code>} interface.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class CosineSimilarityBirthmarkComparator extends\r
-        AbstractBirthmarkComparator{\r
-\r
-    public CosineSimilarityBirthmarkComparator(BirthmarkSpi spi){\r
-        super(spi);\r
-    }\r
-\r
-    public double compare(Birthmark b1, Birthmark b2){\r
-        if(!b1.getType().equals(b2.getType())){\r
-            return Double.NaN;\r
-        }\r
-        if(b1.getElementCount() == 0 && b2.getElementCount() == 0){\r
-            return 1d;\r
-        }\r
-        else if(b1.getElementCount() == 0 || b2.getElementCount() == 0){\r
-            return 0d;\r
-        }\r
-\r
-        Map<String, CountPair> pairs = new HashMap<String, CountPair>();\r
-        addCount(pairs, b1, true);\r
-        addCount(pairs, b2, false);\r
-\r
-        double norm1 = norm(pairs, true);\r
-        double norm2 = norm(pairs, false);\r
-        double product = innerproduct(pairs);\r
-        double similarity = product / (norm1 * norm2);\r
-        // System.out.printf("%g / (%g * %g) = %g%n", product, norm1, norm2, similarity);\r
-\r
-        // double radian = Math.acos(product / (norm1 * norm2));\r
-        // double angle = 90 - (180 * radian / Math.PI);\r
-        // double sim = angle / 90;\r
-        // System.out.printf("angle: %g (%g\93x, %g)%n", radian, angle, sim);\r
-\r
-        return similarity;\r
-    }\r
-\r
-    private double innerproduct(Map<String, CountPair> pairs){\r
-        double sum = 0;\r
-        for(CountPair pair: pairs.values()){\r
-            sum += pair.get(true) * pair.get(false);\r
-        }\r
-        return sum;\r
-    }\r
-\r
-    private double norm(Map<String, CountPair> pairs, boolean first){\r
-        double sum = 0;\r
-        for(CountPair pair: pairs.values()){\r
-            sum += pair.get(first) * pair.get(first);\r
-        }\r
-        return Math.sqrt(sum);\r
-    }\r
-\r
-    private void addCount(Map<String, CountPair> pairs, Birthmark birthmark, boolean first){\r
-        for(BirthmarkElement element: birthmark){\r
-            ValueCountable vc = (ValueCountable)element;\r
-            CountPair cp = pairs.get(vc.getValueName());\r
-            if(cp == null){\r
-                cp = new CountPair();\r
-                pairs.put(vc.getValueName(), cp);\r
-            }\r
-            cp.set(first, vc.getValueCount());\r
-        }\r
-    }\r
-\r
-    private class CountPair{\r
-        private int c1 = 0;\r
-        private int c2 = 0;\r
-\r
-        public int get(boolean first){\r
-            if(first){\r
-                return c1;\r
-            }\r
-            else{\r
-                return c2;\r
-            }\r
-        }\r
-\r
-        public void set(boolean first, int count){\r
-            if(first){\r
-                c1 = count;\r
-            }\r
-            else{\r
-                c2 = count;\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * This method is used for debugging.\r
-     */\r
-    @SuppressWarnings("unused")\r
-    private void printAll(Map<String, CountPair> pairs){\r
-        System.out.println("----------");\r
-        for(Map.Entry<String, CountPair> entry: pairs.entrySet()){\r
-            CountPair pair = entry.getValue();\r
-            System.out.printf("%40s: %5d, %5d%n", entry.getKey(), pair.get(true), pair.get(false));\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import java.util.HashMap;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.birthmarks.ValueCountable;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Comparing birthmarks by cosine similarity algorithm. This class compares
+ * birthmarks which must be implemented
+ * {@link ValueCountable <code>ValueCountable</code>} interface.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class CosineSimilarityBirthmarkComparator extends
+        AbstractBirthmarkComparator{
+
+    public CosineSimilarityBirthmarkComparator(BirthmarkSpi spi){
+        super(spi);
+    }
+
+    public double compare(Birthmark b1, Birthmark b2){
+        if(!b1.getType().equals(b2.getType())){
+            return Double.NaN;
+        }
+        if(b1.getElementCount() == 0 && b2.getElementCount() == 0){
+            return 1d;
+        }
+        else if(b1.getElementCount() == 0 || b2.getElementCount() == 0){
+            return 0d;
+        }
+
+        Map<String, CountPair> pairs = new HashMap<String, CountPair>();
+        addCount(pairs, b1, true);
+        addCount(pairs, b2, false);
+
+        double norm1 = norm(pairs, true);
+        double norm2 = norm(pairs, false);
+        double product = innerproduct(pairs);
+        double similarity = product / (norm1 * norm2);
+        // System.out.printf("%g / (%g * %g) = %g%n", product, norm1, norm2, similarity);
+
+        // double radian = Math.acos(product / (norm1 * norm2));
+        // double angle = 90 - (180 * radian / Math.PI);
+        // double sim = angle / 90;
+        // System.out.printf("angle: %g (%g\93x, %g)%n", radian, angle, sim);
+
+        return similarity;
+    }
+
+    private double innerproduct(Map<String, CountPair> pairs){
+        double sum = 0;
+        for(CountPair pair: pairs.values()){
+            sum += pair.get(true) * pair.get(false);
+        }
+        return sum;
+    }
+
+    private double norm(Map<String, CountPair> pairs, boolean first){
+        double sum = 0;
+        for(CountPair pair: pairs.values()){
+            sum += pair.get(first) * pair.get(first);
+        }
+        return Math.sqrt(sum);
+    }
+
+    private void addCount(Map<String, CountPair> pairs, Birthmark birthmark, boolean first){
+        for(BirthmarkElement element: birthmark){
+            ValueCountable vc = (ValueCountable)element;
+            CountPair cp = pairs.get(vc.getValueName());
+            if(cp == null){
+                cp = new CountPair();
+                pairs.put(vc.getValueName(), cp);
+            }
+            cp.set(first, vc.getValueCount());
+        }
+    }
+
+    private class CountPair{
+        private int c1 = 0;
+        private int c2 = 0;
+
+        public int get(boolean first){
+            if(first){
+                return c1;
+            }
+            else{
+                return c2;
+            }
+        }
+
+        public void set(boolean first, int count){
+            if(first){
+                c1 = count;
+            }
+            else{
+                c2 = count;
+            }
+        }
+    }
+
+    /**
+     * This method is used for debugging.
+     */
+    @SuppressWarnings("unused")
+    private void printAll(Map<String, CountPair> pairs){
+        System.out.println("----------");
+        for(Map.Entry<String, CountPair> entry: pairs.entrySet()){
+            CountPair pair = entry.getValue();
+            System.out.printf("%40s: %5d, %5d%n", entry.getKey(), pair.get(true), pair.get(false));
+        }
+    }
+}
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.\r
- * Comparing birthmarks by cosine similarity algorithm.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class CosineSimilarityBirthmarkComparatorService extends AbstractBirthmarkComparatorService{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "cosine";\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        return new CosineSimilarityBirthmarkComparator(service);\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.
+ * Comparing birthmarks by cosine similarity algorithm.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class CosineSimilarityBirthmarkComparatorService extends AbstractBirthmarkComparatorService{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "cosine";
+    }
+
+    public String getComparatorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        return new CosineSimilarityBirthmarkComparator(service);
+    }
+}
+
@@ -1,12 +1,12 @@
-package jp.naist.se.stigmata.birthmarks.comparators;
+package jp.sourceforge.stigmata.birthmarks.comparators;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElement;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 /**
  * calculate similarities between two birthmarks by DP matching algorithm.
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.\r
- * Comparing birthmarks by DP matching algorithm.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class DPMatchingBirthmarkComparatorService extends AbstractBirthmarkComparatorService{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "dpmatching";\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        return new DPMatchingBirthmarkComparator(service);\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.
+ * Comparing birthmarks by DP matching algorithm.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class DPMatchingBirthmarkComparatorService extends AbstractBirthmarkComparatorService{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "dpmatching";
+    }
+
+    public String getComparatorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        return new DPMatchingBirthmarkComparator(service);
+    }
+}
+
@@ -1,12 +1,12 @@
-package jp.naist.se.stigmata.birthmarks.comparators;
+package jp.sourceforge.stigmata.birthmarks.comparators;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElement;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 /**
  * calculate similarities between two birthmarks by edit distance
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.\r
- * Comparing birthmarks by edit distance algorithm.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class EditDistanceBirthmarkComparatorService extends AbstractBirthmarkComparatorService{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "editdistancee";\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        return new EditDistanceBirthmarkComparator(service);\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.
+ * Comparing birthmarks by edit distance algorithm.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class EditDistanceBirthmarkComparatorService extends AbstractBirthmarkComparatorService{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "editdistancee";
+    }
+
+    public String getComparatorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        return new EditDistanceBirthmarkComparator(service);
+    }
+}
+
@@ -1,12 +1,12 @@
-package jp.naist.se.stigmata.birthmarks.comparators;
+package jp.sourceforge.stigmata.birthmarks.comparators;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElement;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 /**
  * calculate similarities between two birthmarks by edit distance
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.\r
- * Comparing birthmarks by extended edit distance algorithm.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ExtendedEditDistanceBirthmarkComparatorService extends AbstractBirthmarkComparatorService{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "editdistanceext";\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.comparators.ExtendedEditDistanceBirthmarkComparator";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        return new ExtendedEditDistanceBirthmarkComparator(service);\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.
+ * Comparing birthmarks by extended edit distance algorithm.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ExtendedEditDistanceBirthmarkComparatorService extends AbstractBirthmarkComparatorService{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "editdistanceext";
+    }
+
+    public String getComparatorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.comparators.ExtendedEditDistanceBirthmarkComparator";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        return new ExtendedEditDistanceBirthmarkComparator(service);
+    }
+}
+
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.birthmarks.comparators;
+package jp.sourceforge.stigmata.birthmarks.comparators;
 
 /*
  * $Id$
@@ -7,9 +7,9 @@ package jp.naist.se.stigmata.birthmarks.comparators;
 import java.util.HashSet;
 import java.util.Set;
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElement;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 /**
  * this comparator calculate following formula.
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.\r
- * Comparing birthmarks by logical AND algorithm.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class LogicalAndBirthmarkComparatorService extends AbstractBirthmarkComparatorService{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "and";\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        return new LogicalAndBirthmarkComparator(service);\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.
+ * Comparing birthmarks by logical AND algorithm.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class LogicalAndBirthmarkComparatorService extends AbstractBirthmarkComparatorService{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "and";
+    }
+
+    public String getComparatorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        return new LogicalAndBirthmarkComparator(service);
+    }
+}
+
@@ -1,13 +1,13 @@
-package jp.naist.se.stigmata.birthmarks.comparators;
+package jp.sourceforge.stigmata.birthmarks.comparators;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkComparator;
-import jp.naist.se.stigmata.BirthmarkElement;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 /**
  * An implementation of {@link BirthmarkComparator
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.comparators;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.\r
- * Comparing birthmarks by default matching algorithm.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class PlainBirthmarkComparatorService extends AbstractBirthmarkComparatorService{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "plain";\r
-    }\r
-\r
-    public String getComparatorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service){\r
-        return new PlainBirthmarkComparator(service);\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.comparators;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * SPI of {@link BirthmarkComparator <code>BirthmarkComparator</code>}.
+ * Comparing birthmarks by default matching algorithm.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class PlainBirthmarkComparatorService extends AbstractBirthmarkComparatorService{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "plain";
+    }
+
+    public String getComparatorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service){
+        return new PlainBirthmarkComparator(service);
+    }
+}
+
-package jp.naist.se.stigmata.birthmarks.cvfv;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.LinkedHashMap;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;\r
-\r
-import org.objectweb.asm.ClassVisitor;\r
-import org.objectweb.asm.FieldVisitor;\r
-import org.objectweb.asm.MethodAdapter;\r
-import org.objectweb.asm.MethodVisitor;\r
-import org.objectweb.asm.Opcodes;\r
-import org.objectweb.asm.Type;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends BirthmarkExtractVisitor{\r
-    private Map<String, TypeAndValueBirthmarkElement> elements = new LinkedHashMap<String, TypeAndValueBirthmarkElement>();\r
-    private String className;\r
-\r
-    public ConstantValueOfFieldVariableBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){\r
-        super(visitor, birthmark, environment);\r
-    }\r
-\r
-    public void visitEnd(){\r
-        for(String key: elements.keySet()){\r
-            addElement(elements.get(key));\r
-        }\r
-        super.visitEnd();\r
-    }\r
-\r
-    public void visit(int version, int access, String name, String signature,\r
-                      String superName, String[] interfaces){\r
-        this.className = name;\r
-\r
-        super.visit(version, access, name, signature, superName, interfaces);\r
-    }\r
-\r
-    @Override\r
-    public FieldVisitor visitField(int access, String name, String desc,\r
-                                   String signature, Object value){\r
-\r
-        FieldVisitor visitor = super.visitField(access, name, desc, signature, value);\r
-\r
-        TypeAndValueBirthmarkElement e = elements.get(name);\r
-        if(e == null){\r
-            e = new TypeAndValueBirthmarkElement(desc, value);\r
-        }\r
-        else{\r
-            if(value != null){\r
-                e.setValue(value);\r
-            }\r
-        }\r
-        elements.put(name, e);\r
-\r
-        return visitor;\r
-    }\r
-\r
-    public MethodVisitor visitMethod(int access, String name, String desc, String signature,\r
-                                     String[] exceptions){\r
-        MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);\r
-\r
-        if(name.equals("<init>") || name.equals("<clinit>")){\r
-            visitor = new MethodAdapter(visitor){\r
-                private Object constant = null;\r
-\r
-                public void visitIntInsn(int opcode, int operand){\r
-                    if(opcode == Opcodes.BIPUSH || opcode == Opcodes.SIPUSH){\r
-                        constant = new Integer(operand);\r
-                    }\r
-                    super.visitIntInsn(opcode, operand);\r
-                }\r
-\r
-                public void visitMethodInsn(int opcode, String owner, String name, String desc){\r
-                    Type type = Type.getReturnType(desc);\r
-                    if(!type.equals(Type.VOID_TYPE)){\r
-                        constant = null;\r
-                    }\r
-                    super.visitMethodInsn(opcode, owner, name, desc);\r
-                }\r
-\r
-                public void visitInsn(int opcode){\r
-                    if(opcode == Opcodes.ICONST_M1)     constant = new Integer(-1);\r
-                    else if(opcode == Opcodes.ICONST_0) constant = new Integer(0);\r
-                    else if(opcode == Opcodes.ICONST_1) constant = new Integer(1);\r
-                    else if(opcode == Opcodes.ICONST_2) constant = new Integer(2);\r
-                    else if(opcode == Opcodes.ICONST_3) constant = new Integer(3);\r
-                    else if(opcode == Opcodes.ICONST_4) constant = new Integer(4);\r
-                    else if(opcode == Opcodes.ICONST_5) constant = new Integer(5);\r
-                    else if(opcode == Opcodes.LCONST_0) constant = new Long(0L);\r
-                    else if(opcode == Opcodes.LCONST_1) constant = new Long(1L);\r
-                    else if(opcode == Opcodes.DCONST_0) constant = new Double(0D);\r
-                    else if(opcode == Opcodes.DCONST_1) constant = new Double(1D);\r
-                    else if(opcode == Opcodes.FCONST_0) constant = new Float(0F);\r
-                    else if(opcode == Opcodes.FCONST_1) constant = new Float(1F);\r
-                    else if(opcode == Opcodes.FCONST_2) constant = new Float(2F);\r
-\r
-                    super.visitInsn(opcode);\r
-                }\r
-\r
-                public void visitLdcInsn(Object object){\r
-                    constant = object;\r
-                    super.visitLdcInsn(object);\r
-                }\r
-\r
-                public void visitFieldInsn(int opcode, String owner, String name, String desc){\r
-                    if(className.equals(owner) && opcode == Opcodes.PUTFIELD){\r
-                        TypeAndValueBirthmarkElement e = elements.get(name);\r
-                        if(e == null){\r
-                            e = new TypeAndValueBirthmarkElement(desc, constant);\r
-                        }\r
-\r
-                        if(e.getValue() == null && constant != null){\r
-                            if(!checkCast(desc, constant)){\r
-                                constant = null;\r
-                            }\r
-                            e.setValue(constant);\r
-                        }\r
-                    }\r
-                    super.visitFieldInsn(opcode, owner, name, desc);\r
-                }\r
-            };\r
-        }\r
-\r
-        return visitor;\r
-    }\r
-\r
-    private boolean checkCast(String desc, Object constant){\r
-        if(constant instanceof Integer){\r
-            return desc.equals("Ljava/lang/Integer;") ||\r
-                desc.equals("I") || desc.equals("S") || desc.equals("Z") ||\r
-                desc.equals("C") || desc.equals("B");\r
-        }\r
-        else if(constant instanceof Float){\r
-            return desc.equals("Ljava/lang/Float;") || desc.equals("F");\r
-        }\r
-        else if(constant instanceof Double){\r
-            return desc.equals("Ljava/lang/Double;") || desc.equals("D");\r
-        }\r
-        else if(constant instanceof Long){\r
-            return desc.equals("Ljava/lang/Long;") || desc.equals("J");\r
-        }\r
-        else if(constant instanceof String){\r
-            return desc.equals("Ljava/lang/String;");\r
-        }\r
-        return false;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.cvfv;
+
+/*
+ * $Id$
+ */
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
+    private Map<String, TypeAndValueBirthmarkElement> elements = new LinkedHashMap<String, TypeAndValueBirthmarkElement>();
+    private String className;
+
+    public ConstantValueOfFieldVariableBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
+        super(visitor, birthmark, environment);
+    }
+
+    public void visitEnd(){
+        for(String key: elements.keySet()){
+            addElement(elements.get(key));
+        }
+        super.visitEnd();
+    }
+
+    public void visit(int version, int access, String name, String signature,
+                      String superName, String[] interfaces){
+        this.className = name;
+
+        super.visit(version, access, name, signature, superName, interfaces);
+    }
+
+    @Override
+    public FieldVisitor visitField(int access, String name, String desc,
+                                   String signature, Object value){
+
+        FieldVisitor visitor = super.visitField(access, name, desc, signature, value);
+
+        TypeAndValueBirthmarkElement e = elements.get(name);
+        if(e == null){
+            e = new TypeAndValueBirthmarkElement(desc, value);
+        }
+        else{
+            if(value != null){
+                e.setValue(value);
+            }
+        }
+        elements.put(name, e);
+
+        return visitor;
+    }
+
+    public MethodVisitor visitMethod(int access, String name, String desc, String signature,
+                                     String[] exceptions){
+        MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);
+
+        if(name.equals("<init>") || name.equals("<clinit>")){
+            visitor = new MethodAdapter(visitor){
+                private Object constant = null;
+
+                public void visitIntInsn(int opcode, int operand){
+                    if(opcode == Opcodes.BIPUSH || opcode == Opcodes.SIPUSH){
+                        constant = new Integer(operand);
+                    }
+                    super.visitIntInsn(opcode, operand);
+                }
+
+                public void visitMethodInsn(int opcode, String owner, String name, String desc){
+                    Type type = Type.getReturnType(desc);
+                    if(!type.equals(Type.VOID_TYPE)){
+                        constant = null;
+                    }
+                    super.visitMethodInsn(opcode, owner, name, desc);
+                }
+
+                public void visitInsn(int opcode){
+                    if(opcode == Opcodes.ICONST_M1)     constant = new Integer(-1);
+                    else if(opcode == Opcodes.ICONST_0) constant = new Integer(0);
+                    else if(opcode == Opcodes.ICONST_1) constant = new Integer(1);
+                    else if(opcode == Opcodes.ICONST_2) constant = new Integer(2);
+                    else if(opcode == Opcodes.ICONST_3) constant = new Integer(3);
+                    else if(opcode == Opcodes.ICONST_4) constant = new Integer(4);
+                    else if(opcode == Opcodes.ICONST_5) constant = new Integer(5);
+                    else if(opcode == Opcodes.LCONST_0) constant = new Long(0L);
+                    else if(opcode == Opcodes.LCONST_1) constant = new Long(1L);
+                    else if(opcode == Opcodes.DCONST_0) constant = new Double(0D);
+                    else if(opcode == Opcodes.DCONST_1) constant = new Double(1D);
+                    else if(opcode == Opcodes.FCONST_0) constant = new Float(0F);
+                    else if(opcode == Opcodes.FCONST_1) constant = new Float(1F);
+                    else if(opcode == Opcodes.FCONST_2) constant = new Float(2F);
+
+                    super.visitInsn(opcode);
+                }
+
+                public void visitLdcInsn(Object object){
+                    constant = object;
+                    super.visitLdcInsn(object);
+                }
+
+                public void visitFieldInsn(int opcode, String owner, String name, String desc){
+                    if(className.equals(owner) && opcode == Opcodes.PUTFIELD){
+                        TypeAndValueBirthmarkElement e = elements.get(name);
+                        if(e == null){
+                            e = new TypeAndValueBirthmarkElement(desc, constant);
+                        }
+
+                        if(e.getValue() == null && constant != null){
+                            if(!checkCast(desc, constant)){
+                                constant = null;
+                            }
+                            e.setValue(constant);
+                        }
+                    }
+                    super.visitFieldInsn(opcode, owner, name, desc);
+                }
+            };
+        }
+
+        return visitor;
+    }
+
+    private boolean checkCast(String desc, Object constant){
+        if(constant instanceof Integer){
+            return desc.equals("Ljava/lang/Integer;") ||
+                desc.equals("I") || desc.equals("S") || desc.equals("Z") ||
+                desc.equals("C") || desc.equals("B");
+        }
+        else if(constant instanceof Float){
+            return desc.equals("Ljava/lang/Float;") || desc.equals("F");
+        }
+        else if(constant instanceof Double){
+            return desc.equals("Ljava/lang/Double;") || desc.equals("D");
+        }
+        else if(constant instanceof Long){
+            return desc.equals("Ljava/lang/Long;") || desc.equals("J");
+        }
+        else if(constant instanceof String){
+            return desc.equals("Ljava/lang/String;");
+        }
+        return false;
+    }
+}
@@ -1,15 +1,15 @@
-package jp.naist.se.stigmata.birthmarks.cvfv;
+package jp.sourceforge.stigmata.birthmarks.cvfv;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
 
@@ -1,76 +1,76 @@
-package jp.naist.se.stigmata.birthmarks.cvfv;\r
-\r
-/*\r
- * $Id$\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
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ConstantValueOfFieldVariableBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-       private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new ConstantValueOfFieldVariableBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "cvfv";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "Field type and its initial value.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\r
-\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
+package jp.sourceforge.stigmata.birthmarks.cvfv;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ConstantValueOfFieldVariableBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+       private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new ConstantValueOfFieldVariableBirthmarkExtractor(this);
+
+    public String getType(){
+        return "cvfv";
+    }
+
+    public String getDefaultDescription(){
+        return "Field type and its initial value.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+
+    @Override
+       public BirthmarkElement buildBirthmarkElement(String value) {
+       String signature = value.substring(0, value.indexOf('='));
+       String subValue = value.substring(value.indexOf('=') + 1);
+       Object elementValue = subValue;
+
+        if(subValue.equals("null")){
+            elementValue = null;
+        }
+        else{
+            switch(signature.charAt(0)){
+            case 'Z':{
+                if(value.equals("true")) elementValue = Boolean.TRUE;
+                else                     elementValue = Boolean.FALSE;
+                break;
+            }
+            case 'C': elementValue = new Character(subValue.charAt(0)); break;
+            case 'D': elementValue = new Double(subValue);  break;
+            case 'F': elementValue = new Float(subValue);   break;
+            case 'S': elementValue = new Short(subValue);   break;
+            case 'B': elementValue = new Byte(subValue);    break;
+            case 'I': elementValue = new Integer(subValue); break;
+            default:  elementValue = value; break;
+            }
+       }
+       return new TypeAndValueBirthmarkElement(signature, elementValue);
+       }
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.birthmarks.cvfv;
+package jp.sourceforge.stigmata.birthmarks.cvfv;
 
 /*
  * $Id$
@@ -8,7 +8,7 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
 
-import jp.naist.se.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkElement;
 
 /**
  * 
@@ -1,65 +1,65 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.Constructor;\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.AbstractServiceProvider;\r
-import jp.naist.se.stigmata.spi.BirthmarkExtractorSpi;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-abstract class AbstractBirthmarkExtractorService extends AbstractServiceProvider implements BirthmarkExtractorSpi{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public abstract String getType();\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDescription(\r
-            locale, getType(), LocalizedDescriptionManager.ServiceCategory.extractor\r
-        );\r
-    }\r
-\r
-    /**\r
-     * returns a localized description of the birthmark in default locale.\r
-     */\r
-    public String getDescription(){\r
-        return getDescription(Locale.getDefault());\r
-    }\r
-\r
-    public abstract String getExtractorClassName();\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        try{\r
-            Class<?> c = Class.forName(getExtractorClassName());\r
-            Class<? extends BirthmarkExtractor> clazz = c.asSubclass(BirthmarkExtractor.class);\r
-            Constructor<? extends BirthmarkExtractor> constructor = clazz.getConstructor(BirthmarkSpi.class);\r
-            return constructor.newInstance(service);\r
-        } catch(NoSuchMethodException e){\r
-        } catch(InstantiationException e){\r
-        } catch(InvocationTargetException e){\r
-        } catch(ClassNotFoundException e){\r
-        } catch(IllegalAccessException e){\r
-        }\r
-        return null;\r
-    }\r
-}\r
-\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.AbstractServiceProvider;
+import jp.sourceforge.stigmata.spi.BirthmarkExtractorSpi;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+abstract class AbstractBirthmarkExtractorService extends AbstractServiceProvider implements BirthmarkExtractorSpi{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public abstract String getType();
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDescription(
+            locale, getType(), LocalizedDescriptionManager.ServiceCategory.extractor
+        );
+    }
+
+    /**
+     * returns a localized description of the birthmark in default locale.
+     */
+    public String getDescription(){
+        return getDescription(Locale.getDefault());
+    }
+
+    public abstract String getExtractorClassName();
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        try{
+            Class<?> c = Class.forName(getExtractorClassName());
+            Class<? extends BirthmarkExtractor> clazz = c.asSubclass(BirthmarkExtractor.class);
+            Constructor<? extends BirthmarkExtractor> constructor = clazz.getConstructor(BirthmarkSpi.class);
+            return constructor.newInstance(service);
+        } catch(NoSuchMethodException e){
+        } catch(InstantiationException e){
+        } catch(InvocationTargetException e){
+        } catch(ClassNotFoundException e){
+        } catch(IllegalAccessException e){
+        }
+        return null;
+    }
+}
+
@@ -1,74 +1,74 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.ExtractorNotFoundException;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-import org.apache.commons.beanutils.BeanUtils;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkExtractorFactory{\r
-    private BirthmarkEnvironment environment;\r
-    private Map<String, BirthmarkExtractor> extractors = new HashMap<String, BirthmarkExtractor>();\r
-\r
-    public BirthmarkExtractorFactory(BirthmarkEnvironment env){\r
-        this.environment = env;\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(String name) throws ExtractorNotFoundException{\r
-        BirthmarkExtractor extractor = extractors.get(name);\r
-        if(extractor == null){\r
-            extractor = buildExtractor(name);\r
-            extractors.put(name, extractor);\r
-        }\r
-        return extractor;\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    private BirthmarkExtractor buildExtractor(String birthmarkType) throws ExtractorNotFoundException{\r
-        BirthmarkSpi spi = environment.getService(birthmarkType);\r
-        BirthmarkExtractor extractor = null;\r
-        if(spi != null){\r
-            extractor = spi.getExtractor();\r
-            try{\r
-                if(extractor != null){\r
-                    Map props = BeanUtils.describe(extractor);\r
-                    props.remove("class");\r
-                    props.remove("provider");\r
-                    for(Object keyObject: props.keySet()){\r
-                        String key = "extractor." + spi.getType() + "." + String.valueOf(keyObject);\r
-                        if(environment.getProperty(key) != null){\r
-                            BeanUtils.setProperty(\r
-                                extractor, (String)keyObject, environment.getProperty(key)\r
-                            );\r
-                        }\r
-                    }\r
-                }\r
-            } catch(InvocationTargetException e){\r
-                throw new InternalError(e.getMessage());\r
-            } catch(NoSuchMethodException e){\r
-                throw new InternalError(e.getMessage());\r
-            } catch(IllegalAccessException e){\r
-                throw new InternalError(e.getMessage());\r
-            }\r
-        }\r
-        if(extractor == null){\r
-            throw new ExtractorNotFoundException("extractor not found: " + birthmarkType);\r
-        }\r
-\r
-        return extractor;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.ExtractorNotFoundException;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+import org.apache.commons.beanutils.BeanUtils;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkExtractorFactory{
+    private BirthmarkEnvironment environment;
+    private Map<String, BirthmarkExtractor> extractors = new HashMap<String, BirthmarkExtractor>();
+
+    public BirthmarkExtractorFactory(BirthmarkEnvironment env){
+        this.environment = env;
+    }
+
+    public BirthmarkExtractor getExtractor(String name) throws ExtractorNotFoundException{
+        BirthmarkExtractor extractor = extractors.get(name);
+        if(extractor == null){
+            extractor = buildExtractor(name);
+            extractors.put(name, extractor);
+        }
+        return extractor;
+    }
+
+    @SuppressWarnings("unchecked")
+    private BirthmarkExtractor buildExtractor(String birthmarkType) throws ExtractorNotFoundException{
+        BirthmarkSpi spi = environment.getService(birthmarkType);
+        BirthmarkExtractor extractor = null;
+        if(spi != null){
+            extractor = spi.getExtractor();
+            try{
+                if(extractor != null){
+                    Map props = BeanUtils.describe(extractor);
+                    props.remove("class");
+                    props.remove("provider");
+                    for(Object keyObject: props.keySet()){
+                        String key = "extractor." + spi.getType() + "." + String.valueOf(keyObject);
+                        if(environment.getProperty(key) != null){
+                            BeanUtils.setProperty(
+                                extractor, (String)keyObject, environment.getProperty(key)
+                            );
+                        }
+                    }
+                }
+            } catch(InvocationTargetException e){
+                throw new InternalError(e.getMessage());
+            } catch(NoSuchMethodException e){
+                throw new InternalError(e.getMessage());
+            } catch(IllegalAccessException e){
+                throw new InternalError(e.getMessage());
+            }
+        }
+        if(extractor == null){
+            throw new ExtractorNotFoundException("extractor not found: " + birthmarkType);
+        }
+
+        return extractor;
+    }
+}
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ConstantValueOfFieldVariableBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "cvfv";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new ConstantValueOfFieldVariableBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ConstantValueOfFieldVariableBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "cvfv";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new ConstantValueOfFieldVariableBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyMethodCallBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "fmc";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new FrequencyMethodCallBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FrequencyMethodCallBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "fmc";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new FrequencyMethodCallBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyUsedClassesBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "fuc";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new FrequencyUsedClassesBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FrequencyUsedClassesBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "fuc";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new FrequencyUsedClassesBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class InheritanceStructureBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "is";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new InheritanceStructureBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class InheritanceStructureBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "is";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new InheritanceStructureBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.kgram.KGramBasedBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class KGramBasedBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "kgram";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.kgram.KGramBasedBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new KGramBasedBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.kgram.KGramBasedBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class KGramBasedBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "kgram";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.kgram.KGramBasedBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new KGramBasedBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SequentialMethodCallBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "smc";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new SequentialMethodCallBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SequentialMethodCallBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "smc";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new SequentialMethodCallBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,36 +1,36 @@
-package jp.naist.se.stigmata.birthmarks.extractors;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-import jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * Birthmark Service Provider Interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class UsedClassesBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
-\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType(){\r
-        return "uc";\r
-    }\r
-\r
-    public String getExtractorClassName(){\r
-        return "jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor";\r
-    }\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
-        return new UsedClassesBirthmarkExtractor(service);\r
-    }\r
+package jp.sourceforge.stigmata.birthmarks.extractors;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * Birthmark Service Provider Interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class UsedClassesBirthmarkExtractorService extends AbstractBirthmarkExtractorService{
+
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType(){
+        return "uc";
+    }
+
+    public String getExtractorClassName(){
+        return "jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor";
+    }
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){
+        return new UsedClassesBirthmarkExtractor(service);
+    }
 }
\ No newline at end of file
@@ -1,18 +1,18 @@
-package jp.naist.se.stigmata.birthmarks.fmc;
+package jp.sourceforge.stigmata.birthmarks.fmc;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.birthmarks.FrequencyBirthmark;
-import jp.naist.se.stigmata.birthmarks.FrequencyBirthmarkElement;
-import jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.birthmarks.FrequencyBirthmark;
+import jp.sourceforge.stigmata.birthmarks.FrequencyBirthmarkElement;
+import jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
 
@@ -1,54 +1,54 @@
-package jp.naist.se.stigmata.birthmarks.fmc;\r
-\r
-/*\r
- * $Id$\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.FrequencyBirthmarkElement;\r
-import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyMethodCallBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new CosineSimilarityBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new FrequencyMethodCallBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "fmc";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "Frequency of method call which order is appeared in method definition.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\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
+package jp.sourceforge.stigmata.birthmarks.fmc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.FrequencyBirthmarkElement;
+import jp.sourceforge.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FrequencyMethodCallBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private BirthmarkComparator comparator = new CosineSimilarityBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new FrequencyMethodCallBirthmarkExtractor(this);
+
+    public String getType(){
+        return "fmc";
+    }
+
+    public String getDefaultDescription(){
+        return "Frequency of method call which order is appeared in method definition.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+
+       @Override
+       public BirthmarkElement buildBirthmarkElement(String value) {
+       return new FrequencyBirthmarkElement(value);
+       }
+}
@@ -1,17 +1,17 @@
-package jp.naist.se.stigmata.birthmarks.fuc;
+package jp.sourceforge.stigmata.birthmarks.fuc;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.birthmarks.FrequencyBirthmark;
-import jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.birthmarks.FrequencyBirthmark;
+import jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
 
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata.birthmarks.fuc;\r
-\r
-/*\r
- * $Id$\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.FrequencyBirthmarkElement;\r
-import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyUsedClassesBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new CosineSimilarityBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new FrequencyUsedClassesBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "fuc";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "Frequency of used classes in target class.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\r
-\r
-    public boolean isUserDefined(){\r
-        return false;\r
-    }\r
-\r
-    public BirthmarkElement createBirthmarkElement(String value){\r
-       return new FrequencyBirthmarkElement(value);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.fuc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.FrequencyBirthmarkElement;
+import jp.sourceforge.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FrequencyUsedClassesBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private BirthmarkComparator comparator = new CosineSimilarityBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new FrequencyUsedClassesBirthmarkExtractor(this);
+
+    public String getType(){
+        return "fuc";
+    }
+
+    public String getDefaultDescription(){
+        return "Frequency of used classes in target class.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+
+    public BirthmarkElement createBirthmarkElement(String value){
+       return new FrequencyBirthmarkElement(value);
+    }
+}
@@ -1,57 +1,57 @@
-package jp.naist.se.stigmata.birthmarks.is;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;\r
-import jp.naist.se.stigmata.birthmarks.NullBirthmarkElement;\r
-import jp.naist.se.stigmata.utils.WellknownClassManager;\r
-\r
-import org.objectweb.asm.ClassVisitor;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class InheritanceStructureBirthmarkExtractVisitor extends BirthmarkExtractVisitor{\r
-    public InheritanceStructureBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){\r
-        super(visitor, birthmark, environment);\r
-    }\r
-\r
-    public void visit(int version, int access, String name, String signature,\r
-                      String superName, String[] interfaces){\r
-        try {\r
-            Class<?> c = getEnvironment().getClasspathContext().findClass(name.replace('/', '.'));\r
-            if(c != null && !c.isInterface()){\r
-                addISBirthmark(c);\r
-            }\r
-        } catch (ClassNotFoundException ex){\r
-            addFailur(ex);\r
-        }\r
-    }\r
-\r
-    private void addISBirthmark(Class<?> c){\r
-        WellknownClassManager wcm = getEnvironment().getWellknownClassManager();\r
-        do{\r
-            String className = c.getName();\r
-            BirthmarkElement element = null;\r
-            if(wcm.isWellKnownClass(className)){\r
-                element = new BirthmarkElement(className);\r
-            }\r
-            else{\r
-                element = NullBirthmarkElement.getInstance();\r
-            }\r
-\r
-            addElement(element);\r
-            c = c.getSuperclass();\r
-        } while(!c.getName().equals("java.lang.Object"));\r
-        addElement(new BirthmarkElement("java.lang.Object"));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.is;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.birthmarks.NullBirthmarkElement;
+import jp.sourceforge.stigmata.utils.WellknownClassManager;
+
+import org.objectweb.asm.ClassVisitor;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class InheritanceStructureBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
+    public InheritanceStructureBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
+        super(visitor, birthmark, environment);
+    }
+
+    public void visit(int version, int access, String name, String signature,
+                      String superName, String[] interfaces){
+        try {
+            Class<?> c = getEnvironment().getClasspathContext().findClass(name.replace('/', '.'));
+            if(c != null && !c.isInterface()){
+                addISBirthmark(c);
+            }
+        } catch (ClassNotFoundException ex){
+            addFailur(ex);
+        }
+    }
+
+    private void addISBirthmark(Class<?> c){
+        WellknownClassManager wcm = getEnvironment().getWellknownClassManager();
+        do{
+            String className = c.getName();
+            BirthmarkElement element = null;
+            if(wcm.isWellKnownClass(className)){
+                element = new BirthmarkElement(className);
+            }
+            else{
+                element = NullBirthmarkElement.getInstance();
+            }
+
+            addElement(element);
+            c = c.getSuperclass();
+        } while(!c.getName().equals("java.lang.Object"));
+        addElement(new BirthmarkElement("java.lang.Object"));
+    }
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.birthmarks.is;
+package jp.sourceforge.stigmata.birthmarks.is;
 
 /*
  * $Id$
@@ -7,14 +7,14 @@ package jp.naist.se.stigmata.birthmarks.is;
 import java.io.IOException;
 import java.io.InputStream;
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElementClassNotFoundException;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.BirthmarkExtractionFailedException;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElementClassNotFoundException;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassWriter;
@@ -1,47 +1,47 @@
-package jp.naist.se.stigmata.birthmarks.is;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\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
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class InheritanceStructureBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new InheritanceStructureBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "is";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "Inheritance sequence to root class and user classes is replaced to <null>.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\r
-\r
-    public boolean isUserDefined(){\r
-        return false;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.is;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class InheritanceStructureBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new InheritanceStructureBirthmarkExtractor(this);
+
+    public String getType(){
+        return "is";
+    }
+
+    public String getDefaultDescription(){
+        return "Inheritance sequence to root class and user classes is replaced to <null>.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+}
-package jp.naist.se.stigmata.birthmarks.kgram;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.Serializable;\r
-import java.lang.reflect.Array;\r
-import java.util.Arrays;\r
-import java.util.LinkedHashSet;\r
-import java.util.Set;\r
-\r
-/**\r
- * This class represents k-gram of the some sequence. \r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class KGram<T> implements Serializable{\r
-    private static final long serialVersionUID = 273465874532523L;\r
-    // private List<T> list = new ArrayList<T>();\r
-    private int maxLength = 4;\r
-    private T[] values;\r
-\r
-    /**\r
-     * constructor.\r
-     * @param kvalue the number of elements of this object.\r
-     */\r
-    public KGram(int kvalue){\r
-        setKValue(kvalue);\r
-    }\r
-\r
-    /**\r
-     * sets k-value. \r
-     * @param kvalue the number of elements of this object.\r
-     */\r
-    public void setKValue(int kvalue){\r
-        this.maxLength = kvalue;\r
-    }\r
-\r
-    /**\r
-     * returns k-value which is the number of elements.\r
-     * @return the number of elements.\r
-     */\r
-    public int getKValue(){\r
-        return maxLength;\r
-    }\r
-\r
-    /**\r
-     * returns string representation of this object.\r
-     */\r
-    public String toString(){\r
-        StringBuffer buffer = new StringBuffer("{ ");\r
-        for(int i = 0; i < maxLength; i++){\r
-            if(i != 0) buffer.append(", ");\r
-            buffer.append(get(i));\r
-        }\r
-        buffer.append(" }");\r
-        return new String(buffer);\r
-    }\r
-\r
-    /**\r
-     * sets a element to given index.\r
-     * @param index element index.\r
-     * @param value element value.\r
-     */\r
-    @SuppressWarnings("unchecked")\r
-    public void set(int index, T value){\r
-        if(index < 0 || index >= maxLength){\r
-            throw new ArrayIndexOutOfBoundsException("expected 0-" + (maxLength - 1) + ": " + index);\r
-        }\r
-        if(value == null){\r
-            throw new NullPointerException("null value");\r
-        }\r
-        if(values == null){\r
-            values = (T[])Array.newInstance(value.getClass(), getKValue());\r
-        }\r
-        values[index] = value;\r
-    }\r
-\r
-    /**\r
-     * returns an object of given index.\r
-     */\r
-    public T get(int index){\r
-        T returnValue = null;\r
-        if(index < 0 || index >= maxLength){\r
-            throw new ArrayIndexOutOfBoundsException("expected 0-" + (maxLength - 1) + ": " + index);\r
-        }\r
-        if(values != null){\r
-            returnValue = values[index];\r
-        }\r
-\r
-        return returnValue;\r
-    }\r
-\r
-    /**\r
-     * returns an array of elements this object has.\r
-     * @return\r
-     */\r
-    @SuppressWarnings("unchecked")\r
-    public T[] toArray(){\r
-        if(values == null){\r
-            throw new IllegalStateException("this object has no elements.");\r
-        }\r
-        T[] newarray = (T[])Array.newInstance(values[0].getClass(), getKValue());\r
-        System.arraycopy(values, 0, newarray, 0, getKValue());\r
-        return newarray;\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    public boolean equals(Object o){\r
-        if(o instanceof KGram){\r
-            KGram kgram = (KGram)o;\r
-            boolean flag = getKValue() == kgram.getKValue();\r
-            for(int i = 0; !flag && i < maxLength; i++){\r
-                if(!get(i).equals(kgram.get(i))){\r
-                    flag = false;\r
-                }\r
-            }\r
-            return flag;\r
-        }\r
-        return false;\r
-    }\r
-\r
-    public int hashCode(){\r
-        return Arrays.hashCode(values);\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    public static <T> KGram<T>[] buildKGram(T[] values, int kvalue){\r
-        Set<KGram<T>> kgrams = new LinkedHashSet<KGram<T>>();\r
-\r
-        if(values.length >= kvalue){\r
-            int max = values.length - (kvalue - 1);\r
-            for(int i = 0; i < max; i++){\r
-                KGram<T> kgram = new KGram<T>(kvalue);\r
-                for(int j = 0; j < kvalue; j++){\r
-                    kgram.set(j, values[i + j]);\r
-                }\r
-                kgrams.add(kgram);\r
-            }\r
-        }\r
-        return kgrams.toArray(new KGram[kgrams.size()]);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.kgram;
+
+/*
+ * $Id$
+ */
+
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * This class represents k-gram of the some sequence. 
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class KGram<T> implements Serializable{
+    private static final long serialVersionUID = 273465874532523L;
+    // private List<T> list = new ArrayList<T>();
+    private int maxLength = 4;
+    private T[] values;
+
+    /**
+     * constructor.
+     * @param kvalue the number of elements of this object.
+     */
+    public KGram(int kvalue){
+        setKValue(kvalue);
+    }
+
+    /**
+     * sets k-value. 
+     * @param kvalue the number of elements of this object.
+     */
+    public void setKValue(int kvalue){
+        this.maxLength = kvalue;
+    }
+
+    /**
+     * returns k-value which is the number of elements.
+     * @return the number of elements.
+     */
+    public int getKValue(){
+        return maxLength;
+    }
+
+    /**
+     * returns string representation of this object.
+     */
+    public String toString(){
+        StringBuffer buffer = new StringBuffer("{ ");
+        for(int i = 0; i < maxLength; i++){
+            if(i != 0) buffer.append(", ");
+            buffer.append(get(i));
+        }
+        buffer.append(" }");
+        return new String(buffer);
+    }
+
+    /**
+     * sets a element to given index.
+     * @param index element index.
+     * @param value element value.
+     */
+    @SuppressWarnings("unchecked")
+    public void set(int index, T value){
+        if(index < 0 || index >= maxLength){
+            throw new ArrayIndexOutOfBoundsException("expected 0-" + (maxLength - 1) + ": " + index);
+        }
+        if(value == null){
+            throw new NullPointerException("null value");
+        }
+        if(values == null){
+            values = (T[])Array.newInstance(value.getClass(), getKValue());
+        }
+        values[index] = value;
+    }
+
+    /**
+     * returns an object of given index.
+     */
+    public T get(int index){
+        T returnValue = null;
+        if(index < 0 || index >= maxLength){
+            throw new ArrayIndexOutOfBoundsException("expected 0-" + (maxLength - 1) + ": " + index);
+        }
+        if(values != null){
+            returnValue = values[index];
+        }
+
+        return returnValue;
+    }
+
+    /**
+     * returns an array of elements this object has.
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public T[] toArray(){
+        if(values == null){
+            throw new IllegalStateException("this object has no elements.");
+        }
+        T[] newarray = (T[])Array.newInstance(values[0].getClass(), getKValue());
+        System.arraycopy(values, 0, newarray, 0, getKValue());
+        return newarray;
+    }
+
+    @SuppressWarnings("unchecked")
+    public boolean equals(Object o){
+        if(o instanceof KGram){
+            KGram kgram = (KGram)o;
+            boolean flag = getKValue() == kgram.getKValue();
+            for(int i = 0; !flag && i < maxLength; i++){
+                if(!get(i).equals(kgram.get(i))){
+                    flag = false;
+                }
+            }
+            return flag;
+        }
+        return false;
+    }
+
+    public int hashCode(){
+        return Arrays.hashCode(values);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> KGram<T>[] buildKGram(T[] values, int kvalue){
+        Set<KGram<T>> kgrams = new LinkedHashSet<KGram<T>>();
+
+        if(values.length >= kvalue){
+            int max = values.length - (kvalue - 1);
+            for(int i = 0; i < max; i++){
+                KGram<T> kgram = new KGram<T>(kvalue);
+                for(int j = 0; j < kvalue; j++){
+                    kgram.set(j, values[i + j]);
+                }
+                kgrams.add(kgram);
+            }
+        }
+        return kgrams.toArray(new KGram[kgrams.size()]);
+    }
+}
@@ -1,35 +1,35 @@
-package jp.naist.se.stigmata.birthmarks.kgram;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class KGramBasedBirthmarkElement<T> extends BirthmarkElement{\r
-    private static final long serialVersionUID = 28546543857543634L;\r
-\r
-    private KGram<T> kgram;\r
-\r
-    public KGramBasedBirthmarkElement(KGram<T> kgram){\r
-        super(kgram.toString());\r
-        this.kgram = kgram;\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    public boolean equals(Object o){\r
-        return o instanceof KGramBasedBirthmarkElement &&\r
-            kgram.equals(((KGramBasedBirthmarkElement)o).kgram);\r
-    }\r
-\r
-    public int hashCode(){\r
-        int v = kgram.hashCode();\r
-\r
-        return (v & 0xff << 24) | (v >> 8); \r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.kgram;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkElement;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class KGramBasedBirthmarkElement<T> extends BirthmarkElement{
+    private static final long serialVersionUID = 28546543857543634L;
+
+    private KGram<T> kgram;
+
+    public KGramBasedBirthmarkElement(KGram<T> kgram){
+        super(kgram.toString());
+        this.kgram = kgram;
+    }
+
+    @SuppressWarnings("unchecked")
+    public boolean equals(Object o){
+        return o instanceof KGramBasedBirthmarkElement &&
+            kgram.equals(((KGramBasedBirthmarkElement)o).kgram);
+    }
+
+    public int hashCode(){
+        int v = kgram.hashCode();
+
+        return (v & 0xff << 24) | (v >> 8); 
+    }
+}
@@ -1,65 +1,65 @@
-package jp.naist.se.stigmata.birthmarks.kgram;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;\r
-\r
-import org.objectweb.asm.ClassVisitor;\r
-import org.objectweb.asm.MethodVisitor;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class KGramBasedBirthmarkExtractVisitor extends BirthmarkExtractVisitor{\r
-    private int kvalue;\r
-    private List<Integer> opcodes = new ArrayList<Integer>();\r
-\r
-    public KGramBasedBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){\r
-        super(visitor, birthmark, environment);\r
-    }\r
-\r
-    public int getKValue(){\r
-        return kvalue;\r
-    }\r
-\r
-    public void setKValue(int kvalue){\r
-        this.kvalue = kvalue;\r
-    }\r
-\r
-    public void visitEnd(){\r
-        Set<KGram<Integer>> kgrams = new HashSet<KGram<Integer>>();\r
-        if(opcodes.size() >= getKValue()){\r
-            int kvalue = getKValue();\r
-            int max = opcodes.size() - (kvalue - 1);\r
-            for(int i = 0; i < max; i++){\r
-                KGram<Integer> kgram = new KGram<Integer>(kvalue);\r
-                for(int j = 0; j < kvalue; j++){\r
-                    kgram.set(j, opcodes.get(i + j));\r
-                }\r
-                kgrams.add(kgram);\r
-            }\r
-        }\r
-        for(KGram<Integer> kgram: kgrams){\r
-            addElement(new KGramBasedBirthmarkElement<Integer>(kgram));\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public MethodVisitor visitMethod(int arg0, String arg1, String arg2, String arg3, String[] arg4){\r
-        MethodVisitor visitor = super.visitMethod(arg0, arg1, arg2, arg3, arg4);\r
-        MethodVisitor opcodeVisitor = new OpcodeExtractionMethodVisitor(visitor, opcodes);\r
-\r
-        return opcodeVisitor;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.kgram;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class KGramBasedBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
+    private int kvalue;
+    private List<Integer> opcodes = new ArrayList<Integer>();
+
+    public KGramBasedBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
+        super(visitor, birthmark, environment);
+    }
+
+    public int getKValue(){
+        return kvalue;
+    }
+
+    public void setKValue(int kvalue){
+        this.kvalue = kvalue;
+    }
+
+    public void visitEnd(){
+        Set<KGram<Integer>> kgrams = new HashSet<KGram<Integer>>();
+        if(opcodes.size() >= getKValue()){
+            int kvalue = getKValue();
+            int max = opcodes.size() - (kvalue - 1);
+            for(int i = 0; i < max; i++){
+                KGram<Integer> kgram = new KGram<Integer>(kvalue);
+                for(int j = 0; j < kvalue; j++){
+                    kgram.set(j, opcodes.get(i + j));
+                }
+                kgrams.add(kgram);
+            }
+        }
+        for(KGram<Integer> kgram: kgrams){
+            addElement(new KGramBasedBirthmarkElement<Integer>(kgram));
+        }
+    }
+
+    @Override
+    public MethodVisitor visitMethod(int arg0, String arg1, String arg2, String arg3, String[] arg4){
+        MethodVisitor visitor = super.visitMethod(arg0, arg1, arg2, arg3, arg4);
+        MethodVisitor opcodeVisitor = new OpcodeExtractionMethodVisitor(visitor, opcodes);
+
+        return opcodeVisitor;
+    }
+}
@@ -1,15 +1,15 @@
-package jp.naist.se.stigmata.birthmarks.kgram;
+package jp.sourceforge.stigmata.birthmarks.kgram;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
 
@@ -1,62 +1,62 @@
-package jp.naist.se.stigmata.birthmarks.kgram;\r
-\r
-/*\r
- * $Id$\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
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class KGramBasedBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new LogicalAndBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new KGramBasedBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "kgram";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "k-gram based birthmark.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\r
-\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
+package jp.sourceforge.stigmata.birthmarks.kgram;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class KGramBasedBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private BirthmarkComparator comparator = new LogicalAndBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new KGramBasedBirthmarkExtractor(this);
+
+    public String getType(){
+        return "kgram";
+    }
+
+    public String getDefaultDescription(){
+        return "k-gram based birthmark.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+
+       @Override
+       public BirthmarkElement buildBirthmarkElement(String value) {
+               value = value.trim();
+               if(value.startsWith("{") && value.endsWith("}")){
+                       String[] param = value.substring(1, value.length() - 1).split(", *");
+                       KGram<Integer> kgram = new KGram<Integer>(param.length);
+                       for(int i = 0; i < param.length; i++){
+                               kgram.set(i, new Integer(param[i].trim()));
+                       }
+                       return new KGramBasedBirthmarkElement<Integer>(kgram);
+               }
+               return null;
+       }
+}
@@ -1,99 +1,99 @@
-package jp.naist.se.stigmata.birthmarks.kgram;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.List;\r
-\r
-import org.objectweb.asm.Label;\r
-import org.objectweb.asm.MethodAdapter;\r
-import org.objectweb.asm.MethodVisitor;\r
-import org.objectweb.asm.Opcodes;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class OpcodeExtractionMethodVisitor extends MethodAdapter{\r
-    private List<Integer> opcodes;\r
-\r
-    public OpcodeExtractionMethodVisitor(MethodVisitor visitor, List<Integer> opcodes){\r
-        super(visitor);\r
-        this.opcodes = opcodes;\r
-    }\r
-\r
-    @Override\r
-    public void visitFieldInsn(int opcode, String owner, String name, String desc){\r
-        opcodes.add(opcode);\r
-        super.visitFieldInsn(opcode, owner, name, desc);\r
-    }\r
-\r
-    @Override\r
-    public void visitIincInsn(int var, int increment){\r
-        opcodes.add(Opcodes.IINC);\r
-        super.visitIincInsn(var, increment);\r
-    }\r
-\r
-    @Override\r
-    public void visitInsn(int opcode){\r
-        opcodes.add(opcode);\r
-        super.visitInsn(opcode);\r
-    }\r
-\r
-    @Override\r
-    public void visitIntInsn(int opcode, int operand){\r
-        opcodes.add(opcode);\r
-        super.visitIntInsn(opcode, operand);\r
-    }\r
-\r
-    @Override\r
-    public void visitJumpInsn(int opcode, Label label){\r
-        opcodes.add(opcode);\r
-        super.visitJumpInsn(opcode, label);\r
-    }\r
-\r
-    @Override\r
-    public void visitLdcInsn(Object value){\r
-        opcodes.add(Opcodes.LDC);\r
-        super.visitLdcInsn(value);\r
-    }\r
-\r
-    @Override\r
-    public void visitLookupSwitchInsn(Label defaultHandle, int[] keys, Label[] labels){\r
-        opcodes.add(Opcodes.LOOKUPSWITCH);\r
-        super.visitLookupSwitchInsn(defaultHandle, keys, labels);\r
-    }\r
-\r
-    @Override\r
-    public void visitMethodInsn(int opcode, String owner, String name, String desc){\r
-        opcodes.add(opcode);\r
-        super.visitMethodInsn(opcode, owner, name, desc);\r
-    }\r
-\r
-    @Override\r
-    public void visitMultiANewArrayInsn(String desc, int dims){\r
-        opcodes.add(Opcodes.MULTIANEWARRAY);\r
-        super.visitMultiANewArrayInsn(desc, dims);\r
-    }\r
-\r
-    @Override\r
-    public void visitTableSwitchInsn(int min, int max, Label defaultLabel, Label[] labels){\r
-        opcodes.add(Opcodes.TABLESWITCH);\r
-        super.visitTableSwitchInsn(min, max, defaultLabel, labels);\r
-    }\r
-\r
-    @Override\r
-    public void visitTypeInsn(int opcode, String desc){\r
-        opcodes.add(opcode);\r
-        super.visitTypeInsn(opcode, desc);\r
-    }\r
-\r
-    @Override\r
-    public void visitVarInsn(int opcode, int var){\r
-        opcodes.add(opcode);\r
-        super.visitVarInsn(opcode, var);\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.kgram;
+
+/*
+ * $Id$
+ */
+
+import java.util.List;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class OpcodeExtractionMethodVisitor extends MethodAdapter{
+    private List<Integer> opcodes;
+
+    public OpcodeExtractionMethodVisitor(MethodVisitor visitor, List<Integer> opcodes){
+        super(visitor);
+        this.opcodes = opcodes;
+    }
+
+    @Override
+    public void visitFieldInsn(int opcode, String owner, String name, String desc){
+        opcodes.add(opcode);
+        super.visitFieldInsn(opcode, owner, name, desc);
+    }
+
+    @Override
+    public void visitIincInsn(int var, int increment){
+        opcodes.add(Opcodes.IINC);
+        super.visitIincInsn(var, increment);
+    }
+
+    @Override
+    public void visitInsn(int opcode){
+        opcodes.add(opcode);
+        super.visitInsn(opcode);
+    }
+
+    @Override
+    public void visitIntInsn(int opcode, int operand){
+        opcodes.add(opcode);
+        super.visitIntInsn(opcode, operand);
+    }
+
+    @Override
+    public void visitJumpInsn(int opcode, Label label){
+        opcodes.add(opcode);
+        super.visitJumpInsn(opcode, label);
+    }
+
+    @Override
+    public void visitLdcInsn(Object value){
+        opcodes.add(Opcodes.LDC);
+        super.visitLdcInsn(value);
+    }
+
+    @Override
+    public void visitLookupSwitchInsn(Label defaultHandle, int[] keys, Label[] labels){
+        opcodes.add(Opcodes.LOOKUPSWITCH);
+        super.visitLookupSwitchInsn(defaultHandle, keys, labels);
+    }
+
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String desc){
+        opcodes.add(opcode);
+        super.visitMethodInsn(opcode, owner, name, desc);
+    }
+
+    @Override
+    public void visitMultiANewArrayInsn(String desc, int dims){
+        opcodes.add(Opcodes.MULTIANEWARRAY);
+        super.visitMultiANewArrayInsn(desc, dims);
+    }
+
+    @Override
+    public void visitTableSwitchInsn(int min, int max, Label defaultLabel, Label[] labels){
+        opcodes.add(Opcodes.TABLESWITCH);
+        super.visitTableSwitchInsn(min, max, defaultLabel, labels);
+    }
+
+    @Override
+    public void visitTypeInsn(int opcode, String desc){
+        opcodes.add(opcode);
+        super.visitTypeInsn(opcode, desc);
+    }
+
+    @Override
+    public void visitVarInsn(int opcode, int var){
+        opcodes.add(opcode);
+        super.visitVarInsn(opcode, var);
+    }
+
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.birthmarks.smc;
+package jp.sourceforge.stigmata.birthmarks.smc;
 
 /*
  * $Id$
@@ -6,7 +6,7 @@ package jp.naist.se.stigmata.birthmarks.smc;
 
 import java.io.Serializable;
 
-import jp.naist.se.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkElement;
 
 /**
  * 
@@ -1,46 +1,46 @@
-package jp.naist.se.stigmata.birthmarks.smc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;\r
-\r
-import org.objectweb.asm.ClassVisitor;\r
-import org.objectweb.asm.MethodAdapter;\r
-import org.objectweb.asm.MethodVisitor;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SequentialMethodCallBirthmarkExtractVisitor extends BirthmarkExtractVisitor{\r
-    public SequentialMethodCallBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){\r
-        super(visitor, birthmark, environment);\r
-    }\r
-\r
-    public MethodVisitor visitMethod(int access, String name, String desc,\r
-                                      String signature, String[] exceptions){\r
-\r
-        MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);\r
-\r
-        return new MethodAdapter(visitor){\r
-            public void visitMethodInsn(int opcode, String owner, String name, String desc){\r
-                String className = owner.replace('/', '.');\r
-                if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){\r
-                    addElement(className, name, desc);\r
-                }\r
-                super.visitMethodInsn(opcode, owner, name, desc);\r
-            }\r
-        };\r
-    }\r
-\r
-    protected void addElement(String className, String methodName, String description){\r
-        addElement(new MethodCallBirthmarkElement(className, methodName, description));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.smc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SequentialMethodCallBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
+    public SequentialMethodCallBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
+        super(visitor, birthmark, environment);
+    }
+
+    public MethodVisitor visitMethod(int access, String name, String desc,
+                                      String signature, String[] exceptions){
+
+        MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);
+
+        return new MethodAdapter(visitor){
+            public void visitMethodInsn(int opcode, String owner, String name, String desc){
+                String className = owner.replace('/', '.');
+                if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
+                    addElement(className, name, desc);
+                }
+                super.visitMethodInsn(opcode, owner, name, desc);
+            }
+        };
+    }
+
+    protected void addElement(String className, String methodName, String description){
+        addElement(new MethodCallBirthmarkElement(className, methodName, description));
+    }
+}
@@ -1,15 +1,15 @@
-package jp.naist.se.stigmata.birthmarks.smc;
+package jp.sourceforge.stigmata.birthmarks.smc;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
 
@@ -1,57 +1,57 @@
-package jp.naist.se.stigmata.birthmarks.smc;\r
-\r
-/*\r
- * $Id$\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
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SequentialMethodCallBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new SequentialMethodCallBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "smc";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "Sequence of method call which order is appeared in method definition.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\r
-\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
+package jp.sourceforge.stigmata.birthmarks.smc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SequentialMethodCallBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new SequentialMethodCallBirthmarkExtractor(this);
+
+    public String getType(){
+        return "smc";
+    }
+
+    public String getDefaultDescription(){
+        return "Sequence of method call which order is appeared in method definition.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+
+       @Override
+       public BirthmarkElement buildBirthmarkElement(String value) {
+               String className = value.substring(0, value.indexOf('#'));
+               String methodName = value.substring(value.indexOf('#') + 1, value.lastIndexOf('!'));
+               String signature = value.substring(value.lastIndexOf('!') + 1);
+
+               return new MethodCallBirthmarkElement(className, methodName, signature);
+       }
+}
@@ -1,47 +1,47 @@
-package jp.naist.se.stigmata.birthmarks.uc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.birthmarks.PlainBirthmark;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-class UsedClassesBirthmark extends PlainBirthmark{\r
-    private static final long serialVersionUID = -1043130948373105655L;\r
-\r
-    public UsedClassesBirthmark(String type){\r
-        super(type);\r
-    }\r
-\r
-    @Override\r
-    public synchronized void addElement(BirthmarkElement element){\r
-        int c = getElementCount();\r
-        String s = (String)element.getValue();\r
-        boolean addFlag = false;\r
-        for(int i = 0; i < c; i++){\r
-            BirthmarkElement e = getElement(i);\r
-            String v = (String)e.getValue();\r
-            if(s.equals(v)){\r
-                addFlag = true;\r
-                break;\r
-            }\r
-        }\r
-        if(!addFlag){\r
-            for(int i = 0; i < c; i++){\r
-                if(s.compareTo((String)getElement(i).getValue()) < 0){\r
-                    super.addElement(i, element);\r
-                    break;\r
-                }\r
-            }\r
-        }\r
-        if(!addFlag && c == getElementCount()){\r
-            super.addElement(element);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.uc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.birthmarks.PlainBirthmark;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+class UsedClassesBirthmark extends PlainBirthmark{
+    private static final long serialVersionUID = -1043130948373105655L;
+
+    public UsedClassesBirthmark(String type){
+        super(type);
+    }
+
+    @Override
+    public synchronized void addElement(BirthmarkElement element){
+        int c = getElementCount();
+        String s = (String)element.getValue();
+        boolean addFlag = false;
+        for(int i = 0; i < c; i++){
+            BirthmarkElement e = getElement(i);
+            String v = (String)e.getValue();
+            if(s.equals(v)){
+                addFlag = true;
+                break;
+            }
+        }
+        if(!addFlag){
+            for(int i = 0; i < c; i++){
+                if(s.compareTo((String)getElement(i).getValue()) < 0){
+                    super.addElement(i, element);
+                    break;
+                }
+            }
+        }
+        if(!addFlag && c == getElementCount()){
+            super.addElement(element);
+        }
+    }
+}
-package jp.naist.se.stigmata.birthmarks.uc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;\r
-\r
-import org.objectweb.asm.ClassVisitor;\r
-import org.objectweb.asm.FieldVisitor;\r
-import org.objectweb.asm.Label;\r
-import org.objectweb.asm.MethodAdapter;\r
-import org.objectweb.asm.MethodVisitor;\r
-import org.objectweb.asm.Type;\r
-import org.objectweb.asm.signature.SignatureReader;\r
-import org.objectweb.asm.signature.SignatureWriter;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class UsedClassesBirthmarkExtractVisitor extends BirthmarkExtractVisitor{\r
-    public UsedClassesBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark,\r
-                                              BirthmarkEnvironment environment){\r
-        super(visitor, birthmark, environment);\r
-    }\r
-\r
-    public void visit(int version, int access, String name, String signature,\r
-            String superName, String[] interfaces){\r
-        addSignatureClass(signature);\r
-\r
-        if(getEnvironment().getWellknownClassManager().isWellKnownClass(superName)){\r
-            add(superName);\r
-        }\r
-        for(String i: interfaces){\r
-            if(getEnvironment().getWellknownClassManager().isWellKnownClass(i)){\r
-                add(i);\r
-            }\r
-        }\r
-    }\r
-\r
-    public FieldVisitor visitField(int access, String name, String desc,\r
-            String signature, Object value){\r
-        FieldVisitor visitor = super.visitField(access, name, desc, signature, value);\r
-\r
-        addDescriptor(desc);\r
-        addSignatureClass(signature);\r
-\r
-        return visitor;\r
-    }\r
-\r
-    public MethodVisitor visitMethod(int access, String name, String desc,\r
-                                     String signature, String[] exceptions){\r
-        if(exceptions != null){\r
-            for(String exception: exceptions){\r
-                if(getEnvironment().getWellknownClassManager().isWellKnownClass(exception)){\r
-                    add(exception);\r
-                }\r
-            }\r
-        }\r
-        addMethodDescriptor(desc);\r
-        addSignatureClass(signature);\r
-\r
-        MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);\r
-\r
-        return new MethodAdapter(visitor){\r
-            public void visitTypeInsn(int opcode, String desc){\r
-                Type type = Type.getType("L" + desc + ";");\r
-                if(checkType(type)){\r
-                    add(desc);\r
-                }\r
-                super.visitTypeInsn(opcode, desc);\r
-            }\r
-\r
-            public void visitTryCatchBlock(Label start, Label end, Label handle, String desc){\r
-                Type type = Type.getType("L" + desc + ";");\r
-                if(checkType(type)){\r
-                    add(getType(type));\r
-                }\r
-                super.visitTryCatchBlock(start, end, handle, desc);\r
-            }\r
-\r
-            public void visitMultiANewArrayInsn(String desc, int dims){\r
-                Type type = Type.getType(desc);\r
-                if(checkType(type)){\r
-                    add(getType(type));\r
-                }\r
-                super.visitMultiANewArrayInsn(desc, dims);\r
-            }\r
-\r
-            public void visitLocalVariable(String name, String desc, String signature,\r
-                                           Label start, Label end, int index){\r
-                if(checkType(Type.getType(desc))){\r
-                    add(desc);\r
-                }\r
-                addSignatureClass(signature);\r
-\r
-                super.visitLocalVariable(name, desc, signature, start, end, index);\r
-            }\r
-\r
-            public void visitFieldInsn(int opcode, String owner, String name, String desc){\r
-                if(getEnvironment().getWellknownClassManager().isWellKnownClass(owner)){\r
-                    add(owner);\r
-                }\r
-                addDescriptor(desc);\r
-                super.visitFieldInsn(opcode, owner, name, desc);\r
-            }\r
-            public void visitMethodInsn(int opcode, String owner, String name, String desc){\r
-                String className = normalize(owner);\r
-                if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){\r
-                    add(className);\r
-                }\r
-                addMethodDescriptor(desc);\r
-                super.visitMethodInsn(opcode, owner, name, desc);\r
-            }\r
-        };\r
-    }\r
-\r
-    private void addSignatureClass(String signature){\r
-        if(signature != null){\r
-            SignatureReader in = new SignatureReader(signature);\r
-            SignatureWriter writer = new SignatureWriter(){\r
-                public void visitClassType(String classType){\r
-                    if(getEnvironment().getWellknownClassManager().isWellKnownClass(classType)){\r
-                        add(classType);\r
-                    }\r
-                }\r
-            };\r
-            in.accept(writer);\r
-        }\r
-    }\r
-\r
-    private void addMethodDescriptor(String desc){\r
-        Type returnType = Type.getReturnType(desc);\r
-        Type[] args = Type.getArgumentTypes(desc);\r
-        if(checkType(returnType)){\r
-            add(getType(returnType));\r
-        }\r
-        for(Type arg: args){\r
-            if(checkType(arg)){\r
-                add(getType(arg));\r
-            }\r
-        }\r
-    }\r
-\r
-    private void addDescriptor(String desc){\r
-        Type type = Type.getType(desc);\r
-        if(checkType(type)){\r
-            add(desc);\r
-        }\r
-    }\r
-\r
-    private String getType(Type type){\r
-        if(type.getSort() == Type.ARRAY){\r
-            while(type.getSort() != Type.ARRAY){\r
-                type = type.getElementType();\r
-            }\r
-        }\r
-\r
-        if(type.getSort() == Type.OBJECT){\r
-            return normalize(type.getClassName());\r
-        }\r
-\r
-        return null;\r
-    }\r
-\r
-    private boolean checkType(Type type){\r
-        if(type.getSort() == Type.ARRAY){\r
-            while(type.getSort() != Type.ARRAY){\r
-                type = type.getElementType();\r
-            }\r
-        }\r
-\r
-        if(type.getSort() == Type.OBJECT){\r
-            String className = type.getClassName();\r
-            if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){\r
-                return true;\r
-            }\r
-        }\r
-        return false;\r
-    }\r
-\r
-    private String normalize(String name){\r
-        if(name.startsWith("L") && name.endsWith(";")){\r
-            name = name.substring(1, name.length() - 1);\r
-        }\r
-        name = name.replace('/', '.');\r
-\r
-        return name;\r
-    }\r
-\r
-    private void add(String name){\r
-        addElement(new BirthmarkElement(normalize(name)));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.uc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.signature.SignatureReader;
+import org.objectweb.asm.signature.SignatureWriter;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class UsedClassesBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
+    public UsedClassesBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark,
+                                              BirthmarkEnvironment environment){
+        super(visitor, birthmark, environment);
+    }
+
+    public void visit(int version, int access, String name, String signature,
+            String superName, String[] interfaces){
+        addSignatureClass(signature);
+
+        if(getEnvironment().getWellknownClassManager().isWellKnownClass(superName)){
+            add(superName);
+        }
+        for(String i: interfaces){
+            if(getEnvironment().getWellknownClassManager().isWellKnownClass(i)){
+                add(i);
+            }
+        }
+    }
+
+    public FieldVisitor visitField(int access, String name, String desc,
+            String signature, Object value){
+        FieldVisitor visitor = super.visitField(access, name, desc, signature, value);
+
+        addDescriptor(desc);
+        addSignatureClass(signature);
+
+        return visitor;
+    }
+
+    public MethodVisitor visitMethod(int access, String name, String desc,
+                                     String signature, String[] exceptions){
+        if(exceptions != null){
+            for(String exception: exceptions){
+                if(getEnvironment().getWellknownClassManager().isWellKnownClass(exception)){
+                    add(exception);
+                }
+            }
+        }
+        addMethodDescriptor(desc);
+        addSignatureClass(signature);
+
+        MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);
+
+        return new MethodAdapter(visitor){
+            public void visitTypeInsn(int opcode, String desc){
+                Type type = Type.getType("L" + desc + ";");
+                if(checkType(type)){
+                    add(desc);
+                }
+                super.visitTypeInsn(opcode, desc);
+            }
+
+            public void visitTryCatchBlock(Label start, Label end, Label handle, String desc){
+                Type type = Type.getType("L" + desc + ";");
+                if(checkType(type)){
+                    add(getType(type));
+                }
+                super.visitTryCatchBlock(start, end, handle, desc);
+            }
+
+            public void visitMultiANewArrayInsn(String desc, int dims){
+                Type type = Type.getType(desc);
+                if(checkType(type)){
+                    add(getType(type));
+                }
+                super.visitMultiANewArrayInsn(desc, dims);
+            }
+
+            public void visitLocalVariable(String name, String desc, String signature,
+                                           Label start, Label end, int index){
+                if(checkType(Type.getType(desc))){
+                    add(desc);
+                }
+                addSignatureClass(signature);
+
+                super.visitLocalVariable(name, desc, signature, start, end, index);
+            }
+
+            public void visitFieldInsn(int opcode, String owner, String name, String desc){
+                if(getEnvironment().getWellknownClassManager().isWellKnownClass(owner)){
+                    add(owner);
+                }
+                addDescriptor(desc);
+                super.visitFieldInsn(opcode, owner, name, desc);
+            }
+            public void visitMethodInsn(int opcode, String owner, String name, String desc){
+                String className = normalize(owner);
+                if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
+                    add(className);
+                }
+                addMethodDescriptor(desc);
+                super.visitMethodInsn(opcode, owner, name, desc);
+            }
+        };
+    }
+
+    private void addSignatureClass(String signature){
+        if(signature != null){
+            SignatureReader in = new SignatureReader(signature);
+            SignatureWriter writer = new SignatureWriter(){
+                public void visitClassType(String classType){
+                    if(getEnvironment().getWellknownClassManager().isWellKnownClass(classType)){
+                        add(classType);
+                    }
+                }
+            };
+            in.accept(writer);
+        }
+    }
+
+    private void addMethodDescriptor(String desc){
+        Type returnType = Type.getReturnType(desc);
+        Type[] args = Type.getArgumentTypes(desc);
+        if(checkType(returnType)){
+            add(getType(returnType));
+        }
+        for(Type arg: args){
+            if(checkType(arg)){
+                add(getType(arg));
+            }
+        }
+    }
+
+    private void addDescriptor(String desc){
+        Type type = Type.getType(desc);
+        if(checkType(type)){
+            add(desc);
+        }
+    }
+
+    private String getType(Type type){
+        if(type.getSort() == Type.ARRAY){
+            while(type.getSort() != Type.ARRAY){
+                type = type.getElementType();
+            }
+        }
+
+        if(type.getSort() == Type.OBJECT){
+            return normalize(type.getClassName());
+        }
+
+        return null;
+    }
+
+    private boolean checkType(Type type){
+        if(type.getSort() == Type.ARRAY){
+            while(type.getSort() != Type.ARRAY){
+                type = type.getElementType();
+            }
+        }
+
+        if(type.getSort() == Type.OBJECT){
+            String className = type.getClassName();
+            if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private String normalize(String name){
+        if(name.startsWith("L") && name.endsWith(";")){
+            name = name.substring(1, name.length() - 1);
+        }
+        name = name.replace('/', '.');
+
+        return name;
+    }
+
+    private void add(String name){
+        addElement(new BirthmarkElement(normalize(name)));
+    }
+}
@@ -1,15 +1,15 @@
-package jp.naist.se.stigmata.birthmarks.uc;
+package jp.sourceforge.stigmata.birthmarks.uc;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
-import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
 
@@ -1,47 +1,47 @@
-package jp.naist.se.stigmata.birthmarks.uc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\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
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class UsedClassesBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new LogicalAndBirthmarkComparator(this);\r
-    private BirthmarkExtractor extractor = new UsedClassesBirthmarkExtractor(this);\r
-\r
-    public String getType(){\r
-        return "uc";\r
-    }\r
-\r
-    public String getDefaultDescription(){\r
-        return "Set of used classes in target class.";\r
-    }\r
-\r
-    public BirthmarkExtractor getExtractor(){\r
-        return extractor;\r
-    }\r
-\r
-    public BirthmarkComparator getComparator(){\r
-        return comparator;\r
-    }\r
-\r
-    public boolean isExpert(){\r
-        return false;\r
-    }\r
-\r
-    public boolean isUserDefined(){\r
-        return false;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.uc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+import jp.sourceforge.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class UsedClassesBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{
+    private BirthmarkComparator comparator = new LogicalAndBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new UsedClassesBirthmarkExtractor(this);
+
+    public String getType(){
+        return "uc";
+    }
+
+    public String getDefaultDescription(){
+        return "Set of used classes in target class.";
+    }
+
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    public boolean isExpert(){
+        return false;
+    }
+
+    public boolean isUserDefined(){
+        return false;
+    }
+}
@@ -1,24 +1,24 @@
-package jp.naist.se.stigmata.event;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkEngineAdapter implements BirthmarkEngineListener{\r
-\r
-    public void operationDone(BirthmarkEngineEvent e){\r
-    }\r
-\r
-    public void operationStart(BirthmarkEngineEvent e){\r
-    }\r
-\r
-    public void subOperationDone(BirthmarkEngineEvent e){\r
-    }\r
-\r
-    public void subOperationStart(BirthmarkEngineEvent e){\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.event;
+
+/*
+ * $Id$
+ */
+
+/**
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkEngineAdapter implements BirthmarkEngineListener{
+
+    public void operationDone(BirthmarkEngineEvent e){
+    }
+
+    public void operationStart(BirthmarkEngineEvent e){
+    }
+
+    public void subOperationDone(BirthmarkEngineEvent e){
+    }
+
+    public void subOperationStart(BirthmarkEngineEvent e){
+    }
+}
@@ -1,39 +1,39 @@
-package jp.naist.se.stigmata.event;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.EventObject;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkEngineEvent extends EventObject{\r
-    private static final long serialVersionUID = -1260793588721638917L;\r
-\r
-    private OperationType type;\r
-    private OperationStage stage;\r
-    private WarningMessages message;\r
-\r
-    public BirthmarkEngineEvent(OperationStage stage, OperationType type, WarningMessages message){\r
-        super(type.ordinal());\r
-        this.type = type;\r
-        this.stage = stage;\r
-        this.message = message;\r
-    }\r
-\r
-    public OperationStage getStage(){\r
-        return stage;\r
-    }\r
-\r
-    public OperationType getType(){\r
-        return type;\r
-    }\r
-\r
-    public WarningMessages getMessage(){\r
-        return message;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.event;
+
+/*
+ * $Id$
+ */
+
+import java.util.EventObject;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkEngineEvent extends EventObject{
+    private static final long serialVersionUID = -1260793588721638917L;
+
+    private OperationType type;
+    private OperationStage stage;
+    private WarningMessages message;
+
+    public BirthmarkEngineEvent(OperationStage stage, OperationType type, WarningMessages message){
+        super(type.ordinal());
+        this.type = type;
+        this.stage = stage;
+        this.message = message;
+    }
+
+    public OperationStage getStage(){
+        return stage;
+    }
+
+    public OperationType getType(){
+        return type;
+    }
+
+    public WarningMessages getMessage(){
+        return message;
+    }
+}
@@ -1,22 +1,22 @@
-package jp.naist.se.stigmata.event;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.EventListener;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkEngineListener extends EventListener{\r
-    public void operationStart(BirthmarkEngineEvent e);\r
-\r
-    public void subOperationStart(BirthmarkEngineEvent e);\r
-\r
-    public void subOperationDone(BirthmarkEngineEvent e);\r
-\r
-    public void operationDone(BirthmarkEngineEvent e);\r
-}\r
+package jp.sourceforge.stigmata.event;
+
+/*
+ * $Id$
+ */
+
+import java.util.EventListener;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkEngineListener extends EventListener{
+    public void operationStart(BirthmarkEngineEvent e);
+
+    public void subOperationStart(BirthmarkEngineEvent e);
+
+    public void subOperationDone(BirthmarkEngineEvent e);
+
+    public void operationDone(BirthmarkEngineEvent e);
+}
@@ -1,8 +1,8 @@
-package jp.naist.se.stigmata.event;\r
-\r
-public enum OperationStage{\r
-    OPERATION_START,\r
-    SUB_OPERATION_START,\r
-    SUB_OPERATION_DONE,\r
-    OPERATION_DONE,\r
-}\r
+package jp.sourceforge.stigmata.event;
+
+public enum OperationStage{
+    OPERATION_START,
+    SUB_OPERATION_START,
+    SUB_OPERATION_DONE,
+    OPERATION_DONE,
+}
@@ -1,19 +1,19 @@
-package jp.naist.se.stigmata.event;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public enum OperationType{\r
-    CONFIGURATION,\r
-    EXTRACT_BIRTHMARKS,\r
-    COMPARE_BIRTHMARKS,\r
-    COMPARE_DETAIL_BIRTHMARKS,\r
-    FILTER_BIRTHMARKS,\r
-    CREATE_ENVIRONMENT,\r
-}\r
+package jp.sourceforge.stigmata.event;
+
+/*
+ * $Id$
+ */
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public enum OperationType{
+    CONFIGURATION,
+    EXTRACT_BIRTHMARKS,
+    COMPARE_BIRTHMARKS,
+    COMPARE_DETAIL_BIRTHMARKS,
+    FILTER_BIRTHMARKS,
+    CREATE_ENVIRONMENT,
+}
@@ -1,47 +1,47 @@
-package jp.naist.se.stigmata.event;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class WarningMessages{\r
-    private OperationType type;\r
-    private Map<Exception, String> messages = new HashMap<Exception, String>();\r
-\r
-    public WarningMessages(OperationType type){\r
-        this.type = type;\r
-    }\r
-\r
-    public void addMessage(Exception e, String string){\r
-        messages.put(e, string);\r
-    }\r
-\r
-    public Iterator<Exception> exceptions(){\r
-        return messages.keySet().iterator();\r
-    }\r
-\r
-    public String getString(Exception e){\r
-        return messages.get(e);\r
-    }\r
-\r
-    public OperationType getType(){\r
-        return type;\r
-    }\r
-\r
-    public void setType(OperationType type){\r
-        this.type = type;\r
-    }\r
-\r
-    public int getWarningCount(){\r
-        return messages.size();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.event;
+
+/*
+ * $Id$
+ */
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class WarningMessages{
+    private OperationType type;
+    private Map<Exception, String> messages = new HashMap<Exception, String>();
+
+    public WarningMessages(OperationType type){
+        this.type = type;
+    }
+
+    public void addMessage(Exception e, String string){
+        messages.put(e, string);
+    }
+
+    public Iterator<Exception> exceptions(){
+        return messages.keySet().iterator();
+    }
+
+    public String getString(Exception e){
+        return messages.get(e);
+    }
+
+    public OperationType getType(){
+        return type;
+    }
+
+    public void setType(OperationType type){
+        this.type = type;
+    }
+
+    public int getWarningCount(){
+        return messages.size();
+    }
+}
@@ -1,48 +1,48 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractComparisonPairFilter implements ComparisonPairFilter{\r
-    private ComparisonPairFilterSpi service;\r
-    private Criterion criterion = Criterion.EQUALS_AS;\r
-\r
-    public AbstractComparisonPairFilter(ComparisonPairFilterSpi service){\r
-        this.service = service;\r
-    }\r
-\r
-    public ComparisonPairFilterSpi getService(){\r
-        return service;\r
-    }\r
-\r
-    public Criterion getCriterion(){\r
-        return criterion;\r
-    }\r
-\r
-    public void setCriterion(Criterion criterion){\r
-        if(!isAcceptable(criterion)){\r
-            throw new IllegalArgumentException("illegal criterion: "\r
-                    + criterion + ": accepts only " + getAcceptableCriteria());\r
-        }\r
-        this.criterion = criterion;\r
-    }\r
-\r
-    public boolean isAcceptable(Criterion criterion){\r
-        Criterion[] criteria = getAcceptableCriteria();\r
-        for(int i = 0; i < criteria.length; i++){\r
-            if(criteria[i] == criterion){\r
-                return true;\r
-            }\r
-        }\r
-        return false;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractComparisonPairFilter implements ComparisonPairFilter{
+    private ComparisonPairFilterSpi service;
+    private Criterion criterion = Criterion.EQUALS_AS;
+
+    public AbstractComparisonPairFilter(ComparisonPairFilterSpi service){
+        this.service = service;
+    }
+
+    public ComparisonPairFilterSpi getService(){
+        return service;
+    }
+
+    public Criterion getCriterion(){
+        return criterion;
+    }
+
+    public void setCriterion(Criterion criterion){
+        if(!isAcceptable(criterion)){
+            throw new IllegalArgumentException("illegal criterion: "
+                    + criterion + ": accepts only " + getAcceptableCriteria());
+        }
+        this.criterion = criterion;
+    }
+
+    public boolean isAcceptable(Criterion criterion){
+        Criterion[] criteria = getAcceptableCriteria();
+        for(int i = 0; i < criteria.length; i++){
+            if(criteria[i] == criterion){
+                return true;
+            }
+        }
+        return false;
+    }
+}
@@ -1,34 +1,34 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.spi.AbstractServiceProvider;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-abstract class AbstractComparisonPairFilterService extends AbstractServiceProvider implements ComparisonPairFilterSpi{\r
-    public String getDescription(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDescription(\r
-                locale, getFilterName(), LocalizedDescriptionManager.ServiceCategory.filter\r
-            );\r
-    }\r
-\r
-    public String getDisplayFilterName(){\r
-        return getDisplayFilterName(Locale.getDefault());\r
-    }\r
-\r
-    public String getDisplayFilterName(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDisplayType(\r
-                locale, getFilterName(), LocalizedDescriptionManager.ServiceCategory.filter\r
-            );\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.spi.AbstractServiceProvider;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+abstract class AbstractComparisonPairFilterService extends AbstractServiceProvider implements ComparisonPairFilterSpi{
+    public String getDescription(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDescription(
+                locale, getFilterName(), LocalizedDescriptionManager.ServiceCategory.filter
+            );
+    }
+
+    public String getDisplayFilterName(){
+        return getDisplayFilterName(Locale.getDefault());
+    }
+
+    public String getDisplayFilterName(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDisplayType(
+                locale, getFilterName(), LocalizedDescriptionManager.ServiceCategory.filter
+            );
+    }
+}
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkElementCountComparisonPairFilter extends AbstractComparisonPairFilter{\r
-    private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();\r
-\r
-    private int threshold = 0;\r
-    private FilterTarget target;\r
-    private String birthmarkType;\r
-\r
-    static{\r
-        CRITERIA.add(Criterion.GREATER_EQUALS);\r
-        CRITERIA.add(Criterion.GREATER_THAN);\r
-        CRITERIA.add(Criterion.LESS_EQUALS);\r
-        CRITERIA.add(Criterion.LESS_THAN);\r
-        CRITERIA.add(Criterion.EQUALS_AS);\r
-        CRITERIA.add(Criterion.NOT_EQUALS_AS);\r
-    }\r
-\r
-    public BirthmarkElementCountComparisonPairFilter(ComparisonPairFilterSpi service){\r
-        super(service);\r
-    }\r
-\r
-    public String getBirthmarkType(){\r
-        return birthmarkType;\r
-    }\r
-\r
-    public void setBirthmarkType(String birthmarkType){\r
-        this.birthmarkType = birthmarkType;\r
-    }\r
-\r
-    public static Criterion[] getValidCriteria(){\r
-        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);\r
-    }\r
-\r
-    public Criterion[] getAcceptableCriteria(){\r
-        return getValidCriteria();\r
-    }\r
-\r
-    private boolean isFilteredTwo(ComparisonPair pair){\r
-        boolean flag = false;\r
-\r
-        String type = getBirthmarkType();\r
-        if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){\r
-            int elem1 = pair.getTarget1().getBirthmark(type).getElementCount();\r
-            int elem2 = pair.getTarget2().getBirthmark(type).getElementCount();\r
-\r
-            switch(getCriterion()){\r
-            case GREATER_EQUALS:\r
-                flag = (target == FilterTarget.BOTH_TARGETS && elem1 >= threshold && elem2 >= threshold) ||\r
-                (target == FilterTarget.ONE_OF_TARGETS && (elem1 >= threshold || elem2 >= threshold));\r
-                break;\r
-            case GREATER_THAN:\r
-                flag = (target == FilterTarget.BOTH_TARGETS && elem1 > threshold && elem2 > threshold) ||\r
-                    (target == FilterTarget.ONE_OF_TARGETS && (elem1 > threshold || elem2 > threshold));\r
-                break;\r
-            case LESS_EQUALS:\r
-                flag = (target == FilterTarget.BOTH_TARGETS && elem1 <= threshold && elem2 <= threshold) ||\r
-                (target == FilterTarget.ONE_OF_TARGETS && (elem1 <= threshold || elem2 <= threshold));\r
-                break;\r
-            case LESS_THAN:\r
-                flag = (target == FilterTarget.BOTH_TARGETS && elem1 < threshold && elem2 < threshold) ||\r
-                    (target == FilterTarget.ONE_OF_TARGETS && (elem1 < threshold || elem2 < threshold));\r
-                break;\r
-            case EQUALS_AS:\r
-                flag = (target == FilterTarget.BOTH_TARGETS && elem1 == threshold && elem2 == threshold) ||\r
-                (target == FilterTarget.ONE_OF_TARGETS && (elem1 == threshold || elem2 == threshold));\r
-                break;\r
-            case NOT_EQUALS_AS:\r
-                flag = (target == FilterTarget.BOTH_TARGETS && elem1 != threshold && elem2 != threshold) ||\r
-                    (target == FilterTarget.ONE_OF_TARGETS && (elem1 != threshold || elem2 != threshold));\r
-                break;\r
-            default:\r
-                flag = false;\r
-                break;\r
-            }\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    public boolean isFiltered(ComparisonPair pair){\r
-        if(target == FilterTarget.BOTH_TARGETS || target == FilterTarget.ONE_OF_TARGETS){\r
-            return isFilteredTwo(pair);\r
-        }\r
-        boolean flag = false;\r
-        String type = getBirthmarkType();\r
-        if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){\r
-            int total = 0;\r
-            int threshold = getThreshold();\r
-            if(target == FilterTarget.TARGET_1){\r
-                total = pair.getTarget1().getBirthmark(type).getElementCount();\r
-            }\r
-            if(target == FilterTarget.TARGET_2){\r
-                total = pair.getTarget2().getBirthmark(type).getElementCount();\r
-            }\r
-            switch(getCriterion()){\r
-            case GREATER_EQUALS:\r
-                flag = total >= threshold;\r
-                break;\r
-            case GREATER_THAN:\r
-                flag = total > threshold;\r
-                break;\r
-            case LESS_EQUALS:\r
-                flag = total <= threshold;\r
-                break;\r
-            case LESS_THAN:\r
-                flag = total < threshold;\r
-                break;\r
-            case EQUALS_AS:\r
-                flag = total == threshold;\r
-                break;\r
-            case NOT_EQUALS_AS:\r
-                flag = total != threshold;\r
-                break;\r
-            default:\r
-                flag = false;\r
-                break;\r
-            }\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    public int getThreshold(){\r
-        return threshold;\r
-    }\r
-\r
-    public void setThreshold(int threshold){\r
-        if(threshold < 0){\r
-            throw new IllegalArgumentException("threshold must be positive value: " + threshold);\r
-        }\r
-        this.threshold = threshold;\r
-    }\r
-\r
-    public FilterTarget getTarget(){\r
-        return target;\r
-    }\r
-\r
-    public void setTarget(FilterTarget target){\r
-        this.target = target;\r
-    }\r
-\r
-    public String toString(){\r
-        StringBuilder sb = new StringBuilder();\r
-        switch(getTarget()){\r
-        case TARGET_1:       sb.append("target1"); break;\r
-        case TARGET_2:       sb.append("target2"); break;\r
-        case BOTH_TARGETS:   sb.append("(target1&target2)");    break;\r
-        case ONE_OF_TARGETS: sb.append("(target1|target2)");\r
-        }\r
-        sb.append(".").append(birthmarkType);\r
-        sb.append(".size");\r
-        switch(getCriterion()){\r
-        case GREATER_EQUALS: sb.append(" >= "); break;\r
-        case GREATER_THAN:   sb.append(" >  "); break;\r
-        case LESS_EQUALS:    sb.append(" <= "); break;\r
-        case LESS_THAN:      sb.append(" <  "); break;\r
-        case EQUALS_AS:      sb.append(" == "); break;\r
-        case NOT_EQUALS_AS:  sb.append(" != "); break;\r
-        }\r
-        sb.append(Integer.toString(getThreshold()));\r
-\r
-        return new String(sb);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkElementCountComparisonPairFilter extends AbstractComparisonPairFilter{
+    private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();
+
+    private int threshold = 0;
+    private FilterTarget target;
+    private String birthmarkType;
+
+    static{
+        CRITERIA.add(Criterion.GREATER_EQUALS);
+        CRITERIA.add(Criterion.GREATER_THAN);
+        CRITERIA.add(Criterion.LESS_EQUALS);
+        CRITERIA.add(Criterion.LESS_THAN);
+        CRITERIA.add(Criterion.EQUALS_AS);
+        CRITERIA.add(Criterion.NOT_EQUALS_AS);
+    }
+
+    public BirthmarkElementCountComparisonPairFilter(ComparisonPairFilterSpi service){
+        super(service);
+    }
+
+    public String getBirthmarkType(){
+        return birthmarkType;
+    }
+
+    public void setBirthmarkType(String birthmarkType){
+        this.birthmarkType = birthmarkType;
+    }
+
+    public static Criterion[] getValidCriteria(){
+        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
+    }
+
+    public Criterion[] getAcceptableCriteria(){
+        return getValidCriteria();
+    }
+
+    private boolean isFilteredTwo(ComparisonPair pair){
+        boolean flag = false;
+
+        String type = getBirthmarkType();
+        if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){
+            int elem1 = pair.getTarget1().getBirthmark(type).getElementCount();
+            int elem2 = pair.getTarget2().getBirthmark(type).getElementCount();
+
+            switch(getCriterion()){
+            case GREATER_EQUALS:
+                flag = (target == FilterTarget.BOTH_TARGETS && elem1 >= threshold && elem2 >= threshold) ||
+                (target == FilterTarget.ONE_OF_TARGETS && (elem1 >= threshold || elem2 >= threshold));
+                break;
+            case GREATER_THAN:
+                flag = (target == FilterTarget.BOTH_TARGETS && elem1 > threshold && elem2 > threshold) ||
+                    (target == FilterTarget.ONE_OF_TARGETS && (elem1 > threshold || elem2 > threshold));
+                break;
+            case LESS_EQUALS:
+                flag = (target == FilterTarget.BOTH_TARGETS && elem1 <= threshold && elem2 <= threshold) ||
+                (target == FilterTarget.ONE_OF_TARGETS && (elem1 <= threshold || elem2 <= threshold));
+                break;
+            case LESS_THAN:
+                flag = (target == FilterTarget.BOTH_TARGETS && elem1 < threshold && elem2 < threshold) ||
+                    (target == FilterTarget.ONE_OF_TARGETS && (elem1 < threshold || elem2 < threshold));
+                break;
+            case EQUALS_AS:
+                flag = (target == FilterTarget.BOTH_TARGETS && elem1 == threshold && elem2 == threshold) ||
+                (target == FilterTarget.ONE_OF_TARGETS && (elem1 == threshold || elem2 == threshold));
+                break;
+            case NOT_EQUALS_AS:
+                flag = (target == FilterTarget.BOTH_TARGETS && elem1 != threshold && elem2 != threshold) ||
+                    (target == FilterTarget.ONE_OF_TARGETS && (elem1 != threshold || elem2 != threshold));
+                break;
+            default:
+                flag = false;
+                break;
+            }
+        }
+        return flag;
+    }
+
+    public boolean isFiltered(ComparisonPair pair){
+        if(target == FilterTarget.BOTH_TARGETS || target == FilterTarget.ONE_OF_TARGETS){
+            return isFilteredTwo(pair);
+        }
+        boolean flag = false;
+        String type = getBirthmarkType();
+        if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){
+            int total = 0;
+            int threshold = getThreshold();
+            if(target == FilterTarget.TARGET_1){
+                total = pair.getTarget1().getBirthmark(type).getElementCount();
+            }
+            if(target == FilterTarget.TARGET_2){
+                total = pair.getTarget2().getBirthmark(type).getElementCount();
+            }
+            switch(getCriterion()){
+            case GREATER_EQUALS:
+                flag = total >= threshold;
+                break;
+            case GREATER_THAN:
+                flag = total > threshold;
+                break;
+            case LESS_EQUALS:
+                flag = total <= threshold;
+                break;
+            case LESS_THAN:
+                flag = total < threshold;
+                break;
+            case EQUALS_AS:
+                flag = total == threshold;
+                break;
+            case NOT_EQUALS_AS:
+                flag = total != threshold;
+                break;
+            default:
+                flag = false;
+                break;
+            }
+        }
+        return flag;
+    }
+
+    public int getThreshold(){
+        return threshold;
+    }
+
+    public void setThreshold(int threshold){
+        if(threshold < 0){
+            throw new IllegalArgumentException("threshold must be positive value: " + threshold);
+        }
+        this.threshold = threshold;
+    }
+
+    public FilterTarget getTarget(){
+        return target;
+    }
+
+    public void setTarget(FilterTarget target){
+        this.target = target;
+    }
+
+    public String toString(){
+        StringBuilder sb = new StringBuilder();
+        switch(getTarget()){
+        case TARGET_1:       sb.append("target1"); break;
+        case TARGET_2:       sb.append("target2"); break;
+        case BOTH_TARGETS:   sb.append("(target1&target2)");    break;
+        case ONE_OF_TARGETS: sb.append("(target1|target2)");
+        }
+        sb.append(".").append(birthmarkType);
+        sb.append(".size");
+        switch(getCriterion()){
+        case GREATER_EQUALS: sb.append(" >= "); break;
+        case GREATER_THAN:   sb.append(" >  "); break;
+        case LESS_EQUALS:    sb.append(" <= "); break;
+        case LESS_THAN:      sb.append(" <  "); break;
+        case EQUALS_AS:      sb.append(" == "); break;
+        case NOT_EQUALS_AS:  sb.append(" != "); break;
+        }
+        sb.append(Integer.toString(getThreshold()));
+
+        return new String(sb);
+    }
+}
@@ -1,27 +1,27 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkElementCountComparisonPairFilterService extends AbstractComparisonPairFilterService{\r
-\r
-    public ComparisonPairFilter getFilter(){\r
-        return new BirthmarkElementCountComparisonPairFilter(this);\r
-    }\r
-\r
-    public String getFilterClassName(){\r
-        return BirthmarkElementCountComparisonPairFilter.class.getName();\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "elementcount";\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkElementCountComparisonPairFilterService extends AbstractComparisonPairFilterService{
+
+    public ComparisonPairFilter getFilter(){
+        return new BirthmarkElementCountComparisonPairFilter(this);
+    }
+
+    public String getFilterClassName(){
+        return BirthmarkElementCountComparisonPairFilter.class.getName();
+    }
+
+    public String getFilterName(){
+        return "elementcount";
+    }
+}
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\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
-\r
-import org.apache.commons.beanutils.BeanUtils;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ComparisonPairFilterManager{\r
-    private Map<String, ComparisonPairFilterSpi> services = new HashMap<String, ComparisonPairFilterSpi>();\r
-    private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();\r
-    private ComparisonPairFilterManager parent;\r
-\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(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
-    }\r
-\r
-    public synchronized ComparisonPairFilterSet[] getFilterSets(){\r
-        List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();\r
-        if(parent != null){\r
-            for(ComparisonPairFilterSet fs: parent.getFilterSets()){\r
-                if(filters.get(fs.getName()) == null){\r
-                    list.add(fs);\r
-                }\r
-            }\r
-        }\r
-        list.addAll(filters.values());\r
-        return list.toArray(new ComparisonPairFilterSet[list.size()]);\r
-    }\r
-\r
-    public synchronized ComparisonPairFilterSet[] getFilterSets(String[] names){\r
-        List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();\r
-        for(int i = 0; i < names.length; i++){\r
-            list.add(getFilterSet(names[i]));\r
-        }\r
-        return list.toArray(new ComparisonPairFilterSet[list.size()]);\r
-    }\r
-\r
-    public void addFilterSet(ComparisonPairFilterSet filterset){\r
-        filters.put(filterset.getName(), filterset);\r
-    }\r
-\r
-    public void removeFilterSet(String filterSetName){\r
-        if(filters.get(filterSetName) != null){\r
-            filters.remove(filterSetName);\r
-        }\r
-        else{\r
-            if(parent != null && parent.getFilterSet(filterSetName) != null){\r
-                filters.remove(filterSetName);\r
-            }\r
-        }\r
-    }\r
-\r
-    public ComparisonPairFilterSet getFilterSet(String filterSetName){\r
-        ComparisonPairFilterSet filter = filters.get(filterSetName);\r
-        if(filter == null && parent != null){\r
-            filter = parent.getFilterSet(filterSetName);\r
-        }\r
-        return filter;\r
-    }\r
-\r
-    public ComparisonPairFilter buildFilter(String filterName, String criterion, Map<String, String> values){\r
-        Criterion c = Criterion.valueOf(criterion);\r
-        if(c != null){\r
-            return buildFilter(filterName, c, values);\r
-        }\r
-        throw new IllegalArgumentException("criterion not found: " + criterion);\r
-    }\r
-\r
-    public ComparisonPairFilter buildFilter(String filterName, Criterion criterion, Map<String, String> values){\r
-        ComparisonPairFilter filter = createFilter(filterName);\r
-        if(filter != null){\r
-            filter.setCriterion(criterion);\r
-            for(Map.Entry<String, String> entry: values.entrySet()){\r
-                try{\r
-                    Object value = entry.getValue();\r
-                    if(entry.getKey().equals("target")){\r
-                        value = FilterTarget.valueOf(String.valueOf(value));\r
-                    }\r
-                    BeanUtils.setProperty(filter, entry.getKey(), value);\r
-                }catch(IllegalAccessException e){\r
-                    e.printStackTrace();\r
-                    filter = null;\r
-                }catch(InvocationTargetException e){\r
-                    e.printStackTrace();\r
-                    filter = null;\r
-                }\r
-            }\r
-        }\r
-        return filter;\r
-    }\r
-\r
-    public ComparisonPairFilter createFilter(String filterName){\r
-        if(hasService(filterName)){\r
-            return getService(filterName).getFilter();\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public ComparisonPairFilterSpi removeService(String name){\r
-        if(parent != null && parent.hasService(name)){\r
-            parent.removeService(name);\r
-        }\r
-        return services.remove(name);\r
-    }\r
-\r
-    public void addService(ComparisonPairFilterSpi service){\r
-        if(parent == null || parent.getService(service.getFilterName()) == null){\r
-            services.put(service.getFilterName(), service);\r
-        }\r
-    }\r
-\r
-    public boolean hasService(String name){\r
-        return (parent != null && parent.hasService(name)) || services.get(name) != null;\r
-    }\r
-\r
-    public ComparisonPairFilterSpi getService(String name){\r
-        ComparisonPairFilterSpi service = null;\r
-        if(parent != null){\r
-            service = parent.getService(name);\r
-        }\r
-        if(service == null){\r
-            service = services.get(name);\r
-        }\r
-        return service;\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+import org.apache.commons.beanutils.BeanUtils;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ComparisonPairFilterManager{
+    private Map<String, ComparisonPairFilterSpi> services = new HashMap<String, ComparisonPairFilterSpi>();
+    private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();
+    private ComparisonPairFilterManager parent;
+
+    public ComparisonPairFilterManager(BirthmarkEnvironment env, ComparisonPairFilterManager parent){
+        this.parent = parent;
+        for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){
+            ComparisonPairFilterSpi service = i.next();
+            if(getService(service.getFilterName()) != null){
+                services.put(service.getFilterName(), service);
+            }
+        }
+    }
+
+    public ComparisonPairFilterManager(BirthmarkEnvironment env){
+        for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){
+            ComparisonPairFilterSpi service = i.next();
+            services.put(service.getFilterName(), service);
+        }
+    }
+
+    public synchronized ComparisonPairFilterSet[] getFilterSets(){
+        List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
+        if(parent != null){
+            for(ComparisonPairFilterSet fs: parent.getFilterSets()){
+                if(filters.get(fs.getName()) == null){
+                    list.add(fs);
+                }
+            }
+        }
+        list.addAll(filters.values());
+        return list.toArray(new ComparisonPairFilterSet[list.size()]);
+    }
+
+    public synchronized ComparisonPairFilterSet[] getFilterSets(String[] names){
+        List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
+        for(int i = 0; i < names.length; i++){
+            list.add(getFilterSet(names[i]));
+        }
+        return list.toArray(new ComparisonPairFilterSet[list.size()]);
+    }
+
+    public void addFilterSet(ComparisonPairFilterSet filterset){
+        filters.put(filterset.getName(), filterset);
+    }
+
+    public void removeFilterSet(String filterSetName){
+        if(filters.get(filterSetName) != null){
+            filters.remove(filterSetName);
+        }
+        else{
+            if(parent != null && parent.getFilterSet(filterSetName) != null){
+                filters.remove(filterSetName);
+            }
+        }
+    }
+
+    public ComparisonPairFilterSet getFilterSet(String filterSetName){
+        ComparisonPairFilterSet filter = filters.get(filterSetName);
+        if(filter == null && parent != null){
+            filter = parent.getFilterSet(filterSetName);
+        }
+        return filter;
+    }
+
+    public ComparisonPairFilter buildFilter(String filterName, String criterion, Map<String, String> values){
+        Criterion c = Criterion.valueOf(criterion);
+        if(c != null){
+            return buildFilter(filterName, c, values);
+        }
+        throw new IllegalArgumentException("criterion not found: " + criterion);
+    }
+
+    public ComparisonPairFilter buildFilter(String filterName, Criterion criterion, Map<String, String> values){
+        ComparisonPairFilter filter = createFilter(filterName);
+        if(filter != null){
+            filter.setCriterion(criterion);
+            for(Map.Entry<String, String> entry: values.entrySet()){
+                try{
+                    Object value = entry.getValue();
+                    if(entry.getKey().equals("target")){
+                        value = FilterTarget.valueOf(String.valueOf(value));
+                    }
+                    BeanUtils.setProperty(filter, entry.getKey(), value);
+                }catch(IllegalAccessException e){
+                    e.printStackTrace();
+                    filter = null;
+                }catch(InvocationTargetException e){
+                    e.printStackTrace();
+                    filter = null;
+                }
+            }
+        }
+        return filter;
+    }
+
+    public ComparisonPairFilter createFilter(String filterName){
+        if(hasService(filterName)){
+            return getService(filterName).getFilter();
+        }
+        return null;
+    }
+
+    public ComparisonPairFilterSpi removeService(String name){
+        if(parent != null && parent.hasService(name)){
+            parent.removeService(name);
+        }
+        return services.remove(name);
+    }
+
+    public void addService(ComparisonPairFilterSpi service){
+        if(parent == null || parent.getService(service.getFilterName()) == null){
+            services.put(service.getFilterName(), service);
+        }
+    }
+
+    public boolean hasService(String name){
+        return (parent != null && parent.hasService(name)) || services.get(name) != null;
+    }
+
+    public ComparisonPairFilterSpi getService(String name){
+        ComparisonPairFilterSpi service = null;
+        if(parent != null){
+            service = parent.getService(name);
+        }
+        if(service == null){
+            service = services.get(name);
+        }
+        return service;
+    }
+
+}
@@ -1,25 +1,25 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public enum Criterion{\r
-    LESS_THAN,\r
-    LESS_EQUALS,\r
-    GREATER_THAN,\r
-    GREATER_EQUALS,\r
-    EQUALS_AS,\r
-    NOT_EQUALS_AS,\r
-    STARTS_WITH,\r
-    NOT_STARTS_WITH,\r
-    ENDS_WITH,\r
-    NOT_ENDS_WITH,\r
-    MATCH,\r
-    NOT_MATCH;\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public enum Criterion{
+    LESS_THAN,
+    LESS_EQUALS,
+    GREATER_THAN,
+    GREATER_EQUALS,
+    EQUALS_AS,
+    NOT_EQUALS_AS,
+    STARTS_WITH,
+    NOT_STARTS_WITH,
+    ENDS_WITH,
+    NOT_ENDS_WITH,
+    MATCH,
+    NOT_MATCH;
+}
@@ -1,15 +1,15 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * This enum represents filter target.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public enum FilterTarget{\r
-    TARGET_1, TARGET_2, BOTH_TARGETS, ONE_OF_TARGETS,\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This enum represents filter target.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public enum FilterTarget{
+    TARGET_1, TARGET_2, BOTH_TARGETS, ONE_OF_TARGETS,
 }
\ No newline at end of file
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\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.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-\r
-/**\r
- * Filtering {@link ComparisonResultSet <code>ComparisonResultSet</code>}.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FilteredComparisonResultSet implements ComparisonResultSet{\r
-    private ComparisonResultSet resultset;\r
-    private List<ComparisonPairFilterSet> filters = new ArrayList<ComparisonPairFilterSet>(); \r
-\r
-    /**\r
-     * constructor.\r
-     * \r
-     * @param resultset filtering target\r
-     */\r
-    public FilteredComparisonResultSet(ComparisonResultSet resultset){\r
-        this.resultset = resultset;\r
-    }\r
-\r
-    /**\r
-     * constructor.\r
-     * @param resultset filtering target\r
-     * @param filters filtering rule\r
-     */\r
-    public FilteredComparisonResultSet(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters){\r
-        this.resultset = resultset;\r
-        for(int i = 0; i < filters.length; i++){\r
-            addFilterSet(filters[i]);\r
-        }\r
-    }\r
-\r
-    public void addFilterSet(ComparisonPairFilterSet filter){\r
-        filters.add(filter);\r
-    }\r
-\r
-    public void removeFilterSet(ComparisonPairFilterSet filter){\r
-        filters.remove(filter);\r
-    }\r
-\r
-    public ComparisonPair getPairAt(int index){\r
-        int currentIndex = 0;\r
-        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){\r
-            ComparisonPair pair = i.next();\r
-            if(currentIndex == index){\r
-                return pair;\r
-            }\r
-            currentIndex++;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public ComparisonPair[] getPairs(){\r
-        List<ComparisonPair> list = new ArrayList<ComparisonPair>();\r
-        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){\r
-            list.add(i.next());\r
-        }\r
-        return list.toArray(new ComparisonPair[list.size()]);\r
-    }\r
-\r
-    public int getPairCount(){\r
-        return resultset.getPairCount();\r
-    }\r
-\r
-    public BirthmarkContext getContext(){\r
-        return resultset.getContext();\r
-    }\r
-\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return resultset.getEnvironment();\r
-    }\r
-\r
-    public Iterator<ComparisonPair> iterator(){\r
-        return new FilteredIterator(resultset.iterator());\r
-    }\r
-\r
-    public synchronized BirthmarkSet[] getPairSources(){\r
-        List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
-        for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){\r
-            list.add(i.next());\r
-        }\r
-        return list.toArray(new BirthmarkSet[list.size()]);\r
-    }\r
-\r
-    public Iterator<BirthmarkSet> pairSources(){\r
-        return resultset.pairSources();\r
-    }\r
-\r
-    private class FilteredIterator implements Iterator<ComparisonPair>{\r
-        private Iterator<ComparisonPair> iterator;\r
-        private ComparisonPair next;\r
-\r
-        public FilteredIterator(Iterator<ComparisonPair> iterator){\r
-            this.iterator = iterator;\r
-            \r
-            next = findNext();\r
-        }\r
-\r
-        public boolean hasNext(){\r
-            return next != null;\r
-        }\r
-\r
-        public ComparisonPair next(){\r
-            ComparisonPair returnValue = next;\r
-            next = findNext();\r
-            return returnValue;\r
-        }\r
-\r
-        public void remove(){\r
-            throw new InternalError("not implemented");\r
-        }\r
-\r
-        private ComparisonPair findNext(){\r
-            boolean nowFinding = true;\r
-            while(nowFinding && iterator.hasNext()){\r
-                ComparisonPair nextPair = iterator.next();\r
-                // return the pair which the all filters is passed\r
-                if(isAllFilterPassed(nextPair)){\r
-                    nowFinding = false; // found next value!\r
-                    next = nextPair;\r
-                }\r
-            }\r
-            if(nowFinding && !iterator.hasNext()){\r
-                next = null;\r
-            }\r
-            return next;\r
-        }\r
-\r
-        private boolean isAllFilterPassed(ComparisonPair pair){\r
-            boolean flag = true;\r
-            for(Iterator<ComparisonPairFilterSet> i = filters.iterator(); i.hasNext(); ){\r
-                ComparisonPairFilterSet filter = i.next();\r
-                if(!filter.isFiltered(pair)){\r
-                    flag = false;\r
-                    break;\r
-                }\r
-            }\r
-            return flag;\r
-        }\r
-    };\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+
+/**
+ * Filtering {@link ComparisonResultSet <code>ComparisonResultSet</code>}.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FilteredComparisonResultSet implements ComparisonResultSet{
+    private ComparisonResultSet resultset;
+    private List<ComparisonPairFilterSet> filters = new ArrayList<ComparisonPairFilterSet>(); 
+
+    /**
+     * constructor.
+     * 
+     * @param resultset filtering target
+     */
+    public FilteredComparisonResultSet(ComparisonResultSet resultset){
+        this.resultset = resultset;
+    }
+
+    /**
+     * constructor.
+     * @param resultset filtering target
+     * @param filters filtering rule
+     */
+    public FilteredComparisonResultSet(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters){
+        this.resultset = resultset;
+        for(int i = 0; i < filters.length; i++){
+            addFilterSet(filters[i]);
+        }
+    }
+
+    public void addFilterSet(ComparisonPairFilterSet filter){
+        filters.add(filter);
+    }
+
+    public void removeFilterSet(ComparisonPairFilterSet filter){
+        filters.remove(filter);
+    }
+
+    public ComparisonPair getPairAt(int index){
+        int currentIndex = 0;
+        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
+            ComparisonPair pair = i.next();
+            if(currentIndex == index){
+                return pair;
+            }
+            currentIndex++;
+        }
+        return null;
+    }
+
+    public ComparisonPair[] getPairs(){
+        List<ComparisonPair> list = new ArrayList<ComparisonPair>();
+        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
+            list.add(i.next());
+        }
+        return list.toArray(new ComparisonPair[list.size()]);
+    }
+
+    public int getPairCount(){
+        return resultset.getPairCount();
+    }
+
+    public BirthmarkContext getContext(){
+        return resultset.getContext();
+    }
+
+    public BirthmarkEnvironment getEnvironment(){
+        return resultset.getEnvironment();
+    }
+
+    public Iterator<ComparisonPair> iterator(){
+        return new FilteredIterator(resultset.iterator());
+    }
+
+    public synchronized BirthmarkSet[] getPairSources(){
+        List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();
+        for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){
+            list.add(i.next());
+        }
+        return list.toArray(new BirthmarkSet[list.size()]);
+    }
+
+    public Iterator<BirthmarkSet> pairSources(){
+        return resultset.pairSources();
+    }
+
+    private class FilteredIterator implements Iterator<ComparisonPair>{
+        private Iterator<ComparisonPair> iterator;
+        private ComparisonPair next;
+
+        public FilteredIterator(Iterator<ComparisonPair> iterator){
+            this.iterator = iterator;
+            
+            next = findNext();
+        }
+
+        public boolean hasNext(){
+            return next != null;
+        }
+
+        public ComparisonPair next(){
+            ComparisonPair returnValue = next;
+            next = findNext();
+            return returnValue;
+        }
+
+        public void remove(){
+            throw new InternalError("not implemented");
+        }
+
+        private ComparisonPair findNext(){
+            boolean nowFinding = true;
+            while(nowFinding && iterator.hasNext()){
+                ComparisonPair nextPair = iterator.next();
+                // return the pair which the all filters is passed
+                if(isAllFilterPassed(nextPair)){
+                    nowFinding = false; // found next value!
+                    next = nextPair;
+                }
+            }
+            if(nowFinding && !iterator.hasNext()){
+                next = null;
+            }
+            return next;
+        }
+
+        private boolean isAllFilterPassed(ComparisonPair pair){
+            boolean flag = true;
+            for(Iterator<ComparisonPairFilterSet> i = filters.iterator(); i.hasNext(); ){
+                ComparisonPairFilterSet filter = i.next();
+                if(!filter.isFiltered(pair)){
+                    flag = false;
+                    break;
+                }
+            }
+            return flag;
+        }
+    };
+}
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SimilarityComparisonPairFilter extends AbstractComparisonPairFilter{\r
-    private static final double EQUALS_THRESHOLD = 5E-5;\r
-\r
-    private static List<Criterion> CRITERIA = new ArrayList<Criterion>();\r
-    static{\r
-        CRITERIA.add(Criterion.GREATER_EQUALS);\r
-        CRITERIA.add(Criterion.GREATER_THAN);\r
-        CRITERIA.add(Criterion.LESS_EQUALS);\r
-        CRITERIA.add(Criterion.LESS_THAN);\r
-        CRITERIA.add(Criterion.EQUALS_AS);\r
-        CRITERIA.add(Criterion.NOT_EQUALS_AS); \r
-    };\r
-\r
-    private double threshold;\r
-\r
-    public SimilarityComparisonPairFilter(ComparisonPairFilterSpi service){\r
-        super(service);\r
-        setThreshold(0.8d);\r
-    }\r
-    \r
-    public boolean isFiltered(ComparisonPair pair){\r
-        double similarity = pair.calculateSimilarity();\r
-        boolean flag;\r
-        switch(getCriterion()){\r
-        case GREATER_EQUALS:\r
-            flag = similarity >= getThreshold();\r
-            break;\r
-        case GREATER_THAN:\r
-            flag = similarity > getThreshold();\r
-            break;\r
-        case LESS_EQUALS:\r
-            flag = similarity <= getThreshold();\r
-            break;\r
-        case LESS_THAN:\r
-            flag = similarity < getThreshold();\r
-            break;\r
-        case EQUALS_AS:\r
-            flag = (similarity - getThreshold()) <= EQUALS_THRESHOLD;\r
-            break;\r
-        case NOT_EQUALS_AS:\r
-            flag = (similarity - getThreshold()) > EQUALS_THRESHOLD;\r
-            break;\r
-        default:\r
-            flag = false;\r
-            break;\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    public static Criterion[] getValidCriteria(){\r
-        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);\r
-    }\r
-\r
-    public Criterion[] getAcceptableCriteria(){\r
-        return getValidCriteria();\r
-    }\r
-\r
-    public double getThreshold(){\r
-        return threshold;\r
-    }\r
-\r
-    public void setThreshold(double threshold){\r
-        if(threshold < 0d || threshold >= 1.0d){\r
-            throw new IllegalArgumentException("threshold must be 0.0-1.0");\r
-        }\r
-        this.threshold = threshold;\r
-    }\r
-\r
-    public String toString(){\r
-        StringBuffer sb = new StringBuffer();\r
-        sb.append("similarity");\r
-        switch(getCriterion()){\r
-        case GREATER_EQUALS: sb.append(" >= "); break;\r
-        case GREATER_THAN:   sb.append(" >  "); break;\r
-        case LESS_EQUALS:    sb.append(" <= "); break;\r
-        case LESS_THAN:      sb.append(" <  "); break;\r
-        case EQUALS_AS:      sb.append(" == "); break;\r
-        case NOT_EQUALS_AS:  sb.append(" != "); break;\r
-        }\r
-        sb.append(getThreshold());\r
-        return new String(sb);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SimilarityComparisonPairFilter extends AbstractComparisonPairFilter{
+    private static final double EQUALS_THRESHOLD = 5E-5;
+
+    private static List<Criterion> CRITERIA = new ArrayList<Criterion>();
+    static{
+        CRITERIA.add(Criterion.GREATER_EQUALS);
+        CRITERIA.add(Criterion.GREATER_THAN);
+        CRITERIA.add(Criterion.LESS_EQUALS);
+        CRITERIA.add(Criterion.LESS_THAN);
+        CRITERIA.add(Criterion.EQUALS_AS);
+        CRITERIA.add(Criterion.NOT_EQUALS_AS); 
+    };
+
+    private double threshold;
+
+    public SimilarityComparisonPairFilter(ComparisonPairFilterSpi service){
+        super(service);
+        setThreshold(0.8d);
+    }
+    
+    public boolean isFiltered(ComparisonPair pair){
+        double similarity = pair.calculateSimilarity();
+        boolean flag;
+        switch(getCriterion()){
+        case GREATER_EQUALS:
+            flag = similarity >= getThreshold();
+            break;
+        case GREATER_THAN:
+            flag = similarity > getThreshold();
+            break;
+        case LESS_EQUALS:
+            flag = similarity <= getThreshold();
+            break;
+        case LESS_THAN:
+            flag = similarity < getThreshold();
+            break;
+        case EQUALS_AS:
+            flag = (similarity - getThreshold()) <= EQUALS_THRESHOLD;
+            break;
+        case NOT_EQUALS_AS:
+            flag = (similarity - getThreshold()) > EQUALS_THRESHOLD;
+            break;
+        default:
+            flag = false;
+            break;
+        }
+        return flag;
+    }
+
+    public static Criterion[] getValidCriteria(){
+        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
+    }
+
+    public Criterion[] getAcceptableCriteria(){
+        return getValidCriteria();
+    }
+
+    public double getThreshold(){
+        return threshold;
+    }
+
+    public void setThreshold(double threshold){
+        if(threshold < 0d || threshold >= 1.0d){
+            throw new IllegalArgumentException("threshold must be 0.0-1.0");
+        }
+        this.threshold = threshold;
+    }
+
+    public String toString(){
+        StringBuffer sb = new StringBuffer();
+        sb.append("similarity");
+        switch(getCriterion()){
+        case GREATER_EQUALS: sb.append(" >= "); break;
+        case GREATER_THAN:   sb.append(" >  "); break;
+        case LESS_EQUALS:    sb.append(" <= "); break;
+        case LESS_THAN:      sb.append(" <  "); break;
+        case EQUALS_AS:      sb.append(" == "); break;
+        case NOT_EQUALS_AS:  sb.append(" != "); break;
+        }
+        sb.append(getThreshold());
+        return new String(sb);
+    }
+}
@@ -1,26 +1,26 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SimilarityComparisonPairFilterService extends AbstractComparisonPairFilterService{\r
-    public ComparisonPairFilter getFilter(){\r
-        return new SimilarityComparisonPairFilter(this);\r
-    }\r
-\r
-    public String getFilterClassName(){\r
-        return SimilarityComparisonPairFilter.class.getName();\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "similarity";\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SimilarityComparisonPairFilterService extends AbstractComparisonPairFilterService{
+    public ComparisonPairFilter getFilter(){
+        return new SimilarityComparisonPairFilter(this);
+    }
+
+    public String getFilterClassName(){
+        return SimilarityComparisonPairFilter.class.getName();
+    }
+
+    public String getFilterName(){
+        return "similarity";
+    }
+}
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TargetNameComparisonPairFilter extends AbstractComparisonPairFilter{\r
-    private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();\r
-\r
-    static{\r
-        CRITERIA.add(Criterion.STARTS_WITH);\r
-        CRITERIA.add(Criterion.NOT_STARTS_WITH); \r
-        CRITERIA.add(Criterion.ENDS_WITH);\r
-        CRITERIA.add(Criterion.NOT_ENDS_WITH);\r
-        CRITERIA.add(Criterion.EQUALS_AS);\r
-        CRITERIA.add(Criterion.NOT_EQUALS_AS);\r
-        CRITERIA.add(Criterion.MATCH);\r
-        CRITERIA.add(Criterion.NOT_MATCH);\r
-    };\r
-    private FilterTarget target = FilterTarget.BOTH_TARGETS;\r
-    private String value;\r
-\r
-    public TargetNameComparisonPairFilter(ComparisonPairFilterSpi service){\r
-        super(service);\r
-    }\r
-\r
-    public Criterion[] getAcceptableCriteria(){\r
-        return getValidCriteria();\r
-    }\r
-\r
-    public static Criterion[] getValidCriteria(){\r
-        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);\r
-    }\r
-\r
-    public boolean isFiltered(ComparisonPair pair){\r
-        String v = value;\r
-        if(v == null) v = "";\r
-        boolean flag;\r
-        if(getTarget() == FilterTarget.TARGET_1){\r
-            flag = checkMatch(pair.getTarget1().getName(), v);\r
-        }\r
-        else if(getTarget() == FilterTarget.TARGET_2){\r
-            flag = checkMatch(pair.getTarget2().getName(), v);\r
-        }\r
-        else{\r
-            flag = checkMatch(pair.getTarget1().getName(), pair.getTarget2().getName(), v);\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    public String getValue(){\r
-        return value;\r
-    }\r
-\r
-    public void setValue(String value){\r
-        this.value = value;\r
-    }\r
-\r
-    public FilterTarget getTarget(){\r
-        return target;\r
-    }\r
-\r
-    public void setTarget(FilterTarget target){\r
-        this.target = target;\r
-    }\r
-\r
-    private boolean checkMatch(String name1, String name2, String value){\r
-        boolean flag1;\r
-        boolean flag2;\r
-        switch(getCriterion()){\r
-        case STARTS_WITH:\r
-            flag1 = name1.startsWith(value);\r
-            flag2 = name2.startsWith(value);\r
-            break;\r
-        case ENDS_WITH:\r
-            flag1 = name1.endsWith(value);\r
-            flag2 = name2.endsWith(value);\r
-            break;\r
-        case EQUALS_AS:\r
-            flag1 = name1.equals(value);\r
-            flag2 = name2.equals(value);\r
-            break;\r
-        case NOT_EQUALS_AS:\r
-            flag1 = !name1.equals(value);\r
-            flag2 = !name2.equals(value);\r
-            break;\r
-        case MATCH:\r
-            flag1 = name1.equals(name2);\r
-            flag2 = flag1;\r
-            break;\r
-        case NOT_MATCH:\r
-            flag1 = !name1.equals(name2);\r
-            flag2 = flag1;\r
-            break;\r
-        default:\r
-            flag1 = false;\r
-            flag2 = false;\r
-            break;\r
-        }\r
-        \r
-        boolean flag;\r
-        if(getTarget() == FilterTarget.BOTH_TARGETS){\r
-            flag = flag1 && flag2;\r
-        }\r
-        else{\r
-            flag = flag1 || flag2;\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    private boolean checkMatch(String name, String value){\r
-        boolean flag;\r
-        switch(getCriterion()){\r
-        case STARTS_WITH:\r
-            flag = name.startsWith(value);\r
-            break;\r
-        case ENDS_WITH:\r
-            flag = name.endsWith(value);\r
-            break;\r
-        case EQUALS_AS:\r
-            flag = name.equals(value);\r
-            break;\r
-        case NOT_EQUALS_AS:\r
-            flag = !name.equals(value);\r
-            break;\r
-        default:\r
-            flag = false;\r
-            break;\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    public String toString(){\r
-        if(getCriterion() == Criterion.MATCH || getCriterion() == Criterion.NOT_MATCH){\r
-            String value = " match ";\r
-            if(getCriterion() == Criterion.NOT_MATCH) value = " not match ";\r
-            return "target1.name" + value + "target2.name";\r
-        }\r
-        StringBuilder sb = new StringBuilder();\r
-        switch(getTarget()){\r
-        case TARGET_1:       sb.append("target1.name");           break;\r
-        case TARGET_2:       sb.append("target2.name");           break;\r
-        case BOTH_TARGETS:   sb.append("(target1&target2).name"); break;\r
-        case ONE_OF_TARGETS: sb.append("(target1|target2).name"); break; \r
-        }\r
-        switch(getCriterion()){\r
-        case STARTS_WITH:     sb.append(" starts with ");     break;\r
-        case NOT_STARTS_WITH: sb.append(" not starts with "); break;\r
-        case ENDS_WITH:       sb.append(" ends with ");       break;\r
-        case NOT_ENDS_WITH:   sb.append(" not ends with ");   break;\r
-        case EQUALS_AS:       sb.append(" equals as ");       break;\r
-        case NOT_EQUALS_AS:   sb.append(" not equals as ");   break;\r
-        }\r
-        sb.append(getValue());\r
-\r
-        return new String(sb);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TargetNameComparisonPairFilter extends AbstractComparisonPairFilter{
+    private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();
+
+    static{
+        CRITERIA.add(Criterion.STARTS_WITH);
+        CRITERIA.add(Criterion.NOT_STARTS_WITH); 
+        CRITERIA.add(Criterion.ENDS_WITH);
+        CRITERIA.add(Criterion.NOT_ENDS_WITH);
+        CRITERIA.add(Criterion.EQUALS_AS);
+        CRITERIA.add(Criterion.NOT_EQUALS_AS);
+        CRITERIA.add(Criterion.MATCH);
+        CRITERIA.add(Criterion.NOT_MATCH);
+    };
+    private FilterTarget target = FilterTarget.BOTH_TARGETS;
+    private String value;
+
+    public TargetNameComparisonPairFilter(ComparisonPairFilterSpi service){
+        super(service);
+    }
+
+    public Criterion[] getAcceptableCriteria(){
+        return getValidCriteria();
+    }
+
+    public static Criterion[] getValidCriteria(){
+        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
+    }
+
+    public boolean isFiltered(ComparisonPair pair){
+        String v = value;
+        if(v == null) v = "";
+        boolean flag;
+        if(getTarget() == FilterTarget.TARGET_1){
+            flag = checkMatch(pair.getTarget1().getName(), v);
+        }
+        else if(getTarget() == FilterTarget.TARGET_2){
+            flag = checkMatch(pair.getTarget2().getName(), v);
+        }
+        else{
+            flag = checkMatch(pair.getTarget1().getName(), pair.getTarget2().getName(), v);
+        }
+        return flag;
+    }
+
+    public String getValue(){
+        return value;
+    }
+
+    public void setValue(String value){
+        this.value = value;
+    }
+
+    public FilterTarget getTarget(){
+        return target;
+    }
+
+    public void setTarget(FilterTarget target){
+        this.target = target;
+    }
+
+    private boolean checkMatch(String name1, String name2, String value){
+        boolean flag1;
+        boolean flag2;
+        switch(getCriterion()){
+        case STARTS_WITH:
+            flag1 = name1.startsWith(value);
+            flag2 = name2.startsWith(value);
+            break;
+        case ENDS_WITH:
+            flag1 = name1.endsWith(value);
+            flag2 = name2.endsWith(value);
+            break;
+        case EQUALS_AS:
+            flag1 = name1.equals(value);
+            flag2 = name2.equals(value);
+            break;
+        case NOT_EQUALS_AS:
+            flag1 = !name1.equals(value);
+            flag2 = !name2.equals(value);
+            break;
+        case MATCH:
+            flag1 = name1.equals(name2);
+            flag2 = flag1;
+            break;
+        case NOT_MATCH:
+            flag1 = !name1.equals(name2);
+            flag2 = flag1;
+            break;
+        default:
+            flag1 = false;
+            flag2 = false;
+            break;
+        }
+        
+        boolean flag;
+        if(getTarget() == FilterTarget.BOTH_TARGETS){
+            flag = flag1 && flag2;
+        }
+        else{
+            flag = flag1 || flag2;
+        }
+        return flag;
+    }
+
+    private boolean checkMatch(String name, String value){
+        boolean flag;
+        switch(getCriterion()){
+        case STARTS_WITH:
+            flag = name.startsWith(value);
+            break;
+        case ENDS_WITH:
+            flag = name.endsWith(value);
+            break;
+        case EQUALS_AS:
+            flag = name.equals(value);
+            break;
+        case NOT_EQUALS_AS:
+            flag = !name.equals(value);
+            break;
+        default:
+            flag = false;
+            break;
+        }
+        return flag;
+    }
+
+    public String toString(){
+        if(getCriterion() == Criterion.MATCH || getCriterion() == Criterion.NOT_MATCH){
+            String value = " match ";
+            if(getCriterion() == Criterion.NOT_MATCH) value = " not match ";
+            return "target1.name" + value + "target2.name";
+        }
+        StringBuilder sb = new StringBuilder();
+        switch(getTarget()){
+        case TARGET_1:       sb.append("target1.name");           break;
+        case TARGET_2:       sb.append("target2.name");           break;
+        case BOTH_TARGETS:   sb.append("(target1&target2).name"); break;
+        case ONE_OF_TARGETS: sb.append("(target1|target2).name"); break; 
+        }
+        switch(getCriterion()){
+        case STARTS_WITH:     sb.append(" starts with ");     break;
+        case NOT_STARTS_WITH: sb.append(" not starts with "); break;
+        case ENDS_WITH:       sb.append(" ends with ");       break;
+        case NOT_ENDS_WITH:   sb.append(" not ends with ");   break;
+        case EQUALS_AS:       sb.append(" equals as ");       break;
+        case NOT_EQUALS_AS:   sb.append(" not equals as ");   break;
+        }
+        sb.append(getValue());
+
+        return new String(sb);
+    }
+}
@@ -1,27 +1,27 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TargetNameComparisonPairFilterService extends AbstractComparisonPairFilterService{\r
-\r
-    public ComparisonPairFilter getFilter(){\r
-        return new TargetNameComparisonPairFilter(this);\r
-    }\r
-\r
-    public String getFilterClassName(){\r
-        return TargetNameComparisonPairFilter.class.getName();\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "name";\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TargetNameComparisonPairFilterService extends AbstractComparisonPairFilterService{
+
+    public ComparisonPairFilter getFilter(){
+        return new TargetNameComparisonPairFilter(this);
+    }
+
+    public String getFilterClassName(){
+        return TargetNameComparisonPairFilter.class.getName();
+    }
+
+    public String getFilterName(){
+        return "name";
+    }
+}
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TotalElementCountComparisonPairFilter extends AbstractComparisonPairFilter{\r
-    private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();\r
-    static{\r
-        CRITERIA.add(Criterion.GREATER_EQUALS);\r
-        CRITERIA.add(Criterion.GREATER_THAN);\r
-        CRITERIA.add(Criterion.LESS_EQUALS);\r
-        CRITERIA.add(Criterion.LESS_THAN);\r
-        CRITERIA.add(Criterion.EQUALS_AS);\r
-        CRITERIA.add(Criterion.NOT_EQUALS_AS); \r
-        CRITERIA.add(Criterion.MATCH);\r
-        CRITERIA.add(Criterion.NOT_MATCH);\r
-    };\r
-\r
-    private int threshold = 0;\r
-    private FilterTarget target;\r
-\r
-    public TotalElementCountComparisonPairFilter(ComparisonPairFilterSpi service){\r
-        super(service);\r
-    }\r
-\r
-    public Criterion[] getAcceptableCriteria(){\r
-        return getValidCriteria();\r
-    }\r
-\r
-    public static Criterion[] getValidCriteria(){\r
-        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);\r
-    }\r
-\r
-    public boolean isFiltered(ComparisonPair pair){\r
-        boolean flag;\r
-        if(getTarget() == FilterTarget.TARGET_1){\r
-            flag = checkFiltered(pair.getTarget1().getSumOfElementCount());\r
-        }\r
-        else if(getTarget() == FilterTarget.TARGET_2){\r
-            flag = checkFiltered(pair.getTarget2().getSumOfElementCount());\r
-        }\r
-        else{\r
-            flag = checkFiltered(pair.getTarget1().getSumOfElementCount(), pair.getTarget2().getSumOfElementCount());\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    private boolean checkFiltered(int e1, int e2){\r
-        boolean flag1;\r
-        boolean flag2;\r
-        int t = getThreshold();\r
-        switch(getCriterion()){\r
-        case GREATER_EQUALS:\r
-            flag1 = e1 >= t; flag2 = e2 >= t;\r
-            break;\r
-        case GREATER_THAN:\r
-            flag1 = e1 > t;  flag2 = e2 > t;\r
-            break;\r
-        case LESS_EQUALS:\r
-            flag1 = e1 <= t; flag2 = e2 <= t;\r
-            break;\r
-        case LESS_THAN:\r
-            flag1 = e1 < t;  flag2 = e2 < t;\r
-            break;\r
-        case EQUALS_AS:\r
-            flag1 = e1 == t; flag2 = e2 == t;\r
-            break;\r
-        case NOT_EQUALS_AS:\r
-            flag1 = e1 != t; flag2 = e2 != t;\r
-            break;\r
-        case MATCH:\r
-            flag1 = e1 == e2; flag2 = flag1;\r
-            break;\r
-        case NOT_MATCH:\r
-            flag1 = e1 != e2; flag2 = flag1;\r
-            break;\r
-        default:\r
-            flag1 = false;\r
-            flag2 = false;\r
-            break;\r
-        }\r
-        return (getTarget() == FilterTarget.BOTH_TARGETS && flag1 && flag2) ||\r
-            (getTarget() == FilterTarget.ONE_OF_TARGETS && (flag1 || flag2));\r
-    }\r
-\r
-    private boolean checkFiltered(int total){\r
-        boolean flag = false;\r
-        switch(getCriterion()){\r
-        case GREATER_EQUALS:\r
-            flag = total >= getThreshold();\r
-            break;\r
-        case GREATER_THAN:\r
-            flag = total > getThreshold();\r
-            break;\r
-        case LESS_EQUALS:\r
-            flag = total <= getThreshold();\r
-            break;\r
-        case LESS_THAN:\r
-            flag = total < getThreshold();\r
-            break;\r
-        case EQUALS_AS:\r
-            flag = total == getThreshold();\r
-            break;\r
-        case NOT_EQUALS_AS:\r
-            flag = total != getThreshold();\r
-            break;\r
-        default:\r
-            flag = false;\r
-            break;\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    public int getThreshold(){\r
-        return threshold;\r
-    }\r
-\r
-    public void setThreshold(int threshold){\r
-        if(threshold < 0){\r
-            throw new IllegalArgumentException("threshold must be positive value: " + threshold);\r
-        }\r
-        this.threshold = threshold;\r
-    }\r
-\r
-    public FilterTarget getTarget(){\r
-        return target;\r
-    }\r
-\r
-    public void setTarget(FilterTarget target){\r
-        this.target = target;\r
-    }\r
-\r
-    public String toString(){\r
-        StringBuilder sb = new StringBuilder();\r
-        switch(getTarget()){\r
-        case TARGET_1:       sb.append("target1"); break;\r
-        case TARGET_2:       sb.append("target2"); break;\r
-        case BOTH_TARGETS:   sb.append("(target1&target2)"); break;\r
-        case ONE_OF_TARGETS: sb.append("(target1|target2)"); break;\r
-        }\r
-        sb.append(".element");\r
-        switch(getCriterion()){\r
-        case GREATER_EQUALS: sb.append(" >= "); break;\r
-        case GREATER_THAN:   sb.append(" >  "); break;\r
-        case LESS_EQUALS:    sb.append(" <= "); break;\r
-        case LESS_THAN:      sb.append(" <  "); break;\r
-        case EQUALS_AS:      sb.append(" == "); break;\r
-        case NOT_EQUALS_AS:  sb.append(" != "); break;\r
-        }\r
-        sb.append(Integer.toString(getThreshold()));\r
-\r
-        return new String(sb);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TotalElementCountComparisonPairFilter extends AbstractComparisonPairFilter{
+    private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();
+    static{
+        CRITERIA.add(Criterion.GREATER_EQUALS);
+        CRITERIA.add(Criterion.GREATER_THAN);
+        CRITERIA.add(Criterion.LESS_EQUALS);
+        CRITERIA.add(Criterion.LESS_THAN);
+        CRITERIA.add(Criterion.EQUALS_AS);
+        CRITERIA.add(Criterion.NOT_EQUALS_AS); 
+        CRITERIA.add(Criterion.MATCH);
+        CRITERIA.add(Criterion.NOT_MATCH);
+    };
+
+    private int threshold = 0;
+    private FilterTarget target;
+
+    public TotalElementCountComparisonPairFilter(ComparisonPairFilterSpi service){
+        super(service);
+    }
+
+    public Criterion[] getAcceptableCriteria(){
+        return getValidCriteria();
+    }
+
+    public static Criterion[] getValidCriteria(){
+        return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
+    }
+
+    public boolean isFiltered(ComparisonPair pair){
+        boolean flag;
+        if(getTarget() == FilterTarget.TARGET_1){
+            flag = checkFiltered(pair.getTarget1().getSumOfElementCount());
+        }
+        else if(getTarget() == FilterTarget.TARGET_2){
+            flag = checkFiltered(pair.getTarget2().getSumOfElementCount());
+        }
+        else{
+            flag = checkFiltered(pair.getTarget1().getSumOfElementCount(), pair.getTarget2().getSumOfElementCount());
+        }
+        return flag;
+    }
+
+    private boolean checkFiltered(int e1, int e2){
+        boolean flag1;
+        boolean flag2;
+        int t = getThreshold();
+        switch(getCriterion()){
+        case GREATER_EQUALS:
+            flag1 = e1 >= t; flag2 = e2 >= t;
+            break;
+        case GREATER_THAN:
+            flag1 = e1 > t;  flag2 = e2 > t;
+            break;
+        case LESS_EQUALS:
+            flag1 = e1 <= t; flag2 = e2 <= t;
+            break;
+        case LESS_THAN:
+            flag1 = e1 < t;  flag2 = e2 < t;
+            break;
+        case EQUALS_AS:
+            flag1 = e1 == t; flag2 = e2 == t;
+            break;
+        case NOT_EQUALS_AS:
+            flag1 = e1 != t; flag2 = e2 != t;
+            break;
+        case MATCH:
+            flag1 = e1 == e2; flag2 = flag1;
+            break;
+        case NOT_MATCH:
+            flag1 = e1 != e2; flag2 = flag1;
+            break;
+        default:
+            flag1 = false;
+            flag2 = false;
+            break;
+        }
+        return (getTarget() == FilterTarget.BOTH_TARGETS && flag1 && flag2) ||
+            (getTarget() == FilterTarget.ONE_OF_TARGETS && (flag1 || flag2));
+    }
+
+    private boolean checkFiltered(int total){
+        boolean flag = false;
+        switch(getCriterion()){
+        case GREATER_EQUALS:
+            flag = total >= getThreshold();
+            break;
+        case GREATER_THAN:
+            flag = total > getThreshold();
+            break;
+        case LESS_EQUALS:
+            flag = total <= getThreshold();
+            break;
+        case LESS_THAN:
+            flag = total < getThreshold();
+            break;
+        case EQUALS_AS:
+            flag = total == getThreshold();
+            break;
+        case NOT_EQUALS_AS:
+            flag = total != getThreshold();
+            break;
+        default:
+            flag = false;
+            break;
+        }
+        return flag;
+    }
+
+    public int getThreshold(){
+        return threshold;
+    }
+
+    public void setThreshold(int threshold){
+        if(threshold < 0){
+            throw new IllegalArgumentException("threshold must be positive value: " + threshold);
+        }
+        this.threshold = threshold;
+    }
+
+    public FilterTarget getTarget(){
+        return target;
+    }
+
+    public void setTarget(FilterTarget target){
+        this.target = target;
+    }
+
+    public String toString(){
+        StringBuilder sb = new StringBuilder();
+        switch(getTarget()){
+        case TARGET_1:       sb.append("target1"); break;
+        case TARGET_2:       sb.append("target2"); break;
+        case BOTH_TARGETS:   sb.append("(target1&target2)"); break;
+        case ONE_OF_TARGETS: sb.append("(target1|target2)"); break;
+        }
+        sb.append(".element");
+        switch(getCriterion()){
+        case GREATER_EQUALS: sb.append(" >= "); break;
+        case GREATER_THAN:   sb.append(" >  "); break;
+        case LESS_EQUALS:    sb.append(" <= "); break;
+        case LESS_THAN:      sb.append(" <  "); break;
+        case EQUALS_AS:      sb.append(" == "); break;
+        case NOT_EQUALS_AS:  sb.append(" != "); break;
+        }
+        sb.append(Integer.toString(getThreshold()));
+
+        return new String(sb);
+    }
+}
@@ -1,27 +1,27 @@
-package jp.naist.se.stigmata.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TotalElementCountComparisonPairFilterService extends AbstractComparisonPairFilterService{\r
-\r
-    public ComparisonPairFilter getFilter(){\r
-        return new TotalElementCountComparisonPairFilter(this);\r
-    }\r
-\r
-    public String getFilterClassName(){\r
-        return TotalElementCountComparisonPairFilter.class.getName();\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "totalelementcount";\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TotalElementCountComparisonPairFilterService extends AbstractComparisonPairFilterService{
+
+    public ComparisonPairFilter getFilter(){
+        return new TotalElementCountComparisonPairFilter(this);
+    }
+
+    public String getFilterClassName(){
+        return TotalElementCountComparisonPairFilter.class.getName();
+    }
+
+    public String getFilterName(){
+        return "totalelementcount";
+    }
+}
@@ -1,10 +1,10 @@
-package jp.naist.se.stigmata.hook;
+package jp.sourceforge.stigmata.hook;
 
 /*
  * $Id$
  */
 
-import jp.naist.se.stigmata.spi.StigmataHookSpi;
+import jp.sourceforge.stigmata.spi.StigmataHookSpi;
 
 /**
  * 
@@ -1,69 +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
+package jp.sourceforge.stigmata.hook;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class MultipleStigmataHook implements StigmataHook, StigmataRuntimeHook{
+    private List<StigmataHook> hooks = new ArrayList<StigmataHook>();
+    private List<StigmataRuntimeHook> runtimeHooks = new ArrayList<StigmataRuntimeHook>();
+
+    public void onHook(Phase phase, BirthmarkContext context){
+        for(StigmataRuntimeHook hook: runtimeHooks){
+            if(hook != null){
+                hook.onHook(phase, context);
+            }
+        }
+    }
+
+    public void onHook(Phase phase, BirthmarkEnvironment env){
+        for(StigmataHook hook: hooks){
+            if(hook != null){
+                hook.onHook(phase, env);
+            }
+        }
+    }
+
+    public void addHook(StigmataHook hook){
+        hooks.add(hook);
+    }
+
+    public void removeHook(StigmataHook hook){
+        hooks.remove(hook);
+    }
+
+    public int getHookCount(){
+        return hooks.size();
+    }
+
+    public StigmataHook getHook(int index){
+        return hooks.get(index);
+    }
+
+    public void addRuntimeHook(StigmataRuntimeHook hook){
+        runtimeHooks.add(hook);
+    }
+
+    public void removeRuntimeHook(StigmataRuntimeHook hook){
+        runtimeHooks.remove(hook);
+    }
+
+    public int getRuntimeHookCount(){
+        return runtimeHooks.size();
+    }
+
+    public StigmataRuntimeHook getRuntimeHook(int index){
+        return runtimeHooks.get(index);
+    }
 }
\ No newline at end of file
@@ -1,21 +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
+package jp.sourceforge.stigmata.hook;
+
+/*
+ * $Id$
+ */
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public enum Phase{
+    SETUP,
+    TEAR_DOWN,
+    BEFORE_EXTRACTION,
+    AFTER_EXTRACTION,
+    BEFORE_COMPARISON,
+    AFTER_COMPARISON,
+    BEFORE_FILTERING,
+    AFTER_FILTERING,
 }
\ No newline at end of file
@@ -1,16 +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
+package jp.sourceforge.stigmata.hook;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date
+ */
+public interface StigmataHook{
+    public void onHook(Phase phase, BirthmarkEnvironment env);
 }
\ No newline at end of file
@@ -1,78 +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
+package jp.sourceforge.stigmata.hook;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.spi.StigmataHookSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date
+ */
+public class StigmataHookManager{
+    private static final StigmataHookManager manager = new StigmataHookManager();
+
+    /**
+     * private constructor for singleton pattern.
+     */
+    private StigmataHookManager(){
+    }
+
+    public static StigmataHookManager getInstance(){
+        return manager;
+    }
+
+    public void runHook(Phase phase, BirthmarkContext context){
+        StigmataRuntimeHook hook = buildHook(phase, context.getEnvironment());
+        hook.onHook(phase, context);
+    }
+
+    public void runHook(Phase phase, BirthmarkEnvironment env){
+        StigmataHook hook = buildHook(phase, env);
+        hook.onHook(phase, env);
+    }
+
+    private MultipleStigmataHook buildHook(Phase phase, BirthmarkEnvironment env){
+        MultipleStigmataHook hooks = new MultipleStigmataHook();
+
+        for(Iterator<StigmataHookSpi> i = env.lookupProviders(StigmataHookSpi.class); i.hasNext(); ){
+            StigmataHookSpi service = i.next();
+
+            switch(phase){
+            case SETUP:
+                hooks.addHook(service.onSetup());
+                break;
+            case TEAR_DOWN:
+                hooks.addHook(service.onTearDown());
+                break;
+            case BEFORE_EXTRACTION:
+                hooks.addRuntimeHook(service.beforeExtraction());
+                break;
+            case AFTER_EXTRACTION:
+                hooks.addRuntimeHook(service.afterExtraction());
+                break;
+            case BEFORE_COMPARISON:
+                hooks.addRuntimeHook(service.beforeComparison());
+                break;
+            case AFTER_COMPARISON:
+                hooks.addRuntimeHook(service.afterComparison());
+                break;
+            case BEFORE_FILTERING:
+                hooks.addRuntimeHook(service.beforeFiltering());
+                break;
+            case AFTER_FILTERING:
+                hooks.addRuntimeHook(service.afterFiltering());
+                break;
+            default:
+                throw new InternalError("invalid phase: " + phase);
+            }
+        }
+        return hooks;
+    }
 }
\ No newline at end of file
@@ -1,12 +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
+package jp.sourceforge.stigmata.hook;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date
+ */
+public interface StigmataRuntimeHook{
+    public void onHook(Phase phase, BirthmarkContext context);
 }
\ No newline at end of file
@@ -1,38 +1,38 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.io.StringWriter;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractBirthmarkServicePrinter implements BirthmarkServicePrinter, Printer{\r
-    public abstract void printResult(PrintWriter out, BirthmarkSpi[] spilist);\r
-\r
-    public String getResult(BirthmarkSpi[] spilist){\r
-        StringWriter writer = new StringWriter();\r
-        PrintWriter out = new PrintWriter(writer);\r
-\r
-        printResult(out, spilist);\r
-\r
-        out.close();\r
-        return writer.toString();\r
-    }\r
-\r
-    public void printHeader(PrintWriter out){\r
-    }\r
-\r
-    public void printFooter(PrintWriter out){\r
-        out.flush();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractBirthmarkServicePrinter implements BirthmarkServicePrinter, Printer{
+    public abstract void printResult(PrintWriter out, BirthmarkSpi[] spilist);
+
+    public String getResult(BirthmarkSpi[] spilist){
+        StringWriter writer = new StringWriter();
+        PrintWriter out = new PrintWriter(writer);
+
+        printResult(out, spilist);
+
+        out.close();
+        return writer.toString();
+    }
+
+    public void printHeader(PrintWriter out){
+    }
+
+    public void printFooter(PrintWriter out){
+        out.flush();
+    }
+}
@@ -1,37 +1,37 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.io.StringWriter;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractComparisonPairPrinter implements ComparisonPairPrinter, Printer{\r
-\r
-    public abstract void printResult(PrintWriter out, ComparisonPair pair);\r
-\r
-    public void printFooter(PrintWriter out){\r
-        out.flush();\r
-    }\r
-\r
-    public void printHeader(PrintWriter out){\r
-    }\r
-\r
-    public String getResult(ComparisonPair pair){\r
-        StringWriter writer = new StringWriter();\r
-        PrintWriter out = new PrintWriter(writer);\r
-\r
-        printResult(out, pair);\r
-\r
-        out.close();\r
-        return writer.toString();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractComparisonPairPrinter implements ComparisonPairPrinter, Printer{
+
+    public abstract void printResult(PrintWriter out, ComparisonPair pair);
+
+    public void printFooter(PrintWriter out){
+        out.flush();
+    }
+
+    public void printHeader(PrintWriter out){
+    }
+
+    public String getResult(ComparisonPair pair){
+        StringWriter writer = new StringWriter();
+        PrintWriter out = new PrintWriter(writer);
+
+        printResult(out, pair);
+
+        out.close();
+        return writer.toString();
+    }
+}
@@ -1,38 +1,38 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.io.StringWriter;\r
-\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractComparisonResultSetPrinter implements ComparisonResultSetPrinter, Printer{\r
-    public abstract void printResult(PrintWriter out, ComparisonResultSet resultset);\r
-\r
-    public void printHeader(PrintWriter out){\r
-    }\r
-\r
-    public void printFooter(PrintWriter out){\r
-        out.flush();\r
-    }\r
-\r
-    public String getResult(ComparisonResultSet resultset){\r
-        StringWriter writer = new StringWriter();\r
-        PrintWriter out = new PrintWriter(writer);\r
-\r
-        printResult(out, resultset);\r
-\r
-        out.close();\r
-        return writer.toString();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import jp.sourceforge.stigmata.ComparisonResultSet;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractComparisonResultSetPrinter implements ComparisonResultSetPrinter, Printer{
+    public abstract void printResult(PrintWriter out, ComparisonResultSet resultset);
+
+    public void printHeader(PrintWriter out){
+    }
+
+    public void printFooter(PrintWriter out){
+        out.flush();
+    }
+
+    public String getResult(ComparisonResultSet resultset){
+        StringWriter writer = new StringWriter();
+        PrintWriter out = new PrintWriter(writer);
+
+        printResult(out, resultset);
+
+        out.close();
+        return writer.toString();
+    }
+}
@@ -1,38 +1,38 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.io.StringWriter;\r
-\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractExtractionResultSetPrinter implements ExtractionResultSetPrinter{\r
-    public abstract void printResult(PrintWriter out, ExtractionResultSet ers);\r
-\r
-    public void printHeader(PrintWriter out){\r
-    }\r
-\r
-    public void printFooter(PrintWriter out){\r
-        out.flush();\r
-    }\r
-\r
-    public String getResult(ExtractionResultSet ers){\r
-        StringWriter writer = new StringWriter();\r
-        PrintWriter out = new PrintWriter(writer);\r
-\r
-        printResult(out, ers);\r
-\r
-        out.close();\r
-        return writer.toString();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import jp.sourceforge.stigmata.ExtractionResultSet;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractExtractionResultSetPrinter implements ExtractionResultSetPrinter{
+    public abstract void printResult(PrintWriter out, ExtractionResultSet ers);
+
+    public void printHeader(PrintWriter out){
+    }
+
+    public void printFooter(PrintWriter out){
+        out.flush();
+    }
+
+    public String getResult(ExtractionResultSet ers){
+        StringWriter writer = new StringWriter();
+        PrintWriter out = new PrintWriter(writer);
+
+        printResult(out, ers);
+
+        out.close();
+        return writer.toString();
+    }
+}
@@ -1,23 +1,23 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkServicePrinter{\r
-    public void printResult(PrintWriter out, BirthmarkSpi[] spilist) throws IOException;\r
-\r
-    public String getResult(BirthmarkSpi[] spilist);\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkServicePrinter{
+    public void printResult(PrintWriter out, BirthmarkSpi[] spilist) throws IOException;
+
+    public String getResult(BirthmarkSpi[] spilist);
+}
@@ -1,20 +1,20 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonPairPrinter{\r
-    public String getResult(ComparisonPair pair);\r
-\r
-    public void printResult(PrintWriter out, ComparisonPair pair);\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonPairPrinter{
+    public String getResult(ComparisonPair pair);
+
+    public void printResult(PrintWriter out, ComparisonPair pair);
+}
@@ -1,22 +1,22 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonResultSetPrinter{\r
-    public void printResult(PrintWriter out, ComparisonResultSet resultset);\r
-\r
-    public String getResult(ComparisonResultSet resultset);\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.ComparisonResultSet;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonResultSetPrinter{
+    public void printResult(PrintWriter out, ComparisonResultSet resultset);
+
+    public String getResult(ComparisonResultSet resultset);
+}
@@ -1,22 +1,22 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ExtractionResultSetPrinter{\r
-    public void printResult(PrintWriter out, ExtractionResultSet ers);\r
-\r
-    public String getResult(ExtractionResultSet ers);\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.ExtractionResultSet;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ExtractionResultSetPrinter{
+    public void printResult(PrintWriter out, ExtractionResultSet ers);
+
+    public String getResult(ExtractionResultSet ers);
+}
@@ -1,9 +1,9 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-import java.io.PrintWriter;\r
-\r
-interface Printer{\r
-    public void printHeader(PrintWriter out);\r
-\r
-    public void printFooter(PrintWriter out);\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+import java.io.PrintWriter;
+
+interface Printer{
+    public void printHeader(PrintWriter out);
+
+    public void printFooter(PrintWriter out);
+}
@@ -1,57 +1,57 @@
-package jp.naist.se.stigmata.printer;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.HashMap;\r
-import java.util.Iterator;\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.printer.csv.CsvResultPrinterService;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class PrinterManager{\r
-    private static final PrinterManager manager = new PrinterManager();\r
-\r
-    private Map<String, ResultPrinterSpi> formats = new HashMap<String, ResultPrinterSpi>();\r
-\r
-    private PrinterManager(){\r
-        for(Iterator<ResultPrinterSpi> i = ServiceRegistry.lookupProviders(ResultPrinterSpi.class); i.hasNext(); ){\r
-            ResultPrinterSpi spi = i.next();\r
-            addService(spi);\r
-        }\r
-    }\r
-\r
-    public static void updateServices(BirthmarkEnvironment environment){\r
-        PrinterManager instance = getInstance();\r
-        for(Iterator<ResultPrinterSpi> i = environment.lookupProviders(ResultPrinterSpi.class); i.hasNext(); ){\r
-            ResultPrinterSpi spi = i.next();\r
-            instance.addService(spi);\r
-        }\r
-    }\r
-\r
-    public static ResultPrinterSpi getDefaultFormatService(){\r
-        return new CsvResultPrinterService();\r
-    }\r
-\r
-    public static PrinterManager getInstance(){\r
-        return manager;\r
-    }\r
-\r
-    public ResultPrinterSpi getService(String format){\r
-        return formats.get(format);\r
-    }\r
-\r
-    private void addService(ResultPrinterSpi service){\r
-        formats.put(service.getFormat(), service);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer;
+
+/*
+ * $Id$
+ */
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.imageio.spi.ServiceRegistry;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.printer.csv.CsvResultPrinterService;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class PrinterManager{
+    private static final PrinterManager manager = new PrinterManager();
+
+    private Map<String, ResultPrinterSpi> formats = new HashMap<String, ResultPrinterSpi>();
+
+    private PrinterManager(){
+        for(Iterator<ResultPrinterSpi> i = ServiceRegistry.lookupProviders(ResultPrinterSpi.class); i.hasNext(); ){
+            ResultPrinterSpi spi = i.next();
+            addService(spi);
+        }
+    }
+
+    public static void updateServices(BirthmarkEnvironment environment){
+        PrinterManager instance = getInstance();
+        for(Iterator<ResultPrinterSpi> i = environment.lookupProviders(ResultPrinterSpi.class); i.hasNext(); ){
+            ResultPrinterSpi spi = i.next();
+            instance.addService(spi);
+        }
+    }
+
+    public static ResultPrinterSpi getDefaultFormatService(){
+        return new CsvResultPrinterService();
+    }
+
+    public static PrinterManager getInstance(){
+        return manager;
+    }
+
+    public ResultPrinterSpi getService(String format){
+        return formats.get(format);
+    }
+
+    private void addService(ResultPrinterSpi service){
+        formats.put(service.getFormat(), service);
+    }
+}
@@ -1,34 +1,34 @@
-package jp.naist.se.stigmata.printer.csv;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.printer.AbstractBirthmarkServicePrinter;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkServiceCsvPrinter extends AbstractBirthmarkServicePrinter{\r
-    public void printResult(PrintWriter out, BirthmarkSpi[] spilist){\r
-        printHeader(out);\r
-        for(BirthmarkSpi spi: spilist){\r
-            out.print(spi.getType());\r
-            out.print(",");\r
-            out.print(spi.getDisplayType());\r
-            out.print(",");\r
-            out.print(spi.getClass().getName());\r
-            out.print(",");\r
-            out.print(spi.getDescription());\r
-            out.println();\r
-        }\r
-        printFooter(out);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.csv;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.printer.AbstractBirthmarkServicePrinter;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkServiceCsvPrinter extends AbstractBirthmarkServicePrinter{
+    public void printResult(PrintWriter out, BirthmarkSpi[] spilist){
+        printHeader(out);
+        for(BirthmarkSpi spi: spilist){
+            out.print(spi.getType());
+            out.print(",");
+            out.print(spi.getDisplayType());
+            out.print(",");
+            out.print(spi.getClass().getName());
+            out.print(",");
+            out.print(spi.getDescription());
+            out.println();
+        }
+        printFooter(out);
+    }
+}
@@ -1,29 +1,29 @@
-package jp.naist.se.stigmata.printer.csv;\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonPairElement;\r
-import jp.naist.se.stigmata.printer.AbstractComparisonPairPrinter;\r
-\r
-public class ComparisonPairCsvPrinter extends AbstractComparisonPairPrinter{\r
-    private ExtractionResultSetCsvPrinter list;\r
-\r
-    public ComparisonPairCsvPrinter(ExtractionResultSetCsvPrinter list){\r
-        this.list = list;\r
-    }\r
-\r
-    @Override\r
-    public void printResult(PrintWriter out, ComparisonPair pair){\r
-        list.printBirthmarkSet(out, pair.getTarget1());\r
-        list.printBirthmarkSet(out, pair.getTarget2());\r
-\r
-        for(ComparisonPairElement element: pair){\r
-            out.print("compare,");\r
-            out.print(element.getType());\r
-            out.print(",");\r
-            out.println(element.getSimilarity());\r
-        }\r
-        out.flush();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.csv;
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonPairElement;
+import jp.sourceforge.stigmata.printer.AbstractComparisonPairPrinter;
+
+public class ComparisonPairCsvPrinter extends AbstractComparisonPairPrinter{
+    private ExtractionResultSetCsvPrinter list;
+
+    public ComparisonPairCsvPrinter(ExtractionResultSetCsvPrinter list){
+        this.list = list;
+    }
+
+    @Override
+    public void printResult(PrintWriter out, ComparisonPair pair){
+        list.printBirthmarkSet(out, pair.getTarget1());
+        list.printBirthmarkSet(out, pair.getTarget2());
+
+        for(ComparisonPairElement element: pair){
+            out.print("compare,");
+            out.print(element.getType());
+            out.print(",");
+            out.println(element.getSimilarity());
+        }
+        out.flush();
+    }
+}
@@ -1,85 +1,85 @@
-package jp.naist.se.stigmata.printer.csv;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.LinkedHashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-import jp.naist.se.stigmata.printer.AbstractComparisonResultSetPrinter;\r
-import jp.naist.se.stigmata.result.CertainPairComparisonResultSet;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ComparisonResultSetCsvPrinter extends AbstractComparisonResultSetPrinter{\r
-    public ComparisonResultSetCsvPrinter(){\r
-    }\r
-\r
-    @Override\r
-    public void printResult(PrintWriter out, ComparisonResultSet resultset){\r
-        if(resultset instanceof CertainPairComparisonResultSet){\r
-            printResultImpl(out, (CertainPairComparisonResultSet)resultset);\r
-        }\r
-        else{\r
-            printResultImpl(out, resultset);\r
-        }\r
-    }\r
-\r
-    private void printResultImpl(PrintWriter out, CertainPairComparisonResultSet resultset){\r
-        for(ComparisonPair pair: resultset){\r
-            out.print(pair.getTarget1().getName());\r
-            out.print(",");\r
-            out.print(pair.getTarget1().getName());\r
-            out.print(",");\r
-            out.println(pair.calculateSimilarity());\r
-        }\r
-    }\r
-\r
-    private void printResultImpl(PrintWriter out, ComparisonResultSet resultset){\r
-        Map<String, Map<String, Double>> map = new LinkedHashMap<String, Map<String, Double>>();\r
-        List<String> names = new ArrayList<String>();\r
-\r
-        for(ComparisonPair pair: resultset){\r
-            Map<String, Double> val = map.get(pair.getTarget1().getName());\r
-            if(val == null){\r
-                val = new HashMap<String, Double>();\r
-            }\r
-            val.put(pair.getTarget2().getName(), new Double(pair.calculateSimilarity()));\r
-            if(!names.contains(pair.getTarget2().getName())){\r
-                names.add(pair.getTarget2().getName());\r
-            }\r
-            map.put(pair.getTarget1().getName(), val);\r
-        }\r
-\r
-        for(String name: names){\r
-            out.print(",");\r
-            out.print(name);\r
-        }\r
-        out.println();\r
-        for(Map.Entry<String, Map<String, Double>> entry: map.entrySet()){\r
-            out.print(entry.getKey());\r
-            Map<String, Double> element = entry.getValue();\r
-            for(String name: names){\r
-                out.print(",");\r
-                Double v = element.get(name);\r
-                if(v != null){\r
-                    out.print(v.doubleValue());\r
-                }\r
-            }\r
-            out.println();\r
-        }\r
-        out.flush();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.csv;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+import jp.sourceforge.stigmata.printer.AbstractComparisonResultSetPrinter;
+import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ComparisonResultSetCsvPrinter extends AbstractComparisonResultSetPrinter{
+    public ComparisonResultSetCsvPrinter(){
+    }
+
+    @Override
+    public void printResult(PrintWriter out, ComparisonResultSet resultset){
+        if(resultset instanceof CertainPairComparisonResultSet){
+            printResultImpl(out, (CertainPairComparisonResultSet)resultset);
+        }
+        else{
+            printResultImpl(out, resultset);
+        }
+    }
+
+    private void printResultImpl(PrintWriter out, CertainPairComparisonResultSet resultset){
+        for(ComparisonPair pair: resultset){
+            out.print(pair.getTarget1().getName());
+            out.print(",");
+            out.print(pair.getTarget1().getName());
+            out.print(",");
+            out.println(pair.calculateSimilarity());
+        }
+    }
+
+    private void printResultImpl(PrintWriter out, ComparisonResultSet resultset){
+        Map<String, Map<String, Double>> map = new LinkedHashMap<String, Map<String, Double>>();
+        List<String> names = new ArrayList<String>();
+
+        for(ComparisonPair pair: resultset){
+            Map<String, Double> val = map.get(pair.getTarget1().getName());
+            if(val == null){
+                val = new HashMap<String, Double>();
+            }
+            val.put(pair.getTarget2().getName(), new Double(pair.calculateSimilarity()));
+            if(!names.contains(pair.getTarget2().getName())){
+                names.add(pair.getTarget2().getName());
+            }
+            map.put(pair.getTarget1().getName(), val);
+        }
+
+        for(String name: names){
+            out.print(",");
+            out.print(name);
+        }
+        out.println();
+        for(Map.Entry<String, Map<String, Double>> entry: map.entrySet()){
+            out.print(entry.getKey());
+            Map<String, Double> element = entry.getValue();
+            for(String name: names){
+                out.print(",");
+                Double v = element.get(name);
+                if(v != null){
+                    out.print(v.doubleValue());
+                }
+            }
+            out.println();
+        }
+        out.flush();
+    }
+}
@@ -1,58 +1,58 @@
-package jp.naist.se.stigmata.printer.csv;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.printer.BirthmarkServicePrinter;\r
-import jp.naist.se.stigmata.printer.ComparisonPairPrinter;\r
-import jp.naist.se.stigmata.printer.ComparisonResultSetPrinter;\r
-import jp.naist.se.stigmata.printer.ExtractionResultSetPrinter;\r
-import jp.naist.se.stigmata.spi.AbstractServiceProvider;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class CsvResultPrinterService extends AbstractServiceProvider implements ResultPrinterSpi{\r
-    private BirthmarkServiceCsvPrinter serviceList = new BirthmarkServiceCsvPrinter();\r
-    private ExtractionResultSetCsvPrinter list = new ExtractionResultSetCsvPrinter();\r
-    private ComparisonPairCsvPrinter pairPrinter = new ComparisonPairCsvPrinter(list);\r
-    private ComparisonResultSetCsvPrinter compare = new ComparisonResultSetCsvPrinter();\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDescription(\r
-            locale, getFormat(), LocalizedDescriptionManager.ServiceCategory.formatter\r
-        );\r
-    }\r
-\r
-    public String getFormat(){\r
-        return "csv";\r
-    }\r
-    \r
-    public ComparisonResultSetPrinter getComparisonResultSetPrinter() {\r
-        return compare;\r
-    }\r
-\r
-    public ExtractionResultSetPrinter getExtractionResultSetPrinter() {\r
-        return list;\r
-    }\r
-\r
-    public BirthmarkServicePrinter getBirthmarkServicePrinter() {\r
-        return serviceList;\r
-    }\r
-\r
-    public ComparisonPairPrinter getComparisonPairPrinter(){\r
-        return pairPrinter;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.csv;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.printer.BirthmarkServicePrinter;
+import jp.sourceforge.stigmata.printer.ComparisonPairPrinter;
+import jp.sourceforge.stigmata.printer.ComparisonResultSetPrinter;
+import jp.sourceforge.stigmata.printer.ExtractionResultSetPrinter;
+import jp.sourceforge.stigmata.spi.AbstractServiceProvider;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class CsvResultPrinterService extends AbstractServiceProvider implements ResultPrinterSpi{
+    private BirthmarkServiceCsvPrinter serviceList = new BirthmarkServiceCsvPrinter();
+    private ExtractionResultSetCsvPrinter list = new ExtractionResultSetCsvPrinter();
+    private ComparisonPairCsvPrinter pairPrinter = new ComparisonPairCsvPrinter(list);
+    private ComparisonResultSetCsvPrinter compare = new ComparisonResultSetCsvPrinter();
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDescription(
+            locale, getFormat(), LocalizedDescriptionManager.ServiceCategory.formatter
+        );
+    }
+
+    public String getFormat(){
+        return "csv";
+    }
+    
+    public ComparisonResultSetPrinter getComparisonResultSetPrinter() {
+        return compare;
+    }
+
+    public ExtractionResultSetPrinter getExtractionResultSetPrinter() {
+        return list;
+    }
+
+    public BirthmarkServicePrinter getBirthmarkServicePrinter() {
+        return serviceList;
+    }
+
+    public ComparisonPairPrinter getComparisonPairPrinter(){
+        return pairPrinter;
+    }
+}
@@ -1,49 +1,49 @@
-package jp.naist.se.stigmata.printer.csv;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.util.Iterator;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.ExtractionTarget;\r
-import jp.naist.se.stigmata.printer.AbstractExtractionResultSetPrinter;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ExtractionResultSetCsvPrinter extends AbstractExtractionResultSetPrinter{\r
-    public void printResult(PrintWriter out, ExtractionResultSet ers){\r
-        printHeader(out);\r
-        for(Iterator<BirthmarkSet> i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){\r
-            printBirthmarkSet(out, i.next());\r
-        }\r
-        printFooter(out);\r
-    }\r
-\r
-    protected void printBirthmarkSet(PrintWriter out, BirthmarkSet holder){\r
-        for(String type: holder.getBirthmarkTypes()){\r
-            out.print(holder.getName());\r
-            out.print(",");\r
-            out.print(holder.getLocation());\r
-\r
-            Birthmark birthmark = holder.getBirthmark(type);\r
-            out.print(",");\r
-            out.print(birthmark.getType());\r
-            for(Iterator<BirthmarkElement> elements = birthmark.iterator(); elements.hasNext(); ){\r
-                out.print(",");\r
-                out.print(elements.next());\r
-            }\r
-            out.println();\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.csv;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.util.Iterator;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.printer.AbstractExtractionResultSetPrinter;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ExtractionResultSetCsvPrinter extends AbstractExtractionResultSetPrinter{
+    public void printResult(PrintWriter out, ExtractionResultSet ers){
+        printHeader(out);
+        for(Iterator<BirthmarkSet> i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){
+            printBirthmarkSet(out, i.next());
+        }
+        printFooter(out);
+    }
+
+    protected void printBirthmarkSet(PrintWriter out, BirthmarkSet holder){
+        for(String type: holder.getBirthmarkTypes()){
+            out.print(holder.getName());
+            out.print(",");
+            out.print(holder.getLocation());
+
+            Birthmark birthmark = holder.getBirthmark(type);
+            out.print(",");
+            out.print(birthmark.getType());
+            for(Iterator<BirthmarkElement> elements = birthmark.iterator(); elements.hasNext(); ){
+                out.print(",");
+                out.print(elements.next());
+            }
+            out.println();
+        }
+    }
+}
@@ -1,39 +1,39 @@
-package jp.naist.se.stigmata.printer.xml;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.printer.AbstractBirthmarkServicePrinter;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkServiceXmlPrinter extends AbstractBirthmarkServicePrinter{\r
-    public void printResult(PrintWriter out, BirthmarkSpi[] spilist){\r
-        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark-result-set>");\r
-        out.println("  <birthmark-services>");\r
-        for(BirthmarkSpi spi: spilist){\r
-            out.println("    <birthmark-service>");\r
-            out.printf("      <type>%s</type>%n", spi.getType());\r
-            out.printf("      <display-name>%s</display-name>%n", spi.getDisplayType());\r
-            out.printf("      <description>%s</description>%n", spi.getDescription());\r
-            out.printf("      <class-name>%s</class-name>%n", spi.getClass().getName());\r
-            out.printf("      <extractor>%s</extractor>%n", spi.getExtractorClassName());\r
-            out.printf("      <comparator>%s</comparator>%n", spi.getComparatorClassName());\r
-            out.println("    </birthmark-service>");\r
-        }\r
-        out.println("  </birthmark-services>");\r
-        out.println("</birthmark-result-set>");\r
-\r
-        out.flush();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.xml;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.printer.AbstractBirthmarkServicePrinter;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkServiceXmlPrinter extends AbstractBirthmarkServicePrinter{
+    public void printResult(PrintWriter out, BirthmarkSpi[] spilist){
+        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        out.println("<birthmark-result-set>");
+        out.println("  <birthmark-services>");
+        for(BirthmarkSpi spi: spilist){
+            out.println("    <birthmark-service>");
+            out.printf("      <type>%s</type>%n", spi.getType());
+            out.printf("      <display-name>%s</display-name>%n", spi.getDisplayType());
+            out.printf("      <description>%s</description>%n", spi.getDescription());
+            out.printf("      <class-name>%s</class-name>%n", spi.getClass().getName());
+            out.printf("      <extractor>%s</extractor>%n", spi.getExtractorClassName());
+            out.printf("      <comparator>%s</comparator>%n", spi.getComparatorClassName());
+            out.println("    </birthmark-service>");
+        }
+        out.println("  </birthmark-services>");
+        out.println("</birthmark-result-set>");
+
+        out.flush();
+    }
+}
@@ -1,68 +1,68 @@
-package jp.naist.se.stigmata.printer.xml;\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonPairElement;\r
-import jp.naist.se.stigmata.printer.AbstractComparisonPairPrinter;\r
-\r
-public class ComparisonPairXmlPrinter extends AbstractComparisonPairPrinter{\r
-    private ExtractionResultSetXmlPrinter list;\r
-\r
-    public ComparisonPairXmlPrinter(ExtractionResultSetXmlPrinter list){\r
-        this.list = list;\r
-    }\r
-\r
-    @Override\r
-    public void printResult(PrintWriter out, ComparisonPair pair){\r
-        printHeader(out);\r
-        out.println("  <extracted-birthmarks>");\r
-        list.printBirthmarkSet(out, pair.getTarget1());\r
-        list.printBirthmarkSet(out, pair.getTarget2());\r
-        out.println("  </extracted-birthmarks>");\r
-        out.println("  <comparison-result-set>");\r
-        printComparisonPair(out, pair);\r
-        out.println("  </comparison-result-set>");\r
-        printFooter(out);\r
-    }\r
-\r
-    @Override\r
-    public void printHeader(PrintWriter out){\r
-        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark-result-set>");\r
-    }\r
-\r
-    @Override\r
-    public void printFooter(PrintWriter out){\r
-        out.println("</birthmark-result-set>");\r
-        out.flush();\r
-    }\r
-    public void printComparisonPair(PrintWriter out, ComparisonPair pair){\r
-        out.println("    <comparison-result>");\r
-        printTarget(out, pair.getTarget1(), 1);\r
-        printTarget(out, pair.getTarget2(), 2);\r
-        out.println("      <birthmark-similarities>");\r
-        for(ComparisonPairElement element: pair){\r
-            printPairElement(out, element);\r
-        }\r
-        out.println("      </birthmark-similarities>");\r
-        out.print("      <similarity>");\r
-        out.print(pair.calculateSimilarity());\r
-        out.println("</similarity>");\r
-        out.println("    </comparison-result>");\r
-    }\r
-\r
-    private void printTarget(PrintWriter out, BirthmarkSet set, int index){\r
-        out.printf("      <target%d>%n", index);\r
-        out.printf("        <name>%s</name>%n", list.escapeToXmlString(set.getName()));\r
-        out.printf("        <location>%s</location>%n", list.escapeToXmlString(set.getLocation()));\r
-        out.printf("      </target%d>%n", index);\r
-    }\r
-\r
-    private void printPairElement(PrintWriter out, ComparisonPairElement e){\r
-        out.printf("        <birthmark-similarity type=\"%s\" comparison-count=\"%d\">%g</birthmark-similarity>%n",\r
-                   e.getType(), e.getComparisonCount(), e.getSimilarity());\r
-\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.xml;
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonPairElement;
+import jp.sourceforge.stigmata.printer.AbstractComparisonPairPrinter;
+
+public class ComparisonPairXmlPrinter extends AbstractComparisonPairPrinter{
+    private ExtractionResultSetXmlPrinter list;
+
+    public ComparisonPairXmlPrinter(ExtractionResultSetXmlPrinter list){
+        this.list = list;
+    }
+
+    @Override
+    public void printResult(PrintWriter out, ComparisonPair pair){
+        printHeader(out);
+        out.println("  <extracted-birthmarks>");
+        list.printBirthmarkSet(out, pair.getTarget1());
+        list.printBirthmarkSet(out, pair.getTarget2());
+        out.println("  </extracted-birthmarks>");
+        out.println("  <comparison-result-set>");
+        printComparisonPair(out, pair);
+        out.println("  </comparison-result-set>");
+        printFooter(out);
+    }
+
+    @Override
+    public void printHeader(PrintWriter out){
+        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        out.println("<birthmark-result-set>");
+    }
+
+    @Override
+    public void printFooter(PrintWriter out){
+        out.println("</birthmark-result-set>");
+        out.flush();
+    }
+    public void printComparisonPair(PrintWriter out, ComparisonPair pair){
+        out.println("    <comparison-result>");
+        printTarget(out, pair.getTarget1(), 1);
+        printTarget(out, pair.getTarget2(), 2);
+        out.println("      <birthmark-similarities>");
+        for(ComparisonPairElement element: pair){
+            printPairElement(out, element);
+        }
+        out.println("      </birthmark-similarities>");
+        out.print("      <similarity>");
+        out.print(pair.calculateSimilarity());
+        out.println("</similarity>");
+        out.println("    </comparison-result>");
+    }
+
+    private void printTarget(PrintWriter out, BirthmarkSet set, int index){
+        out.printf("      <target%d>%n", index);
+        out.printf("        <name>%s</name>%n", list.escapeToXmlString(set.getName()));
+        out.printf("        <location>%s</location>%n", list.escapeToXmlString(set.getLocation()));
+        out.printf("      </target%d>%n", index);
+    }
+
+    private void printPairElement(PrintWriter out, ComparisonPairElement e){
+        out.printf("        <birthmark-similarity type=\"%s\" comparison-count=\"%d\">%g</birthmark-similarity>%n",
+                   e.getType(), e.getComparisonCount(), e.getSimilarity());
+
+    }
+}
@@ -1,49 +1,49 @@
-package jp.naist.se.stigmata.printer.xml;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-import jp.naist.se.stigmata.printer.AbstractComparisonResultSetPrinter;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ComparisonResultSetXmlPrinter extends AbstractComparisonResultSetPrinter{\r
-    private ComparisonPairXmlPrinter pairPrinter;\r
-\r
-    public ComparisonResultSetXmlPrinter(ComparisonPairXmlPrinter pairPrinter){\r
-        this.pairPrinter = pairPrinter;\r
-    }\r
-\r
-    @Override\r
-    public void printHeader(PrintWriter out){\r
-        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark-result-set>");\r
-        out.println("  <comparison-result-set>");\r
-    }\r
-\r
-    @Override\r
-    public void printFooter(PrintWriter out){\r
-        out.println("  </comparison-result-set>");\r
-        out.println("</birthmark-result-set>");\r
-        out.flush();\r
-    }\r
-\r
-    @Override\r
-    public void printResult(PrintWriter out, ComparisonResultSet resultset){\r
-        printHeader(out);\r
-        for(ComparisonPair pair: resultset){\r
-            pairPrinter.printComparisonPair(out, pair);\r
-        }\r
-        printFooter(out);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.xml;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+import jp.sourceforge.stigmata.printer.AbstractComparisonResultSetPrinter;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ComparisonResultSetXmlPrinter extends AbstractComparisonResultSetPrinter{
+    private ComparisonPairXmlPrinter pairPrinter;
+
+    public ComparisonResultSetXmlPrinter(ComparisonPairXmlPrinter pairPrinter){
+        this.pairPrinter = pairPrinter;
+    }
+
+    @Override
+    public void printHeader(PrintWriter out){
+        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        out.println("<birthmark-result-set>");
+        out.println("  <comparison-result-set>");
+    }
+
+    @Override
+    public void printFooter(PrintWriter out){
+        out.println("  </comparison-result-set>");
+        out.println("</birthmark-result-set>");
+        out.flush();
+    }
+
+    @Override
+    public void printResult(PrintWriter out, ComparisonResultSet resultset){
+        printHeader(out);
+        for(ComparisonPair pair: resultset){
+            pairPrinter.printComparisonPair(out, pair);
+        }
+        printFooter(out);
+    }
+}
@@ -1,85 +1,85 @@
-package jp.naist.se.stigmata.printer.xml;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.PrintWriter;\r
-import java.util.Iterator;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.ExtractionTarget;\r
-import jp.naist.se.stigmata.printer.AbstractExtractionResultSetPrinter;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ExtractionResultSetXmlPrinter extends AbstractExtractionResultSetPrinter{\r
-    public void printResult(PrintWriter out, ExtractionResultSet ers){\r
-        printHeader(out);\r
-\r
-        out.printf("    <unit>%s</unit>%n", ers.getExtractionUnit());\r
-        out.printf("    <birthmark-types>%n");\r
-        for(String type: ers.getBirthmarkTypes()){\r
-            out.printf("      <birthmark-type>%s</birthmark-type>%n", type);\r
-        }\r
-        out.printf("    </birthmark-types>%n");\r
-        for(Iterator<BirthmarkSet> i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){\r
-            printBirthmarkSet(out, i.next());\r
-        }\r
-        printFooter(out);\r
-    }\r
-\r
-    public void printHeader(PrintWriter out){\r
-        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark-result-set>");\r
-        out.println("  <extracted-birthmarks>");\r
-    }\r
-\r
-    public void printFooter(PrintWriter out){\r
-        out.println("  </extracted-birthmarks>");\r
-        out.println("</birthmark-result-set>");\r
-        out.flush();\r
-    }\r
-\r
-    public void printBirthmarkSet(PrintWriter out, BirthmarkSet set){\r
-        out.println("    <extracted-birthmark>");\r
-        out.printf("      <name>%s</name>%n", escapeToXmlString(set.getName()));\r
-        out.printf("      <location>%s</location>%n", escapeToXmlString(set.getLocation()));\r
-        for(Iterator<String> i = set.birthmarkTypes(); i.hasNext(); ){\r
-            String type = i.next();\r
-            Birthmark birthmark = set.getBirthmark(type);\r
-            out.printf("      <birthmark type=\"%s\" count=\"%d\">%n",\r
-                       birthmark.getType(), birthmark.getElementCount());\r
-            for(Iterator<BirthmarkElement> elements = birthmark.iterator(); elements.hasNext(); ){\r
-                out.printf("        <element>%s</element>%n",\r
-                           escapeToXmlString(String.valueOf(elements.next())));\r
-            }\r
-            out.println("      </birthmark>");\r
-        }\r
-        out.println("    </extracted-birthmark>");\r
-    }\r
-\r
-    public String escapeToXmlString(Object o){\r
-        if(o != null){\r
-            return escapeToXmlString(o.toString());\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public String escapeToXmlString(String string){\r
-        string = string.replaceAll("&",  "&amp;");\r
-        string = string.replaceAll("\"", "&quot;");\r
-        string = string.replaceAll("<",  "&lt;");\r
-        string = string.replaceAll(">",  "&gt;");\r
-\r
-        return string;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.xml;
+
+/*
+ * $Id$
+ */
+
+import java.io.PrintWriter;
+import java.util.Iterator;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.printer.AbstractExtractionResultSetPrinter;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ExtractionResultSetXmlPrinter extends AbstractExtractionResultSetPrinter{
+    public void printResult(PrintWriter out, ExtractionResultSet ers){
+        printHeader(out);
+
+        out.printf("    <unit>%s</unit>%n", ers.getExtractionUnit());
+        out.printf("    <birthmark-types>%n");
+        for(String type: ers.getBirthmarkTypes()){
+            out.printf("      <birthmark-type>%s</birthmark-type>%n", type);
+        }
+        out.printf("    </birthmark-types>%n");
+        for(Iterator<BirthmarkSet> i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){
+            printBirthmarkSet(out, i.next());
+        }
+        printFooter(out);
+    }
+
+    public void printHeader(PrintWriter out){
+        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        out.println("<birthmark-result-set>");
+        out.println("  <extracted-birthmarks>");
+    }
+
+    public void printFooter(PrintWriter out){
+        out.println("  </extracted-birthmarks>");
+        out.println("</birthmark-result-set>");
+        out.flush();
+    }
+
+    public void printBirthmarkSet(PrintWriter out, BirthmarkSet set){
+        out.println("    <extracted-birthmark>");
+        out.printf("      <name>%s</name>%n", escapeToXmlString(set.getName()));
+        out.printf("      <location>%s</location>%n", escapeToXmlString(set.getLocation()));
+        for(Iterator<String> i = set.birthmarkTypes(); i.hasNext(); ){
+            String type = i.next();
+            Birthmark birthmark = set.getBirthmark(type);
+            out.printf("      <birthmark type=\"%s\" count=\"%d\">%n",
+                       birthmark.getType(), birthmark.getElementCount());
+            for(Iterator<BirthmarkElement> elements = birthmark.iterator(); elements.hasNext(); ){
+                out.printf("        <element>%s</element>%n",
+                           escapeToXmlString(String.valueOf(elements.next())));
+            }
+            out.println("      </birthmark>");
+        }
+        out.println("    </extracted-birthmark>");
+    }
+
+    public String escapeToXmlString(Object o){
+        if(o != null){
+            return escapeToXmlString(o.toString());
+        }
+        return null;
+    }
+
+    public String escapeToXmlString(String string){
+        string = string.replaceAll("&",  "&amp;");
+        string = string.replaceAll("\"", "&quot;");
+        string = string.replaceAll("<",  "&lt;");
+        string = string.replaceAll(">",  "&gt;");
+
+        return string;
+    }
+}
@@ -1,58 +1,58 @@
-package jp.naist.se.stigmata.printer.xml;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.printer.BirthmarkServicePrinter;\r
-import jp.naist.se.stigmata.printer.ComparisonPairPrinter;\r
-import jp.naist.se.stigmata.printer.ComparisonResultSetPrinter;\r
-import jp.naist.se.stigmata.printer.ExtractionResultSetPrinter;\r
-import jp.naist.se.stigmata.spi.AbstractServiceProvider;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class XmlResultPrinterService extends AbstractServiceProvider implements ResultPrinterSpi{\r
-    private BirthmarkServiceXmlPrinter serviceList = new BirthmarkServiceXmlPrinter();\r
-    private ExtractionResultSetXmlPrinter list = new ExtractionResultSetXmlPrinter();\r
-    private ComparisonPairXmlPrinter pairPrinter = new ComparisonPairXmlPrinter(list);\r
-    private ComparisonResultSetXmlPrinter compare = new ComparisonResultSetXmlPrinter(pairPrinter);\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDescription(\r
-            locale, getFormat(), LocalizedDescriptionManager.ServiceCategory.formatter\r
-        );\r
-    }\r
-\r
-    public String getFormat(){\r
-        return "xml";\r
-    }\r
-\r
-    public ComparisonResultSetPrinter getComparisonResultSetPrinter() {\r
-        return compare;\r
-    }\r
-\r
-    public ExtractionResultSetPrinter getExtractionResultSetPrinter() {\r
-        return list;\r
-    }\r
-\r
-    public BirthmarkServicePrinter getBirthmarkServicePrinter() {\r
-        return serviceList;\r
-    }\r
-\r
-    public ComparisonPairPrinter getComparisonPairPrinter(){\r
-        return pairPrinter;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.printer.xml;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.printer.BirthmarkServicePrinter;
+import jp.sourceforge.stigmata.printer.ComparisonPairPrinter;
+import jp.sourceforge.stigmata.printer.ComparisonResultSetPrinter;
+import jp.sourceforge.stigmata.printer.ExtractionResultSetPrinter;
+import jp.sourceforge.stigmata.spi.AbstractServiceProvider;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class XmlResultPrinterService extends AbstractServiceProvider implements ResultPrinterSpi{
+    private BirthmarkServiceXmlPrinter serviceList = new BirthmarkServiceXmlPrinter();
+    private ExtractionResultSetXmlPrinter list = new ExtractionResultSetXmlPrinter();
+    private ComparisonPairXmlPrinter pairPrinter = new ComparisonPairXmlPrinter(list);
+    private ComparisonResultSetXmlPrinter compare = new ComparisonResultSetXmlPrinter(pairPrinter);
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDescription(
+            locale, getFormat(), LocalizedDescriptionManager.ServiceCategory.formatter
+        );
+    }
+
+    public String getFormat(){
+        return "xml";
+    }
+
+    public ComparisonResultSetPrinter getComparisonResultSetPrinter() {
+        return compare;
+    }
+
+    public ExtractionResultSetPrinter getExtractionResultSetPrinter() {
+        return list;
+    }
+
+    public BirthmarkServicePrinter getBirthmarkServicePrinter() {
+        return serviceList;
+    }
+
+    public ComparisonPairPrinter getComparisonPairPrinter(){
+        return pairPrinter;
+    }
+}
@@ -1,30 +1,30 @@
-package jp.naist.se.stigmata.reader;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.URL;\r
-import java.util.Iterator;\r
-\r
-/**\r
- * abstract presentation of class file archive's location.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ClassFileArchive extends Iterable<ClassFileEntry>{\r
-    public URL getLocation();\r
-\r
-    public InputStream getInputStream(ClassFileEntry entry) throws IOException;\r
-\r
-    public Iterator<ClassFileEntry> iterator();\r
-\r
-    public boolean hasEntry(String className);\r
-\r
-    public ClassFileEntry getEntry(String className) throws ClassNotFoundException;\r
-\r
-    public String getName();\r
-}\r
+package jp.sourceforge.stigmata.reader;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Iterator;
+
+/**
+ * abstract presentation of class file archive's location.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ClassFileArchive extends Iterable<ClassFileEntry>{
+    public URL getLocation();
+
+    public InputStream getInputStream(ClassFileEntry entry) throws IOException;
+
+    public Iterator<ClassFileEntry> iterator();
+
+    public boolean hasEntry(String className);
+
+    public ClassFileEntry getEntry(String className) throws ClassNotFoundException;
+
+    public String getName();
+}
@@ -1,35 +1,35 @@
-package jp.naist.se.stigmata.reader;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.net.URL;\r
-\r
-/**\r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ClassFileEntry{\r
-    private URL location;\r
-    private String className;\r
-\r
-    public ClassFileEntry(String className, URL location){\r
-        this.className = className;\r
-        setLocation(location);\r
-    }\r
-\r
-    public String getClassName(){\r
-        return className;\r
-    }\r
-\r
-    public void setLocation(URL location){\r
-        this.location = location;\r
-    }\r
-\r
-    public URL getLocation(){\r
-        return location;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.reader;
+
+/*
+ * $Id$
+ */
+
+import java.net.URL;
+
+/**
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ClassFileEntry{
+    private URL location;
+    private String className;
+
+    public ClassFileEntry(String className, URL location){
+        this.className = className;
+        setLocation(location);
+    }
+
+    public String getClassName(){
+        return className;
+    }
+
+    public void setLocation(URL location){
+        this.location = location;
+    }
+
+    public URL getLocation(){
+        return location;
+    }
+}
-package jp.naist.se.stigmata.reader;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import jp.naist.se.stigmata.utils.WarClassLoader;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ClasspathContext implements Iterable<URL>{\r
-    private static ClasspathContext DEFAULT_CONTEXT = new ClasspathContext(false);\r
-\r
-    private ClasspathContext parent;\r
-    private List<URL> classpath = new ArrayList<URL>();\r
-    private ClassLoader loader = null;\r
-\r
-    /**\r
-     * private constructor for root context.\r
-     */\r
-    private ClasspathContext(boolean flag){\r
-    }\r
-\r
-    public ClasspathContext(){\r
-        this(DEFAULT_CONTEXT);\r
-    }\r
-\r
-    /**\r
-     * constructor with parent classpath context.\r
-     */\r
-    public ClasspathContext(ClasspathContext parent){\r
-        this.parent = parent;\r
-    }\r
-\r
-    /**\r
-     * returns parent classpath context.\r
-     */\r
-    public ClasspathContext getParent(){\r
-        return parent;\r
-    }\r
-\r
-    /**\r
-     * returns default classpath context.\r
-     */\r
-    public static final ClasspathContext getDefaultContext(){\r
-        return DEFAULT_CONTEXT;\r
-    }\r
-\r
-    /**\r
-     * adds given url to this context.  If this context already has given url or\r
-     * parent context has given url, this method do nothing.\r
-     */\r
-    public synchronized void addClasspath(URL url){\r
-        if(!contains(url)){\r
-            classpath.add(url);\r
-            loader = null;\r
-        }\r
-    }\r
-\r
-    /**\r
-     * returns that this context or parent context have given url.\r
-     */\r
-    public synchronized boolean contains(URL url){\r
-        return (parent != null && parent.contains(url)) || classpath.contains(url); \r
-    }\r
-\r
-    /**\r
-     * returns a size of classpath list, which this context and parent context have.\r
-     */\r
-    public int getClasspathSize(){\r
-        int count = classpath.size();\r
-        if(parent != null){\r
-            count += parent.getClasspathSize();\r
-        }\r
-        return count;\r
-    }\r
-\r
-    /**\r
-     * returns an array of all of classpathes include parent context.\r
-     */\r
-    public synchronized URL[] getClasspathList(){\r
-        List<URL> list = new ArrayList<URL>();\r
-        for(URL url: this){\r
-            list.add(url);\r
-        }\r
-        return list.toArray(new URL[list.size()]);\r
-    }\r
-\r
-    /**\r
-     * clears all of classpathes of this context. not clear parent context.\r
-     * If you want to clear this context and parent context, use {@link #clearAll <code>clearAll</code>} method.\r
-     * @see clearAll\r
-     */\r
-    public void clear(){\r
-        classpath.clear();\r
-    }\r
-\r
-    /**\r
-     * clears all of classpathes of this context and parent context.\r
-     */\r
-    public void clearAll(){\r
-        clear();\r
-        if(parent != null){\r
-            parent.clearAll();\r
-        }\r
-    }\r
-\r
-    public Iterator<URL> iterator(){\r
-        if(parent == null){\r
-            return classpath.iterator();\r
-        }\r
-        else{\r
-            final Iterator<URL> parentIterator = parent.iterator();\r
-            final Iterator<URL> thisIterator = classpath.iterator();\r
-            return new Iterator<URL>(){\r
-                public boolean hasNext(){\r
-                    boolean next = parentIterator.hasNext();\r
-                    if(!next){\r
-                        next = thisIterator.hasNext();\r
-                    }\r
-                    return next;\r
-                }\r
-                public URL next(){\r
-                    URL nextObject = null;\r
-                    if(parentIterator.hasNext()){\r
-                        nextObject = parentIterator.next();\r
-                    }\r
-                    else{\r
-                        nextObject = thisIterator.next();\r
-                    }\r
-                    return nextObject;\r
-                }\r
-                public void remove(){\r
-                }\r
-            };\r
-        }\r
-    }\r
-\r
-    public synchronized ClassLoader createClassLoader(){\r
-        if(loader == null){\r
-            List<URL> list = new ArrayList<URL>();\r
-            for(URL url: this){\r
-                list.add(url);\r
-            }\r
-\r
-            loader = new WarClassLoader(list.toArray(new URL[list.size()]), getClass().getClassLoader());\r
-        }\r
-        return loader;\r
-    }\r
-\r
-    public ClassFileEntry find(String className) throws ClassNotFoundException{\r
-        ClassLoader loader = createClassLoader();\r
-\r
-        URL resource = loader.getResource(className.replace('.', '/') + ".class");\r
-        if(resource != null){\r
-            return new ClassFileEntry(className, resource);\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public Class<?> findClass(String className) throws ClassNotFoundException{\r
-        try{\r
-            ClassLoader loader = createClassLoader();\r
-\r
-            return loader.loadClass(className);\r
-        } catch(NoClassDefFoundError e){\r
-            throw new ClassNotFoundException(e.getMessage(), e);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.reader;
+
+/*
+ * $Id$
+ */
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import jp.sourceforge.stigmata.utils.WarClassLoader;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ClasspathContext implements Iterable<URL>{
+    private static ClasspathContext DEFAULT_CONTEXT = new ClasspathContext(false);
+
+    private ClasspathContext parent;
+    private List<URL> classpath = new ArrayList<URL>();
+    private ClassLoader loader = null;
+
+    /**
+     * private constructor for root context.
+     */
+    private ClasspathContext(boolean flag){
+    }
+
+    public ClasspathContext(){
+        this(DEFAULT_CONTEXT);
+    }
+
+    /**
+     * constructor with parent classpath context.
+     */
+    public ClasspathContext(ClasspathContext parent){
+        this.parent = parent;
+    }
+
+    /**
+     * returns parent classpath context.
+     */
+    public ClasspathContext getParent(){
+        return parent;
+    }
+
+    /**
+     * returns default classpath context.
+     */
+    public static final ClasspathContext getDefaultContext(){
+        return DEFAULT_CONTEXT;
+    }
+
+    /**
+     * adds given url to this context.  If this context already has given url or
+     * parent context has given url, this method do nothing.
+     */
+    public synchronized void addClasspath(URL url){
+        if(!contains(url)){
+            classpath.add(url);
+            loader = null;
+        }
+    }
+
+    /**
+     * returns that this context or parent context have given url.
+     */
+    public synchronized boolean contains(URL url){
+        return (parent != null && parent.contains(url)) || classpath.contains(url); 
+    }
+
+    /**
+     * returns a size of classpath list, which this context and parent context have.
+     */
+    public int getClasspathSize(){
+        int count = classpath.size();
+        if(parent != null){
+            count += parent.getClasspathSize();
+        }
+        return count;
+    }
+
+    /**
+     * returns an array of all of classpathes include parent context.
+     */
+    public synchronized URL[] getClasspathList(){
+        List<URL> list = new ArrayList<URL>();
+        for(URL url: this){
+            list.add(url);
+        }
+        return list.toArray(new URL[list.size()]);
+    }
+
+    /**
+     * clears all of classpathes of this context. not clear parent context.
+     * If you want to clear this context and parent context, use {@link #clearAll <code>clearAll</code>} method.
+     * @see clearAll
+     */
+    public void clear(){
+        classpath.clear();
+    }
+
+    /**
+     * clears all of classpathes of this context and parent context.
+     */
+    public void clearAll(){
+        clear();
+        if(parent != null){
+            parent.clearAll();
+        }
+    }
+
+    public Iterator<URL> iterator(){
+        if(parent == null){
+            return classpath.iterator();
+        }
+        else{
+            final Iterator<URL> parentIterator = parent.iterator();
+            final Iterator<URL> thisIterator = classpath.iterator();
+            return new Iterator<URL>(){
+                public boolean hasNext(){
+                    boolean next = parentIterator.hasNext();
+                    if(!next){
+                        next = thisIterator.hasNext();
+                    }
+                    return next;
+                }
+                public URL next(){
+                    URL nextObject = null;
+                    if(parentIterator.hasNext()){
+                        nextObject = parentIterator.next();
+                    }
+                    else{
+                        nextObject = thisIterator.next();
+                    }
+                    return nextObject;
+                }
+                public void remove(){
+                }
+            };
+        }
+    }
+
+    public synchronized ClassLoader createClassLoader(){
+        if(loader == null){
+            List<URL> list = new ArrayList<URL>();
+            for(URL url: this){
+                list.add(url);
+            }
+
+            loader = new WarClassLoader(list.toArray(new URL[list.size()]), getClass().getClassLoader());
+        }
+        return loader;
+    }
+
+    public ClassFileEntry find(String className) throws ClassNotFoundException{
+        ClassLoader loader = createClassLoader();
+
+        URL resource = loader.getResource(className.replace('.', '/') + ".class");
+        if(resource != null){
+            return new ClassFileEntry(className, resource);
+        }
+        return null;
+    }
+
+    public Class<?> findClass(String className) throws ClassNotFoundException{
+        try{
+            ClassLoader loader = createClassLoader();
+
+            return loader.loadClass(className);
+        } catch(NoClassDefFoundError e){
+            throw new ClassNotFoundException(e.getMessage(), e);
+        }
+    }
+}
-package jp.naist.se.stigmata.reader;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.FileNotFoundException;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.objectweb.asm.ClassReader;\r
-import org.objectweb.asm.commons.EmptyVisitor;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class DefaultClassFileArchive implements ClassFileArchive{\r
-    private File file;\r
-    private String className;\r
-    \r
-    public DefaultClassFileArchive(String file){\r
-        this(new File(file));\r
-    }\r
-    \r
-    public DefaultClassFileArchive(File file){\r
-        this.file = file;\r
-        parseClassName();\r
-    }\r
-    \r
-    public DefaultClassFileArchive(String file, String className){\r
-        this(new File(file), className);\r
-    }\r
-    \r
-    public DefaultClassFileArchive(File file, String className){\r
-        this.file = file;\r
-        this.className = className;\r
-    }\r
-\r
-    public URL getLocation(){\r
-        try {\r
-            return file.toURI().toURL();\r
-        } catch (MalformedURLException ex) {\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public InputStream getInputStream(ClassFileEntry entry) throws IOException{\r
-        return new FileInputStream(file);\r
-    }\r
-\r
-    public Iterator<ClassFileEntry> iterator(){\r
-        List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();\r
-        list.add(new ClassFileEntry(className, getLocation()));\r
-\r
-        return list.iterator();\r
-    }\r
-\r
-    public boolean hasEntry(String className){\r
-        return this.className.equals(className);\r
-    }\r
-\r
-    public ClassFileEntry getEntry(String className) throws ClassNotFoundException{\r
-        return new ClassFileEntry(className, getLocation());\r
-    }\r
-\r
-    public String getName(){\r
-        return className;\r
-    }\r
-\r
-    private void parseClassName(){\r
-        FileInputStream in = null;\r
-        try {\r
-            in = new FileInputStream(file);\r
-            ClassReader reader = new ClassReader(in);\r
-            ClassNameExtractVisitor visitor = new ClassNameExtractVisitor();\r
-            reader.accept(visitor, true);\r
-\r
-            this.className = visitor.getClassName();\r
-        } catch (FileNotFoundException ex) {\r
-            ex.printStackTrace();\r
-        } catch (IOException ex) {\r
-            ex.printStackTrace();\r
-        } finally{\r
-            if(in != null){\r
-                try{\r
-                    in.close();\r
-                } catch(IOException e){\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    private static class ClassNameExtractVisitor extends EmptyVisitor{\r
-        private String className;\r
-\r
-        public String getClassName(){\r
-            return className;\r
-        }\r
-\r
-        @Override\r
-        public void visit(int version, int access, String name, String signature, \r
-                String superClassName, String[] interfaces){\r
-            className = name;\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.reader;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.commons.EmptyVisitor;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class DefaultClassFileArchive implements ClassFileArchive{
+    private File file;
+    private String className;
+    
+    public DefaultClassFileArchive(String file){
+        this(new File(file));
+    }
+    
+    public DefaultClassFileArchive(File file){
+        this.file = file;
+        parseClassName();
+    }
+    
+    public DefaultClassFileArchive(String file, String className){
+        this(new File(file), className);
+    }
+    
+    public DefaultClassFileArchive(File file, String className){
+        this.file = file;
+        this.className = className;
+    }
+
+    public URL getLocation(){
+        try {
+            return file.toURI().toURL();
+        } catch (MalformedURLException ex) {
+        }
+        return null;
+    }
+
+    public InputStream getInputStream(ClassFileEntry entry) throws IOException{
+        return new FileInputStream(file);
+    }
+
+    public Iterator<ClassFileEntry> iterator(){
+        List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();
+        list.add(new ClassFileEntry(className, getLocation()));
+
+        return list.iterator();
+    }
+
+    public boolean hasEntry(String className){
+        return this.className.equals(className);
+    }
+
+    public ClassFileEntry getEntry(String className) throws ClassNotFoundException{
+        return new ClassFileEntry(className, getLocation());
+    }
+
+    public String getName(){
+        return className;
+    }
+
+    private void parseClassName(){
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(file);
+            ClassReader reader = new ClassReader(in);
+            ClassNameExtractVisitor visitor = new ClassNameExtractVisitor();
+            reader.accept(visitor, true);
+
+            this.className = visitor.getClassName();
+        } catch (FileNotFoundException ex) {
+            ex.printStackTrace();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        } finally{
+            if(in != null){
+                try{
+                    in.close();
+                } catch(IOException e){
+                }
+            }
+        }
+    }
+
+    private static class ClassNameExtractVisitor extends EmptyVisitor{
+        private String className;
+
+        public String getClassName(){
+            return className;
+        }
+
+        @Override
+        public void visit(int version, int access, String name, String signature, 
+                String superClassName, String[] interfaces){
+            className = name;
+        }
+    }
+}
@@ -1,95 +1,95 @@
-package jp.naist.se.stigmata.reader;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Enumeration;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.jar.JarEntry;\r
-import java.util.jar.JarFile;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class JarClassFileArchive implements ClassFileArchive{\r
-    private File file;\r
-    private JarFile jarfile;\r
-    private URL jarfileLocation;\r
-\r
-    public JarClassFileArchive(String jarfile) throws IOException{\r
-        this.file = new File(jarfile);\r
-        this.jarfile = new JarFile(jarfile);\r
-        this.jarfileLocation = file.toURI().toURL();\r
-    }\r
-\r
-    public URL getLocation(){\r
-        return jarfileLocation;\r
-    }\r
-\r
-    public String getName(){\r
-        return file.getName();\r
-    }\r
-\r
-    public InputStream getInputStream(ClassFileEntry entry) throws IOException{\r
-        if(hasEntry(entry.getClassName())){\r
-            return jarfile.getInputStream(jarfile.getEntry(entry.getClassName().replace('.', '/') + ".class"));\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public Iterator<ClassFileEntry> iterator(){\r
-        List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();\r
-        \r
-        for(Enumeration<JarEntry> e = jarfile.entries(); e.hasMoreElements(); ){\r
-            JarEntry entry = e.nextElement();\r
-            if(entry.getName().endsWith(".class")){\r
-                URL location = null;\r
-                try {\r
-                    location = new URL("jar:" + getLocation() + "!/" + entry.getName());\r
-                    String className = entry.getName();\r
-                    className = className.substring(0, className.length() - ".class".length());\r
-                    className = className.replace('/', '.');\r
-                    \r
-                    list.add(new ClassFileEntry(className, location));\r
-                } catch (MalformedURLException ex) {\r
-                }\r
-            }\r
-        }\r
-        return list.iterator();\r
-    }\r
-\r
-    public boolean hasEntry(String className){\r
-        return jarfile.getEntry(className.replace('.', '/') + ".class") != null;\r
-    }\r
-\r
-    public ClassFileEntry getEntry(String className) throws ClassNotFoundException{\r
-        if(hasEntry(className)){\r
-            String entryName = className.replace('.', '/') + ".class";\r
-            try{\r
-                URL location = new URL("jar:" + jarfile.getName() + "!/" + entryName);\r
-                \r
-                return new ClassFileEntry(className, location);\r
-            } catch(MalformedURLException e){\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-\r
-    Enumeration<JarEntry> jarentries(){\r
-        return jarfile.entries();\r
-    }\r
-\r
-    boolean hasJarEntry(String entry){\r
-        return jarfile.getEntry(entry) != null;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.reader;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class JarClassFileArchive implements ClassFileArchive{
+    private File file;
+    private JarFile jarfile;
+    private URL jarfileLocation;
+
+    public JarClassFileArchive(String jarfile) throws IOException{
+        this.file = new File(jarfile);
+        this.jarfile = new JarFile(jarfile);
+        this.jarfileLocation = file.toURI().toURL();
+    }
+
+    public URL getLocation(){
+        return jarfileLocation;
+    }
+
+    public String getName(){
+        return file.getName();
+    }
+
+    public InputStream getInputStream(ClassFileEntry entry) throws IOException{
+        if(hasEntry(entry.getClassName())){
+            return jarfile.getInputStream(jarfile.getEntry(entry.getClassName().replace('.', '/') + ".class"));
+        }
+        return null;
+    }
+
+    public Iterator<ClassFileEntry> iterator(){
+        List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();
+        
+        for(Enumeration<JarEntry> e = jarfile.entries(); e.hasMoreElements(); ){
+            JarEntry entry = e.nextElement();
+            if(entry.getName().endsWith(".class")){
+                URL location = null;
+                try {
+                    location = new URL("jar:" + getLocation() + "!/" + entry.getName());
+                    String className = entry.getName();
+                    className = className.substring(0, className.length() - ".class".length());
+                    className = className.replace('/', '.');
+                    
+                    list.add(new ClassFileEntry(className, location));
+                } catch (MalformedURLException ex) {
+                }
+            }
+        }
+        return list.iterator();
+    }
+
+    public boolean hasEntry(String className){
+        return jarfile.getEntry(className.replace('.', '/') + ".class") != null;
+    }
+
+    public ClassFileEntry getEntry(String className) throws ClassNotFoundException{
+        if(hasEntry(className)){
+            String entryName = className.replace('.', '/') + ".class";
+            try{
+                URL location = new URL("jar:" + jarfile.getName() + "!/" + entryName);
+                
+                return new ClassFileEntry(className, location);
+            } catch(MalformedURLException e){
+            }
+        }
+        return null;
+    }
+
+    Enumeration<JarEntry> jarentries(){
+        return jarfile.entries();
+    }
+
+    boolean hasJarEntry(String entry){
+        return jarfile.getEntry(entry) != null;
+    }
+}
@@ -1,74 +1,74 @@
-package jp.naist.se.stigmata.reader;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Enumeration;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.jar.JarEntry;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class WarClassFileArchive extends JarClassFileArchive{\r
-    public WarClassFileArchive(String jarfile) throws IOException{\r
-        super(jarfile);\r
-    }\r
-\r
-    public InputStream getInputStream(ClassFileEntry entry) throws IOException{\r
-        if(hasEntry(entry.getClassName())){\r
-            return entry.getLocation().openStream();\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public Iterator<ClassFileEntry> iterator(){\r
-        List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();\r
-\r
-        for(Enumeration<JarEntry> e = jarentries(); e.hasMoreElements(); ){\r
-            JarEntry entry = e.nextElement();\r
-            if(entry.getName().endsWith(".class")){\r
-                URL location = null;\r
-                try {\r
-                    location = new URL("jar:" + getLocation() + "!/" + entry.getName());\r
-                    String className = entry.getName();\r
-                    className = className.substring("WEB-INF/classes/".length(), className.length() - ".class".length());\r
-                    className = className.replace('/', '.');\r
-\r
-                    list.add(new ClassFileEntry(className, location));\r
-                } catch (MalformedURLException ex) {\r
-                    ex.printStackTrace();\r
-                }\r
-            }\r
-        }\r
-        return list.iterator();\r
-    }\r
-\r
-    public boolean hasEntry(String className){\r
-        return hasJarEntry("WEB-INF/classes/" + className.replace('.', '/') + ".class");\r
-    }\r
-\r
-    public ClassFileEntry getEntry(String className) throws ClassNotFoundException{\r
-        if(hasEntry(className)){\r
-            String entryName = className.replace('.', '/') + ".class";\r
-            try{\r
-                URL location = new URL("jar:" + getLocation() + "!/WEB-INF/classes/" + entryName);\r
-\r
-                return new ClassFileEntry(className, location);\r
-            } catch(MalformedURLException e){\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.reader;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.JarEntry;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class WarClassFileArchive extends JarClassFileArchive{
+    public WarClassFileArchive(String jarfile) throws IOException{
+        super(jarfile);
+    }
+
+    public InputStream getInputStream(ClassFileEntry entry) throws IOException{
+        if(hasEntry(entry.getClassName())){
+            return entry.getLocation().openStream();
+        }
+        return null;
+    }
+
+    public Iterator<ClassFileEntry> iterator(){
+        List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();
+
+        for(Enumeration<JarEntry> e = jarentries(); e.hasMoreElements(); ){
+            JarEntry entry = e.nextElement();
+            if(entry.getName().endsWith(".class")){
+                URL location = null;
+                try {
+                    location = new URL("jar:" + getLocation() + "!/" + entry.getName());
+                    String className = entry.getName();
+                    className = className.substring("WEB-INF/classes/".length(), className.length() - ".class".length());
+                    className = className.replace('/', '.');
+
+                    list.add(new ClassFileEntry(className, location));
+                } catch (MalformedURLException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
+        return list.iterator();
+    }
+
+    public boolean hasEntry(String className){
+        return hasJarEntry("WEB-INF/classes/" + className.replace('.', '/') + ".class");
+    }
+
+    public ClassFileEntry getEntry(String className) throws ClassNotFoundException{
+        if(hasEntry(className)){
+            String entryName = className.replace('.', '/') + ".class";
+            try{
+                URL location = new URL("jar:" + getLocation() + "!/WEB-INF/classes/" + entryName);
+
+                return new ClassFileEntry(className, location);
+            } catch(MalformedURLException e){
+            }
+        }
+        return null;
+    }
+}
@@ -1,92 +1,92 @@
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.Array;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\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.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-\r
-/**\r
- * Abstract class for ComparisonResultSet.\r
- *\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractComparisonResultSet implements ComparisonResultSet{\r
-    protected ExtractionResultSet extraction;\r
-    private int count = -1;\r
-\r
-    public AbstractComparisonResultSet(ExtractionResultSet extraction){\r
-        this.extraction = extraction;\r
-    }\r
-\r
-    public abstract Iterator<ComparisonPair> iterator();\r
-\r
-    public abstract Iterator<BirthmarkSet> pairSources();\r
-\r
-    public synchronized BirthmarkSet[] getPairSources(){\r
-        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(pairSources(), new BirthmarkSet[0]);\r
-    }\r
-\r
-    public int getPairCount(){\r
-        if(count < 0){\r
-            int calculateCount = 0;\r
-            for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){\r
-                calculateCount++;\r
-                i.next();\r
-            }\r
-            this.count = calculateCount;\r
-        }\r
-        return count;\r
-    }\r
-\r
-    public synchronized ComparisonPair[] getPairs(){\r
-        return AbstractComparisonResultSet.<ComparisonPair>getArrays(iterator(), new ComparisonPair[0]);\r
-    }\r
-\r
-    public ComparisonPair getPairAt(int index){\r
-        int currentIndex = 0;\r
-        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){\r
-            ComparisonPair pair = i.next();\r
-            if(currentIndex == index){\r
-                return pair;\r
-            }\r
-            currentIndex++;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public BirthmarkContext getContext(){\r
-        return extraction.getContext();\r
-    }\r
-\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return extraction.getEnvironment();\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    static synchronized <T> T[] getArrays(Iterator<T> i, T[] array){\r
-        List<Object> list = new ArrayList<Object>();\r
-        while(i.hasNext()){\r
-            list.add(i.next());\r
-        }\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
-        return array;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+
+/**
+ * Abstract class for ComparisonResultSet.
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractComparisonResultSet implements ComparisonResultSet{
+    protected ExtractionResultSet extraction;
+    private int count = -1;
+
+    public AbstractComparisonResultSet(ExtractionResultSet extraction){
+        this.extraction = extraction;
+    }
+
+    public abstract Iterator<ComparisonPair> iterator();
+
+    public abstract Iterator<BirthmarkSet> pairSources();
+
+    public synchronized BirthmarkSet[] getPairSources(){
+        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(pairSources(), new BirthmarkSet[0]);
+    }
+
+    public int getPairCount(){
+        if(count < 0){
+            int calculateCount = 0;
+            for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
+                calculateCount++;
+                i.next();
+            }
+            this.count = calculateCount;
+        }
+        return count;
+    }
+
+    public synchronized ComparisonPair[] getPairs(){
+        return AbstractComparisonResultSet.<ComparisonPair>getArrays(iterator(), new ComparisonPair[0]);
+    }
+
+    public ComparisonPair getPairAt(int index){
+        int currentIndex = 0;
+        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
+            ComparisonPair pair = i.next();
+            if(currentIndex == index){
+                return pair;
+            }
+            currentIndex++;
+        }
+        return null;
+    }
+
+    public BirthmarkContext getContext(){
+        return extraction.getContext();
+    }
+
+    public BirthmarkEnvironment getEnvironment(){
+        return extraction.getEnvironment();
+    }
+
+    @SuppressWarnings("unchecked")
+    static synchronized <T> T[] getArrays(Iterator<T> i, T[] array){
+        List<Object> list = new ArrayList<Object>();
+        while(i.hasNext()){
+            list.add(i.next());
+        }
+
+        if(list.size() > array.length){
+            array = (T[])Array.newInstance(array.getClass().getComponentType(), list.size());
+        }
+        for(int index = 0; index < list.size(); index++){
+            array[index] = (T)list.get(index);
+        }
+        return array;
+    }
+}
-package jp.naist.se.stigmata.result;\r
-\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
-import jp.naist.se.stigmata.ExtractionUnit;\r
-\r
-/**\r
- * Abstract class for ExtractionResultSet.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractExtractionResultSet implements ExtractionResultSet{\r
-    private BirthmarkContext context;\r
-    private boolean tableType = true;\r
-    private String id;\r
-\r
-    /**\r
-     * constructor.\r
-     */\r
-    public AbstractExtractionResultSet(BirthmarkContext context){\r
-        this(context, true);\r
-    }\r
-\r
-    /**\r
-     * constructor.\r
-     */\r
-    public AbstractExtractionResultSet(BirthmarkContext context, boolean tableType){\r
-        this.context = context;\r
-        id = generateId();\r
-    }\r
-\r
-    void setId(String id){\r
-        this.id = id;\r
-    }\r
-\r
-    public String getId(){\r
-        return id;\r
-    }\r
-\r
-    /**\r
-     * returns a birthmark environment.\r
-     */\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return context.getEnvironment();\r
-    }\r
-\r
-    /**\r
-     * returns a birthmark context.\r
-     */\r
-    public BirthmarkContext getContext(){\r
-        return context;\r
-    }\r
-\r
-    public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;\r
-\r
-    public abstract void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
-\r
-    public abstract void removeAllBirthmarkSets(ExtractionTarget target);\r
-\r
-    public abstract int getBirthmarkSetSize(ExtractionTarget target);\r
-\r
-    public abstract Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target);\r
-\r
-    /**\r
-     * returns the sum of birthmark set size this instance has.\r
-     * <code>getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH)</code>\r
-     */\r
-    public int getBirthmarkSetSize(){\r
-        return getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH);\r
-    }\r
-\r
-    /**\r
-     * returns an iterator.\r
-     * <code>birthmarkSets(ExtractionTarget.TARGET_BOTH)</code>\r
-     */\r
-    public Iterator<BirthmarkSet> iterator(){\r
-        return birthmarkSets(ExtractionTarget.TARGET_BOTH);\r
-    }\r
-\r
-    /**\r
-     * returns a birthmark set related of given index.\r
-     * <code>getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index)</code>\r
-     */\r
-    public BirthmarkSet getBirthmarkSet(int index){\r
-        return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index);\r
-    }\r
-\r
-    /**\r
-     * returns a birthmark set related with given name.\r
-     * <code>getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name)</code>\r
-     */\r
-    public BirthmarkSet getBirthmarkSet(String name){\r
-        return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name);\r
-    }\r
-\r
-    /**\r
-     * returns all of birthmark sets.\r
-     * <code>getBirthmarkSets(ExtractionTarget.TARGET_BOTH)</code>\r
-     */\r
-    public BirthmarkSet[] getBirthmarkSets(){\r
-        return getBirthmarkSets(ExtractionTarget.TARGET_BOTH);\r
-    }\r
-\r
-    /**\r
-     * remove specified birthmark set from this instance.\r
-     * <code>removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs)</code>\r
-     */\r
-    public void removeBirthmarkSet(BirthmarkSet bs){\r
-        removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs);\r
-    }\r
-\r
-    /**\r
-     * remove all of birthmark sets.\r
-     * <code>removeBirthmarkSet(ExtractionTarget.TARGET_BOTH)</code>\r
-     */\r
-    public void removeAllBirthmarkSets(){\r
-        removeAllBirthmarkSets(ExtractionTarget.TARGET_BOTH);\r
-    }\r
-\r
-    /**\r
-     * returns an array of extracted birthmark types.\r
-     */\r
-    public String[] getBirthmarkTypes(){\r
-        return context.getBirthmarkTypes();\r
-    }\r
-\r
-    /**\r
-     * returns an unit of extraction from.\r
-     */\r
-    public ExtractionUnit getExtractionUnit(){\r
-        return context.getExtractionUnit();\r
-    }\r
-\r
-    /**\r
-     * returns the birthmark set at the specified position in the specified target. \r
-     */\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){\r
-        int currentIndex = 0;\r
-        for(Iterator<BirthmarkSet> i = birthmarkSets(target); i.hasNext(); ){\r
-            if(currentIndex == index){\r
-                return i.next();\r
-            }\r
-            i.next();\r
-            currentIndex++;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * returns the birthmark set related with the specified name in the specified target.\r
-     */\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname){\r
-        for(Iterator<BirthmarkSet> i = birthmarkSets(target); i.hasNext(); ){\r
-            BirthmarkSet bs = i.next();\r
-            if(bs.getName().equals(setname)){\r
-                return bs;\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-\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), new BirthmarkSet[0]);\r
-    }\r
-\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
-        }\r
-    }\r
-\r
-    public boolean isTableType(){\r
-        return tableType;\r
-    }\r
-\r
-    public void setTableType(boolean flag){\r
-        this.tableType = flag;\r
-    }\r
-\r
-    protected static String generateId(){\r
-        SimpleDateFormat cdf = new SimpleDateFormat("yyyyMMdd-HHmmss.SSS");\r
-        return cdf.format(Calendar.getInstance().getTime());\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Iterator;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreException;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.ExtractionUnit;
+
+/**
+ * Abstract class for ExtractionResultSet.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractExtractionResultSet implements ExtractionResultSet{
+    private BirthmarkContext context;
+    private boolean tableType = true;
+    private String id;
+
+    /**
+     * constructor.
+     */
+    public AbstractExtractionResultSet(BirthmarkContext context){
+        this(context, true);
+    }
+
+    /**
+     * constructor.
+     */
+    public AbstractExtractionResultSet(BirthmarkContext context, boolean tableType){
+        this.context = context;
+        id = generateId();
+    }
+
+    void setId(String id){
+        this.id = id;
+    }
+
+    public String getId(){
+        return id;
+    }
+
+    /**
+     * returns a birthmark environment.
+     */
+    public BirthmarkEnvironment getEnvironment(){
+        return context.getEnvironment();
+    }
+
+    /**
+     * returns a birthmark context.
+     */
+    public BirthmarkContext getContext(){
+        return context;
+    }
+
+    public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;
+
+    public abstract void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set);
+
+    public abstract void removeAllBirthmarkSets(ExtractionTarget target);
+
+    public abstract int getBirthmarkSetSize(ExtractionTarget target);
+
+    public abstract Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target);
+
+    /**
+     * returns the sum of birthmark set size this instance has.
+     * <code>getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH)</code>
+     */
+    public int getBirthmarkSetSize(){
+        return getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH);
+    }
+
+    /**
+     * returns an iterator.
+     * <code>birthmarkSets(ExtractionTarget.TARGET_BOTH)</code>
+     */
+    public Iterator<BirthmarkSet> iterator(){
+        return birthmarkSets(ExtractionTarget.TARGET_BOTH);
+    }
+
+    /**
+     * returns a birthmark set related of given index.
+     * <code>getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index)</code>
+     */
+    public BirthmarkSet getBirthmarkSet(int index){
+        return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index);
+    }
+
+    /**
+     * returns a birthmark set related with given name.
+     * <code>getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name)</code>
+     */
+    public BirthmarkSet getBirthmarkSet(String name){
+        return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name);
+    }
+
+    /**
+     * returns all of birthmark sets.
+     * <code>getBirthmarkSets(ExtractionTarget.TARGET_BOTH)</code>
+     */
+    public BirthmarkSet[] getBirthmarkSets(){
+        return getBirthmarkSets(ExtractionTarget.TARGET_BOTH);
+    }
+
+    /**
+     * remove specified birthmark set from this instance.
+     * <code>removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs)</code>
+     */
+    public void removeBirthmarkSet(BirthmarkSet bs){
+        removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs);
+    }
+
+    /**
+     * remove all of birthmark sets.
+     * <code>removeBirthmarkSet(ExtractionTarget.TARGET_BOTH)</code>
+     */
+    public void removeAllBirthmarkSets(){
+        removeAllBirthmarkSets(ExtractionTarget.TARGET_BOTH);
+    }
+
+    /**
+     * returns an array of extracted birthmark types.
+     */
+    public String[] getBirthmarkTypes(){
+        return context.getBirthmarkTypes();
+    }
+
+    /**
+     * returns an unit of extraction from.
+     */
+    public ExtractionUnit getExtractionUnit(){
+        return context.getExtractionUnit();
+    }
+
+    /**
+     * returns the birthmark set at the specified position in the specified target. 
+     */
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){
+        int currentIndex = 0;
+        for(Iterator<BirthmarkSet> i = birthmarkSets(target); i.hasNext(); ){
+            if(currentIndex == index){
+                return i.next();
+            }
+            i.next();
+            currentIndex++;
+        }
+        return null;
+    }
+
+    /**
+     * returns the birthmark set related with the specified name in the specified target.
+     */
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname){
+        for(Iterator<BirthmarkSet> i = birthmarkSets(target); i.hasNext(); ){
+            BirthmarkSet bs = i.next();
+            if(bs.getName().equals(setname)){
+                return bs;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @return all of BirthmarkSet this instance have. elements is obtained from birthmarkSet.
+     */
+    public synchronized BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){
+        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(birthmarkSets(target), new BirthmarkSet[0]);
+    }
+
+    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException{
+        removeAllBirthmarkSets(target);
+        for(int i = 0; i < sets.length; i++){
+            addBirthmarkSet(target, sets[i]);
+        }
+    }
+
+    public boolean isTableType(){
+        return tableType;
+    }
+
+    public void setTableType(boolean flag){
+        this.tableType = flag;
+    }
+
+    protected static String generateId(){
+        SimpleDateFormat cdf = new SimpleDateFormat("yyyyMMdd-HHmmss.SSS");
+        return cdf.format(Calendar.getInstance().getTime());
+    }
+}
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.net.URL;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\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
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkServiceManager;\r
-\r
-/**\r
- * Concrete class for ComparisonResultSet. This instance compare class files by\r
- * certain pair. The pair is guessed by system with class name, or specified by\r
- * user.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class CertainPairComparisonResultSet extends AbstractComparisonResultSet{\r
-    private int compareCount = -1;\r
-    private Collection<BirthmarkSet> sources = null;\r
-\r
-    public CertainPairComparisonResultSet(ExtractionResultSet extraction){\r
-        super(extraction);\r
-    }\r
-\r
-    public CertainPairComparisonResultSet(ExtractionResultSet extraction, Map<String, String> nameMap){\r
-        super(extraction);\r
-        BirthmarkContext context = extraction.getContext();\r
-        for(Map.Entry<String, String> entry: nameMap.entrySet()){\r
-            context.addNameMapping(entry.getKey(), entry.getValue());\r
-        }\r
-    }\r
-\r
-    /**\r
-     * This constructor is the comparison pair list is specified.\r
-     */\r
-    public CertainPairComparisonResultSet(ComparisonPair[] pairs, BirthmarkContext context){\r
-        super(createExtractionResultSet(pairs, context));\r
-    }\r
-\r
-    /**\r
-     * This constructor is the comparison pair was guessed with class name.\r
-     */\r
-    public CertainPairComparisonResultSet(BirthmarkSet[] targetX,\r
-            BirthmarkSet[] targetY, BirthmarkContext context){\r
-        super(createExtractionResultSet(targetX, targetY, context));\r
-    }\r
-\r
-    /**\r
-     * This constructor is the comparison pair was specified as mapping.\r
-     */\r
-    public CertainPairComparisonResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY,\r
-            Map<String, String> mapping, BirthmarkContext context){\r
-        super(createExtractionResultSet(targetX, targetY, context));\r
-\r
-        for(Map.Entry<String, String> entry : mapping.entrySet()){\r
-            context.addNameMapping(entry.getKey(), entry.getValue());\r
-        }\r
-    }\r
-\r
-    /**\r
-     * return comparison count.\r
-     */\r
-    @Override\r
-    public int getPairCount(){\r
-        BirthmarkContext context = getContext();\r
-        if(compareCount < 0){\r
-            int count = 0;\r
-            if(context.hasNameMapping()){\r
-                count = context.getNameMappingCount();\r
-            }\r
-            else{\r
-                count = super.getPairCount();\r
-            }\r
-            compareCount = count;\r
-        }\r
-        return compareCount;\r
-    }\r
-\r
-    /**\r
-     * return the iterator of each pair.\r
-     */\r
-    @Override\r
-    public Iterator<ComparisonPair> iterator(){\r
-        Iterator<ComparisonPair> iterator = null;\r
-        final BirthmarkContext context = getContext();\r
-        if(context.hasNameMapping()){\r
-            iterator = new NameMappingIterator(extraction);\r
-        }\r
-        else{\r
-            iterator = new NameFindIterator(extraction);\r
-        }\r
-        return iterator;\r
-    }\r
-\r
-    @Override\r
-    public Iterator<BirthmarkSet> pairSources(){\r
-        if(sources == null){\r
-            sources = createSources();\r
-        }\r
-        return sources.iterator();\r
-    }\r
-\r
-    public BirthmarkSet[] getPairSources(){\r
-        if(sources == null){\r
-            sources = createSources();\r
-        }\r
-        return sources.toArray(new BirthmarkSet[sources.size()]);\r
-    }\r
-\r
-    private Collection<BirthmarkSet> createSources(){\r
-        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();\r
-        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){\r
-            ComparisonPair pair = i.next();\r
-            addToMap(map, pair.getTarget1());\r
-            addToMap(map, pair.getTarget2());\r
-        }\r
-        return map.values();\r
-    }\r
-\r
-    private void addToMap(Map<URL, BirthmarkSet> map, BirthmarkSet set){\r
-        map.put(set.getLocation(), set);\r
-    }\r
-\r
-    private static ExtractionResultSet createExtractionResultSet(ComparisonPair[] pairs, BirthmarkContext context){\r
-        ExtractedBirthmarkServiceManager historyManager = context.getEnvironment().getHistoryManager();\r
-        ExtractionResultSet ers = historyManager.createDefaultResultSet(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 = context.getEnvironment().getHistoryManager().createDefaultResultSet(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 static class NameFindIterator implements Iterator<ComparisonPair>{\r
-        private ComparisonPair next;\r
-        private BirthmarkSet setX = null;\r
-        private Iterator<BirthmarkSet> iteratorX;\r
-        private Iterator<BirthmarkSet> iteratorY;\r
-        private ExtractionResultSet extraction;\r
-\r
-        public NameFindIterator(ExtractionResultSet extraction){\r
-            this.extraction = extraction;\r
-            iteratorX = extraction.birthmarkSets(ExtractionTarget.TARGET_X);\r
-            setX = iteratorX.next();\r
-            next = findNext();\r
-        }\r
-\r
-        public boolean hasNext(){\r
-            return next != null;\r
-        }\r
-\r
-        public ComparisonPair next(){\r
-            ComparisonPair returnValue = next;\r
-            next = findNext();\r
-            return returnValue;\r
-        }\r
-\r
-        public void remove(){\r
-        }\r
-\r
-        private ComparisonPair findNext(){\r
-            ComparisonPair next = null;\r
-            if(iteratorY == null || !iteratorY.hasNext()){\r
-                iteratorY = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);\r
-            }\r
-\r
-            if(setX != null){\r
-                for(; iteratorY.hasNext(); ){\r
-                    BirthmarkSet setY = iteratorY.next();\r
-                    if(setX.getName().equals(setY.getName())){\r
-                        next = new ComparisonPair(setX, setY, extraction.getContext());\r
-                        break;\r
-                    }\r
-                }\r
-\r
-                if(iteratorX.hasNext()){\r
-                    setX = iteratorX.next();\r
-                }\r
-                else{\r
-                    setX = null;\r
-                }\r
-                if(next == null){\r
-                    next = findNext();\r
-                }\r
-            }\r
-            return next;\r
-        }\r
-    };\r
-\r
-    private static class NameMappingIterator implements Iterator<ComparisonPair>{\r
-        private Iterator<Map.Entry<String, String>> names;\r
-        private ComparisonPair nextPair;\r
-        private ExtractionResultSet ers;\r
-\r
-        public NameMappingIterator(ExtractionResultSet ers){\r
-            this.ers = ers;\r
-            names = ers.getContext().nameMappingEntries();\r
-            nextPair = findNextPair();\r
-        }\r
-\r
-        public ComparisonPair next(){\r
-            ComparisonPair cp = nextPair;\r
-            nextPair = findNextPair();\r
-            return cp;\r
-        }\r
-\r
-        public boolean hasNext(){\r
-            return nextPair != null;\r
-        }\r
-\r
-        public void remove(){\r
-        }\r
-\r
-        private ComparisonPair findNextPair(){\r
-            ComparisonPair pair = null;\r
-            if(names.hasNext()){\r
-                Map.Entry<String, String> entry = names.next();\r
-                String n1 = entry.getKey();\r
-                String n2 = entry.getValue();\r
-\r
-                BirthmarkSet bs1 = ers.getBirthmarkSet(ExtractionTarget.TARGET_X, n1);\r
-                BirthmarkSet bs2 = ers.getBirthmarkSet(ExtractionTarget.TARGET_Y, n2);\r
-\r
-                if(bs1 == null || bs2 == null){\r
-                    pair = findNextPair();\r
-                }\r
-                else{\r
-                    pair = new ComparisonPair(bs1, bs2, ers.getContext());\r
-                }\r
-            }\r
-            return pair;\r
-        }\r
-    };\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreException;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkServiceManager;
+
+/**
+ * Concrete class for ComparisonResultSet. This instance compare class files by
+ * certain pair. The pair is guessed by system with class name, or specified by
+ * user.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class CertainPairComparisonResultSet extends AbstractComparisonResultSet{
+    private int compareCount = -1;
+    private Collection<BirthmarkSet> sources = null;
+
+    public CertainPairComparisonResultSet(ExtractionResultSet extraction){
+        super(extraction);
+    }
+
+    public CertainPairComparisonResultSet(ExtractionResultSet extraction, Map<String, String> nameMap){
+        super(extraction);
+        BirthmarkContext context = extraction.getContext();
+        for(Map.Entry<String, String> entry: nameMap.entrySet()){
+            context.addNameMapping(entry.getKey(), entry.getValue());
+        }
+    }
+
+    /**
+     * This constructor is the comparison pair list is specified.
+     */
+    public CertainPairComparisonResultSet(ComparisonPair[] pairs, BirthmarkContext context){
+        super(createExtractionResultSet(pairs, context));
+    }
+
+    /**
+     * This constructor is the comparison pair was guessed with class name.
+     */
+    public CertainPairComparisonResultSet(BirthmarkSet[] targetX,
+            BirthmarkSet[] targetY, BirthmarkContext context){
+        super(createExtractionResultSet(targetX, targetY, context));
+    }
+
+    /**
+     * This constructor is the comparison pair was specified as mapping.
+     */
+    public CertainPairComparisonResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY,
+            Map<String, String> mapping, BirthmarkContext context){
+        super(createExtractionResultSet(targetX, targetY, context));
+
+        for(Map.Entry<String, String> entry : mapping.entrySet()){
+            context.addNameMapping(entry.getKey(), entry.getValue());
+        }
+    }
+
+    /**
+     * return comparison count.
+     */
+    @Override
+    public int getPairCount(){
+        BirthmarkContext context = getContext();
+        if(compareCount < 0){
+            int count = 0;
+            if(context.hasNameMapping()){
+                count = context.getNameMappingCount();
+            }
+            else{
+                count = super.getPairCount();
+            }
+            compareCount = count;
+        }
+        return compareCount;
+    }
+
+    /**
+     * return the iterator of each pair.
+     */
+    @Override
+    public Iterator<ComparisonPair> iterator(){
+        Iterator<ComparisonPair> iterator = null;
+        final BirthmarkContext context = getContext();
+        if(context.hasNameMapping()){
+            iterator = new NameMappingIterator(extraction);
+        }
+        else{
+            iterator = new NameFindIterator(extraction);
+        }
+        return iterator;
+    }
+
+    @Override
+    public Iterator<BirthmarkSet> pairSources(){
+        if(sources == null){
+            sources = createSources();
+        }
+        return sources.iterator();
+    }
+
+    public BirthmarkSet[] getPairSources(){
+        if(sources == null){
+            sources = createSources();
+        }
+        return sources.toArray(new BirthmarkSet[sources.size()]);
+    }
+
+    private Collection<BirthmarkSet> createSources(){
+        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
+        for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
+            ComparisonPair pair = i.next();
+            addToMap(map, pair.getTarget1());
+            addToMap(map, pair.getTarget2());
+        }
+        return map.values();
+    }
+
+    private void addToMap(Map<URL, BirthmarkSet> map, BirthmarkSet set){
+        map.put(set.getLocation(), set);
+    }
+
+    private static ExtractionResultSet createExtractionResultSet(ComparisonPair[] pairs, BirthmarkContext context){
+        ExtractedBirthmarkServiceManager historyManager = context.getEnvironment().getHistoryManager();
+        ExtractionResultSet ers = historyManager.createDefaultResultSet(context);
+        ers.setTableType(false);
+        try{
+            for(int i = 0; i < pairs.length; i++){
+                ers.addBirthmarkSet(ExtractionTarget.TARGET_X, pairs[i].getTarget1());
+                ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, pairs[i].getTarget2());
+            }
+        }catch(BirthmarkStoreException e){
+            throw new InternalError("never thrown BirthmarkStoreException is thrown");
+        }
+        return ers;
+    }
+
+    private static ExtractionResultSet createExtractionResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, BirthmarkContext context){
+        ExtractionResultSet ers = context.getEnvironment().getHistoryManager().createDefaultResultSet(context);
+        ers.setTableType(true);
+        try{
+            ers.setBirthmarkSets(ExtractionTarget.TARGET_X, targetX);
+            ers.setBirthmarkSets(ExtractionTarget.TARGET_Y, targetY);
+        }catch(BirthmarkStoreException e){
+            throw new InternalError("never thrown BirthmarkStoreException is thrown");
+        }
+        return ers;
+    }
+
+    private static class NameFindIterator implements Iterator<ComparisonPair>{
+        private ComparisonPair next;
+        private BirthmarkSet setX = null;
+        private Iterator<BirthmarkSet> iteratorX;
+        private Iterator<BirthmarkSet> iteratorY;
+        private ExtractionResultSet extraction;
+
+        public NameFindIterator(ExtractionResultSet extraction){
+            this.extraction = extraction;
+            iteratorX = extraction.birthmarkSets(ExtractionTarget.TARGET_X);
+            setX = iteratorX.next();
+            next = findNext();
+        }
+
+        public boolean hasNext(){
+            return next != null;
+        }
+
+        public ComparisonPair next(){
+            ComparisonPair returnValue = next;
+            next = findNext();
+            return returnValue;
+        }
+
+        public void remove(){
+        }
+
+        private ComparisonPair findNext(){
+            ComparisonPair next = null;
+            if(iteratorY == null || !iteratorY.hasNext()){
+                iteratorY = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);
+            }
+
+            if(setX != null){
+                for(; iteratorY.hasNext(); ){
+                    BirthmarkSet setY = iteratorY.next();
+                    if(setX.getName().equals(setY.getName())){
+                        next = new ComparisonPair(setX, setY, extraction.getContext());
+                        break;
+                    }
+                }
+
+                if(iteratorX.hasNext()){
+                    setX = iteratorX.next();
+                }
+                else{
+                    setX = null;
+                }
+                if(next == null){
+                    next = findNext();
+                }
+            }
+            return next;
+        }
+    };
+
+    private static class NameMappingIterator implements Iterator<ComparisonPair>{
+        private Iterator<Map.Entry<String, String>> names;
+        private ComparisonPair nextPair;
+        private ExtractionResultSet ers;
+
+        public NameMappingIterator(ExtractionResultSet ers){
+            this.ers = ers;
+            names = ers.getContext().nameMappingEntries();
+            nextPair = findNextPair();
+        }
+
+        public ComparisonPair next(){
+            ComparisonPair cp = nextPair;
+            nextPair = findNextPair();
+            return cp;
+        }
+
+        public boolean hasNext(){
+            return nextPair != null;
+        }
+
+        public void remove(){
+        }
+
+        private ComparisonPair findNextPair(){
+            ComparisonPair pair = null;
+            if(names.hasNext()){
+                Map.Entry<String, String> entry = names.next();
+                String n1 = entry.getKey();
+                String n2 = entry.getValue();
+
+                BirthmarkSet bs1 = ers.getBirthmarkSet(ExtractionTarget.TARGET_X, n1);
+                BirthmarkSet bs2 = ers.getBirthmarkSet(ExtractionTarget.TARGET_Y, n2);
+
+                if(bs1 == null || bs2 == null){
+                    pair = findNextPair();
+                }
+                else{
+                    pair = new ComparisonPair(bs1, bs2, ers.getContext());
+                }
+            }
+            return pair;
+        }
+    };
+}
@@ -1,40 +1,40 @@
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistory;\r
-import jp.naist.se.stigmata.result.history.MemoryExtractedBirthmarkHistory;\r
-import jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class MemoryExtractedBirthmarkService implements ExtractedBirthmarkSpi{\r
-    private MemoryExtractedBirthmarkHistory history = new MemoryExtractedBirthmarkHistory();\r
-\r
-    public ExtractionResultSet createResultSet(BirthmarkContext context){\r
-        MemoryExtractionResultSet mers = new MemoryExtractionResultSet(context);\r
-        history.addResultSet(mers);\r
-        return mers;\r
-    }\r
-\r
-    public ExtractedBirthmarkHistory getHistory(String parameter){\r
-        return history;\r
-    }\r
-\r
-    public ExtractionResultSet getResultSet(String id){\r
-        return history.getResultSet(id);\r
-    }\r
-\r
-    public BirthmarkStoreTarget getTarget(){\r
-        return BirthmarkStoreTarget.MEMORY;\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.result.history.MemoryExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class MemoryExtractedBirthmarkService implements ExtractedBirthmarkSpi{
+    private MemoryExtractedBirthmarkHistory history = new MemoryExtractedBirthmarkHistory();
+
+    public ExtractionResultSet createResultSet(BirthmarkContext context){
+        MemoryExtractionResultSet mers = new MemoryExtractionResultSet(context);
+        history.addResultSet(mers);
+        return mers;
+    }
+
+    public ExtractedBirthmarkHistory getHistory(String parameter){
+        return history;
+    }
+
+    public ExtractionResultSet getResultSet(String id){
+        return history.getResultSet(id);
+    }
+
+    public BirthmarkStoreTarget getTarget(){
+        return BirthmarkStoreTarget.MEMORY;
+    }
+
+}
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\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
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class MemoryExtractionResultSet extends AbstractExtractionResultSet{\r
-    private List<BirthmarkSet> targetX = new ArrayList<BirthmarkSet>();\r
-    private List<BirthmarkSet> targetY = new ArrayList<BirthmarkSet>();\r
-\r
-    MemoryExtractionResultSet(BirthmarkContext context){\r
-        this(context, true);\r
-    }\r
-\r
-    MemoryExtractionResultSet(BirthmarkContext context, boolean tableType){\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
-        case TARGET_XY:\r
-            targetX.clear();\r
-            break;\r
-        case TARGET_Y:\r
-            targetY.clear();\r
-            break;\r
-        case TARGET_BOTH:\r
-        default:\r
-            throw new IllegalArgumentException("unknown target: " + target);\r
-        }\r
-    }\r
-\r
-    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){\r
-        switch(target){\r
-        case TARGET_X:\r
-        case TARGET_XY:\r
-            targetX.remove(set);\r
-            break;\r
-        case TARGET_Y:\r
-            targetY.remove(set);\r
-            break;\r
-        case TARGET_BOTH:\r
-        default:\r
-            throw new IllegalArgumentException("unknown target: " + target);\r
-        }\r
-    }\r
-\r
-    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){\r
-        switch(target){\r
-        case TARGET_X:\r
-        case TARGET_XY:\r
-            targetX.add(set);\r
-            break;\r
-        case TARGET_Y:\r
-            targetY.add(set);\r
-            break;\r
-        case TARGET_BOTH:\r
-        default:\r
-            throw new IllegalArgumentException("unknown target: " + target);\r
-        }\r
-    }\r
-\r
-    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){\r
-        Iterator<BirthmarkSet> iterator;\r
-        switch(target){\r
-        case TARGET_X:\r
-        case TARGET_XY:\r
-            iterator = targetX.iterator();\r
-            break;\r
-        case TARGET_Y:\r
-            iterator = targetY.iterator();\r
-            break;\r
-        case TARGET_BOTH:\r
-        default:\r
-            MultipleIterator<BirthmarkSet> i = new MultipleIterator<BirthmarkSet>();\r
-            i.add(targetX.iterator());\r
-            i.add(targetY.iterator());\r
-            iterator = i;\r
-            break;\r
-        }\r
-        return iterator;\r
-    }\r
-    public int getBirthmarkSetSize(ExtractionTarget target){\r
-        int count = 0;\r
-        switch(target){\r
-        case TARGET_X:\r
-        case TARGET_XY:\r
-            count = targetX.size();\r
-            break;\r
-        case TARGET_Y:\r
-            count = targetY.size();\r
-            break;\r
-        case TARGET_BOTH:\r
-        default:\r
-            count = targetX.size() + targetY.size();\r
-            break;\r
-        }\r
-        return count;\r
-    }\r
-\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){\r
-        BirthmarkSet set;\r
-        switch(target){\r
-        case TARGET_X:\r
-            set = targetX.get(index);\r
-            break;\r
-        case TARGET_Y:\r
-            set = targetY.get(index);\r
-            break;\r
-        case TARGET_XY:\r
-        case TARGET_BOTH:\r
-        default:\r
-            if(index < targetX.size()){\r
-                set = targetX.get(index);\r
-            }\r
-            else{\r
-                set = targetY.get(index - targetX.size());\r
-            }\r
-            break;\r
-        }\r
-        return set;\r
-    }\r
-\r
-    public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){\r
-        BirthmarkSet[] sets;\r
-        switch(target){\r
-        case TARGET_X:\r
-        case TARGET_XY:\r
-            sets = targetX.toArray(new BirthmarkSet[targetX.size()]);\r
-            break;\r
-        case TARGET_Y:\r
-            sets = targetY.toArray(new BirthmarkSet[targetX.size()]);\r
-            break;\r
-        case TARGET_BOTH:\r
-        default:\r
-            sets = new BirthmarkSet[targetX.size() + targetY.size()];\r
-            System.arraycopy(targetX.toArray(new BirthmarkSet[targetX.size()]), 0, sets, 0, targetX.size());\r
-            System.arraycopy(targetY.toArray(new BirthmarkSet[targetY.size()]), 0, sets, targetX.size(), targetY.size());\r
-            break;\r
-        }\r
-        return sets;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.utils.MultipleIterator;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class MemoryExtractionResultSet extends AbstractExtractionResultSet{
+    private List<BirthmarkSet> targetX = new ArrayList<BirthmarkSet>();
+    private List<BirthmarkSet> targetY = new ArrayList<BirthmarkSet>();
+
+    MemoryExtractionResultSet(BirthmarkContext context){
+        this(context, true);
+    }
+
+    MemoryExtractionResultSet(BirthmarkContext context, boolean tableType){
+        super(context, tableType);
+    }
+
+    public BirthmarkStoreTarget getStoreTarget(){
+        return BirthmarkStoreTarget.MEMORY;
+    }
+
+    public void removeAllBirthmarkSets(ExtractionTarget target){
+        switch(target){
+        case TARGET_X:
+        case TARGET_XY:
+            targetX.clear();
+            break;
+        case TARGET_Y:
+            targetY.clear();
+            break;
+        case TARGET_BOTH:
+        default:
+            throw new IllegalArgumentException("unknown target: " + target);
+        }
+    }
+
+    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
+        switch(target){
+        case TARGET_X:
+        case TARGET_XY:
+            targetX.remove(set);
+            break;
+        case TARGET_Y:
+            targetY.remove(set);
+            break;
+        case TARGET_BOTH:
+        default:
+            throw new IllegalArgumentException("unknown target: " + target);
+        }
+    }
+
+    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
+        switch(target){
+        case TARGET_X:
+        case TARGET_XY:
+            targetX.add(set);
+            break;
+        case TARGET_Y:
+            targetY.add(set);
+            break;
+        case TARGET_BOTH:
+        default:
+            throw new IllegalArgumentException("unknown target: " + target);
+        }
+    }
+
+    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
+        Iterator<BirthmarkSet> iterator;
+        switch(target){
+        case TARGET_X:
+        case TARGET_XY:
+            iterator = targetX.iterator();
+            break;
+        case TARGET_Y:
+            iterator = targetY.iterator();
+            break;
+        case TARGET_BOTH:
+        default:
+            MultipleIterator<BirthmarkSet> i = new MultipleIterator<BirthmarkSet>();
+            i.add(targetX.iterator());
+            i.add(targetY.iterator());
+            iterator = i;
+            break;
+        }
+        return iterator;
+    }
+    public int getBirthmarkSetSize(ExtractionTarget target){
+        int count = 0;
+        switch(target){
+        case TARGET_X:
+        case TARGET_XY:
+            count = targetX.size();
+            break;
+        case TARGET_Y:
+            count = targetY.size();
+            break;
+        case TARGET_BOTH:
+        default:
+            count = targetX.size() + targetY.size();
+            break;
+        }
+        return count;
+    }
+
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){
+        BirthmarkSet set;
+        switch(target){
+        case TARGET_X:
+            set = targetX.get(index);
+            break;
+        case TARGET_Y:
+            set = targetY.get(index);
+            break;
+        case TARGET_XY:
+        case TARGET_BOTH:
+        default:
+            if(index < targetX.size()){
+                set = targetX.get(index);
+            }
+            else{
+                set = targetY.get(index - targetX.size());
+            }
+            break;
+        }
+        return set;
+    }
+
+    public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){
+        BirthmarkSet[] sets;
+        switch(target){
+        case TARGET_X:
+        case TARGET_XY:
+            sets = targetX.toArray(new BirthmarkSet[targetX.size()]);
+            break;
+        case TARGET_Y:
+            sets = targetY.toArray(new BirthmarkSet[targetX.size()]);
+            break;
+        case TARGET_BOTH:
+        default:
+            sets = new BirthmarkSet[targetX.size() + targetY.size()];
+            System.arraycopy(targetX.toArray(new BirthmarkSet[targetX.size()]), 0, sets, 0, targetX.size());
+            System.arraycopy(targetY.toArray(new BirthmarkSet[targetY.size()]), 0, sets, targetX.size(), targetY.size());
+            break;
+        }
+        return sets;
+    }
+}
@@ -1,42 +1,42 @@
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import javax.sql.DataSource;\r
-\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistory;\r
-import jp.naist.se.stigmata.result.history.RDBExtractedBirthmarkHistory;\r
-import jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class RDBExtractedBirthmarkService implements ExtractedBirthmarkSpi{\r
-    private DataSource source;\r
-\r
-    public RDBExtractedBirthmarkService(){\r
-    }\r
-\r
-    public ExtractionResultSet createResultSet(BirthmarkContext context){\r
-        return new RDBExtractionResultSet(context);\r
-    }\r
-\r
-    public ExtractedBirthmarkHistory getHistory(String parameter){\r
-        return new RDBExtractedBirthmarkHistory(source);\r
-    }\r
-\r
-    public ExtractionResultSet getResultSet(String id){\r
-        return new RDBExtractionResultSet(source, id);\r
-    }\r
-\r
-    public BirthmarkStoreTarget getTarget(){\r
-        return BirthmarkStoreTarget.RDB;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import javax.sql.DataSource;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.result.history.RDBExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class RDBExtractedBirthmarkService implements ExtractedBirthmarkSpi{
+    private DataSource source;
+
+    public RDBExtractedBirthmarkService(){
+    }
+
+    public ExtractionResultSet createResultSet(BirthmarkContext context){
+        return new RDBExtractionResultSet(context);
+    }
+
+    public ExtractedBirthmarkHistory getHistory(String parameter){
+        return new RDBExtractedBirthmarkHistory(source);
+    }
+
+    public ExtractionResultSet getResultSet(String id){
+        return new RDBExtractionResultSet(source, id);
+    }
+
+    public BirthmarkStoreTarget getTarget(){
+        return BirthmarkStoreTarget.RDB;
+    }
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.result;
+package jp.sourceforge.stigmata.result;
 
 /*
  * $Id$
@@ -19,16 +19,16 @@ import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import javax.sql.DataSource;
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkContext;
-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.ExtractionUnit;
-import jp.naist.se.stigmata.Stigmata;
-import jp.naist.se.stigmata.utils.ArrayIterator;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreException;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.Stigmata;
+import jp.sourceforge.stigmata.utils.ArrayIterator;
 
 import org.apache.commons.dbutils.QueryRunner;
 import org.apache.commons.dbutils.ResultSetHandler;
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\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.ComparisonPair;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.ExtractionTarget;\r
-\r
-/**\r
- * Concrete class for ComparisonResultSet. This instance compare class files by round robin.\r
- *\r
- * @author  Haruaki TAMADA\r
- * @version  $Revision$ $Date$\r
- */\r
-public class RoundRobinComparisonResultSet extends AbstractComparisonResultSet{\r
-    private int compareCount = -1;\r
-    private boolean tableType;\r
-    private boolean samePair = false;\r
-\r
-    /**\r
-     * constructor.  if user gives { a, b, c, } as holders1, then\r
-     * the instance (created by this constructor) compares { a<->b, a<->c,\r
-     * b<->c, }.\r
-     */\r
-    public RoundRobinComparisonResultSet(ExtractionResultSet resultset){\r
-        this(resultset, false);\r
-    }\r
-\r
-    /**\r
-     * constructor.  if user gives { a, b, c, } as holders1, then the\r
-     * instance (created by this constructor when samePair is true)\r
-     * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }.\r
-     * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when\r
-     * samePair is false.\r
-     */\r
-    public RoundRobinComparisonResultSet(ExtractionResultSet resultset, boolean samePair){\r
-        super(resultset);\r
-        this.tableType = resultset.isTableType();\r
-        setCompareSamePair(samePair);\r
-    }\r
-\r
-    /**\r
-     * @return  environment\r
-     */\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return extraction.getEnvironment();\r
-    }\r
-\r
-    public BirthmarkContext getContext(){\r
-        return extraction.getContext();\r
-    }\r
-\r
-    /**\r
-     * update same pair comparing flag unless two birthmark array is setted.\r
-     */\r
-    public void setCompareSamePair(boolean flag){\r
-        samePair = flag;\r
-        if(!extraction.isTableType()){\r
-            int size = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_XY);\r
-            if(flag){\r
-                if(size > 1)       compareCount = (size - 1) * (size - 2) + 1;\r
-                else if(size == 1) compareCount = 0;\r
-                else throw new IllegalStateException("no extraction result");\r
-            }\r
-            else{\r
-                if(size > 1)       compareCount = (size - 1) * (size - 2) + 1 + size;\r
-                else if(size == 1) compareCount = 1;\r
-                else throw new IllegalStateException("no extraction result");\r
-            }\r
-        }\r
-        else if(compareCount == -1){\r
-            compareCount = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X)\r
-                    * extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y); \r
-        }\r
-    }\r
-\r
-    public boolean isCompareSamePair(){\r
-        return samePair;\r
-    }\r
-\r
-    /**\r
-     * returns the compare count of birthmark sets.\r
-     */\r
-    public int getPairCount(){\r
-        return compareCount;\r
-    }\r
-\r
-    /**\r
-     * return a iterator of whole comparison.\r
-     */\r
-    public Iterator<ComparisonPair> iterator(){\r
-        if(tableType){\r
-            return new CompareTableIterator();\r
-        }\r
-        else{\r
-            return new CompareTriangleIterator();\r
-        }\r
-    }\r
-\r
-    public BirthmarkSet[] getPairSources(){\r
-        List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
-        for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){\r
-            list.add(i.next());\r
-        }\r
-\r
-        return list.toArray(new BirthmarkSet[list.size()]);\r
-    }\r
-\r
-    public Iterator<BirthmarkSet> pairSources(){\r
-        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();\r
-        if(extraction.isTableType()){\r
-            for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
-                BirthmarkSet bs = i.next();\r
-                map.put(bs.getLocation(), bs);\r
-            }\r
-            for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
-                BirthmarkSet bs = i.next();\r
-                map.put(bs.getLocation(), bs);\r
-            }\r
-        }\r
-        else{\r
-            for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_XY); i.hasNext(); ){\r
-                BirthmarkSet bs = i.next();\r
-                map.put(bs.getLocation(), bs);\r
-            }\r
-        }\r
-        return map.values().iterator();\r
-    }\r
-\r
-    private class CompareTableIterator implements Iterator<ComparisonPair>{\r
-        private Iterator<BirthmarkSet> ix = extraction.birthmarkSets(ExtractionTarget.TARGET_X);\r
-        private Iterator<BirthmarkSet> iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);\r
-        private BirthmarkSet x = ix.next();\r
-\r
-        public boolean hasNext(){\r
-            return ix.hasNext() || iy.hasNext();\r
-        }\r
-\r
-        public ComparisonPair next(){\r
-            if(!iy.hasNext()){\r
-                iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);\r
-                x = ix.next();\r
-            }\r
-            BirthmarkSet y = iy.next();\r
-\r
-            return new ComparisonPair(x, y, extraction.getContext());\r
-        }\r
-\r
-        public void remove(){\r
-        }\r
-    }\r
-\r
-    /**\r
-     * iterator class.\r
-     */\r
-    private class CompareTriangleIterator implements Iterator<ComparisonPair>{\r
-        private List<String> names = new ArrayList<String>();\r
-        private Iterator<BirthmarkSet> iterator;\r
-        private int index = 0;\r
-        private BirthmarkSet bs;\r
-        private ComparisonPair next;\r
-\r
-        public CompareTriangleIterator(){\r
-            iterator = extraction.birthmarkSets(ExtractionTarget.TARGET_XY);\r
-            next = findNext();\r
-        }\r
-        public boolean hasNext(){\r
-            return next != null;\r
-        }\r
-\r
-        public ComparisonPair next(){\r
-            ComparisonPair returnValue = next;\r
-            next = findNext();\r
-            return returnValue;\r
-        }\r
-\r
-        private ComparisonPair findNext(){\r
-            if(bs == null && iterator.hasNext()){\r
-                bs = iterator.next();\r
-                names.add(bs.getName());\r
-            }\r
-            if((isCompareSamePair() && index == names.size()) || (!isCompareSamePair() && index == (names.size() - 1))){\r
-                index = 0;\r
-                if(iterator.hasNext()){\r
-                    bs = iterator.next();\r
-                    names.add(bs.getName());\r
-                }\r
-                else{\r
-                    return null;\r
-                }\r
-            }\r
-            String name = names.get(index);\r
-            BirthmarkSet bsX = extraction.getBirthmarkSet(ExtractionTarget.TARGET_XY, name);\r
-            ComparisonPair pair = null;\r
-            if(bsX != null){\r
-                pair = new ComparisonPair(bsX, bs, extraction.getContext());\r
-            }\r
-            index++;\r
-\r
-            if(pair == null){\r
-                pair = findNext();\r
-            }\r
-            \r
-            return pair;\r
-        }\r
-\r
-        public void remove(){\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+
+/**
+ * Concrete class for ComparisonResultSet. This instance compare class files by round robin.
+ *
+ * @author  Haruaki TAMADA
+ * @version  $Revision$ $Date$
+ */
+public class RoundRobinComparisonResultSet extends AbstractComparisonResultSet{
+    private int compareCount = -1;
+    private boolean tableType;
+    private boolean samePair = false;
+
+    /**
+     * constructor.  if user gives { a, b, c, } as holders1, then
+     * the instance (created by this constructor) compares { a<->b, a<->c,
+     * b<->c, }.
+     */
+    public RoundRobinComparisonResultSet(ExtractionResultSet resultset){
+        this(resultset, false);
+    }
+
+    /**
+     * constructor.  if user gives { a, b, c, } as holders1, then the
+     * instance (created by this constructor when samePair is true)
+     * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }.
+     * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when
+     * samePair is false.
+     */
+    public RoundRobinComparisonResultSet(ExtractionResultSet resultset, boolean samePair){
+        super(resultset);
+        this.tableType = resultset.isTableType();
+        setCompareSamePair(samePair);
+    }
+
+    /**
+     * @return  environment
+     */
+    public BirthmarkEnvironment getEnvironment(){
+        return extraction.getEnvironment();
+    }
+
+    public BirthmarkContext getContext(){
+        return extraction.getContext();
+    }
+
+    /**
+     * update same pair comparing flag unless two birthmark array is setted.
+     */
+    public void setCompareSamePair(boolean flag){
+        samePair = flag;
+        if(!extraction.isTableType()){
+            int size = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_XY);
+            if(flag){
+                if(size > 1)       compareCount = (size - 1) * (size - 2) + 1;
+                else if(size == 1) compareCount = 0;
+                else throw new IllegalStateException("no extraction result");
+            }
+            else{
+                if(size > 1)       compareCount = (size - 1) * (size - 2) + 1 + size;
+                else if(size == 1) compareCount = 1;
+                else throw new IllegalStateException("no extraction result");
+            }
+        }
+        else if(compareCount == -1){
+            compareCount = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X)
+                    * extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y); 
+        }
+    }
+
+    public boolean isCompareSamePair(){
+        return samePair;
+    }
+
+    /**
+     * returns the compare count of birthmark sets.
+     */
+    public int getPairCount(){
+        return compareCount;
+    }
+
+    /**
+     * return a iterator of whole comparison.
+     */
+    public Iterator<ComparisonPair> iterator(){
+        if(tableType){
+            return new CompareTableIterator();
+        }
+        else{
+            return new CompareTriangleIterator();
+        }
+    }
+
+    public BirthmarkSet[] getPairSources(){
+        List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();
+        for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){
+            list.add(i.next());
+        }
+
+        return list.toArray(new BirthmarkSet[list.size()]);
+    }
+
+    public Iterator<BirthmarkSet> pairSources(){
+        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
+        if(extraction.isTableType()){
+            for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){
+                BirthmarkSet bs = i.next();
+                map.put(bs.getLocation(), bs);
+            }
+            for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){
+                BirthmarkSet bs = i.next();
+                map.put(bs.getLocation(), bs);
+            }
+        }
+        else{
+            for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_XY); i.hasNext(); ){
+                BirthmarkSet bs = i.next();
+                map.put(bs.getLocation(), bs);
+            }
+        }
+        return map.values().iterator();
+    }
+
+    private class CompareTableIterator implements Iterator<ComparisonPair>{
+        private Iterator<BirthmarkSet> ix = extraction.birthmarkSets(ExtractionTarget.TARGET_X);
+        private Iterator<BirthmarkSet> iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);
+        private BirthmarkSet x = ix.next();
+
+        public boolean hasNext(){
+            return ix.hasNext() || iy.hasNext();
+        }
+
+        public ComparisonPair next(){
+            if(!iy.hasNext()){
+                iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);
+                x = ix.next();
+            }
+            BirthmarkSet y = iy.next();
+
+            return new ComparisonPair(x, y, extraction.getContext());
+        }
+
+        public void remove(){
+        }
+    }
+
+    /**
+     * iterator class.
+     */
+    private class CompareTriangleIterator implements Iterator<ComparisonPair>{
+        private List<String> names = new ArrayList<String>();
+        private Iterator<BirthmarkSet> iterator;
+        private int index = 0;
+        private BirthmarkSet bs;
+        private ComparisonPair next;
+
+        public CompareTriangleIterator(){
+            iterator = extraction.birthmarkSets(ExtractionTarget.TARGET_XY);
+            next = findNext();
+        }
+        public boolean hasNext(){
+            return next != null;
+        }
+
+        public ComparisonPair next(){
+            ComparisonPair returnValue = next;
+            next = findNext();
+            return returnValue;
+        }
+
+        private ComparisonPair findNext(){
+            if(bs == null && iterator.hasNext()){
+                bs = iterator.next();
+                names.add(bs.getName());
+            }
+            if((isCompareSamePair() && index == names.size()) || (!isCompareSamePair() && index == (names.size() - 1))){
+                index = 0;
+                if(iterator.hasNext()){
+                    bs = iterator.next();
+                    names.add(bs.getName());
+                }
+                else{
+                    return null;
+                }
+            }
+            String name = names.get(index);
+            BirthmarkSet bsX = extraction.getBirthmarkSet(ExtractionTarget.TARGET_XY, name);
+            ComparisonPair pair = null;
+            if(bsX != null){
+                pair = new ComparisonPair(bsX, bs, extraction.getContext());
+            }
+            index++;
+
+            if(pair == null){
+                pair = findNext();
+            }
+            
+            return pair;
+        }
+
+        public void remove(){
+        }
+    }
+}
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Iterator;\r
-import java.util.NoSuchElementException;\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
-/**\r
- *\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class SingleExtractionResultSet extends AbstractExtractionResultSet{\r
-    private BirthmarkSet bs;\r
-\r
-    public SingleExtractionResultSet(BirthmarkContext context, BirthmarkSet bs){\r
-        super(context, false);\r
-        this.bs = bs;\r
-    }\r
-\r
-    public SingleExtractionResultSet(BirthmarkContext context){\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
-\r
-    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets){\r
-        this.bs = sets[0];\r
-    }\r
-\r
-    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){\r
-        if(bs != null){\r
-            return new SingleIterator(bs);\r
-        }\r
-        return new NullIterator<BirthmarkSet>();\r
-    }\r
-\r
-    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){\r
-        bs = null;\r
-    }\r
-\r
-    public void removeAllBirthmarkSets(ExtractionTarget target){\r
-        bs = null;\r
-    }\r
-\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){\r
-        if(index != 0){\r
-            throw new IndexOutOfBoundsException("illegal index: " + index);\r
-        }\r
-        return bs;\r
-    }\r
-\r
-    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String name){\r
-        if(bs.getName().equals(name)){\r
-            return bs;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public int getBirthmarkSetSize(ExtractionTarget target){\r
-        return 1;\r
-    }\r
-\r
-    private static class SingleIterator implements Iterator<BirthmarkSet>{\r
-        private boolean first = true;\r
-        private BirthmarkSet bs;\r
-\r
-        public SingleIterator(BirthmarkSet bs){\r
-            this.bs = bs;\r
-        }\r
-\r
-        public BirthmarkSet next(){\r
-            if(first){\r
-                first = false;\r
-                return bs;\r
-            }\r
-            throw new NoSuchElementException();\r
-        }\r
-\r
-        public boolean hasNext(){\r
-            return first;\r
-        }\r
-\r
-        public void remove(){\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.utils.NullIterator;
+
+/**
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class SingleExtractionResultSet extends AbstractExtractionResultSet{
+    private BirthmarkSet bs;
+
+    public SingleExtractionResultSet(BirthmarkContext context, BirthmarkSet bs){
+        super(context, false);
+        this.bs = bs;
+    }
+
+    public SingleExtractionResultSet(BirthmarkContext context){
+        super(context, false);
+    }
+
+    public BirthmarkStoreTarget getStoreTarget(){
+        return BirthmarkStoreTarget.MEMORY_SINGLE;
+    }
+
+    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
+        this.bs = set;
+    }
+
+    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets){
+        this.bs = sets[0];
+    }
+
+    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
+        if(bs != null){
+            return new SingleIterator(bs);
+        }
+        return new NullIterator<BirthmarkSet>();
+    }
+
+    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
+        bs = null;
+    }
+
+    public void removeAllBirthmarkSets(ExtractionTarget target){
+        bs = null;
+    }
+
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){
+        if(index != 0){
+            throw new IndexOutOfBoundsException("illegal index: " + index);
+        }
+        return bs;
+    }
+
+    public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String name){
+        if(bs.getName().equals(name)){
+            return bs;
+        }
+        return null;
+    }
+
+    public int getBirthmarkSetSize(ExtractionTarget target){
+        return 1;
+    }
+
+    private static class SingleIterator implements Iterator<BirthmarkSet>{
+        private boolean first = true;
+        private BirthmarkSet bs;
+
+        public SingleIterator(BirthmarkSet bs){
+            this.bs = bs;
+        }
+
+        public BirthmarkSet next(){
+            if(first){
+                first = false;
+                return bs;
+            }
+            throw new NoSuchElementException();
+        }
+
+        public boolean hasNext(){
+            return first;
+        }
+
+        public void remove(){
+        }
+    }
+}
@@ -1,60 +1,60 @@
-package jp.naist.se.stigmata.result;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.File;\r
-\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.ExtractionResultSet;\r
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistory;\r
-import jp.naist.se.stigmata.result.history.XmlFileExtractedBirthmarkHistory;\r
-import jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class XmlFileExtractedBirthmarkService implements ExtractedBirthmarkSpi{\r
-    private File defaultBaseDirectory;\r
-\r
-    public XmlFileExtractedBirthmarkService(){\r
-        defaultBaseDirectory = new File(\r
-            BirthmarkEnvironment.getStigmataHome(),\r
-            "extracted_birthmarks"\r
-        );\r
-    }\r
-\r
-    public ExtractionResultSet createResultSet(BirthmarkContext context){\r
-        return createResultSet(context, defaultBaseDirectory);\r
-    }\r
-\r
-    public ExtractionResultSet createResultSet(BirthmarkContext context, File base){\r
-        return new XmlFileExtractionResultSet(\r
-            context, new File(base, AbstractExtractionResultSet.generateId())\r
-        );\r
-    }\r
-\r
-    public ExtractedBirthmarkHistory getHistory(String parameter){\r
-        File file = defaultBaseDirectory;\r
-        if(parameter != null){\r
-            file = new File(parameter);\r
-        }\r
-        if(!file.exists()){\r
-            file.mkdirs();\r
-        }\r
-        return new XmlFileExtractedBirthmarkHistory(file);\r
-    }\r
-\r
-    public ExtractionResultSet getResultSet(String id){\r
-        return new XmlFileExtractionResultSet(new File(id));\r
-    }\r
-\r
-    public BirthmarkStoreTarget getTarget(){\r
-        return BirthmarkStoreTarget.XMLFILE;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.result.history.XmlFileExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class XmlFileExtractedBirthmarkService implements ExtractedBirthmarkSpi{
+    private File defaultBaseDirectory;
+
+    public XmlFileExtractedBirthmarkService(){
+        defaultBaseDirectory = new File(
+            BirthmarkEnvironment.getStigmataHome(),
+            "extracted_birthmarks"
+        );
+    }
+
+    public ExtractionResultSet createResultSet(BirthmarkContext context){
+        return createResultSet(context, defaultBaseDirectory);
+    }
+
+    public ExtractionResultSet createResultSet(BirthmarkContext context, File base){
+        return new XmlFileExtractionResultSet(
+            context, new File(base, AbstractExtractionResultSet.generateId())
+        );
+    }
+
+    public ExtractedBirthmarkHistory getHistory(String parameter){
+        File file = defaultBaseDirectory;
+        if(parameter != null){
+            file = new File(parameter);
+        }
+        if(!file.exists()){
+            file.mkdirs();
+        }
+        return new XmlFileExtractedBirthmarkHistory(file);
+    }
+
+    public ExtractionResultSet getResultSet(String id){
+        return new XmlFileExtractionResultSet(new File(id));
+    }
+
+    public BirthmarkStoreTarget getTarget(){
+        return BirthmarkStoreTarget.XMLFILE;
+    }
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.result;
+package jp.sourceforge.stigmata.result;
 
 /*
  * $Id$
@@ -27,21 +27,21 @@ 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.ComparisonMethod;
-import jp.naist.se.stigmata.ExtractionTarget;
-import jp.naist.se.stigmata.ExtractionUnit;
-import jp.naist.se.stigmata.Stigmata;
-import jp.naist.se.stigmata.printer.xml.ExtractionResultSetXmlPrinter;
-import jp.naist.se.stigmata.spi.BirthmarkSpi;
-import jp.naist.se.stigmata.ui.swing.ExtensionFilter;
-import jp.naist.se.stigmata.utils.MultipleIterator;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreException;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ComparisonMethod;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.Stigmata;
+import jp.sourceforge.stigmata.printer.xml.ExtractionResultSetXmlPrinter;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.ui.swing.ExtensionFilter;
+import jp.sourceforge.stigmata.utils.MultipleIterator;
 
 /**
  * This class manages extracted birthmarks as xml file.
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.result.history;
+package jp.sourceforge.stigmata.result.history;
 
 /*
  * $Id$
@@ -6,7 +6,7 @@ package jp.naist.se.stigmata.result.history;
 
 import java.util.Iterator;
 
-import jp.naist.se.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
 
 /**
  * This interface indicates extracted history management.
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.result.history;
+package jp.sourceforge.stigmata.result.history;
 
 /*
  * $Id$
@@ -14,11 +14,11 @@ import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
-import jp.naist.se.stigmata.BirthmarkContext;
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.BirthmarkStoreTarget;
-import jp.naist.se.stigmata.ExtractionResultSet;
-import jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi;
 
 /**
  * 
@@ -1,49 +1,49 @@
-package jp.naist.se.stigmata.result.history;\r
-\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.result.MemoryExtractionResultSet;\r
-\r
-public class MemoryExtractedBirthmarkHistory implements ExtractedBirthmarkHistory{\r
-    private Map<String, MemoryExtractionResultSet> map = new HashMap<String, MemoryExtractionResultSet>();\r
-\r
-    public MemoryExtractedBirthmarkHistory(){\r
-    }\r
-\r
-    public MemoryExtractedBirthmarkHistory(MemoryExtractionResultSet[] mersArray){\r
-        for(MemoryExtractionResultSet mers: mersArray){\r
-            map.put(mers.getId(), mers);\r
-        }\r
-    }\r
-\r
-    public void addResultSet(MemoryExtractionResultSet mers){\r
-        map.put(mers.getId(), mers);\r
-    }\r
-\r
-    public void deleteResultSet(String id){\r
-        map.remove(id);\r
-    }\r
-\r
-    public void deleteAllResultSets(){\r
-        map.clear();\r
-    }\r
-\r
-    public ExtractionResultSet getResultSet(String id){\r
-        return map.get(id);\r
-    }\r
-\r
-    public synchronized String[] getResultSetIds(){\r
-        return map.keySet().toArray(new String[map.size()]);\r
-    }\r
-\r
-    public Iterator<String> iterator(){\r
-        return Collections.unmodifiableSet(map.keySet()).iterator();\r
-    }\r
-\r
-    public void refresh(){\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.result.history;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.MemoryExtractionResultSet;
+
+public class MemoryExtractedBirthmarkHistory implements ExtractedBirthmarkHistory{
+    private Map<String, MemoryExtractionResultSet> map = new HashMap<String, MemoryExtractionResultSet>();
+
+    public MemoryExtractedBirthmarkHistory(){
+    }
+
+    public MemoryExtractedBirthmarkHistory(MemoryExtractionResultSet[] mersArray){
+        for(MemoryExtractionResultSet mers: mersArray){
+            map.put(mers.getId(), mers);
+        }
+    }
+
+    public void addResultSet(MemoryExtractionResultSet mers){
+        map.put(mers.getId(), mers);
+    }
+
+    public void deleteResultSet(String id){
+        map.remove(id);
+    }
+
+    public void deleteAllResultSets(){
+        map.clear();
+    }
+
+    public ExtractionResultSet getResultSet(String id){
+        return map.get(id);
+    }
+
+    public synchronized String[] getResultSetIds(){
+        return map.keySet().toArray(new String[map.size()]);
+    }
+
+    public Iterator<String> iterator(){
+        return Collections.unmodifiableSet(map.keySet()).iterator();
+    }
+
+    public void refresh(){
+    }
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.result.history;
+package jp.sourceforge.stigmata.result.history;
 
 /*
  * $Id$
@@ -9,10 +9,10 @@ import java.util.Iterator;
 
 import javax.sql.DataSource;
 
-import jp.naist.se.stigmata.ExtractionResultSet;
-import jp.naist.se.stigmata.result.RDBExtractionResultSet;
-import jp.naist.se.stigmata.result.RDBExtractionResultSet.StringHandler;
-import jp.naist.se.stigmata.utils.ArrayIterator;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.RDBExtractionResultSet;
+import jp.sourceforge.stigmata.result.RDBExtractionResultSet.StringHandler;
+import jp.sourceforge.stigmata.utils.ArrayIterator;
 
 import org.apache.commons.dbutils.QueryRunner;
 
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.result.history;
+package jp.sourceforge.stigmata.result.history;
 
 /*
  * $Id$
@@ -9,10 +9,10 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import jp.naist.se.stigmata.BirthmarkEnvironment;
-import jp.naist.se.stigmata.ExtractionResultSet;
-import jp.naist.se.stigmata.result.XmlFileExtractionResultSet;
-import jp.naist.se.stigmata.utils.Utility;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.XmlFileExtractionResultSet;
+import jp.sourceforge.stigmata.utils.Utility;
 
 /**
  * 
@@ -1,38 +1,38 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-/**\r
- * Base abstract class for birthmark SPI.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractServiceProvider implements ServiceProvider{\r
-\r
-    /**\r
-     * returning implementation vendor name of this SPI.\r
-     */\r
-    public String getDescription(){\r
-        return getDescription(Locale.getDefault());\r
-    }\r
-\r
-    /**\r
-     * returning implementation vendor name of this SPI.\r
-     */\r
-    public String getVendorName(){\r
-        return getClass().getPackage().getImplementationVendor();\r
-    }\r
-\r
-    /**\r
-     * returning version of this SPI.\r
-     */\r
-    public String getVersion(){\r
-        return getClass().getPackage().getImplementationVersion();\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+/**
+ * Base abstract class for birthmark SPI.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractServiceProvider implements ServiceProvider{
+
+    /**
+     * returning implementation vendor name of this SPI.
+     */
+    public String getDescription(){
+        return getDescription(Locale.getDefault());
+    }
+
+    /**
+     * returning implementation vendor name of this SPI.
+     */
+    public String getVendorName(){
+        return getClass().getPackage().getImplementationVendor();
+    }
+
+    /**
+     * returning version of this SPI.
+     */
+    public String getVersion(){
+        return getClass().getPackage().getImplementationVersion();
+    }
+
+}
@@ -1,40 +1,40 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.BirthmarkComparator;\r
-\r
-/**\r
- * Service provider interface for comparing birthmarks.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkComparatorSpi extends ServiceProvider{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType();\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale);\r
-\r
-    /**\r
-     * returns a localized description of the birthmark in default locale.\r
-     */\r
-    public String getDescription();\r
-\r
-    public String getComparatorClassName();\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator(BirthmarkSpi service);\r
-}\r
-\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+
+/**
+ * Service provider interface for comparing birthmarks.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkComparatorSpi extends ServiceProvider{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType();
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale);
+
+    /**
+     * returns a localized description of the birthmark in default locale.
+     */
+    public String getDescription();
+
+    public String getComparatorClassName();
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator(BirthmarkSpi service);
+}
+
@@ -1,40 +1,40 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.BirthmarkExtractor;\r
-\r
-/**\r
- * Service provider interface for extracting birhtmark from given class files.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkExtractorSpi extends ServiceProvider{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType();\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale);\r
-\r
-    /**\r
-     * returns a localized description of the birthmark in default locale.\r
-     */\r
-    public String getDescription();\r
-\r
-    public String getExtractorClassName();\r
-\r
-    /**\r
-     * returns a extractor for the birthmark of this service.\r
-     */\r
-    public BirthmarkExtractor getExtractor(BirthmarkSpi service);\r
-}\r
-\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+
+/**
+ * Service provider interface for extracting birhtmark from given class files.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkExtractorSpi extends ServiceProvider{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType();
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale);
+
+    /**
+     * returns a localized description of the birthmark in default locale.
+     */
+    public String getDescription();
+
+    public String getExtractorClassName();
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service);
+}
+
@@ -1,74 +1,74 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\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
- * Birthmark service provider interface.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkSpi extends ServiceProvider{\r
-    /**\r
-     * returns a type of the birthmark this service provides.\r
-     */\r
-    public String getType();\r
-\r
-    /**\r
-     * returns a type of the birthmark for display.\r
-     */\r
-    public String getDisplayType(Locale locale);\r
-\r
-    /**\r
-     * returns a type of the birthmark for display in default locale.\r
-     */\r
-    public String getDisplayType();\r
-\r
-    /**\r
-     * returns a description of the birthmark this service provides.\r
-     */\r
-    public String getDefaultDescription();\r
-\r
-    /**\r
-     * returns a localized description of the birthmark this service provides.\r
-     */\r
-    public String getDescription(Locale locale);\r
-\r
-    /**\r
-     * returns a localized description of the birthmark in default locale.\r
-     */\r
-    public String getDescription();\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
-    public BirthmarkExtractor getExtractor();\r
-\r
-    public String getComparatorClassName();\r
-\r
-    /**\r
-     * returns a comparator for the birthmark of this service.\r
-     */\r
-    public BirthmarkComparator getComparator();\r
-\r
-    public boolean isExpert();\r
-\r
-    public boolean isUserDefined();\r
-\r
-}\r
-\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+
+/**
+ * Birthmark service provider interface.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkSpi extends ServiceProvider{
+    /**
+     * returns a type of the birthmark this service provides.
+     */
+    public String getType();
+
+    /**
+     * returns a type of the birthmark for display.
+     */
+    public String getDisplayType(Locale locale);
+
+    /**
+     * returns a type of the birthmark for display in default locale.
+     */
+    public String getDisplayType();
+
+    /**
+     * returns a description of the birthmark this service provides.
+     */
+    public String getDefaultDescription();
+
+    /**
+     * returns a localized description of the birthmark this service provides.
+     */
+    public String getDescription(Locale locale);
+
+    /**
+     * returns a localized description of the birthmark in default locale.
+     */
+    public String getDescription();
+
+    public String getExtractorClassName();
+
+    public Birthmark buildBirthmark();
+
+    public BirthmarkElement buildBirthmarkElement(String elementValue);
+
+    /**
+     * returns a extractor for the birthmark of this service.
+     */
+    public BirthmarkExtractor getExtractor();
+
+    public String getComparatorClassName();
+
+    /**
+     * returns a comparator for the birthmark of this service.
+     */
+    public BirthmarkComparator getComparator();
+
+    public boolean isExpert();
+
+    public boolean isUserDefined();
+
+}
+
@@ -1,27 +1,27 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-\r
-/**\r
- * Service provider interface for filtering comparison pair.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonPairFilterSpi extends ServiceProvider{\r
-    public String getDisplayFilterName(Locale locale);\r
-\r
-    public String getDisplayFilterName();\r
-\r
-    public String getFilterName();\r
-\r
-    public String getFilterClassName();\r
-\r
-    public ComparisonPairFilter getFilter();\r
-}\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+
+/**
+ * Service provider interface for filtering comparison pair.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonPairFilterSpi extends ServiceProvider{
+    public String getDisplayFilterName(Locale locale);
+
+    public String getDisplayFilterName();
+
+    public String getFilterName();
+
+    public String getFilterClassName();
+
+    public ComparisonPairFilter getFilter();
+}
@@ -1,31 +1,31 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistory;\r
-\r
-/**\r
- * This service provider interface manages extracted birthmark histories.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ExtractedBirthmarkSpi{\r
-    /**\r
-     * finds and returns history from given parameter.\r
-     * @param parameter search base.\r
-     * @return found history.\r
-     */\r
-    public ExtractedBirthmarkHistory getHistory(String parameter);\r
-\r
-    public ExtractionResultSet getResultSet(String id);\r
-\r
-    public ExtractionResultSet createResultSet(BirthmarkContext context);\r
-\r
-    public BirthmarkStoreTarget getTarget();\r
-}\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkHistory;
+
+/**
+ * This service provider interface manages extracted birthmark histories.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface ExtractedBirthmarkSpi{
+    /**
+     * finds and returns history from given parameter.
+     * @param parameter search base.
+     * @return found history.
+     */
+    public ExtractedBirthmarkHistory getHistory(String parameter);
+
+    public ExtractionResultSet getResultSet(String id);
+
+    public ExtractionResultSet createResultSet(BirthmarkContext context);
+
+    public BirthmarkStoreTarget getTarget();
+}
@@ -1,32 +1,32 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.printer.BirthmarkServicePrinter;\r
-import jp.naist.se.stigmata.printer.ComparisonPairPrinter;\r
-import jp.naist.se.stigmata.printer.ComparisonResultSetPrinter;\r
-import jp.naist.se.stigmata.printer.ExtractionResultSetPrinter;\r
-\r
-/**\r
- * Service provider interface for printing comparison/extracting\r
- * result to certain output stream.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ResultPrinterSpi extends ServiceProvider{\r
-    /**\r
-     * return a format.\r
-     */\r
-    public String getFormat();\r
-\r
-    public BirthmarkServicePrinter getBirthmarkServicePrinter();\r
-\r
-    public ComparisonResultSetPrinter getComparisonResultSetPrinter();\r
-\r
-    public ComparisonPairPrinter getComparisonPairPrinter();\r
-\r
-    public ExtractionResultSetPrinter getExtractionResultSetPrinter();\r
-}\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.printer.BirthmarkServicePrinter;
+import jp.sourceforge.stigmata.printer.ComparisonPairPrinter;
+import jp.sourceforge.stigmata.printer.ComparisonResultSetPrinter;
+import jp.sourceforge.stigmata.printer.ExtractionResultSetPrinter;
+
+/**
+ * Service provider interface for printing comparison/extracting
+ * result to certain output stream.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ResultPrinterSpi extends ServiceProvider{
+    /**
+     * return a format.
+     */
+    public String getFormat();
+
+    public BirthmarkServicePrinter getBirthmarkServicePrinter();
+
+    public ComparisonResultSetPrinter getComparisonResultSetPrinter();
+
+    public ComparisonPairPrinter getComparisonPairPrinter();
+
+    public ExtractionResultSetPrinter getExtractionResultSetPrinter();
+}
@@ -1,23 +1,23 @@
-package jp.naist.se.stigmata.spi;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-/**\r
- * Base interface for birthmark SPI.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ServiceProvider{\r
-    public String getDescription(Locale locale);\r
-\r
-    public String getDescription();\r
-\r
-    public String getVendorName();\r
-\r
-    public String getVersion();\r
-}\r
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+/**
+ * Base interface for birthmark SPI.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ServiceProvider{
+    public String getDescription(Locale locale);
+
+    public String getDescription();
+
+    public String getVendorName();
+
+    public String getVersion();
+}
@@ -1,31 +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
+package jp.sourceforge.stigmata.spi;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.hook.StigmataHook;
+import jp.sourceforge.stigmata.hook.StigmataRuntimeHook;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface StigmataHookSpi{
+    public StigmataHook onSetup();
+
+    public StigmataHook onTearDown();
+
+    public StigmataRuntimeHook beforeExtraction();
+
+    public StigmataRuntimeHook afterExtraction();
+
+    public StigmataRuntimeHook beforeComparison();
+
+    public StigmataRuntimeHook afterComparison();
+
+    public StigmataRuntimeHook beforeFiltering();
+
+    public StigmataRuntimeHook afterFiltering();
 }
\ No newline at end of file
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Dimension;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.ItemEvent;\r
-import java.awt.event.ItemListener;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.BoxLayout;\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JButton;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTextArea;\r
-import javax.swing.JTextField;\r
-import javax.swing.ListModel;\r
-import javax.swing.border.TitledBorder;\r
-import javax.swing.event.DocumentEvent;\r
-import javax.swing.event.DocumentListener;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkService;\r
-import jp.naist.se.stigmata.spi.BirthmarkComparatorSpi;\r
-import jp.naist.se.stigmata.spi.BirthmarkExtractorSpi;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkDefinitionPane extends JPanel{\r
-    private static final long serialVersionUID = 3932637653297802978L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private DefaultListModel model;\r
-    private InformationPane information;\r
-    private JList serviceList;\r
-    private JButton newService;\r
-    private JButton removeService;\r
-    private List<BirthmarkSpi> addedService = new ArrayList<BirthmarkSpi>();\r
-    private List<BirthmarkServiceListener> listeners = new ArrayList<BirthmarkServiceListener>();\r
-\r
-    public BirthmarkDefinitionPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-\r
-        initLayouts();\r
-        initData();\r
-\r
-        updateView();\r
-    }\r
-\r
-    public void addBirthmarkServiceListener(BirthmarkServiceListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    public void reset(){\r
-        for(BirthmarkSpi service: addedService){\r
-            model.removeElement(service);\r
-        }\r
-    }\r
-\r
-    public void updateEnvironment(BirthmarkEnvironment environment){\r
-        for(BirthmarkSpi service: addedService){\r
-            if(environment.getService(service.getType()) == null){\r
-                if(service instanceof BirthmarkService){\r
-                    ((BirthmarkService)service).setBirthmarkEnvironment(environment);\r
-                }\r
-                environment.addService(service);\r
-            }\r
-        }\r
-    }\r
-\r
-    private void initData(){\r
-        information.initData();\r
-        model.addElement(stigmata.getMessages().get("newservice.definition.label"));\r
-\r
-        for(BirthmarkSpi service: stigmata.getEnvironment().findServices()){\r
-            model.addElement(service);\r
-        }\r
-    }\r
-\r
-    private void initLayouts(){\r
-        Messages messages = stigmata.getMessages();\r
-        JPanel panel = new JPanel(new BorderLayout());\r
-        serviceList = new JList(model = new DefaultListModel());\r
-        serviceList.setCellRenderer(new BirthmarkServiceListCellRenderer(new Dimension(250, 20), 60));\r
-        JScrollPane scroll = new JScrollPane(serviceList);\r
-\r
-        scroll.setBorder(new TitledBorder(messages.get("servicelist.border")));\r
-        serviceList.setToolTipText(messages.get("servicelist.tooltip"));\r
-\r
-        panel.add(scroll, BorderLayout.WEST);\r
-        panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);\r
-\r
-        Box buttonPanel = Box.createHorizontalBox();\r
-        newService = GUIUtility.createButton(messages, "newservice");\r
-        removeService = GUIUtility.createButton(messages, "removeservice");\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-        buttonPanel.add(newService);\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-        buttonPanel.add(removeService);\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-\r
-        setLayout(new BorderLayout());\r
-        add(panel, BorderLayout.CENTER);\r
-        add(buttonPanel, BorderLayout.SOUTH);\r
-\r
-        removeService.setEnabled(false);\r
-\r
-        serviceList.addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent e){\r
-                listValueChanged(e);\r
-            }\r
-        });\r
-\r
-        newService.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                addNewService();\r
-            }\r
-        });\r
-\r
-        removeService.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                removeService();\r
-            }\r
-        });\r
-    }\r
-\r
-    private void removeService(){\r
-        int index = serviceList.getSelectedIndex();\r
-        if(index > 0){\r
-            BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);\r
-            if(service != null && service.isUserDefined()){\r
-                model.remove(index);\r
-                for(BirthmarkServiceListener listener: listeners){\r
-                    listener.serviceRemoved(service);\r
-                }\r
-            }\r
-        }\r
-        stigmata.setNeedToSaveSettings(true);\r
-        updateView();\r
-    }\r
-\r
-    private void addNewService(){\r
-        BirthmarkService service = information.createService();\r
-        model.addElement(service);\r
-        addedService.add(service);\r
-\r
-        for(BirthmarkServiceListener listener: listeners){\r
-            listener.serviceAdded(service);\r
-        }\r
-        stigmata.setNeedToSaveSettings(true);\r
-        updateView();\r
-    }\r
-\r
-    private void listValueChanged(ListSelectionEvent e){\r
-        int index = serviceList.getSelectedIndex();\r
-        if(index > 0){\r
-            BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);\r
-            if(service != null){\r
-                information.setService(service);\r
-            }\r
-        }\r
-        else if(index == 0){\r
-            information.clear();\r
-        }\r
-        updateView();\r
-    }\r
-\r
-    /**\r
-     * remove: enabled when selected index is greater than 0 and selected service is defined by user.\r
-     * new service: enabled when selected index is less equals than 0 or selected service is defined by user and information pane is show available service.\r
-     *\r
-     */\r
-    private void updateView(){\r
-        int index = serviceList.getSelectedIndex();\r
-        ListModel model = serviceList.getModel();\r
-        BirthmarkSpi service = null;\r
-        if(index > 0){\r
-            service = (BirthmarkSpi)model.getElementAt(index); \r
-        }\r
-        newService.setEnabled(\r
-            (index <= 0 || service.isUserDefined()) && \r
-            information.isAvailableService() &&\r
-            isAvailableServiceName(information.getType())\r
-        );\r
-        removeService.setEnabled(index > 0 && service.isUserDefined());\r
-        information.setEnabled(index <= 0 || service.isUserDefined());\r
-    }\r
-\r
-    private boolean isAvailableServiceName(String name){\r
-        for(BirthmarkSpi service: addedService){\r
-            if(service.getType().equals(name)){\r
-                return false;\r
-            }\r
-        }\r
-        return true;\r
-    }\r
-\r
-    private static class InformationPane extends JPanel{\r
-        private static final long serialVersionUID = 37906542932362L;\r
-\r
-        private StigmataFrame stigmata;\r
-        private BirthmarkDefinitionPane thisPane;\r
-        private JTextField type;\r
-        private JTextField displayType;\r
-        private JTextArea description;\r
-        private JComboBox extractor;\r
-        private JComboBox comparator;\r
-        private JCheckBox expert;\r
-        private JCheckBox userDefined;\r
-\r
-        public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){\r
-            this.stigmata = stigmata;\r
-            this.thisPane = thisPane;\r
-            initLayouts();\r
-        }\r
-\r
-        public String getType(){\r
-            return type.getText();\r
-        }\r
-\r
-        public void setEnabled(boolean flag){\r
-            super.setEnabled(flag);\r
-\r
-            type.setEnabled(flag);\r
-            displayType.setEnabled(flag);\r
-            description.setEnabled(flag);\r
-            extractor.setEnabled(flag);\r
-            comparator.setEnabled(flag);\r
-        }\r
-\r
-        public BirthmarkService createService(){\r
-            BirthmarkService service = new BirthmarkService();\r
-            service.setType(type.getText());\r
-            service.setDisplayType(displayType.getText());\r
-            service.setDescription(description.getText());\r
-            service.setExtractorClassName(extractor.getSelectedItem().toString());\r
-            service.setComparatorClassName(comparator.getSelectedItem().toString());\r
-            service.setUserDefined(true);\r
-\r
-            return service;\r
-        }\r
-\r
-        public void clear(){\r
-            type.setText("");\r
-            displayType.setText("");\r
-            description.setText("");\r
-            extractor.getModel().setSelectedItem(null);\r
-            comparator.getModel().setSelectedItem(null);\r
-            userDefined.setSelected(true);\r
-            expert.setSelected(true);\r
-        }\r
-\r
-        public boolean isAvailableService(){\r
-            String newType = type.getText();\r
-            Object selectedExtractor = extractor.getSelectedItem();\r
-            String extractorClass = "";;\r
-            if(selectedExtractor != null){\r
-                extractorClass = selectedExtractor.toString();\r
-            }\r
-            Object selectedComparator = comparator.getSelectedItem();\r
-            String comparatorClass = "";\r
-            if(selectedComparator != null){\r
-                comparatorClass = selectedComparator.toString();\r
-            }\r
-            BirthmarkEnvironment environment = stigmata.getEnvironment();\r
-\r
-            boolean flag = newType.length() > 0\r
-                    && displayType.getText().length() > 0\r
-                    && extractorClass.length() > 0\r
-                    && comparatorClass.length() > 0;\r
-\r
-            // check inputed type is free\r
-            flag = flag && environment.getService(newType) == null;\r
-\r
-            // check extractor/comparator classes are available\r
-            try{\r
-                flag = flag\r
-                    && environment.getClasspathContext().find(extractorClass) != null\r
-                    && environment.getClasspathContext().find(comparatorClass) != null;\r
-            } catch(ClassNotFoundException e){\r
-                flag = false;\r
-            }\r
-\r
-            return flag;\r
-        }\r
-\r
-        public void setService(BirthmarkSpi service){\r
-            type.setText(service.getType());\r
-            displayType.setText(service.getDisplayType());\r
-            description.setText(service.getDefaultDescription());\r
-            selectComboBoxItem(extractor, service.getExtractorClassName());\r
-            selectComboBoxItem(comparator, service.getComparatorClassName());\r
-            userDefined.setSelected(service.isUserDefined());\r
-            expert.setSelected(service.isExpert());\r
-\r
-            setEnabled(service.isUserDefined());\r
-        }\r
-\r
-        public void initData(){\r
-            comparator.addItem("");\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 = stigmata.getEnvironment().lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){\r
-                BirthmarkExtractorSpi service = i.next();\r
-                extractor.addItem(service.getExtractorClassName());\r
-            }\r
-        }\r
-\r
-        private void selectComboBoxItem(JComboBox box, String item){\r
-            box.getModel().setSelectedItem(item);\r
-        }\r
-\r
-        private void initLayouts(){\r
-            Messages messages = stigmata.getMessages();\r
-            type = new JTextField();\r
-            displayType = new JTextField();\r
-            extractor = new JComboBox();\r
-            comparator = new JComboBox();\r
-            expert = new JCheckBox(messages.get("define.expert.label"));\r
-            userDefined = new JCheckBox(messages.get("define.userdef.label"));\r
-            description = new JTextArea();\r
-            JScrollPane scroll = new JScrollPane(description);\r
-            type.setColumns(10);\r
-            displayType.setColumns(20);\r
-            description.setColumns(40);\r
-            description.setRows(10);\r
-\r
-            Box box1 = Box.createHorizontalBox();\r
-            box1.add(type);\r
-            box1.add(displayType);\r
-\r
-            Box box2 = Box.createHorizontalBox();\r
-            box2.add(Box.createHorizontalGlue());\r
-            box2.add(expert);\r
-            box2.add(Box.createHorizontalGlue());\r
-            box2.add(userDefined);\r
-            box2.add(Box.createHorizontalGlue());\r
-\r
-            JPanel panel = new JPanel(new GridLayout(3, 1));\r
-            panel.add(box1);\r
-            panel.add(extractor);\r
-            panel.add(comparator);\r
-\r
-            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));\r
-            add(panel);\r
-            add(box2);\r
-            add(scroll);\r
-            add(Box.createVerticalGlue());\r
-\r
-            GUIUtility.decorateJComponent(messages, type, "define.type");\r
-            GUIUtility.decorateJComponent(messages, displayType, "define.displaytype");\r
-            GUIUtility.decorateJComponent(messages, scroll, "define.description");\r
-            GUIUtility.decorateJComponent(messages, extractor, "define.extractor");\r
-            GUIUtility.decorateJComponent(messages, comparator, "define.comparator");\r
-            GUIUtility.decorateJComponent(messages, expert, "define.expert");\r
-            GUIUtility.decorateJComponent(messages, userDefined, "define.userdef");\r
-\r
-            userDefined.setEnabled(false);\r
-            expert.setEnabled(false);\r
-            userDefined.setSelected(true);\r
-            expert.setSelected(true);\r
-\r
-            extractor.setEditable(true);\r
-            comparator.setEditable(true);\r
-\r
-            DocumentListener listener = new DocumentListener(){\r
-                public void insertUpdate(DocumentEvent e){\r
-                    thisPane.updateView();\r
-                }\r
-\r
-                public void removeUpdate(DocumentEvent e){\r
-                    thisPane.updateView();\r
-                }\r
-\r
-                public void changedUpdate(DocumentEvent e){\r
-                    thisPane.updateView();\r
-                }\r
-            };\r
-\r
-            type.getDocument().addDocumentListener(listener);\r
-            displayType.getDocument().addDocumentListener(listener);\r
-            description.getDocument().addDocumentListener(listener);\r
-            ItemListener itemListener = new ItemListener(){\r
-                public void itemStateChanged(ItemEvent e){\r
-                    thisPane.updateView();\r
-                }\r
-            };\r
-            comparator.addItemListener(itemListener);\r
-            extractor.addItemListener(itemListener);\r
-            ActionListener actionListener = new ActionListener(){\r
-                public void actionPerformed(ActionEvent e){\r
-                    thisPane.updateView();\r
-                }\r
-            };\r
-            comparator.getEditor().addActionListener(actionListener);\r
-            extractor.getEditor().addActionListener(actionListener);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.ListModel;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkService;
+import jp.sourceforge.stigmata.spi.BirthmarkComparatorSpi;
+import jp.sourceforge.stigmata.spi.BirthmarkExtractorSpi;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkDefinitionPane extends JPanel{
+    private static final long serialVersionUID = 3932637653297802978L;
+
+    private StigmataFrame stigmata;
+    private DefaultListModel model;
+    private InformationPane information;
+    private JList serviceList;
+    private JButton newService;
+    private JButton removeService;
+    private List<BirthmarkSpi> addedService = new ArrayList<BirthmarkSpi>();
+    private List<BirthmarkServiceListener> listeners = new ArrayList<BirthmarkServiceListener>();
+
+    public BirthmarkDefinitionPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+
+        initLayouts();
+        initData();
+
+        updateView();
+    }
+
+    public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
+        listeners.remove(listener);
+    }
+
+    public void reset(){
+        for(BirthmarkSpi service: addedService){
+            model.removeElement(service);
+        }
+    }
+
+    public void updateEnvironment(BirthmarkEnvironment environment){
+        for(BirthmarkSpi service: addedService){
+            if(environment.getService(service.getType()) == null){
+                if(service instanceof BirthmarkService){
+                    ((BirthmarkService)service).setBirthmarkEnvironment(environment);
+                }
+                environment.addService(service);
+            }
+        }
+    }
+
+    private void initData(){
+        information.initData();
+        model.addElement(stigmata.getMessages().get("newservice.definition.label"));
+
+        for(BirthmarkSpi service: stigmata.getEnvironment().findServices()){
+            model.addElement(service);
+        }
+    }
+
+    private void initLayouts(){
+        Messages messages = stigmata.getMessages();
+        JPanel panel = new JPanel(new BorderLayout());
+        serviceList = new JList(model = new DefaultListModel());
+        serviceList.setCellRenderer(new BirthmarkServiceListCellRenderer(new Dimension(250, 20), 60));
+        JScrollPane scroll = new JScrollPane(serviceList);
+
+        scroll.setBorder(new TitledBorder(messages.get("servicelist.border")));
+        serviceList.setToolTipText(messages.get("servicelist.tooltip"));
+
+        panel.add(scroll, BorderLayout.WEST);
+        panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);
+
+        Box buttonPanel = Box.createHorizontalBox();
+        newService = GUIUtility.createButton(messages, "newservice");
+        removeService = GUIUtility.createButton(messages, "removeservice");
+        buttonPanel.add(Box.createHorizontalGlue());
+        buttonPanel.add(newService);
+        buttonPanel.add(Box.createHorizontalGlue());
+        buttonPanel.add(removeService);
+        buttonPanel.add(Box.createHorizontalGlue());
+
+        setLayout(new BorderLayout());
+        add(panel, BorderLayout.CENTER);
+        add(buttonPanel, BorderLayout.SOUTH);
+
+        removeService.setEnabled(false);
+
+        serviceList.addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent e){
+                listValueChanged(e);
+            }
+        });
+
+        newService.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                addNewService();
+            }
+        });
+
+        removeService.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                removeService();
+            }
+        });
+    }
+
+    private void removeService(){
+        int index = serviceList.getSelectedIndex();
+        if(index > 0){
+            BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
+            if(service != null && service.isUserDefined()){
+                model.remove(index);
+                for(BirthmarkServiceListener listener: listeners){
+                    listener.serviceRemoved(service);
+                }
+            }
+        }
+        stigmata.setNeedToSaveSettings(true);
+        updateView();
+    }
+
+    private void addNewService(){
+        BirthmarkService service = information.createService();
+        model.addElement(service);
+        addedService.add(service);
+
+        for(BirthmarkServiceListener listener: listeners){
+            listener.serviceAdded(service);
+        }
+        stigmata.setNeedToSaveSettings(true);
+        updateView();
+    }
+
+    private void listValueChanged(ListSelectionEvent e){
+        int index = serviceList.getSelectedIndex();
+        if(index > 0){
+            BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
+            if(service != null){
+                information.setService(service);
+            }
+        }
+        else if(index == 0){
+            information.clear();
+        }
+        updateView();
+    }
+
+    /**
+     * remove: enabled when selected index is greater than 0 and selected service is defined by user.
+     * new service: enabled when selected index is less equals than 0 or selected service is defined by user and information pane is show available service.
+     *
+     */
+    private void updateView(){
+        int index = serviceList.getSelectedIndex();
+        ListModel model = serviceList.getModel();
+        BirthmarkSpi service = null;
+        if(index > 0){
+            service = (BirthmarkSpi)model.getElementAt(index); 
+        }
+        newService.setEnabled(
+            (index <= 0 || service.isUserDefined()) && 
+            information.isAvailableService() &&
+            isAvailableServiceName(information.getType())
+        );
+        removeService.setEnabled(index > 0 && service.isUserDefined());
+        information.setEnabled(index <= 0 || service.isUserDefined());
+    }
+
+    private boolean isAvailableServiceName(String name){
+        for(BirthmarkSpi service: addedService){
+            if(service.getType().equals(name)){
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static class InformationPane extends JPanel{
+        private static final long serialVersionUID = 37906542932362L;
+
+        private StigmataFrame stigmata;
+        private BirthmarkDefinitionPane thisPane;
+        private JTextField type;
+        private JTextField displayType;
+        private JTextArea description;
+        private JComboBox extractor;
+        private JComboBox comparator;
+        private JCheckBox expert;
+        private JCheckBox userDefined;
+
+        public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
+            this.stigmata = stigmata;
+            this.thisPane = thisPane;
+            initLayouts();
+        }
+
+        public String getType(){
+            return type.getText();
+        }
+
+        public void setEnabled(boolean flag){
+            super.setEnabled(flag);
+
+            type.setEnabled(flag);
+            displayType.setEnabled(flag);
+            description.setEnabled(flag);
+            extractor.setEnabled(flag);
+            comparator.setEnabled(flag);
+        }
+
+        public BirthmarkService createService(){
+            BirthmarkService service = new BirthmarkService();
+            service.setType(type.getText());
+            service.setDisplayType(displayType.getText());
+            service.setDescription(description.getText());
+            service.setExtractorClassName(extractor.getSelectedItem().toString());
+            service.setComparatorClassName(comparator.getSelectedItem().toString());
+            service.setUserDefined(true);
+
+            return service;
+        }
+
+        public void clear(){
+            type.setText("");
+            displayType.setText("");
+            description.setText("");
+            extractor.getModel().setSelectedItem(null);
+            comparator.getModel().setSelectedItem(null);
+            userDefined.setSelected(true);
+            expert.setSelected(true);
+        }
+
+        public boolean isAvailableService(){
+            String newType = type.getText();
+            Object selectedExtractor = extractor.getSelectedItem();
+            String extractorClass = "";;
+            if(selectedExtractor != null){
+                extractorClass = selectedExtractor.toString();
+            }
+            Object selectedComparator = comparator.getSelectedItem();
+            String comparatorClass = "";
+            if(selectedComparator != null){
+                comparatorClass = selectedComparator.toString();
+            }
+            BirthmarkEnvironment environment = stigmata.getEnvironment();
+
+            boolean flag = newType.length() > 0
+                    && displayType.getText().length() > 0
+                    && extractorClass.length() > 0
+                    && comparatorClass.length() > 0;
+
+            // check inputed type is free
+            flag = flag && environment.getService(newType) == null;
+
+            // check extractor/comparator classes are available
+            try{
+                flag = flag
+                    && environment.getClasspathContext().find(extractorClass) != null
+                    && environment.getClasspathContext().find(comparatorClass) != null;
+            } catch(ClassNotFoundException e){
+                flag = false;
+            }
+
+            return flag;
+        }
+
+        public void setService(BirthmarkSpi service){
+            type.setText(service.getType());
+            displayType.setText(service.getDisplayType());
+            description.setText(service.getDefaultDescription());
+            selectComboBoxItem(extractor, service.getExtractorClassName());
+            selectComboBoxItem(comparator, service.getComparatorClassName());
+            userDefined.setSelected(service.isUserDefined());
+            expert.setSelected(service.isExpert());
+
+            setEnabled(service.isUserDefined());
+        }
+
+        public void initData(){
+            comparator.addItem("");
+            for(Iterator<BirthmarkComparatorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkComparatorSpi.class); i.hasNext();){
+                BirthmarkComparatorSpi service = i.next();
+                comparator.addItem(service.getComparatorClassName());
+            }
+            extractor.addItem("");
+            for(Iterator<BirthmarkExtractorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){
+                BirthmarkExtractorSpi service = i.next();
+                extractor.addItem(service.getExtractorClassName());
+            }
+        }
+
+        private void selectComboBoxItem(JComboBox box, String item){
+            box.getModel().setSelectedItem(item);
+        }
+
+        private void initLayouts(){
+            Messages messages = stigmata.getMessages();
+            type = new JTextField();
+            displayType = new JTextField();
+            extractor = new JComboBox();
+            comparator = new JComboBox();
+            expert = new JCheckBox(messages.get("define.expert.label"));
+            userDefined = new JCheckBox(messages.get("define.userdef.label"));
+            description = new JTextArea();
+            JScrollPane scroll = new JScrollPane(description);
+            type.setColumns(10);
+            displayType.setColumns(20);
+            description.setColumns(40);
+            description.setRows(10);
+
+            Box box1 = Box.createHorizontalBox();
+            box1.add(type);
+            box1.add(displayType);
+
+            Box box2 = Box.createHorizontalBox();
+            box2.add(Box.createHorizontalGlue());
+            box2.add(expert);
+            box2.add(Box.createHorizontalGlue());
+            box2.add(userDefined);
+            box2.add(Box.createHorizontalGlue());
+
+            JPanel panel = new JPanel(new GridLayout(3, 1));
+            panel.add(box1);
+            panel.add(extractor);
+            panel.add(comparator);
+
+            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+            add(panel);
+            add(box2);
+            add(scroll);
+            add(Box.createVerticalGlue());
+
+            GUIUtility.decorateJComponent(messages, type, "define.type");
+            GUIUtility.decorateJComponent(messages, displayType, "define.displaytype");
+            GUIUtility.decorateJComponent(messages, scroll, "define.description");
+            GUIUtility.decorateJComponent(messages, extractor, "define.extractor");
+            GUIUtility.decorateJComponent(messages, comparator, "define.comparator");
+            GUIUtility.decorateJComponent(messages, expert, "define.expert");
+            GUIUtility.decorateJComponent(messages, userDefined, "define.userdef");
+
+            userDefined.setEnabled(false);
+            expert.setEnabled(false);
+            userDefined.setSelected(true);
+            expert.setSelected(true);
+
+            extractor.setEditable(true);
+            comparator.setEditable(true);
+
+            DocumentListener listener = new DocumentListener(){
+                public void insertUpdate(DocumentEvent e){
+                    thisPane.updateView();
+                }
+
+                public void removeUpdate(DocumentEvent e){
+                    thisPane.updateView();
+                }
+
+                public void changedUpdate(DocumentEvent e){
+                    thisPane.updateView();
+                }
+            };
+
+            type.getDocument().addDocumentListener(listener);
+            displayType.getDocument().addDocumentListener(listener);
+            description.getDocument().addDocumentListener(listener);
+            ItemListener itemListener = new ItemListener(){
+                public void itemStateChanged(ItemEvent e){
+                    thisPane.updateView();
+                }
+            };
+            comparator.addItemListener(itemListener);
+            extractor.addItemListener(itemListener);
+            ActionListener actionListener = new ActionListener(){
+                public void actionPerformed(ActionEvent e){
+                    thisPane.updateView();
+                }
+            };
+            comparator.getEditor().addActionListener(actionListener);
+            extractor.getEditor().addActionListener(actionListener);
+        }
+    }
+}
@@ -1,90 +1,90 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.io.PrintWriter;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.Action;\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JPanel;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.JScrollPane;\r
-\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.ExtractionTarget;\r
-import jp.naist.se.stigmata.printer.ExtractionResultSetPrinter;\r
-import jp.naist.se.stigmata.printer.PrinterManager;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;\r
-import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
-import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkExtractionResultPane extends JPanel{\r
-    private static final long serialVersionUID = 239084365756236543L;\r
-\r
-    private StigmataFrame frame;\r
-    private ExtractionResultSet extraction;\r
-\r
-    public BirthmarkExtractionResultPane(StigmataFrame stigmataFrame, ExtractionResultSet ers){\r
-        this.frame = stigmataFrame;\r
-        this.extraction = ers;\r
-\r
-        initLayouts();\r
-    }\r
-\r
-    private void initLayouts(){\r
-        JComponent southPanel = Box.createHorizontalBox();\r
-        Action saveAction = new SaveAction(frame, new AsciiDataWritable(){\r
-            public void writeAsciiData(PrintWriter out, String format){\r
-                ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
-                if(service == null){\r
-                    service = PrinterManager.getDefaultFormatService();\r
-                }\r
-\r
-                ExtractionResultSetPrinter list = service.getExtractionResultSetPrinter();\r
-                list.printResult(new PrintWriter(out), extraction);\r
-            }\r
-        });\r
-        Action compareAction = new AbstractAction(){\r
-            private static final long serialVersionUID = -1938101718384412339L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                frame.compareExtractionResult(extraction);\r
-            }\r
-        };\r
-        Messages messages = frame.getMessages();\r
-        JButton saveButton = GUIUtility.createButton(messages, "savebirthmark", saveAction);\r
-        JButton compareButton = GUIUtility.createButton(messages, "comparebirthmark", compareAction);\r
-\r
-        JPopupMenu popup = new JPopupMenu();\r
-        popup.add(GUIUtility.createJMenuItem(messages, "savebirthmark", saveAction));\r
-        popup.add(GUIUtility.createJMenuItem(messages, "comparebirthmark", compareAction));\r
-\r
-        JScrollPane scroll = new JScrollPane();\r
-        scroll.setViewportView(new BirthmarkTree(frame, extraction.getBirthmarkSets(ExtractionTarget.TARGET_BOTH)));\r
-\r
-        setLayout(new BorderLayout());\r
-        add(popup);\r
-        add(scroll, BorderLayout.CENTER);\r
-        add(southPanel, BorderLayout.SOUTH);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(saveButton);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(compareButton);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-\r
-        addMouseListener(new PopupShowAction(popup));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.io.PrintWriter;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.printer.ExtractionResultSetPrinter;
+import jp.sourceforge.stigmata.printer.PrinterManager;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
+import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
+import jp.sourceforge.stigmata.utils.AsciiDataWritable;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkExtractionResultPane extends JPanel{
+    private static final long serialVersionUID = 239084365756236543L;
+
+    private StigmataFrame frame;
+    private ExtractionResultSet extraction;
+
+    public BirthmarkExtractionResultPane(StigmataFrame stigmataFrame, ExtractionResultSet ers){
+        this.frame = stigmataFrame;
+        this.extraction = ers;
+
+        initLayouts();
+    }
+
+    private void initLayouts(){
+        JComponent southPanel = Box.createHorizontalBox();
+        Action saveAction = new SaveAction(frame, new AsciiDataWritable(){
+            public void writeAsciiData(PrintWriter out, String format){
+                ResultPrinterSpi service = PrinterManager.getInstance().getService(format);
+                if(service == null){
+                    service = PrinterManager.getDefaultFormatService();
+                }
+
+                ExtractionResultSetPrinter list = service.getExtractionResultSetPrinter();
+                list.printResult(new PrintWriter(out), extraction);
+            }
+        });
+        Action compareAction = new AbstractAction(){
+            private static final long serialVersionUID = -1938101718384412339L;
+
+            public void actionPerformed(ActionEvent e){
+                frame.compareExtractionResult(extraction);
+            }
+        };
+        Messages messages = frame.getMessages();
+        JButton saveButton = GUIUtility.createButton(messages, "savebirthmark", saveAction);
+        JButton compareButton = GUIUtility.createButton(messages, "comparebirthmark", compareAction);
+
+        JPopupMenu popup = new JPopupMenu();
+        popup.add(GUIUtility.createJMenuItem(messages, "savebirthmark", saveAction));
+        popup.add(GUIUtility.createJMenuItem(messages, "comparebirthmark", compareAction));
+
+        JScrollPane scroll = new JScrollPane();
+        scroll.setViewportView(new BirthmarkTree(frame, extraction.getBirthmarkSets(ExtractionTarget.TARGET_BOTH)));
+
+        setLayout(new BorderLayout());
+        add(popup);
+        add(scroll, BorderLayout.CENTER);
+        add(southPanel, BorderLayout.SOUTH);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(saveButton);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(compareButton);
+        southPanel.add(Box.createHorizontalGlue());
+
+        addMouseListener(new PopupShowAction(popup));
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashSet;\r
-import java.util.Iterator;\r
-import java.util.LinkedHashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import javax.swing.JPanel;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class BirthmarkSelectablePane extends JPanel implements BirthmarkServiceListener{\r
-    private StigmataFrame stigmata;\r
-    private Set<String> selectedServices = new HashSet<String>();\r
-    private Map<String, BirthmarkSelection> services;\r
-    private List<DataChangeListener> listeners = new ArrayList<DataChangeListener>();\r
-    private boolean expertmode;\r
-\r
-    public BirthmarkSelectablePane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-\r
-        initServices();\r
-        stigmata.addBirthmarkServiceListener(this);\r
-    }\r
-\r
-    protected abstract void updateLayouts();\r
-\r
-    public Messages getMessages(){\r
-        return stigmata.getMessages();\r
-    }\r
-\r
-    public void setExpertMode(boolean expertmode){\r
-        this.expertmode = expertmode;\r
-        updateLayouts();\r
-    }\r
-\r
-    public boolean isExpertMode(){\r
-        return expertmode;\r
-    }\r
-\r
-    public String[] getSelectedServiceTypes(){\r
-        return selectedServices.toArray(new String[selectedServices.size()]);\r
-    }\r
-\r
-    public BirthmarkSpi getService(String type){\r
-        BirthmarkSelection elem = services.get(type);\r
-        if(elem != null){\r
-            return elem.getService();\r
-        }\r
-    \r
-        return null;\r
-    }\r
-\r
-    public String[] getServiceTypes(){\r
-        String[] serviceArray = new String[services.size()];\r
-        int index = 0;\r
-        for(String key: services.keySet()){\r
-            BirthmarkSpi service = services.get(key).getService();\r
-            serviceArray[index] = service.getType();\r
-            index++;\r
-        }\r
-        return serviceArray;\r
-    }\r
-\r
-    public boolean hasService(String type){\r
-        return services.get(type) != null;\r
-    }\r
-\r
-    public void select(String type, boolean flag){\r
-        if(flag){\r
-            selectedServices.add(type);\r
-        }\r
-        else{\r
-            selectedServices.remove(type);\r
-        }\r
-        fireEvent();\r
-    }\r
-\r
-    public void select(BirthmarkSpi service, boolean flag){\r
-        select(service.getType(), flag);\r
-    }\r
-\r
-    public void reset(){\r
-        selectedServices.clear();\r
-        initServices();\r
-        expertmode = false;\r
-        updateLayouts();\r
-        fireEvent();\r
-    }\r
-\r
-    public void addDataChangeListener(DataChangeListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void serviceAdded(BirthmarkSpi service){\r
-        if(services.get(service.getType()) == null){\r
-            BirthmarkSelection elem = new BirthmarkSelection(service);\r
-            selectedServices.add(service.getType());\r
-            services.put(service.getType(), elem);\r
-        }\r
-        updateLayouts();\r
-        fireEvent();\r
-    }\r
-\r
-    public void serviceRemoved(BirthmarkSpi service){\r
-        BirthmarkSelection elem = services.get(service);\r
-        if(elem != null){\r
-            selectedServices.remove(service);\r
-            services.remove(service);\r
-        }\r
-        fireEvent();\r
-    }\r
-\r
-    public Iterator<String> serviceNames(){\r
-        return services.keySet().iterator();\r
-    }\r
-\r
-    protected BirthmarkSelection getSelection(String type){\r
-        return services.get(type);\r
-    }\r
-\r
-    protected Iterator<BirthmarkSelection> birthmarkSelections(){\r
-        return services.values().iterator();\r
-    }\r
-\r
-    protected void fireEvent(){\r
-        for(DataChangeListener listener: listeners){\r
-            listener.valueChanged(this);\r
-        }\r
-    }\r
-\r
-    private void initServices(){\r
-        BirthmarkSpi[] serviceArray = stigmata.getEnvironment().getServices();\r
-\r
-        services = new LinkedHashMap<String, BirthmarkSelection>();\r
-        for(BirthmarkSpi service: serviceArray){\r
-            BirthmarkSelection elem = new BirthmarkSelection(service);\r
-            services.put(service.getType(), elem);\r
-        }\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class BirthmarkSelectablePane extends JPanel implements BirthmarkServiceListener{
+    private StigmataFrame stigmata;
+    private Set<String> selectedServices = new HashSet<String>();
+    private Map<String, BirthmarkSelection> services;
+    private List<DataChangeListener> listeners = new ArrayList<DataChangeListener>();
+    private boolean expertmode;
+
+    public BirthmarkSelectablePane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+
+        initServices();
+        stigmata.addBirthmarkServiceListener(this);
+    }
+
+    protected abstract void updateLayouts();
+
+    public Messages getMessages(){
+        return stigmata.getMessages();
+    }
+
+    public void setExpertMode(boolean expertmode){
+        this.expertmode = expertmode;
+        updateLayouts();
+    }
+
+    public boolean isExpertMode(){
+        return expertmode;
+    }
+
+    public String[] getSelectedServiceTypes(){
+        return selectedServices.toArray(new String[selectedServices.size()]);
+    }
+
+    public BirthmarkSpi getService(String type){
+        BirthmarkSelection elem = services.get(type);
+        if(elem != null){
+            return elem.getService();
+        }
+    
+        return null;
+    }
+
+    public String[] getServiceTypes(){
+        String[] serviceArray = new String[services.size()];
+        int index = 0;
+        for(String key: services.keySet()){
+            BirthmarkSpi service = services.get(key).getService();
+            serviceArray[index] = service.getType();
+            index++;
+        }
+        return serviceArray;
+    }
+
+    public boolean hasService(String type){
+        return services.get(type) != null;
+    }
+
+    public void select(String type, boolean flag){
+        if(flag){
+            selectedServices.add(type);
+        }
+        else{
+            selectedServices.remove(type);
+        }
+        fireEvent();
+    }
+
+    public void select(BirthmarkSpi service, boolean flag){
+        select(service.getType(), flag);
+    }
+
+    public void reset(){
+        selectedServices.clear();
+        initServices();
+        expertmode = false;
+        updateLayouts();
+        fireEvent();
+    }
+
+    public void addDataChangeListener(DataChangeListener listener){
+        listeners.add(listener);
+    }
+
+    public void serviceAdded(BirthmarkSpi service){
+        if(services.get(service.getType()) == null){
+            BirthmarkSelection elem = new BirthmarkSelection(service);
+            selectedServices.add(service.getType());
+            services.put(service.getType(), elem);
+        }
+        updateLayouts();
+        fireEvent();
+    }
+
+    public void serviceRemoved(BirthmarkSpi service){
+        BirthmarkSelection elem = services.get(service);
+        if(elem != null){
+            selectedServices.remove(service);
+            services.remove(service);
+        }
+        fireEvent();
+    }
+
+    public Iterator<String> serviceNames(){
+        return services.keySet().iterator();
+    }
+
+    protected BirthmarkSelection getSelection(String type){
+        return services.get(type);
+    }
+
+    protected Iterator<BirthmarkSelection> birthmarkSelections(){
+        return services.values().iterator();
+    }
+
+    protected void fireEvent(){
+        for(DataChangeListener listener: listeners){
+            listener.valueChanged(this);
+        }
+    }
+
+    private void initServices(){
+        BirthmarkSpi[] serviceArray = stigmata.getEnvironment().getServices();
+
+        services = new LinkedHashMap<String, BirthmarkSelection>();
+        for(BirthmarkSpi service: serviceArray){
+            BirthmarkSelection elem = new BirthmarkSelection(service);
+            services.put(service.getType(), elem);
+        }
+    }
 }
\ No newline at end of file
@@ -1,44 +1,44 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/**\r
- *  $Id$\r
- */\r
-\r
-import java.io.Serializable;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class BirthmarkSelection implements Serializable{\r
-    private static final long serialVersionUID = -3244323970546344L;\r
-\r
-    private BirthmarkSpi service;\r
-    private boolean selected = true;\r
-\r
-    public BirthmarkSelection(BirthmarkSpi service){\r
-        this.service = service;\r
-    }\r
-\r
-    public BirthmarkSpi getService(){\r
-        return service;\r
-    }\r
-\r
-    public boolean isVisible(boolean expertFlag){\r
-        return expertFlag || (!expertFlag && !service.isExpert());\r
-    }\r
-\r
-    public boolean isSelected(){\r
-        return selected;\r
-    }\r
-\r
-    public void setSelected(boolean flag){\r
-        this.selected = flag;\r
-    }\r
-\r
-    public String getType(){\r
-        return service.getType();\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/**
+ *  $Id$
+ */
+
+import java.io.Serializable;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class BirthmarkSelection implements Serializable{
+    private static final long serialVersionUID = -3244323970546344L;
+
+    private BirthmarkSpi service;
+    private boolean selected = true;
+
+    public BirthmarkSelection(BirthmarkSpi service){
+        this.service = service;
+    }
+
+    public BirthmarkSpi getService(){
+        return service;
+    }
+
+    public boolean isVisible(boolean expertFlag){
+        return expertFlag || (!expertFlag && !service.isExpert());
+    }
+
+    public boolean isSelected(){
+        return selected;
+    }
+
+    public void setSelected(boolean flag){
+        this.selected = flag;
+    }
+
+    public String getType(){
+        return service.getType();
+    }
 }
\ No newline at end of file
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Dimension;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.util.Iterator;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JPanel;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkSelectionCheckSetPane extends BirthmarkSelectablePane{\r
-    private static final long serialVersionUID = 3209854654743223453L;\r
-\r
-    private JPanel checks = new JPanel();\r
-\r
-    public BirthmarkSelectionCheckSetPane(StigmataFrame stigmata){\r
-        super(stigmata);\r
-\r
-        initLayouts();\r
-    }\r
-\r
-    private void initLayouts(){\r
-        setLayout(new BorderLayout());\r
-        add(checks, BorderLayout.CENTER);\r
-\r
-        JButton checkAll = GUIUtility.createButton(getMessages(), "checkall");\r
-        JButton uncheckAll = GUIUtility.createButton(getMessages(), "uncheckall");\r
-\r
-        Box box = Box.createHorizontalBox();\r
-        box.add(Box.createHorizontalGlue());\r
-        box.add(checkAll);\r
-        box.add(Box.createHorizontalGlue());        \r
-        box.add(uncheckAll);\r
-        box.add(Box.createHorizontalGlue());\r
-        add(box, BorderLayout.SOUTH);\r
-\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                boolean flag = e.getActionCommand().equals("checkall");\r
-                for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){\r
-                    BirthmarkSelection le = i.next();\r
-                    le.setSelected(flag);\r
-                    fireEvent();\r
-                }\r
-                updateLayouts();\r
-            }\r
-        };\r
-        checkAll.addActionListener(listener);\r
-        uncheckAll.addActionListener(listener);\r
-    }\r
-\r
-    /**\r
-     * update layouts and update selected birthmarks list.\r
-     */\r
-    protected void updateLayouts(){\r
-        checks.removeAll();\r
-        Dimension d = calculateDimension();\r
-        checks.setLayout(new GridLayout(d.height, d.width));\r
-\r
-        for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){\r
-            final BirthmarkSelection elem = i.next();\r
-            if(elem.isVisible(isExpertMode())){\r
-                JCheckBox check = new JCheckBox(elem.getService().getDisplayType());\r
-                check.setSelected(elem.isSelected());\r
-                check.addActionListener(new ActionListener(){\r
-                    public void actionPerformed(ActionEvent e){\r
-                        JCheckBox c = (JCheckBox)e.getSource();\r
-                        elem.setSelected(c.isSelected());\r
-                        select(elem.getService().getType(), c.isSelected());\r
-                        fireEvent();\r
-                    }\r
-                });\r
-                checks.add(check);\r
-            }\r
-\r
-            select(elem.getType(), elem.isVisible(isExpertMode()) && elem.isSelected());\r
-        }\r
-        updateUI();\r
-    }\r
-\r
-    private Dimension calculateDimension(){\r
-        int rows = 1;\r
-        int cols = 0;\r
-        for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){\r
-            BirthmarkSelection selection = i.next();\r
-            if(selection.isVisible(isExpertMode())){\r
-                cols++;\r
-            }\r
-        }\r
-\r
-        if(cols > 4){\r
-            rows = (cols / 3);\r
-            if((cols % 3) != 0) rows++;\r
-            cols = 3;\r
-        }\r
-\r
-        return new Dimension(cols, rows);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Iterator;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JPanel;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkSelectionCheckSetPane extends BirthmarkSelectablePane{
+    private static final long serialVersionUID = 3209854654743223453L;
+
+    private JPanel checks = new JPanel();
+
+    public BirthmarkSelectionCheckSetPane(StigmataFrame stigmata){
+        super(stigmata);
+
+        initLayouts();
+    }
+
+    private void initLayouts(){
+        setLayout(new BorderLayout());
+        add(checks, BorderLayout.CENTER);
+
+        JButton checkAll = GUIUtility.createButton(getMessages(), "checkall");
+        JButton uncheckAll = GUIUtility.createButton(getMessages(), "uncheckall");
+
+        Box box = Box.createHorizontalBox();
+        box.add(Box.createHorizontalGlue());
+        box.add(checkAll);
+        box.add(Box.createHorizontalGlue());        
+        box.add(uncheckAll);
+        box.add(Box.createHorizontalGlue());
+        add(box, BorderLayout.SOUTH);
+
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                boolean flag = e.getActionCommand().equals("checkall");
+                for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){
+                    BirthmarkSelection le = i.next();
+                    le.setSelected(flag);
+                    fireEvent();
+                }
+                updateLayouts();
+            }
+        };
+        checkAll.addActionListener(listener);
+        uncheckAll.addActionListener(listener);
+    }
+
+    /**
+     * update layouts and update selected birthmarks list.
+     */
+    protected void updateLayouts(){
+        checks.removeAll();
+        Dimension d = calculateDimension();
+        checks.setLayout(new GridLayout(d.height, d.width));
+
+        for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){
+            final BirthmarkSelection elem = i.next();
+            if(elem.isVisible(isExpertMode())){
+                JCheckBox check = new JCheckBox(elem.getService().getDisplayType());
+                check.setSelected(elem.isSelected());
+                check.addActionListener(new ActionListener(){
+                    public void actionPerformed(ActionEvent e){
+                        JCheckBox c = (JCheckBox)e.getSource();
+                        elem.setSelected(c.isSelected());
+                        select(elem.getService().getType(), c.isSelected());
+                        fireEvent();
+                    }
+                });
+                checks.add(check);
+            }
+
+            select(elem.getType(), elem.isVisible(isExpertMode()) && elem.isSelected());
+        }
+        updateUI();
+    }
+
+    private Dimension calculateDimension(){
+        int rows = 1;
+        int cols = 0;
+        for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){
+            BirthmarkSelection selection = i.next();
+            if(selection.isVisible(isExpertMode())){
+                cols++;
+            }
+        }
+
+        if(cols > 4){
+            rows = (cols / 3);
+            if((cols % 3) != 0) rows++;
+            cols = 3;
+        }
+
+        return new Dimension(cols, rows);
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Component;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.util.Iterator;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JButton;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JList;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.ListCellRenderer;\r
-import javax.swing.UIManager;\r
-import javax.swing.border.Border;\r
-import javax.swing.border.EmptyBorder;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkSelectionListPane extends BirthmarkSelectablePane{\r
-    private static final long serialVersionUID = 3209854654743223453L;\r
-\r
-    private DefaultListModel model;\r
-    private JList list;\r
-\r
-    public BirthmarkSelectionListPane(StigmataFrame stigmata){\r
-        super(stigmata);\r
-\r
-        initLayouts();\r
-    }\r
-\r
-    public void serviceRemoved(BirthmarkSpi service){\r
-        BirthmarkSelection elem = getSelection(service.getType());\r
-        model.removeElement(elem);\r
-        \r
-        super.serviceRemoved(service);\r
-    }\r
-\r
-    private void initLayouts(){\r
-        setLayout(new BorderLayout());\r
-        list = new JList(model = new DefaultListModel());\r
-        JScrollPane scroll = new JScrollPane(list);\r
-        add(scroll, BorderLayout.CENTER);\r
-        list.setCellRenderer(new Renderer());\r
-        list.setVisibleRowCount(5);\r
-        JButton checkAll = GUIUtility.createButton(getMessages(), "checkall");\r
-        JButton uncheckAll = GUIUtility.createButton(getMessages(), "uncheckall");\r
-\r
-        Box box = Box.createHorizontalBox();\r
-        box.add(Box.createHorizontalGlue());\r
-        box.add(checkAll);\r
-        box.add(Box.createHorizontalGlue());        \r
-        box.add(uncheckAll);\r
-        box.add(Box.createHorizontalGlue());\r
-        add(box, BorderLayout.SOUTH);\r
-\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                boolean flag = e.getActionCommand().equals("checkall");\r
-                for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){\r
-                    BirthmarkSelection le = i.next();\r
-                    le.setSelected(flag);\r
-                    fireEvent();\r
-                }\r
-                updateUI();\r
-            }\r
-        };\r
-        checkAll.addActionListener(listener);\r
-        uncheckAll.addActionListener(listener);\r
-        list.addMouseListener(new MouseAdapter(){\r
-            @Override\r
-            public void mouseClicked(MouseEvent e){\r
-                int index = list.locationToIndex(e.getPoint());\r
-                list.setSelectedIndex(index);\r
-                BirthmarkSelection elem = (BirthmarkSelection)model.getElementAt(index);\r
-                elem.setSelected(!elem.isSelected());\r
-                updateUI();\r
-            }\r
-        });\r
-    }\r
-\r
-    /**\r
-     * update layouts and update selected birthmarks list.\r
-     */\r
-    protected void updateLayouts(){\r
-        model.removeAllElements();\r
-\r
-        for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){\r
-            BirthmarkSelection elem = i.next();\r
-            if(elem.isVisible(isExpertMode())){\r
-                model.addElement(elem);\r
-            }\r
-\r
-            select(elem.getType(), elem.isVisible(isExpertMode()) && elem.isSelected());\r
-        }\r
-        updateUI();\r
-    }\r
-\r
-    public static class Renderer extends JCheckBox implements ListCellRenderer{\r
-        private static final long serialVersionUID = -324432943654654L;\r
-        private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);\r
-\r
-        public Renderer(){\r
-            setOpaque(true);\r
-        }\r
-\r
-        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean forcus){\r
-            BirthmarkSelection elem = (BirthmarkSelection)value;\r
-            setText(elem.getService().getDisplayType());\r
-            setToolTipText(elem.getService().getDescription());\r
-            setSelected(elem.isSelected());\r
-\r
-            if(isSelected){\r
-                setBackground(list.getSelectionBackground());\r
-                setForeground(list.getSelectionForeground());\r
-            }\r
-            else{\r
-                setBackground(list.getBackground());\r
-                setForeground(list.getForeground());\r
-            }\r
-\r
-            Border border = null;\r
-            if(forcus) {\r
-                if (isSelected) {\r
-                    border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");\r
-                }\r
-                if (border == null) {\r
-                    border = UIManager.getBorder("List.focusCellHighlightBorder");\r
-                }\r
-            } else {\r
-                border = noFocusBorder;\r
-            }\r
-            setBorder(border);\r
-\r
-            return this;\r
-        }\r
-    };\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.Iterator;
+
+import javax.swing.Box;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JList;
+import javax.swing.JScrollPane;
+import javax.swing.ListCellRenderer;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkSelectionListPane extends BirthmarkSelectablePane{
+    private static final long serialVersionUID = 3209854654743223453L;
+
+    private DefaultListModel model;
+    private JList list;
+
+    public BirthmarkSelectionListPane(StigmataFrame stigmata){
+        super(stigmata);
+
+        initLayouts();
+    }
+
+    public void serviceRemoved(BirthmarkSpi service){
+        BirthmarkSelection elem = getSelection(service.getType());
+        model.removeElement(elem);
+        
+        super.serviceRemoved(service);
+    }
+
+    private void initLayouts(){
+        setLayout(new BorderLayout());
+        list = new JList(model = new DefaultListModel());
+        JScrollPane scroll = new JScrollPane(list);
+        add(scroll, BorderLayout.CENTER);
+        list.setCellRenderer(new Renderer());
+        list.setVisibleRowCount(5);
+        JButton checkAll = GUIUtility.createButton(getMessages(), "checkall");
+        JButton uncheckAll = GUIUtility.createButton(getMessages(), "uncheckall");
+
+        Box box = Box.createHorizontalBox();
+        box.add(Box.createHorizontalGlue());
+        box.add(checkAll);
+        box.add(Box.createHorizontalGlue());        
+        box.add(uncheckAll);
+        box.add(Box.createHorizontalGlue());
+        add(box, BorderLayout.SOUTH);
+
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                boolean flag = e.getActionCommand().equals("checkall");
+                for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){
+                    BirthmarkSelection le = i.next();
+                    le.setSelected(flag);
+                    fireEvent();
+                }
+                updateUI();
+            }
+        };
+        checkAll.addActionListener(listener);
+        uncheckAll.addActionListener(listener);
+        list.addMouseListener(new MouseAdapter(){
+            @Override
+            public void mouseClicked(MouseEvent e){
+                int index = list.locationToIndex(e.getPoint());
+                list.setSelectedIndex(index);
+                BirthmarkSelection elem = (BirthmarkSelection)model.getElementAt(index);
+                elem.setSelected(!elem.isSelected());
+                updateUI();
+            }
+        });
+    }
+
+    /**
+     * update layouts and update selected birthmarks list.
+     */
+    protected void updateLayouts(){
+        model.removeAllElements();
+
+        for(Iterator<BirthmarkSelection> i = birthmarkSelections(); i.hasNext(); ){
+            BirthmarkSelection elem = i.next();
+            if(elem.isVisible(isExpertMode())){
+                model.addElement(elem);
+            }
+
+            select(elem.getType(), elem.isVisible(isExpertMode()) && elem.isSelected());
+        }
+        updateUI();
+    }
+
+    public static class Renderer extends JCheckBox implements ListCellRenderer{
+        private static final long serialVersionUID = -324432943654654L;
+        private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
+
+        public Renderer(){
+            setOpaque(true);
+        }
+
+        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean forcus){
+            BirthmarkSelection elem = (BirthmarkSelection)value;
+            setText(elem.getService().getDisplayType());
+            setToolTipText(elem.getService().getDescription());
+            setSelected(elem.isSelected());
+
+            if(isSelected){
+                setBackground(list.getSelectionBackground());
+                setForeground(list.getSelectionForeground());
+            }
+            else{
+                setBackground(list.getBackground());
+                setForeground(list.getForeground());
+            }
+
+            Border border = null;
+            if(forcus) {
+                if (isSelected) {
+                    border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");
+                }
+                if (border == null) {
+                    border = UIManager.getBorder("List.focusCellHighlightBorder");
+                }
+            } else {
+                border = noFocusBorder;
+            }
+            setBorder(border);
+
+            return this;
+        }
+    };
+}
@@ -1,89 +1,89 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.Dimension;\r
-\r
-import javax.swing.BorderFactory;\r
-import javax.swing.JLabel;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.ListCellRenderer;\r
-import javax.swing.UIManager;\r
-import javax.swing.border.Border;\r
-import javax.swing.border.EmptyBorder;\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkServiceListCellRenderer extends JPanel implements ListCellRenderer{\r
-    private static final long serialVersionUID = 3254763527508235L;\r
-    private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);\r
-\r
-    private final JLabel leftLabel  = new JLabel();\r
-    private final JLabel rightLabel = new JLabel();\r
-\r
-    public BirthmarkServiceListCellRenderer(Dimension dim, int rightw){\r
-        super(new BorderLayout());\r
-        leftLabel.setOpaque(true);\r
-        rightLabel.setOpaque(true);\r
-        this.setOpaque(true);\r
-        leftLabel.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));\r
-        rightLabel.setPreferredSize(new Dimension(rightw, 0));\r
-        rightLabel.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));\r
-        this.add(leftLabel, BorderLayout.CENTER);\r
-        this.add(rightLabel, BorderLayout.EAST);\r
-        this.setPreferredSize(dim);\r
-    }\r
-\r
-    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus){\r
-        if(value instanceof BirthmarkSpi){\r
-            BirthmarkSpi service = (BirthmarkSpi)value;\r
-            leftLabel.setText(service.getDisplayType());\r
-            rightLabel.setText("(" + service.getType() + ")");\r
-        }\r
-        else{\r
-            leftLabel.setText(String.valueOf(value));\r
-            rightLabel.setText("");\r
-        }\r
-        if(isSelected){\r
-            setBackground(list.getSelectionBackground());\r
-            setForeground(list.getSelectionForeground());\r
-            leftLabel.setBackground(list.getSelectionBackground());\r
-            leftLabel.setForeground(list.getSelectionForeground());\r
-            rightLabel.setBackground(list.getSelectionBackground());\r
-            rightLabel.setForeground(Color.gray.brighter());\r
-        }\r
-        else{\r
-            setBackground(list.getBackground());\r
-            setForeground(list.getForeground());\r
-            leftLabel.setBackground(list.getBackground());\r
-            leftLabel.setForeground(list.getForeground());\r
-            rightLabel.setBackground(list.getBackground());\r
-            rightLabel.setForeground(Color.gray);\r
-        }\r
-        Border border = null;\r
-        if(hasFocus) {\r
-            if (isSelected) {\r
-                border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");\r
-            }\r
-            if (border == null) {\r
-                border = UIManager.getBorder("List.focusCellHighlightBorder");\r
-            }\r
-        } else {\r
-            border = noFocusBorder;\r
-        }\r
-        setBorder(border);\r
-\r
-        return this;\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+
+import javax.swing.BorderFactory;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.ListCellRenderer;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkServiceListCellRenderer extends JPanel implements ListCellRenderer{
+    private static final long serialVersionUID = 3254763527508235L;
+    private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
+
+    private final JLabel leftLabel  = new JLabel();
+    private final JLabel rightLabel = new JLabel();
+
+    public BirthmarkServiceListCellRenderer(Dimension dim, int rightw){
+        super(new BorderLayout());
+        leftLabel.setOpaque(true);
+        rightLabel.setOpaque(true);
+        this.setOpaque(true);
+        leftLabel.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
+        rightLabel.setPreferredSize(new Dimension(rightw, 0));
+        rightLabel.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+        this.add(leftLabel, BorderLayout.CENTER);
+        this.add(rightLabel, BorderLayout.EAST);
+        this.setPreferredSize(dim);
+    }
+
+    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus){
+        if(value instanceof BirthmarkSpi){
+            BirthmarkSpi service = (BirthmarkSpi)value;
+            leftLabel.setText(service.getDisplayType());
+            rightLabel.setText("(" + service.getType() + ")");
+        }
+        else{
+            leftLabel.setText(String.valueOf(value));
+            rightLabel.setText("");
+        }
+        if(isSelected){
+            setBackground(list.getSelectionBackground());
+            setForeground(list.getSelectionForeground());
+            leftLabel.setBackground(list.getSelectionBackground());
+            leftLabel.setForeground(list.getSelectionForeground());
+            rightLabel.setBackground(list.getSelectionBackground());
+            rightLabel.setForeground(Color.gray.brighter());
+        }
+        else{
+            setBackground(list.getBackground());
+            setForeground(list.getForeground());
+            leftLabel.setBackground(list.getBackground());
+            leftLabel.setForeground(list.getForeground());
+            rightLabel.setBackground(list.getBackground());
+            rightLabel.setForeground(Color.gray);
+        }
+        Border border = null;
+        if(hasFocus) {
+            if (isSelected) {
+                border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");
+            }
+            if (border == null) {
+                border = UIManager.getBorder("List.focusCellHighlightBorder");
+            }
+        } else {
+            border = noFocusBorder;
+        }
+        setBorder(border);
+
+        return this;
+    }
 }
\ No newline at end of file
@@ -1,18 +1,18 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BirthmarkServiceListener{\r
-    public void serviceAdded(BirthmarkSpi service);\r
-\r
-    public void serviceRemoved(BirthmarkSpi service);\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface BirthmarkServiceListener{
+    public void serviceAdded(BirthmarkSpi service);
+
+    public void serviceRemoved(BirthmarkSpi service);
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.ui.swing;
+package jp.sourceforge.stigmata.ui.swing;
 
 /*
  * $Id$
@@ -11,7 +11,7 @@ import javax.swing.JTree;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 
-import jp.naist.se.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkSet;
 
 /**
  * 
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.ui.swing;
+package jp.sourceforge.stigmata.ui.swing;
 
 /*
  * $Id$
@@ -6,9 +6,9 @@ package jp.naist.se.stigmata.ui.swing;
 
 import javax.swing.tree.DefaultMutableTreeNode;
 
-import jp.naist.se.stigmata.Birthmark;
-import jp.naist.se.stigmata.BirthmarkElement;
-import jp.naist.se.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkSet;
 
 /**
  * 
@@ -1,57 +1,57 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.File;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ClassNameObfuscator{\r
-    private Map<String, String> nameMapping = new HashMap<String, String>();\r
-\r
-    public void outputNameMappings(File file) throws IOException{\r
-        PrintWriter out = null;\r
-        try{\r
-            out = new PrintWriter(new FileWriter(file));\r
-            for(String oldName: nameMapping.keySet()){\r
-                String newName = nameMapping.get(oldName);\r
-                out.print(oldName);\r
-                out.print(",");\r
-                out.println(newName);\r
-            }\r
-\r
-        }finally{\r
-            if(out != null){\r
-                out.close();\r
-            }\r
-        }\r
-    }\r
-\r
-    public BirthmarkSet obfuscateClassName(BirthmarkSet orig){\r
-        String newName = nameMapping.get(orig.getName());\r
-        if(newName == null){\r
-            newName = String.format("C%04d", new Object[] { new Integer(nameMapping.size() + 1), });\r
-            nameMapping.put(orig.getName(), newName);\r
-        }\r
-\r
-        BirthmarkSet newSet = new BirthmarkSet(newName, orig.getLocation());\r
-        for(Birthmark birthmark: orig){\r
-            newSet.addBirthmark(birthmark);\r
-        }\r
-        return newSet;\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkSet;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ClassNameObfuscator{
+    private Map<String, String> nameMapping = new HashMap<String, String>();
+
+    public void outputNameMappings(File file) throws IOException{
+        PrintWriter out = null;
+        try{
+            out = new PrintWriter(new FileWriter(file));
+            for(String oldName: nameMapping.keySet()){
+                String newName = nameMapping.get(oldName);
+                out.print(oldName);
+                out.print(",");
+                out.println(newName);
+            }
+
+        }finally{
+            if(out != null){
+                out.close();
+            }
+        }
+    }
+
+    public BirthmarkSet obfuscateClassName(BirthmarkSet orig){
+        String newName = nameMapping.get(orig.getName());
+        if(newName == null){
+            newName = String.format("C%04d", new Object[] { new Integer(nameMapping.size() + 1), });
+            nameMapping.put(orig.getName(), newName);
+        }
+
+        BirthmarkSet newSet = new BirthmarkSet(newName, orig.getLocation());
+        for(Birthmark birthmark: orig){
+            newSet.addBirthmark(birthmark);
+        }
+        return newSet;
+    }
+
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JLabel;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JTextField;\r
-import javax.swing.border.TitledBorder;\r
-import javax.swing.event.DocumentEvent;\r
-import javax.swing.event.DocumentListener;\r
-\r
-import jp.naist.se.stigmata.Stigmata;\r
-import jp.naist.se.stigmata.reader.ClasspathContext;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ClasspathSettingsPane extends JPanel{\r
-    private static final long serialVersionUID = 320973463423634L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private TargetSelectionPane classpath;\r
-    private TargetSelectionPane bootClasspath;\r
-\r
-    public ClasspathSettingsPane(StigmataFrame frame){\r
-        this.stigmata = frame;\r
-\r
-        initLayouts();\r
-    }\r
-\r
-    public void updateClasspathContext(ClasspathContext context){\r
-        String[] cplist = classpath.getValues();\r
-        if(cplist != null && cplist.length >= 0){\r
-            for(int i = 0; i < cplist.length; i++){\r
-                try{\r
-                    URL url = null;\r
-                    try{\r
-                        url = new URL(cplist[i]);\r
-                    } catch(MalformedURLException e){\r
-                        url = new File(cplist[i]).toURI().toURL();\r
-                    }\r
-                    context.addClasspath(url);\r
-                }catch(IOException ee){\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    public void reset(){\r
-        classpath.removeAllElements();\r
-        bootClasspath.removeAllElements();\r
-        try{\r
-            ClasspathContext context = stigmata.getEnvironment().getClasspathContext();\r
-            for(URL url: context){\r
-                classpath.addValue(url.toString());\r
-            }\r
-\r
-            addClasspath(bootClasspath, System.getProperty("java.class.path"));\r
-            addClasspath(bootClasspath, System.getProperty("sun.boot.class.path"));\r
-        } catch(SecurityException e){\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-    \r
-    private void addClasspath(TargetSelectionPane target, String classpath){\r
-        if(classpath != null){\r
-            target.addValues(classpath.split(System.getProperty("path.separator")));\r
-            stigmata.setNeedToSaveSettings(true);\r
-        }\r
-    }\r
-\r
-    private boolean findClass(String className){\r
-        try{\r
-            ClasspathContext b = Stigmata.getInstance().createEnvironment().getClasspathContext();\r
-            ClasspathContext bytecode = new ClasspathContext(b);\r
-            String[] path = classpath.getValues();\r
-            for(String cp: path){\r
-                bytecode.addClasspath(new File(cp).toURI().toURL());\r
-            }\r
-            return bytecode.findClass(className) != null;\r
-        }catch(ClassNotFoundException e){\r
-        }catch(MalformedURLException e){\r
-        }\r
-        return false;\r
-    }\r
-\r
-    private void initLayouts(){\r
-        final Messages messages = stigmata.getMessages();\r
-        JComponent panel = new JPanel(new GridLayout(1, 2));\r
-        classpath = new TargetSelectionPane(stigmata);\r
-        bootClasspath = new TargetSelectionPane(stigmata);\r
-        JComponent south = Box.createHorizontalBox();\r
-        final JButton findButton = GUIUtility.createButton(messages, "findclass");\r
-        final JTextField text = new JTextField();\r
-        final JLabel label = new JLabel();\r
-\r
-        classpath.setBorder(new TitledBorder(stigmata.getMessages().get("userclasspath.border")));\r
-        classpath.addTargetExtensions(stigmata.getMessages().getArray("userclasspath.extensions"));\r
-        classpath.setDescription(stigmata.getMessages().get("userclasspath.description"));\r
-        classpath.setDirectorySelectable(true);\r
-\r
-        bootClasspath.setBorder(new TitledBorder(stigmata.getMessages().get("bootclasspath.border")));\r
-        bootClasspath.setEnabled(false);\r
-\r
-        findButton.setEnabled(false);\r
-\r
-        south.setBorder(new TitledBorder(stigmata.getMessages().get("classpathchecker.border")));\r
-\r
-        label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.default.icon"));\r
-        label.setToolTipText(stigmata.getMessages().get("classpathchecker.default.tooltip"));\r
-\r
-        setLayout(new BorderLayout());\r
-        add(panel, BorderLayout.CENTER);\r
-        add(south, BorderLayout.SOUTH);\r
-\r
-        panel.add(classpath);\r
-        panel.add(bootClasspath);\r
-\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(text);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(findButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(label);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        text.getDocument().addDocumentListener(new DocumentListener(){\r
-            public void changedUpdate(DocumentEvent arg0){\r
-                String t = text.getText();\r
-                findButton.setEnabled(t.trim().length() > 0);\r
-            }\r
-\r
-            public void insertUpdate(DocumentEvent arg0){\r
-                String t = text.getText();\r
-                findButton.setEnabled(t.trim().length() > 0);\r
-            }\r
-\r
-            public void removeUpdate(DocumentEvent arg0){\r
-                String t = text.getText();\r
-                findButton.setEnabled(t.trim().length() > 0);\r
-            }\r
-        });\r
-        ActionListener action = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                String t = text.getText().trim();\r
-                boolean flag = findClass(t);\r
-                String message = stigmata.getMessages().get("classpathchecker.found.tooltip");\r
-                if(flag){\r
-                    label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.found.icon"));\r
-                }\r
-                else{\r
-                    label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.notfound.icon"));\r
-                    message = stigmata.getMessages().get("classpathchecker.notfound.tooltip");\r
-                }\r
-                label.setToolTipText(message);\r
-                String dm = String.format(\r
-                    "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message\r
-                );\r
-                JOptionPane.showMessageDialog(\r
-                    stigmata, dm, stigmata.getMessages().get("classpathchecker.dialog.title"),\r
-                    JOptionPane.INFORMATION_MESSAGE\r
-                );\r
-            }\r
-        };\r
-\r
-        classpath.addDataChangeListener(new DataChangeListener(){\r
-            public void valueChanged(Object source){\r
-                stigmata.setNeedToSaveSettings(true);\r
-            }\r
-        });\r
-\r
-        findButton.addActionListener(action);\r
-        text.addActionListener(action);\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import jp.sourceforge.stigmata.Stigmata;
+import jp.sourceforge.stigmata.reader.ClasspathContext;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ClasspathSettingsPane extends JPanel{
+    private static final long serialVersionUID = 320973463423634L;
+
+    private StigmataFrame stigmata;
+    private TargetSelectionPane classpath;
+    private TargetSelectionPane bootClasspath;
+
+    public ClasspathSettingsPane(StigmataFrame frame){
+        this.stigmata = frame;
+
+        initLayouts();
+    }
+
+    public void updateClasspathContext(ClasspathContext context){
+        String[] cplist = classpath.getValues();
+        if(cplist != null && cplist.length >= 0){
+            for(int i = 0; i < cplist.length; i++){
+                try{
+                    URL url = null;
+                    try{
+                        url = new URL(cplist[i]);
+                    } catch(MalformedURLException e){
+                        url = new File(cplist[i]).toURI().toURL();
+                    }
+                    context.addClasspath(url);
+                }catch(IOException ee){
+                }
+            }
+        }
+    }
+
+    public void reset(){
+        classpath.removeAllElements();
+        bootClasspath.removeAllElements();
+        try{
+            ClasspathContext context = stigmata.getEnvironment().getClasspathContext();
+            for(URL url: context){
+                classpath.addValue(url.toString());
+            }
+
+            addClasspath(bootClasspath, System.getProperty("java.class.path"));
+            addClasspath(bootClasspath, System.getProperty("sun.boot.class.path"));
+        } catch(SecurityException e){
+            e.printStackTrace();
+        }
+    }
+    
+    private void addClasspath(TargetSelectionPane target, String classpath){
+        if(classpath != null){
+            target.addValues(classpath.split(System.getProperty("path.separator")));
+            stigmata.setNeedToSaveSettings(true);
+        }
+    }
+
+    private boolean findClass(String className){
+        try{
+            ClasspathContext b = Stigmata.getInstance().createEnvironment().getClasspathContext();
+            ClasspathContext bytecode = new ClasspathContext(b);
+            String[] path = classpath.getValues();
+            for(String cp: path){
+                bytecode.addClasspath(new File(cp).toURI().toURL());
+            }
+            return bytecode.findClass(className) != null;
+        }catch(ClassNotFoundException e){
+        }catch(MalformedURLException e){
+        }
+        return false;
+    }
+
+    private void initLayouts(){
+        final Messages messages = stigmata.getMessages();
+        JComponent panel = new JPanel(new GridLayout(1, 2));
+        classpath = new TargetSelectionPane(stigmata);
+        bootClasspath = new TargetSelectionPane(stigmata);
+        JComponent south = Box.createHorizontalBox();
+        final JButton findButton = GUIUtility.createButton(messages, "findclass");
+        final JTextField text = new JTextField();
+        final JLabel label = new JLabel();
+
+        classpath.setBorder(new TitledBorder(stigmata.getMessages().get("userclasspath.border")));
+        classpath.addTargetExtensions(stigmata.getMessages().getArray("userclasspath.extensions"));
+        classpath.setDescription(stigmata.getMessages().get("userclasspath.description"));
+        classpath.setDirectorySelectable(true);
+
+        bootClasspath.setBorder(new TitledBorder(stigmata.getMessages().get("bootclasspath.border")));
+        bootClasspath.setEnabled(false);
+
+        findButton.setEnabled(false);
+
+        south.setBorder(new TitledBorder(stigmata.getMessages().get("classpathchecker.border")));
+
+        label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.default.icon"));
+        label.setToolTipText(stigmata.getMessages().get("classpathchecker.default.tooltip"));
+
+        setLayout(new BorderLayout());
+        add(panel, BorderLayout.CENTER);
+        add(south, BorderLayout.SOUTH);
+
+        panel.add(classpath);
+        panel.add(bootClasspath);
+
+        south.add(Box.createHorizontalGlue());
+        south.add(text);
+        south.add(Box.createHorizontalGlue());
+        south.add(findButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(label);
+        south.add(Box.createHorizontalGlue());
+
+        text.getDocument().addDocumentListener(new DocumentListener(){
+            public void changedUpdate(DocumentEvent arg0){
+                String t = text.getText();
+                findButton.setEnabled(t.trim().length() > 0);
+            }
+
+            public void insertUpdate(DocumentEvent arg0){
+                String t = text.getText();
+                findButton.setEnabled(t.trim().length() > 0);
+            }
+
+            public void removeUpdate(DocumentEvent arg0){
+                String t = text.getText();
+                findButton.setEnabled(t.trim().length() > 0);
+            }
+        });
+        ActionListener action = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                String t = text.getText().trim();
+                boolean flag = findClass(t);
+                String message = stigmata.getMessages().get("classpathchecker.found.tooltip");
+                if(flag){
+                    label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.found.icon"));
+                }
+                else{
+                    label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.notfound.icon"));
+                    message = stigmata.getMessages().get("classpathchecker.notfound.tooltip");
+                }
+                label.setToolTipText(message);
+                String dm = String.format(
+                    "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message
+                );
+                JOptionPane.showMessageDialog(
+                    stigmata, dm, stigmata.getMessages().get("classpathchecker.dialog.title"),
+                    JOptionPane.INFORMATION_MESSAGE
+                );
+            }
+        };
+
+        classpath.addDataChangeListener(new DataChangeListener(){
+            public void valueChanged(Object source){
+                stigmata.setNeedToSaveSettings(true);
+            }
+        });
+
+        findButton.addActionListener(action);
+        text.addActionListener(action);
+    }
 }
\ No newline at end of file
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.Dimension;\r
-import java.awt.SystemColor;\r
-\r
-import javax.swing.BorderFactory;\r
-import javax.swing.Icon;\r
-import javax.swing.JLabel;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.ListCellRenderer;\r
-\r
-/**\r
- * copy from tempura memo available at\r
- * http://terai.xrea.jp/Swing/ClippedLRComboBox.html\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class ClippedLRListCellRenderer extends JPanel implements ListCellRenderer{\r
-    private static final long serialVersionUID = 32943674625674235L;\r
-\r
-    private final JLabel left = new JLabel();\r
-    private final JLabel right = new JLabel();\r
-\r
-    public ClippedLRListCellRenderer(Dimension dim, int rightWidth){\r
-        super(new BorderLayout());\r
-        left.setOpaque(true);\r
-        right.setOpaque(true);\r
-        left.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0));\r
-        right.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));\r
-        right.setPreferredSize(new Dimension(rightWidth, 0));\r
-\r
-        add(left, BorderLayout.CENTER);\r
-        add(right, BorderLayout.EAST);\r
-        setPreferredSize(dim);\r
-    }\r
-\r
-    public Component getListCellRendererComponent(JList list, Object value, int index,\r
-            boolean isSelected, boolean cellHasFocus){\r
-        LRItem item = (LRItem)value;\r
-        if(item != null){\r
-            left.setText(String.valueOf(item.getLeft()));\r
-            right.setText(String.valueOf(item.getRight()));\r
-        }\r
-\r
-        if(item.getIcon() != null){\r
-            left.setIcon(item.getIcon());\r
-        }\r
-\r
-        setBackground(isSelected ? SystemColor.textHighlight: Color.white);\r
-        left.setBackground(isSelected ? SystemColor.textHighlight: Color.white);\r
-        right.setBackground(isSelected ? SystemColor.textHighlight: Color.white);\r
-        left.setForeground(isSelected ? Color.white: Color.black);\r
-        right.setForeground(isSelected ? Color.gray.brighter(): Color.gray);\r
-\r
-        return this;\r
-    }\r
-\r
-    public static class LRItem{\r
-        private Object left;\r
-        private Object right;\r
-        private Icon icon;\r
-\r
-        public LRItem(Icon icon, Object left, Object right){\r
-            this(left, right);\r
-            setIcon(icon);\r
-        }\r
-\r
-        public LRItem(Object left, Object right){\r
-            setLeft(left);\r
-            setRight(right);\r
-        }\r
-\r
-        public Icon getIcon(){\r
-            return icon;\r
-        }\r
-\r
-        public void setIcon(Icon icon){\r
-            this.icon = icon;\r
-        }\r
-\r
-        public Object getLeft(){\r
-            return left;\r
-        }\r
-\r
-        public void setLeft(Object left){\r
-            this.left = left;\r
-        }\r
-\r
-        public Object getRight(){\r
-            return right;\r
-        }\r
-\r
-        public void setRight(Object right){\r
-            this.right = right;\r
-        }\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.SystemColor;
+
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.ListCellRenderer;
+
+/**
+ * copy from tempura memo available at
+ * http://terai.xrea.jp/Swing/ClippedLRComboBox.html
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class ClippedLRListCellRenderer extends JPanel implements ListCellRenderer{
+    private static final long serialVersionUID = 32943674625674235L;
+
+    private final JLabel left = new JLabel();
+    private final JLabel right = new JLabel();
+
+    public ClippedLRListCellRenderer(Dimension dim, int rightWidth){
+        super(new BorderLayout());
+        left.setOpaque(true);
+        right.setOpaque(true);
+        left.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0));
+        right.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
+        right.setPreferredSize(new Dimension(rightWidth, 0));
+
+        add(left, BorderLayout.CENTER);
+        add(right, BorderLayout.EAST);
+        setPreferredSize(dim);
+    }
+
+    public Component getListCellRendererComponent(JList list, Object value, int index,
+            boolean isSelected, boolean cellHasFocus){
+        LRItem item = (LRItem)value;
+        if(item != null){
+            left.setText(String.valueOf(item.getLeft()));
+            right.setText(String.valueOf(item.getRight()));
+        }
+
+        if(item.getIcon() != null){
+            left.setIcon(item.getIcon());
+        }
+
+        setBackground(isSelected ? SystemColor.textHighlight: Color.white);
+        left.setBackground(isSelected ? SystemColor.textHighlight: Color.white);
+        right.setBackground(isSelected ? SystemColor.textHighlight: Color.white);
+        left.setForeground(isSelected ? Color.white: Color.black);
+        right.setForeground(isSelected ? Color.gray.brighter(): Color.gray);
+
+        return this;
+    }
+
+    public static class LRItem{
+        private Object left;
+        private Object right;
+        private Icon icon;
+
+        public LRItem(Icon icon, Object left, Object right){
+            this(left, right);
+            setIcon(icon);
+        }
+
+        public LRItem(Object left, Object right){
+            setLeft(left);
+            setRight(right);
+        }
+
+        public Icon getIcon(){
+            return icon;
+        }
+
+        public void setIcon(Icon icon){
+            this.icon = icon;
+        }
+
+        public Object getLeft(){
+            return left;
+        }
+
+        public void setLeft(Object left){
+            this.left = left;
+        }
+
+        public Object getRight(){
+            return right;
+        }
+
+        public void setRight(Object right){
+            this.right = right;
+        }
+    }
 }
\ No newline at end of file
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$ \r
- */\r
-\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-\r
-import javax.swing.JTable;\r
-import javax.swing.table.DefaultTableCellRenderer;\r
-\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class CompareTableCellRenderer extends DefaultTableCellRenderer{\r
-    private static final long serialVersionUID = 234557758658567345L;\r
-    private static final double EPSILON = 1E-8d;\r
-\r
-    private BirthmarkEnvironment environment;\r
-\r
-    public CompareTableCellRenderer(BirthmarkEnvironment environment){\r
-        this.environment = environment;\r
-    }\r
-\r
-    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,\r
-                                                    boolean hasForcus, int row, int col){\r
-        Object value = table.getValueAt(row, col);\r
-        Component c = super.getTableCellRendererComponent(\r
-            table, obj, isSelected, hasForcus, row, col\r
-        );\r
-        if(value instanceof Double && !isSelected){\r
-            double d = ((Double)value).doubleValue();\r
-            int rank = 0;\r
-            if(d < EPSILON)       rank = 0;\r
-            else if((d - 0.2d) < EPSILON) rank = 1;\r
-            else if((d - 0.4d) < EPSILON) rank = 2;\r
-            else if((d - 0.6d) < EPSILON) rank = 3;\r
-            else if((d - 0.8d) < EPSILON) rank = 4;\r
-            else if((d - 1.0d) < EPSILON) rank = 5;\r
-\r
-            c.setBackground(getBackgroundColor(rank, environment));\r
-            c.setForeground(getForegroundColor(rank, environment));\r
-        }\r
-\r
-        return c;\r
-    }\r
-\r
-    public static Color getDefaultForegroundColor(int rank){\r
-        int c = 180 - ((180 / 5) * rank);\r
-        return new Color(c, c, c);\r
-    }\r
-\r
-    public static Color getDefaultBackgroundColor(int rank){\r
-        Color c;\r
-        switch(rank){\r
-        case 5:\r
-            c = Color.RED;\r
-            break;\r
-        case 0: case 1: case 2: case 3: case 4:\r
-        default:\r
-            c = Color.WHITE;\r
-            break;\r
-        }\r
-        return c;\r
-    }\r
-\r
-    public static Color getBackgroundColor(int rank, BirthmarkEnvironment environment){\r
-        Color c = getColor("backcolor_" + rank, environment);\r
-        if(c == null){\r
-            return getDefaultBackgroundColor(rank);\r
-        }\r
-        return c;\r
-    }\r
-\r
-    public static Color getForegroundColor(int rank, BirthmarkEnvironment environment){\r
-        Color c = getColor("forecolor_" + rank, environment);\r
-        if(c == null){\r
-            c = getDefaultForegroundColor(rank);\r
-        }\r
-        return c;\r
-    }\r
-\r
-    private static Color getColor(String key, BirthmarkEnvironment environment){\r
-        String v = environment.getProperty(key);\r
-        try{\r
-            int color = Integer.parseInt(v, 16);\r
-\r
-            return new Color(\r
-                (color >>> 16) & 0xff, (color >>> 8) & 0xff, color & 0xff\r
-            );\r
-        } catch(NumberFormatException e){\r
-            return null;\r
-        }\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$ 
+ */
+
+import java.awt.Color;
+import java.awt.Component;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class CompareTableCellRenderer extends DefaultTableCellRenderer{
+    private static final long serialVersionUID = 234557758658567345L;
+    private static final double EPSILON = 1E-8d;
+
+    private BirthmarkEnvironment environment;
+
+    public CompareTableCellRenderer(BirthmarkEnvironment environment){
+        this.environment = environment;
+    }
+
+    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,
+                                                    boolean hasForcus, int row, int col){
+        Object value = table.getValueAt(row, col);
+        Component c = super.getTableCellRendererComponent(
+            table, obj, isSelected, hasForcus, row, col
+        );
+        if(value instanceof Double && !isSelected){
+            double d = ((Double)value).doubleValue();
+            int rank = 0;
+            if(d < EPSILON)       rank = 0;
+            else if((d - 0.2d) < EPSILON) rank = 1;
+            else if((d - 0.4d) < EPSILON) rank = 2;
+            else if((d - 0.6d) < EPSILON) rank = 3;
+            else if((d - 0.8d) < EPSILON) rank = 4;
+            else if((d - 1.0d) < EPSILON) rank = 5;
+
+            c.setBackground(getBackgroundColor(rank, environment));
+            c.setForeground(getForegroundColor(rank, environment));
+        }
+
+        return c;
+    }
+
+    public static Color getDefaultForegroundColor(int rank){
+        int c = 180 - ((180 / 5) * rank);
+        return new Color(c, c, c);
+    }
+
+    public static Color getDefaultBackgroundColor(int rank){
+        Color c;
+        switch(rank){
+        case 5:
+            c = Color.RED;
+            break;
+        case 0: case 1: case 2: case 3: case 4:
+        default:
+            c = Color.WHITE;
+            break;
+        }
+        return c;
+    }
+
+    public static Color getBackgroundColor(int rank, BirthmarkEnvironment environment){
+        Color c = getColor("backcolor_" + rank, environment);
+        if(c == null){
+            return getDefaultBackgroundColor(rank);
+        }
+        return c;
+    }
+
+    public static Color getForegroundColor(int rank, BirthmarkEnvironment environment){
+        Color c = getColor("forecolor_" + rank, environment);
+        if(c == null){
+            c = getDefaultForegroundColor(rank);
+        }
+        return c;
+    }
+
+    private static Color getColor(String key, BirthmarkEnvironment environment){
+        String v = environment.getProperty(key);
+        try{
+            int color = Integer.parseInt(v, 16);
+
+            return new Color(
+                (color >>> 16) & 0xff, (color >>> 8) & 0xff, color & 0xff
+            );
+        } catch(NumberFormatException e){
+            return null;
+        }
+    }
 }
\ No newline at end of file
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.io.File;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.BoxLayout;\r
-import javax.swing.JButton;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JComponent;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JTabbedPane;\r
-import javax.swing.border.TitledBorder;\r
-\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
-import jp.naist.se.stigmata.filter.ComparisonPairFilterManager;\r
-import jp.naist.se.stigmata.reader.ClasspathContext;\r
-import jp.naist.se.stigmata.utils.ConfigFileExporter;\r
-import jp.naist.se.stigmata.utils.WellknownClassManager;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ControlPane extends JPanel{\r
-    private static final long serialVersionUID = 983547612346543645L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private BirthmarkSelectablePane birthmarks;\r
-    private TargetSelectionPane targetX;\r
-    private TargetSelectionPane targetY;\r
-    private ClasspathSettingsPane classpath;\r
-    private WellknownClassesSettingsPane wellknownClassses;\r
-    private BirthmarkDefinitionPane definition;\r
-    private PropertyEditPane properties;\r
-    private FilterManagementPane filters;\r
-    private ExtractedHistoryPane history;\r
-    private JTabbedPane controlTab;\r
-    private JButton compareButton;\r
-    private JButton extractButton;\r
-    private JButton resetButton;\r
-    private PopupButton comparePopup;\r
-    private JComboBox unitBox;\r
-    private Map<String, String> unitLabels = new HashMap<String, String>();\r
-    private boolean expertmode = false;\r
-\r
-    public ControlPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-    }\r
-\r
-    void inititalize(){\r
-        definition = new BirthmarkDefinitionPane(stigmata);\r
-        birthmarks = new BirthmarkSelectionCheckSetPane(stigmata);\r
-        properties = new PropertyEditPane(stigmata);\r
-        JComponent control = createControlPane();\r
-        wellknownClassses = new WellknownClassesSettingsPane(stigmata);\r
-        classpath = new ClasspathSettingsPane(stigmata);\r
-        filters = new FilterManagementPane(stigmata);\r
-        history = new ExtractedHistoryPane(stigmata);\r
-        initComponents();\r
-\r
-        GUIUtility.addNewTab(stigmata.getMessages(), "targets", controlTab, control);\r
-        GUIUtility.addNewTab(stigmata.getMessages(), "wellknown", controlTab, wellknownClassses);\r
-        GUIUtility.addNewTab(stigmata.getMessages(), "classpath", controlTab, classpath);\r
-        GUIUtility.addNewTab(stigmata.getMessages(), "property", controlTab, properties);\r
-        reset();\r
-    }\r
-\r
-    public void addBirthmarkServiceListener(BirthmarkServiceListener listener){\r
-        definition.addBirthmarkServiceListener(listener);\r
-    }\r
-\r
-    public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){\r
-        definition.removeBirthmarkServiceListener(listener);\r
-    }\r
-\r
-    public void reset(){\r
-        this.expertmode = false;\r
-        definition.reset();\r
-        birthmarks.reset();\r
-        stigmata.setExpertMode(false);\r
-        targetX.removeAllElements();\r
-        targetY.removeAllElements();\r
-\r
-        classpath.reset();\r
-        wellknownClassses.reset();\r
-        filters.reset();\r
-        updateEnable();\r
-\r
-        int definitionTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("definition.tab.label"));\r
-        if(definitionTabIndex >= 0){\r
-            controlTab.removeTabAt(definitionTabIndex);\r
-        }\r
-        int filterTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("filter.tab.label"));\r
-        if(filterTabIndex >= 0){\r
-            controlTab.removeTabAt(filterTabIndex);\r
-        }\r
-    }\r
-\r
-    public void saveSettings(File file){\r
-        BirthmarkEnvironment environment = generateEnvironment();\r
-        ConfigFileExporter bce = new ConfigFileExporter(environment);\r
-        try{\r
-            PrintWriter out = new PrintWriter(new FileWriter(file));\r
-            bce.export(out);\r
-            out.close();\r
-        } catch(IOException e){\r
-            JOptionPane.showMessageDialog(\r
-                stigmata,\r
-                stigmata.getMessages().get("error.io", e.getMessage()),\r
-                stigmata.getMessages().get("error.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-        }\r
-    }\r
-\r
-    public void exportSettings(){\r
-        File file = stigmata.getSaveFile(\r
-            stigmata.getMessages().getArray("export.extensions"), \r
-            stigmata.getMessages().get("export.description")\r
-        );\r
-\r
-        if(file != null){\r
-            if(!file.getName().endsWith(".xml")){\r
-                file = new File(file.getParent(), file.getName() + ".xml");\r
-            }\r
-            saveSettings(file);\r
-        }\r
-    }\r
-\r
-    public void setExpertMode(boolean expertmode){\r
-        this.expertmode = expertmode;\r
-        birthmarks.setExpertMode(expertmode);\r
-        stigmata.setExpertMode(expertmode);\r
-\r
-        if(expertmode){\r
-            GUIUtility.addNewTab(stigmata.getMessages(), "definition", controlTab, definition);\r
-            GUIUtility.addNewTab(stigmata.getMessages(), "filter", controlTab, filters);\r
-            GUIUtility.addNewTab(stigmata.getMessages(), "history", controlTab, history);\r
-        }\r
-        else{\r
-            removeTabByName(stigmata.getMessages().get("definition.tab.label"));\r
-            removeTabByName(stigmata.getMessages().get("filter.tab.label"));\r
-            removeTabByName(stigmata.getMessages().get("history.tab.label"));\r
-        }\r
-        updateEnable();\r
-    }\r
-\r
-    public boolean isExpertMode(){\r
-        return expertmode;\r
-    }\r
-\r
-    private void removeTabByName(String tabname){\r
-        int index = controlTab.indexOfTab(tabname);\r
-        if(index >= 0){\r
-            controlTab.removeTabAt(index);\r
-        }\r
-    }\r
-\r
-    private JComponent createControlPane(){\r
-        JComponent mainPane = new Box(BoxLayout.X_AXIS);\r
-        JPanel center = new JPanel(new BorderLayout());\r
-        targetX = new TargetSelectionPane(stigmata);\r
-        targetY = new TargetSelectionPane(stigmata);\r
-\r
-        birthmarks.setBorder(new TitledBorder(stigmata.getMessages().get("birthmarkspane.border")));\r
-\r
-        targetX.addTargetExtensions(stigmata.getMessages().getArray("targets.extensions"));\r
-        targetX.setDescription(stigmata.getMessages().get("targets.description"));\r
-        targetX.setBorder(new TitledBorder(stigmata.getMessages().get("targetx.border")));\r
-\r
-        targetY.addTargetExtensions(stigmata.getMessages().getArray("targets.extensions"));\r
-        targetY.setDescription(stigmata.getMessages().get("targets.description"));\r
-        targetY.setBorder(new TitledBorder(stigmata.getMessages().get("targety.border")));\r
-\r
-        center.add(mainPane, BorderLayout.CENTER);\r
-        center.add(birthmarks, BorderLayout.SOUTH);\r
-\r
-        mainPane.add(Box.createHorizontalGlue());\r
-        mainPane.add(targetX);\r
-        mainPane.add(Box.createHorizontalGlue());\r
-        mainPane.add(targetY);\r
-        mainPane.add(Box.createHorizontalGlue());\r
-\r
-        DataChangeListener dcl = new DataChangeListener(){\r
-            public void valueChanged(Object source){\r
-                updateEnable();\r
-            }\r
-        };\r
-        targetX.addDataChangeListener(dcl);\r
-        targetY.addDataChangeListener(dcl);\r
-        birthmarks.addDataChangeListener(dcl);\r
-\r
-        return center;\r
-    }\r
-\r
-    private void updateEnable(){\r
-        String[] valueX = targetX.getValues();\r
-        String[] valueY = targetY.getValues();\r
-        String[] targets = birthmarks.getSelectedServiceTypes();\r
-\r
-        extractButton.setEnabled(\r
-            ((valueX != null && valueX.length > 0) || (valueY != null && valueY.length > 0))\r
-            && (targets != null && targets.length > 0)\r
-        );\r
-\r
-        comparePopup.setEnabled(\r
-            (valueX != null && valueX.length > 0) &&\r
-            (valueY != null && valueY.length > 0) &&\r
-            (targets != null && targets.length > 0)\r
-        );\r
-    }\r
-\r
-    private void extractButtonActionPerformed(ActionEvent e){\r
-        BirthmarkContext context = generateContext();\r
-        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);\r
-\r
-        String[] fileX = targetX.getValues();\r
-        String[] fileY = targetY.getValues();\r
-\r
-        stigmata.extract(fileX, fileY, context);\r
-    }\r
-\r
-    private void compareRoundRobinWithFiltering(){\r
-        BirthmarkContext context = generateContext();\r
-        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);\r
-        FilterSelectionPane pane = new FilterSelectionPane(\r
-            stigmata, context.getEnvironment().getFilterManager()\r
-        );\r
-        int returnValue = JOptionPane.showConfirmDialog(\r
-            stigmata, pane, stigmata.getMessages().get("filterselection.dialog.title"),\r
-            JOptionPane.OK_CANCEL_OPTION,\r
-            JOptionPane.QUESTION_MESSAGE\r
-        );\r
-        if(returnValue == JOptionPane.OK_OPTION){\r
-            String[] filterSetList = pane.getSelectedFilters();\r
-            context.setFilterTypes(filterSetList);\r
-\r
-            String[] fileX = targetX.getValues();\r
-            String[] fileY = targetY.getValues();\r
-            stigmata.compareRoundRobinFilter(fileX, fileY, context);\r
-        }\r
-    }\r
-\r
-    private void compareRoundRobin(){\r
-        BirthmarkContext context = generateContext();\r
-        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);\r
-        String[] fileX = targetX.getValues();\r
-        String[] fileY = targetY.getValues();\r
-\r
-        stigmata.compareRoundRobin(fileX, fileY, context);\r
-    }\r
-\r
-    private void compareSpecifiedPair(){\r
-        BirthmarkContext context = generateContext();\r
-        context.setComparisonMethod(ComparisonMethod.SPECIFIED_PAIR);\r
-        String[] fileX = targetX.getValues();\r
-        String[] fileY = targetY.getValues();\r
-        stigmata.compareSpecifiedPair(fileX, fileY, context);\r
-    }\r
-\r
-    private void compareGuessedPair(){\r
-        BirthmarkContext context = generateContext();\r
-        context.setComparisonMethod(ComparisonMethod.GUESSED_PAIR);\r
-        String[] fileX = targetX.getValues();\r
-        String[] fileY = targetY.getValues();\r
-\r
-        stigmata.compareGuessedPair(fileX, fileY, context);\r
-    }\r
-\r
-    private BirthmarkContext generateContext(){\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
-\r
-    private BirthmarkEnvironment generateEnvironment(){\r
-        BirthmarkEnvironment environment = Stigmata.getInstance().createEnvironment();\r
-        ClasspathContext bytecode = environment.getClasspathContext();\r
-        WellknownClassManager manager = environment.getWellknownClassManager();\r
-        ComparisonPairFilterManager filterManager = environment.getFilterManager();\r
-\r
-        // environment.setExtractionUnit(parseExtractionUnit());\r
-        classpath.updateClasspathContext(bytecode);\r
-        wellknownClassses.setWellknownClasses(manager);\r
-        filters.updateFilterManager(filterManager);\r
-        definition.updateEnvironment(environment);\r
-        properties.updateEnvironment(environment);\r
-\r
-        return environment;\r
-    }\r
-\r
-    private ExtractionUnit parseExtractionUnit(){\r
-        String label = (String)unitBox.getSelectedItem();\r
-        String key = unitLabels.get(label);\r
-        ExtractionUnit unit = ExtractionUnit.CLASS;\r
-\r
-        if(key.equals("unit.archive")){\r
-            unit = ExtractionUnit.ARCHIVE;\r
-        }\r
-        else if(key.equals("unit.package")){\r
-            unit = ExtractionUnit.PACKAGE;\r
-        }\r
-        else{\r
-            unit = ExtractionUnit.CLASS;\r
-        }\r
-        return unit;\r
-    }\r
-\r
-    private void initComponents(){\r
-        controlTab = new JTabbedPane();\r
-        resetButton = GUIUtility.createButton(stigmata.getMessages(), "reset");\r
-        extractButton = GUIUtility.createButton(stigmata.getMessages(), "extract");\r
-        compareButton = GUIUtility.createButton(stigmata.getMessages(), "roundrobin");\r
-        comparePopup = new PopupButton(compareButton);\r
-        unitBox = new JComboBox();\r
-\r
-        Box south = Box.createHorizontalBox();\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(resetButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(extractButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(comparePopup);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(unitBox);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        setLayout(new BorderLayout());\r
-        add(south, BorderLayout.SOUTH);\r
-        add(controlTab, BorderLayout.CENTER);\r
-\r
-        extractButton.setEnabled(false);\r
-        comparePopup.setEnabled(false);\r
-\r
-        resetButton.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                reset();\r
-            }\r
-        });\r
-\r
-        extractButton.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                extractButtonActionPerformed(e);\r
-            }\r
-        });\r
-\r
-        ActionListener compareListener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                String command = e.getActionCommand();\r
-\r
-                if(command.equals("roundrobin")){\r
-                    compareRoundRobin();\r
-                }\r
-                else if(command.equals("guessedpair")){\r
-                    compareGuessedPair();\r
-                }\r
-                else if(command.equals("specifiedpair")){\r
-                    compareSpecifiedPair();\r
-                }\r
-                else if(command.equals("roundrobin.filtering")){\r
-                    compareRoundRobinWithFiltering();\r
-                }\r
-            }\r
-        };\r
-        compareButton.addActionListener(compareListener);\r
-\r
-        String[] comparisonMethods = stigmata.getMessages().getArray("comparison.methods");\r
-        for(int i = 1; i < comparisonMethods.length; i++){\r
-            JMenuItem item = GUIUtility.createJMenuItem(stigmata.getMessages(), comparisonMethods[i]);\r
-            comparePopup.addMenuItem(item);\r
-            item.addActionListener(compareListener);\r
-        }\r
-\r
-        String[] extractionUnits = stigmata.getMessages().getArray("extraction.units");\r
-        for(int i = 0; i < extractionUnits.length; i++){\r
-            String label = stigmata.getMessages().get(extractionUnits[i]);\r
-            unitLabels.put(label, extractionUnits[i]);\r
-            unitBox.addItem(label);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.border.TitledBorder;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkStoreTarget;
+import jp.sourceforge.stigmata.ComparisonMethod;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.Stigmata;
+import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
+import jp.sourceforge.stigmata.reader.ClasspathContext;
+import jp.sourceforge.stigmata.utils.ConfigFileExporter;
+import jp.sourceforge.stigmata.utils.WellknownClassManager;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ControlPane extends JPanel{
+    private static final long serialVersionUID = 983547612346543645L;
+
+    private StigmataFrame stigmata;
+    private BirthmarkSelectablePane birthmarks;
+    private TargetSelectionPane targetX;
+    private TargetSelectionPane targetY;
+    private ClasspathSettingsPane classpath;
+    private WellknownClassesSettingsPane wellknownClassses;
+    private BirthmarkDefinitionPane definition;
+    private PropertyEditPane properties;
+    private FilterManagementPane filters;
+    private ExtractedHistoryPane history;
+    private JTabbedPane controlTab;
+    private JButton compareButton;
+    private JButton extractButton;
+    private JButton resetButton;
+    private PopupButton comparePopup;
+    private JComboBox unitBox;
+    private Map<String, String> unitLabels = new HashMap<String, String>();
+    private boolean expertmode = false;
+
+    public ControlPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+    }
+
+    void inititalize(){
+        definition = new BirthmarkDefinitionPane(stigmata);
+        birthmarks = new BirthmarkSelectionCheckSetPane(stigmata);
+        properties = new PropertyEditPane(stigmata);
+        JComponent control = createControlPane();
+        wellknownClassses = new WellknownClassesSettingsPane(stigmata);
+        classpath = new ClasspathSettingsPane(stigmata);
+        filters = new FilterManagementPane(stigmata);
+        history = new ExtractedHistoryPane(stigmata);
+        initComponents();
+
+        GUIUtility.addNewTab(stigmata.getMessages(), "targets", controlTab, control);
+        GUIUtility.addNewTab(stigmata.getMessages(), "wellknown", controlTab, wellknownClassses);
+        GUIUtility.addNewTab(stigmata.getMessages(), "classpath", controlTab, classpath);
+        GUIUtility.addNewTab(stigmata.getMessages(), "property", controlTab, properties);
+        reset();
+    }
+
+    public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
+        definition.addBirthmarkServiceListener(listener);
+    }
+
+    public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
+        definition.removeBirthmarkServiceListener(listener);
+    }
+
+    public void reset(){
+        this.expertmode = false;
+        definition.reset();
+        birthmarks.reset();
+        stigmata.setExpertMode(false);
+        targetX.removeAllElements();
+        targetY.removeAllElements();
+
+        classpath.reset();
+        wellknownClassses.reset();
+        filters.reset();
+        updateEnable();
+
+        int definitionTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("definition.tab.label"));
+        if(definitionTabIndex >= 0){
+            controlTab.removeTabAt(definitionTabIndex);
+        }
+        int filterTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("filter.tab.label"));
+        if(filterTabIndex >= 0){
+            controlTab.removeTabAt(filterTabIndex);
+        }
+    }
+
+    public void saveSettings(File file){
+        BirthmarkEnvironment environment = generateEnvironment();
+        ConfigFileExporter bce = new ConfigFileExporter(environment);
+        try{
+            PrintWriter out = new PrintWriter(new FileWriter(file));
+            bce.export(out);
+            out.close();
+        } catch(IOException e){
+            JOptionPane.showMessageDialog(
+                stigmata,
+                stigmata.getMessages().get("error.io", e.getMessage()),
+                stigmata.getMessages().get("error.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+        }
+    }
+
+    public void exportSettings(){
+        File file = stigmata.getSaveFile(
+            stigmata.getMessages().getArray("export.extensions"), 
+            stigmata.getMessages().get("export.description")
+        );
+
+        if(file != null){
+            if(!file.getName().endsWith(".xml")){
+                file = new File(file.getParent(), file.getName() + ".xml");
+            }
+            saveSettings(file);
+        }
+    }
+
+    public void setExpertMode(boolean expertmode){
+        this.expertmode = expertmode;
+        birthmarks.setExpertMode(expertmode);
+        stigmata.setExpertMode(expertmode);
+
+        if(expertmode){
+            GUIUtility.addNewTab(stigmata.getMessages(), "definition", controlTab, definition);
+            GUIUtility.addNewTab(stigmata.getMessages(), "filter", controlTab, filters);
+            GUIUtility.addNewTab(stigmata.getMessages(), "history", controlTab, history);
+        }
+        else{
+            removeTabByName(stigmata.getMessages().get("definition.tab.label"));
+            removeTabByName(stigmata.getMessages().get("filter.tab.label"));
+            removeTabByName(stigmata.getMessages().get("history.tab.label"));
+        }
+        updateEnable();
+    }
+
+    public boolean isExpertMode(){
+        return expertmode;
+    }
+
+    private void removeTabByName(String tabname){
+        int index = controlTab.indexOfTab(tabname);
+        if(index >= 0){
+            controlTab.removeTabAt(index);
+        }
+    }
+
+    private JComponent createControlPane(){
+        JComponent mainPane = new Box(BoxLayout.X_AXIS);
+        JPanel center = new JPanel(new BorderLayout());
+        targetX = new TargetSelectionPane(stigmata);
+        targetY = new TargetSelectionPane(stigmata);
+
+        birthmarks.setBorder(new TitledBorder(stigmata.getMessages().get("birthmarkspane.border")));
+
+        targetX.addTargetExtensions(stigmata.getMessages().getArray("targets.extensions"));
+        targetX.setDescription(stigmata.getMessages().get("targets.description"));
+        targetX.setBorder(new TitledBorder(stigmata.getMessages().get("targetx.border")));
+
+        targetY.addTargetExtensions(stigmata.getMessages().getArray("targets.extensions"));
+        targetY.setDescription(stigmata.getMessages().get("targets.description"));
+        targetY.setBorder(new TitledBorder(stigmata.getMessages().get("targety.border")));
+
+        center.add(mainPane, BorderLayout.CENTER);
+        center.add(birthmarks, BorderLayout.SOUTH);
+
+        mainPane.add(Box.createHorizontalGlue());
+        mainPane.add(targetX);
+        mainPane.add(Box.createHorizontalGlue());
+        mainPane.add(targetY);
+        mainPane.add(Box.createHorizontalGlue());
+
+        DataChangeListener dcl = new DataChangeListener(){
+            public void valueChanged(Object source){
+                updateEnable();
+            }
+        };
+        targetX.addDataChangeListener(dcl);
+        targetY.addDataChangeListener(dcl);
+        birthmarks.addDataChangeListener(dcl);
+
+        return center;
+    }
+
+    private void updateEnable(){
+        String[] valueX = targetX.getValues();
+        String[] valueY = targetY.getValues();
+        String[] targets = birthmarks.getSelectedServiceTypes();
+
+        extractButton.setEnabled(
+            ((valueX != null && valueX.length > 0) || (valueY != null && valueY.length > 0))
+            && (targets != null && targets.length > 0)
+        );
+
+        comparePopup.setEnabled(
+            (valueX != null && valueX.length > 0) &&
+            (valueY != null && valueY.length > 0) &&
+            (targets != null && targets.length > 0)
+        );
+    }
+
+    private void extractButtonActionPerformed(ActionEvent e){
+        BirthmarkContext context = generateContext();
+        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
+
+        String[] fileX = targetX.getValues();
+        String[] fileY = targetY.getValues();
+
+        stigmata.extract(fileX, fileY, context);
+    }
+
+    private void compareRoundRobinWithFiltering(){
+        BirthmarkContext context = generateContext();
+        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
+        FilterSelectionPane pane = new FilterSelectionPane(
+            stigmata, context.getEnvironment().getFilterManager()
+        );
+        int returnValue = JOptionPane.showConfirmDialog(
+            stigmata, pane, stigmata.getMessages().get("filterselection.dialog.title"),
+            JOptionPane.OK_CANCEL_OPTION,
+            JOptionPane.QUESTION_MESSAGE
+        );
+        if(returnValue == JOptionPane.OK_OPTION){
+            String[] filterSetList = pane.getSelectedFilters();
+            context.setFilterTypes(filterSetList);
+
+            String[] fileX = targetX.getValues();
+            String[] fileY = targetY.getValues();
+            stigmata.compareRoundRobinFilter(fileX, fileY, context);
+        }
+    }
+
+    private void compareRoundRobin(){
+        BirthmarkContext context = generateContext();
+        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
+        String[] fileX = targetX.getValues();
+        String[] fileY = targetY.getValues();
+
+        stigmata.compareRoundRobin(fileX, fileY, context);
+    }
+
+    private void compareSpecifiedPair(){
+        BirthmarkContext context = generateContext();
+        context.setComparisonMethod(ComparisonMethod.SPECIFIED_PAIR);
+        String[] fileX = targetX.getValues();
+        String[] fileY = targetY.getValues();
+        stigmata.compareSpecifiedPair(fileX, fileY, context);
+    }
+
+    private void compareGuessedPair(){
+        BirthmarkContext context = generateContext();
+        context.setComparisonMethod(ComparisonMethod.GUESSED_PAIR);
+        String[] fileX = targetX.getValues();
+        String[] fileY = targetY.getValues();
+
+        stigmata.compareGuessedPair(fileX, fileY, context);
+    }
+
+    private BirthmarkContext generateContext(){
+        BirthmarkContext context = new BirthmarkContext(generateEnvironment());
+        context.setBirthmarkTypes(birthmarks.getSelectedServiceTypes());
+        context.setExtractionUnit(parseExtractionUnit());
+        BirthmarkStoreTarget bst = BirthmarkStoreTarget.MEMORY;
+        if(context.getEnvironment().getProperty("birthmark.store.target") != null){
+            bst = BirthmarkStoreTarget.valueOf(context.getEnvironment().getProperty("birthmark.store.target"));
+        }
+        if(bst == null){
+            bst = BirthmarkStoreTarget.MEMORY;
+        }
+        context.setStoreTarget(bst);
+        
+        return context;
+    }
+
+    private BirthmarkEnvironment generateEnvironment(){
+        BirthmarkEnvironment environment = Stigmata.getInstance().createEnvironment();
+        ClasspathContext bytecode = environment.getClasspathContext();
+        WellknownClassManager manager = environment.getWellknownClassManager();
+        ComparisonPairFilterManager filterManager = environment.getFilterManager();
+
+        // environment.setExtractionUnit(parseExtractionUnit());
+        classpath.updateClasspathContext(bytecode);
+        wellknownClassses.setWellknownClasses(manager);
+        filters.updateFilterManager(filterManager);
+        definition.updateEnvironment(environment);
+        properties.updateEnvironment(environment);
+
+        return environment;
+    }
+
+    private ExtractionUnit parseExtractionUnit(){
+        String label = (String)unitBox.getSelectedItem();
+        String key = unitLabels.get(label);
+        ExtractionUnit unit = ExtractionUnit.CLASS;
+
+        if(key.equals("unit.archive")){
+            unit = ExtractionUnit.ARCHIVE;
+        }
+        else if(key.equals("unit.package")){
+            unit = ExtractionUnit.PACKAGE;
+        }
+        else{
+            unit = ExtractionUnit.CLASS;
+        }
+        return unit;
+    }
+
+    private void initComponents(){
+        controlTab = new JTabbedPane();
+        resetButton = GUIUtility.createButton(stigmata.getMessages(), "reset");
+        extractButton = GUIUtility.createButton(stigmata.getMessages(), "extract");
+        compareButton = GUIUtility.createButton(stigmata.getMessages(), "roundrobin");
+        comparePopup = new PopupButton(compareButton);
+        unitBox = new JComboBox();
+
+        Box south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(resetButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(extractButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(comparePopup);
+        south.add(Box.createHorizontalGlue());
+        south.add(unitBox);
+        south.add(Box.createHorizontalGlue());
+
+        setLayout(new BorderLayout());
+        add(south, BorderLayout.SOUTH);
+        add(controlTab, BorderLayout.CENTER);
+
+        extractButton.setEnabled(false);
+        comparePopup.setEnabled(false);
+
+        resetButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                reset();
+            }
+        });
+
+        extractButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                extractButtonActionPerformed(e);
+            }
+        });
+
+        ActionListener compareListener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                String command = e.getActionCommand();
+
+                if(command.equals("roundrobin")){
+                    compareRoundRobin();
+                }
+                else if(command.equals("guessedpair")){
+                    compareGuessedPair();
+                }
+                else if(command.equals("specifiedpair")){
+                    compareSpecifiedPair();
+                }
+                else if(command.equals("roundrobin.filtering")){
+                    compareRoundRobinWithFiltering();
+                }
+            }
+        };
+        compareButton.addActionListener(compareListener);
+
+        String[] comparisonMethods = stigmata.getMessages().getArray("comparison.methods");
+        for(int i = 1; i < comparisonMethods.length; i++){
+            JMenuItem item = GUIUtility.createJMenuItem(stigmata.getMessages(), comparisonMethods[i]);
+            comparePopup.addMenuItem(item);
+            item.addActionListener(compareListener);
+        }
+
+        String[] extractionUnits = stigmata.getMessages().getArray("extraction.units");
+        for(int i = 0; i < extractionUnits.length; i++){
+            String label = stigmata.getMessages().get(extractionUnits[i]);
+            unitLabels.put(label, extractionUnits[i]);
+            unitBox.addItem(label);
+        }
+    }
+}
@@ -1,18 +1,18 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.EventListener;\r
-\r
-/**\r
- * \r
- * \r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface DataChangeListener extends EventListener{\r
-    public void valueChanged(Object source);\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.util.EventListener;
+
+/**
+ * 
+ * 
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface DataChangeListener extends EventListener{
+    public void valueChanged(Object source);
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.ui.swing;
+package jp.sourceforge.stigmata.ui.swing;
 
 /*
  * $Id$
@@ -24,10 +24,10 @@ import javax.swing.ListSelectionModel;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
-import jp.naist.se.stigmata.ExtractionResultSet;
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistory;
-import jp.naist.se.stigmata.result.history.ExtractedBirthmarkServiceManager;
-import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkHistory;
+import jp.sourceforge.stigmata.result.history.ExtractedBirthmarkServiceManager;
+import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
 import jp.sourceforge.talisman.i18n.Messages;
 
 /**
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Component;\r
-import java.io.File;\r
-import java.text.MessageFormat;\r
-\r
-import javax.swing.JFileChooser;\r
-import javax.swing.SwingUtilities;\r
-import javax.swing.filechooser.FileFilter;\r
-\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FileIOManager{\r
-    private Component parent;\r
-    private File currentDirectory;\r
-    private BirthmarkEnvironment env;\r
-\r
-    public FileIOManager(Component parent, BirthmarkEnvironment env){\r
-        this.parent = parent;\r
-        this.env = env;\r
-        if(env.getProperty(".current.directory") != null){\r
-            currentDirectory = new File(env.getProperty(".current.directory"));\r
-        }\r
-        if(env.getProperty("startup.directory") != null){\r
-            currentDirectory = new File(env.getProperty("startup.directory"));\r
-        }\r
-        if(currentDirectory == null && System.getProperty("execution.directory") != null){\r
-            currentDirectory = new File(System.getProperty("execution.directory"));\r
-        }\r
-        if(currentDirectory == null){\r
-            currentDirectory = new File(".");\r
-        }\r
-    }\r
-\r
-    public File getCurrentDirectory(){\r
-        return currentDirectory;\r
-    }\r
-\r
-    public void setCurrentDirectory(File directory) throws IllegalArgumentException{\r
-        if(!directory.isDirectory()){\r
-            throw new IllegalArgumentException(directory.getName() + " is not directory");\r
-        }\r
-        this.currentDirectory = directory;\r
-        env.addProperty(".current.directory", directory.getAbsolutePath());\r
-    }\r
-\r
-    public File findFile(boolean open){\r
-        return findFile(open, new String[0], "");\r
-    }\r
-\r
-    public File[] openFiles(FileFilter[] filters, boolean multi, boolean directory){\r
-        JFileChooser chooser = new JFileChooser(getCurrentDirectory());\r
-        if(filters != null){\r
-            for(int i = 0; i < filters.length; i++){\r
-                chooser.addChoosableFileFilter(filters[i]);\r
-            }\r
-        }\r
-        chooser.setMultiSelectionEnabled(multi);\r
-        if(directory){\r
-            chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);\r
-        }\r
-        else{\r
-            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);\r
-        }\r
-        int returnValue = chooser.showOpenDialog(SwingUtilities.getRootPane(parent));\r
-        if(returnValue == JFileChooser.APPROVE_OPTION){\r
-            setCurrentDirectory(chooser.getCurrentDirectory());\r
-            return chooser.getSelectedFiles();\r
-        }\r
-        return new File[0];\r
-    }\r
-\r
-    public File findFile(boolean open, String[] exts, String desc){\r
-        JFileChooser chooser = new JFileChooser(getCurrentDirectory());\r
-        if(exts != null){\r
-            MessageFormat formatter = new MessageFormat(desc);\r
-            for(int i = 0; i < exts.length; i++){\r
-                chooser.addChoosableFileFilter(\r
-                    new ExtensionFilter(exts[i], formatter.format(new Object[] { exts[i], }))\r
-                );\r
-            }\r
-        }\r
-        int returnValue = -1;\r
-        if(open){\r
-            returnValue = chooser.showOpenDialog(SwingUtilities.getRootPane(parent));\r
-        }\r
-        else{\r
-            returnValue = chooser.showSaveDialog(SwingUtilities.getRootPane(parent));\r
-        }\r
-        if(returnValue == JFileChooser.APPROVE_OPTION){\r
-            setCurrentDirectory(chooser.getCurrentDirectory());\r
-            File file = chooser.getSelectedFile();\r
-            if(!open){\r
-                FileFilter filter = chooser.getFileFilter();\r
-                if(filter instanceof ExtensionFilter){\r
-                    ExtensionFilter ef = (ExtensionFilter)filter;\r
-                    if(!filter.accept(file)){\r
-                        String[] extensions = ef.getExtensions();\r
-                        file = setExtension(file, extensions[0]);\r
-                    }\r
-                }\r
-            }\r
-            return file;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    private File setExtension(File file, String ext){\r
-        String name = file.getName();\r
-        int index = name.lastIndexOf('.');\r
-        String n = name;\r
-        if(index > 0){\r
-            n = n.substring(0, index);\r
-        }\r
-        name = n + '.' + ext;\r
-        return new File(file.getParentFile(), name);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Component;
+import java.io.File;
+import java.text.MessageFormat;
+
+import javax.swing.JFileChooser;
+import javax.swing.SwingUtilities;
+import javax.swing.filechooser.FileFilter;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FileIOManager{
+    private Component parent;
+    private File currentDirectory;
+    private BirthmarkEnvironment env;
+
+    public FileIOManager(Component parent, BirthmarkEnvironment env){
+        this.parent = parent;
+        this.env = env;
+        if(env.getProperty(".current.directory") != null){
+            currentDirectory = new File(env.getProperty(".current.directory"));
+        }
+        if(env.getProperty("startup.directory") != null){
+            currentDirectory = new File(env.getProperty("startup.directory"));
+        }
+        if(currentDirectory == null && System.getProperty("execution.directory") != null){
+            currentDirectory = new File(System.getProperty("execution.directory"));
+        }
+        if(currentDirectory == null){
+            currentDirectory = new File(".");
+        }
+    }
+
+    public File getCurrentDirectory(){
+        return currentDirectory;
+    }
+
+    public void setCurrentDirectory(File directory) throws IllegalArgumentException{
+        if(!directory.isDirectory()){
+            throw new IllegalArgumentException(directory.getName() + " is not directory");
+        }
+        this.currentDirectory = directory;
+        env.addProperty(".current.directory", directory.getAbsolutePath());
+    }
+
+    public File findFile(boolean open){
+        return findFile(open, new String[0], "");
+    }
+
+    public File[] openFiles(FileFilter[] filters, boolean multi, boolean directory){
+        JFileChooser chooser = new JFileChooser(getCurrentDirectory());
+        if(filters != null){
+            for(int i = 0; i < filters.length; i++){
+                chooser.addChoosableFileFilter(filters[i]);
+            }
+        }
+        chooser.setMultiSelectionEnabled(multi);
+        if(directory){
+            chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
+        }
+        else{
+            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+        }
+        int returnValue = chooser.showOpenDialog(SwingUtilities.getRootPane(parent));
+        if(returnValue == JFileChooser.APPROVE_OPTION){
+            setCurrentDirectory(chooser.getCurrentDirectory());
+            return chooser.getSelectedFiles();
+        }
+        return new File[0];
+    }
+
+    public File findFile(boolean open, String[] exts, String desc){
+        JFileChooser chooser = new JFileChooser(getCurrentDirectory());
+        if(exts != null){
+            MessageFormat formatter = new MessageFormat(desc);
+            for(int i = 0; i < exts.length; i++){
+                chooser.addChoosableFileFilter(
+                    new ExtensionFilter(exts[i], formatter.format(new Object[] { exts[i], }))
+                );
+            }
+        }
+        int returnValue = -1;
+        if(open){
+            returnValue = chooser.showOpenDialog(SwingUtilities.getRootPane(parent));
+        }
+        else{
+            returnValue = chooser.showSaveDialog(SwingUtilities.getRootPane(parent));
+        }
+        if(returnValue == JFileChooser.APPROVE_OPTION){
+            setCurrentDirectory(chooser.getCurrentDirectory());
+            File file = chooser.getSelectedFile();
+            if(!open){
+                FileFilter filter = chooser.getFileFilter();
+                if(filter instanceof ExtensionFilter){
+                    ExtensionFilter ef = (ExtensionFilter)filter;
+                    if(!filter.accept(file)){
+                        String[] extensions = ef.getExtensions();
+                        file = setExtension(file, extensions[0]);
+                    }
+                }
+            }
+            return file;
+        }
+        return null;
+    }
+
+    private File setExtension(File file, String ext){
+        String name = file.getName();
+        int index = name.lastIndexOf('.');
+        String n = name;
+        if(index > 0){
+            n = n.substring(0, index);
+        }
+        name = n + '.' + ext;
+        return new File(file.getParentFile(), name);
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
-import jp.naist.se.stigmata.filter.ComparisonPairFilterManager;\r
-import jp.naist.se.stigmata.ui.swing.filter.ComparisonPairFilterRetainable;\r
-import jp.naist.se.stigmata.ui.swing.filter.FilterEditingPane;\r
-import jp.naist.se.stigmata.ui.swing.filter.FilterSetDefinitionPane;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FilterManagementPane extends JPanel implements ComparisonPairFilterRetainable{\r
-    private static final long serialVersionUID = 972135792354L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private FilterSetDefinitionPane definition;\r
-    private FilterEditingPane filterPane;\r
-    private JList list;\r
-    private DefaultListModel model;\r
-    private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();\r
-\r
-    public FilterManagementPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-        \r
-        initLayouts();\r
-    }\r
-\r
-    public void reset(){\r
-        definition.reset();\r
-        filterPane.reset();\r
-        model.removeAllElements();\r
-        \r
-        ComparisonPairFilterManager manager = stigmata.getEnvironment().getFilterManager();\r
-        for(ComparisonPairFilterSet filterset: manager.getFilterSets()){\r
-            addFilterSet(filterset);\r
-        }\r
-    }\r
-\r
-    public void updateFilterManager(ComparisonPairFilterManager manager){\r
-        for(ComparisonPairFilterSet filterset: filters.values()){\r
-            manager.addFilterSet(filterset);\r
-        }\r
-    }\r
-\r
-    public void addFilterSet(ComparisonPairFilterSet filterset){\r
-        filters.put(filterset.getName(), filterset);\r
-\r
-        model.addElement(filterset.getName());\r
-        list.setSelectedIndex(model.getSize() - 1);\r
-    }\r
-\r
-    public void removeFilterSet(String name){\r
-        filters.remove(name);\r
-        model.removeElement(name);\r
-\r
-        list.clearSelection();\r
-    }\r
-\r
-    public void updateFilterSet(String oldName, ComparisonPairFilterSet newfilter){\r
-        for(int i = 0; i < model.getSize(); i++){\r
-            if(oldName.equals(model.getElementAt(i))){\r
-                model.setElementAt(newfilter.getName(), i);\r
-                break;\r
-            }\r
-        }\r
-        filters.remove(oldName);\r
-        filters.put(newfilter.getName(), newfilter);\r
-    }\r
-\r
-    public ComparisonPairFilterSet getFilterSet(String name){\r
-        return filters.get(name);\r
-    }\r
-\r
-    public void filterSelected(ComparisonPairFilter filter){\r
-        filterPane.setFilter(filter);\r
-    }\r
-\r
-    private void initLayouts(){\r
-        definition = new FilterSetDefinitionPane(stigmata, this);\r
-        filterPane = new FilterEditingPane(stigmata);\r
-        filterPane.addComparisonPairFilterListener(definition);\r
-        JComponent filtersetlist = createFilterSetPane();\r
-\r
-        GUIUtility.decorateJComponent(stigmata.getMessages(), filtersetlist, "filtersetlist.pane");\r
-        GUIUtility.decorateJComponent(stigmata.getMessages(), definition, "filterdefinition.pane");\r
-        GUIUtility.decorateJComponent(stigmata.getMessages(), filterPane, "filter.pane");\r
-\r
-        setLayout(new GridLayout(1, 3));\r
-        add(filtersetlist);\r
-        add(definition);\r
-        add(filterPane);\r
-    }\r
-\r
-    private JComponent createFilterSetPane(){\r
-        model = new DefaultListModel();\r
-        list = new JList(model);\r
-\r
-        final JButton upButton = GUIUtility.createButton(stigmata.getMessages(), "moveup");\r
-        final JButton downButton = GUIUtility.createButton(stigmata.getMessages(), "movedown");\r
-\r
-        Box south = Box.createHorizontalBox();\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(upButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(downButton);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        list.addMouseListener(new MouseAdapter(){\r
-            @Override\r
-            public void mouseClicked(MouseEvent e){\r
-                int index = list.locationToIndex(e.getPoint());\r
-                list.setSelectedIndex(index);\r
-                updateUI();\r
-            }\r
-        });\r
-        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent e){\r
-                int[] indexes = list.getSelectedIndices();\r
-                int rows = model.getSize();\r
-\r
-                upButton.setEnabled(indexes.length == 1 && rows > 1 && indexes[0] != 0);\r
-                downButton.setEnabled(indexes.length == 1 && rows > 1 && indexes[0] != (rows - 1));\r
-                if(indexes.length != 1){\r
-                    definition.setFilterSet(null);\r
-                }\r
-                else{\r
-                    definition.setFilterSet(filters.get(model.getElementAt(indexes[0])));\r
-                }\r
-            }\r
-        });\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                int step = 1;\r
-                if(e.getActionCommand().equals("moveup")){\r
-                    step = -1;\r
-                }\r
-                int index = list.getSelectedIndex();\r
-                Object e1 = model.getElementAt(index);\r
-                Object e2 = model.getElementAt(index + step);\r
-                model.setElementAt(e1, index + step);\r
-                model.setElementAt(e2, index);\r
-                list.setSelectedIndex(index + step);\r
-            }\r
-        };\r
-        upButton.addActionListener(listener);\r
-        downButton.addActionListener(listener);\r
-        upButton.setEnabled(false);\r
-        downButton.setEnabled(false);\r
-        \r
-        JPanel panel = new JPanel(new BorderLayout());\r
-        panel.add(new JScrollPane(list), BorderLayout.CENTER);\r
-        panel.add(south, BorderLayout.SOUTH);\r
-        \r
-        return panel;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.Box;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
+import jp.sourceforge.stigmata.ui.swing.filter.ComparisonPairFilterRetainable;
+import jp.sourceforge.stigmata.ui.swing.filter.FilterEditingPane;
+import jp.sourceforge.stigmata.ui.swing.filter.FilterSetDefinitionPane;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FilterManagementPane extends JPanel implements ComparisonPairFilterRetainable{
+    private static final long serialVersionUID = 972135792354L;
+
+    private StigmataFrame stigmata;
+    private FilterSetDefinitionPane definition;
+    private FilterEditingPane filterPane;
+    private JList list;
+    private DefaultListModel model;
+    private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();
+
+    public FilterManagementPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+        
+        initLayouts();
+    }
+
+    public void reset(){
+        definition.reset();
+        filterPane.reset();
+        model.removeAllElements();
+        
+        ComparisonPairFilterManager manager = stigmata.getEnvironment().getFilterManager();
+        for(ComparisonPairFilterSet filterset: manager.getFilterSets()){
+            addFilterSet(filterset);
+        }
+    }
+
+    public void updateFilterManager(ComparisonPairFilterManager manager){
+        for(ComparisonPairFilterSet filterset: filters.values()){
+            manager.addFilterSet(filterset);
+        }
+    }
+
+    public void addFilterSet(ComparisonPairFilterSet filterset){
+        filters.put(filterset.getName(), filterset);
+
+        model.addElement(filterset.getName());
+        list.setSelectedIndex(model.getSize() - 1);
+    }
+
+    public void removeFilterSet(String name){
+        filters.remove(name);
+        model.removeElement(name);
+
+        list.clearSelection();
+    }
+
+    public void updateFilterSet(String oldName, ComparisonPairFilterSet newfilter){
+        for(int i = 0; i < model.getSize(); i++){
+            if(oldName.equals(model.getElementAt(i))){
+                model.setElementAt(newfilter.getName(), i);
+                break;
+            }
+        }
+        filters.remove(oldName);
+        filters.put(newfilter.getName(), newfilter);
+    }
+
+    public ComparisonPairFilterSet getFilterSet(String name){
+        return filters.get(name);
+    }
+
+    public void filterSelected(ComparisonPairFilter filter){
+        filterPane.setFilter(filter);
+    }
+
+    private void initLayouts(){
+        definition = new FilterSetDefinitionPane(stigmata, this);
+        filterPane = new FilterEditingPane(stigmata);
+        filterPane.addComparisonPairFilterListener(definition);
+        JComponent filtersetlist = createFilterSetPane();
+
+        GUIUtility.decorateJComponent(stigmata.getMessages(), filtersetlist, "filtersetlist.pane");
+        GUIUtility.decorateJComponent(stigmata.getMessages(), definition, "filterdefinition.pane");
+        GUIUtility.decorateJComponent(stigmata.getMessages(), filterPane, "filter.pane");
+
+        setLayout(new GridLayout(1, 3));
+        add(filtersetlist);
+        add(definition);
+        add(filterPane);
+    }
+
+    private JComponent createFilterSetPane(){
+        model = new DefaultListModel();
+        list = new JList(model);
+
+        final JButton upButton = GUIUtility.createButton(stigmata.getMessages(), "moveup");
+        final JButton downButton = GUIUtility.createButton(stigmata.getMessages(), "movedown");
+
+        Box south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(upButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(downButton);
+        south.add(Box.createHorizontalGlue());
+
+        list.addMouseListener(new MouseAdapter(){
+            @Override
+            public void mouseClicked(MouseEvent e){
+                int index = list.locationToIndex(e.getPoint());
+                list.setSelectedIndex(index);
+                updateUI();
+            }
+        });
+        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent e){
+                int[] indexes = list.getSelectedIndices();
+                int rows = model.getSize();
+
+                upButton.setEnabled(indexes.length == 1 && rows > 1 && indexes[0] != 0);
+                downButton.setEnabled(indexes.length == 1 && rows > 1 && indexes[0] != (rows - 1));
+                if(indexes.length != 1){
+                    definition.setFilterSet(null);
+                }
+                else{
+                    definition.setFilterSet(filters.get(model.getElementAt(indexes[0])));
+                }
+            }
+        });
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                int step = 1;
+                if(e.getActionCommand().equals("moveup")){
+                    step = -1;
+                }
+                int index = list.getSelectedIndex();
+                Object e1 = model.getElementAt(index);
+                Object e2 = model.getElementAt(index + step);
+                model.setElementAt(e1, index + step);
+                model.setElementAt(e2, index);
+                list.setSelectedIndex(index + step);
+            }
+        };
+        upButton.addActionListener(listener);
+        downButton.addActionListener(listener);
+        upButton.setEnabled(false);
+        downButton.setEnabled(false);
+        
+        JPanel panel = new JPanel(new BorderLayout());
+        panel.add(new JScrollPane(list), BorderLayout.CENTER);
+        panel.add(south, BorderLayout.SOUTH);
+        
+        return panel;
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Component;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.ListCellRenderer;\r
-import javax.swing.ListSelectionModel;\r
-import javax.swing.UIManager;\r
-import javax.swing.border.Border;\r
-import javax.swing.border.EmptyBorder;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
-import jp.naist.se.stigmata.filter.ComparisonPairFilterManager;\r
-import jp.naist.se.stigmata.ui.swing.filter.ComparisonPairFilterRetainable;\r
-import jp.naist.se.stigmata.ui.swing.filter.FilterSetDefinitionPane;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class FilterSelectionPane extends JPanel implements ComparisonPairFilterRetainable{\r
-    private static final long serialVersionUID = 1825547576389498336L;\r
-    private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);\r
-\r
-    private StigmataFrame stigmata;\r
-    private ComparisonPairFilterManager manager;\r
-    private FilterSetDefinitionPane filterDef;\r
-    private Map<String, Boolean> enableMap = new HashMap<String, Boolean>();\r
-    private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>(); \r
-    private DefaultListModel model;\r
-    private JList list;\r
-\r
-    public FilterSelectionPane(StigmataFrame stigmata, ComparisonPairFilterManager manager){\r
-        this.stigmata = stigmata;\r
-        this.manager = manager;\r
-\r
-        initLayout();\r
-    }\r
-\r
-    public void addFilterSet(ComparisonPairFilterSet filter){\r
-        filters.put(filter.getName(), filter);\r
-        enableMap.put(filter.getName(), false);\r
-        model.addElement(filter.getName());\r
-    }\r
-\r
-    public void filterSelected(ComparisonPairFilter filter){\r
-    }\r
-\r
-    public ComparisonPairFilterSet getFilterSet(String name){\r
-        return filters.get(name);\r
-    }\r
-\r
-    public void removeFilterSet(String name){\r
-        filters.remove(name);\r
-        enableMap.remove(name);\r
-        model.removeElement(name);\r
-    }\r
-\r
-    public void updateFilterSet(String name, ComparisonPairFilterSet filter){\r
-        int index = model.indexOf(name);\r
-        model.set(index, filter.getName());\r
-        filters.put(filter.getName(), filter);\r
-        enableMap.put(filter.getName(), enableMap.get(name));\r
-\r
-        if(!name.equals(filter.getName())){\r
-            enableMap.remove(name);\r
-            filters.remove(name);\r
-        }\r
-    }\r
-\r
-    public String[] getSelectedFilters(){\r
-        List<String> list = new ArrayList<String>();\r
-        for(String key: enableMap.keySet()){\r
-            if(enableMap.get(key)){\r
-                list.add(key);\r
-            }\r
-        }\r
-        return list.toArray(new String[list.size()]);\r
-    }\r
-\r
-    private void initLayout(){\r
-        setLayout(new BorderLayout());\r
-        model = new DefaultListModel();\r
-        list = new JList(model);\r
-        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
-        list.setCellRenderer(new CheckableListCellRenderer());\r
-\r
-        JScrollPane scroll = new JScrollPane(list);\r
-        filterDef = new FilterSetDefinitionPane(stigmata, this, false);\r
-\r
-        add(scroll, BorderLayout.WEST);\r
-        add(filterDef, BorderLayout.CENTER);\r
-\r
-        list.addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent e){\r
-                String name = (String)list.getSelectedValue();\r
-                filterDef.setFilterSet(filters.get(name));\r
-                \r
-                updateUI();\r
-            }\r
-        });\r
-        list.addMouseListener(new MouseAdapter(){\r
-            @Override\r
-            public void mouseClicked(MouseEvent e){\r
-                int index = list.locationToIndex(e.getPoint());\r
-                String value = (String)model.getElementAt(index);\r
-                enableMap.put(value, !enableMap.get(value));\r
-                updateUI();\r
-            }\r
-        });\r
-\r
-        for(ComparisonPairFilterSet filterset: manager.getFilterSets()){\r
-            enableMap.put(filterset.getName(), false);\r
-            filters.put(filterset.getName(), filterset);\r
-            model.addElement(filterset.getName());\r
-        }\r
-    }\r
-\r
-    private class CheckableListCellRenderer extends JCheckBox implements ListCellRenderer{\r
-        private static final long serialVersionUID = 2120743754620361163L;\r
-\r
-        public CheckableListCellRenderer(){\r
-            setOpaque(true);\r
-        }\r
-\r
-        public Component getListCellRendererComponent(JList list, Object v, int index, boolean isSelected, boolean cellHasFocus){\r
-            String value = (String)v;\r
-            setText(value);\r
-            setSelected(enableMap.get(value));\r
-\r
-            if(isSelected){\r
-                setBackground(list.getSelectionBackground());\r
-                setForeground(list.getSelectionForeground());\r
-            }\r
-            else{\r
-                setBackground(list.getBackground());\r
-                setForeground(list.getForeground());\r
-            }\r
-            Border border = null;\r
-            if(cellHasFocus){\r
-                if(isSelected){\r
-                    border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");\r
-                }\r
-                if(border == null){\r
-                    border = UIManager.getBorder("List.focusCellHighlightBorder");\r
-                }\r
-            }\r
-            else{\r
-                border = noFocusBorder;\r
-            }\r
-            setBorder(border);            \r
-\r
-            return this;\r
-        }\r
-        \r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.DefaultListModel;
+import javax.swing.JCheckBox;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListSelectionModel;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
+import jp.sourceforge.stigmata.ui.swing.filter.ComparisonPairFilterRetainable;
+import jp.sourceforge.stigmata.ui.swing.filter.FilterSetDefinitionPane;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class FilterSelectionPane extends JPanel implements ComparisonPairFilterRetainable{
+    private static final long serialVersionUID = 1825547576389498336L;
+    private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
+
+    private StigmataFrame stigmata;
+    private ComparisonPairFilterManager manager;
+    private FilterSetDefinitionPane filterDef;
+    private Map<String, Boolean> enableMap = new HashMap<String, Boolean>();
+    private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>(); 
+    private DefaultListModel model;
+    private JList list;
+
+    public FilterSelectionPane(StigmataFrame stigmata, ComparisonPairFilterManager manager){
+        this.stigmata = stigmata;
+        this.manager = manager;
+
+        initLayout();
+    }
+
+    public void addFilterSet(ComparisonPairFilterSet filter){
+        filters.put(filter.getName(), filter);
+        enableMap.put(filter.getName(), false);
+        model.addElement(filter.getName());
+    }
+
+    public void filterSelected(ComparisonPairFilter filter){
+    }
+
+    public ComparisonPairFilterSet getFilterSet(String name){
+        return filters.get(name);
+    }
+
+    public void removeFilterSet(String name){
+        filters.remove(name);
+        enableMap.remove(name);
+        model.removeElement(name);
+    }
+
+    public void updateFilterSet(String name, ComparisonPairFilterSet filter){
+        int index = model.indexOf(name);
+        model.set(index, filter.getName());
+        filters.put(filter.getName(), filter);
+        enableMap.put(filter.getName(), enableMap.get(name));
+
+        if(!name.equals(filter.getName())){
+            enableMap.remove(name);
+            filters.remove(name);
+        }
+    }
+
+    public String[] getSelectedFilters(){
+        List<String> list = new ArrayList<String>();
+        for(String key: enableMap.keySet()){
+            if(enableMap.get(key)){
+                list.add(key);
+            }
+        }
+        return list.toArray(new String[list.size()]);
+    }
+
+    private void initLayout(){
+        setLayout(new BorderLayout());
+        model = new DefaultListModel();
+        list = new JList(model);
+        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        list.setCellRenderer(new CheckableListCellRenderer());
+
+        JScrollPane scroll = new JScrollPane(list);
+        filterDef = new FilterSetDefinitionPane(stigmata, this, false);
+
+        add(scroll, BorderLayout.WEST);
+        add(filterDef, BorderLayout.CENTER);
+
+        list.addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent e){
+                String name = (String)list.getSelectedValue();
+                filterDef.setFilterSet(filters.get(name));
+                
+                updateUI();
+            }
+        });
+        list.addMouseListener(new MouseAdapter(){
+            @Override
+            public void mouseClicked(MouseEvent e){
+                int index = list.locationToIndex(e.getPoint());
+                String value = (String)model.getElementAt(index);
+                enableMap.put(value, !enableMap.get(value));
+                updateUI();
+            }
+        });
+
+        for(ComparisonPairFilterSet filterset: manager.getFilterSets()){
+            enableMap.put(filterset.getName(), false);
+            filters.put(filterset.getName(), filterset);
+            model.addElement(filterset.getName());
+        }
+    }
+
+    private class CheckableListCellRenderer extends JCheckBox implements ListCellRenderer{
+        private static final long serialVersionUID = 2120743754620361163L;
+
+        public CheckableListCellRenderer(){
+            setOpaque(true);
+        }
+
+        public Component getListCellRendererComponent(JList list, Object v, int index, boolean isSelected, boolean cellHasFocus){
+            String value = (String)v;
+            setText(value);
+            setSelected(enableMap.get(value));
+
+            if(isSelected){
+                setBackground(list.getSelectionBackground());
+                setForeground(list.getSelectionForeground());
+            }
+            else{
+                setBackground(list.getBackground());
+                setForeground(list.getForeground());
+            }
+            Border border = null;
+            if(cellHasFocus){
+                if(isSelected){
+                    border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");
+                }
+                if(border == null){
+                    border = UIManager.getBorder("List.focusCellHighlightBorder");
+                }
+            }
+            else{
+                border = noFocusBorder;
+            }
+            setBorder(border);            
+
+            return this;
+        }
+        
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Component;\r
-import java.awt.Image;\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.lang.reflect.Method;\r
-import java.net.URL;\r
-import java.text.MessageFormat;\r
-\r
-import javax.swing.Action;\r
-import javax.swing.Icon;\r
-import javax.swing.ImageIcon;\r
-import javax.swing.JButton;\r
-import javax.swing.JCheckBoxMenuItem;\r
-import javax.swing.JComponent;\r
-import javax.swing.JMenu;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JTabbedPane;\r
-import javax.swing.border.TitledBorder;\r
-\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * Utility routines for building GUI.\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class GUIUtility{\r
-    private GUIUtility(){\r
-    }\r
-\r
-    public static void decorateJComponent(Messages messages, JComponent component, String label){\r
-        if(messages.hasValue(label + ".tooltip")){\r
-            component.setToolTipText(messages.get(label + ".tooltip"));\r
-        }\r
-        if(messages.hasValue(label + ".border")){\r
-            component.setBorder(new TitledBorder(messages.get(label + ".border")));\r
-        }\r
-        try{\r
-            Icon icon = getIcon(messages, 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
-                    }\r
-                }\r
-            }\r
-        } catch(IllegalAccessException e){\r
-            throw new InternalError(e.getMessage());\r
-        } catch(InvocationTargetException e){\r
-            throw new InternalError(e.getMessage());\r
-        }\r
-    }\r
-\r
-    public static JButton createButton(Messages messages, String label, Action action){\r
-        JButton button = new JButton(action);\r
-        button.setText(messages.get(label + ".button.label"));\r
-        button.setActionCommand(label);\r
-        if(messages.hasValue(label + ".button.tooltip")){\r
-            button.setToolTipText(messages.get(label + ".button.tooltip"));\r
-        }\r
-        Icon icon = getIcon(messages, label + ".button.icon");\r
-        if(icon != null){\r
-            button.setIcon(icon);\r
-        }\r
-\r
-        return button;\r
-    }\r
-\r
-    public static JButton createButton(Messages messages, String label){\r
-        JButton button = new JButton(messages.get(label + ".button.label"));\r
-        button.setActionCommand(label);\r
-        if(messages.hasValue(label + ".button.tooltip")){\r
-            button.setToolTipText(messages.get(label + ".button.tooltip"));\r
-        }\r
-        Icon icon = getIcon(messages, label + ".button.icon");\r
-        if(icon != null){\r
-            button.setIcon(icon);\r
-        }\r
-\r
-        return button;\r
-    }\r
-\r
-    public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label){\r
-        return createJCheckBoxMenuItem(messages, label, false);\r
-    }\r
-\r
-    public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label, boolean status){\r
-        JCheckBoxMenuItem item = new JCheckBoxMenuItem(messages.get(label + ".menuitem.label"), status);\r
-        item.setActionCommand(label);\r
-        if(messages.hasValue(label + ".menuitem.tooltip")){\r
-            item.setToolTipText(messages.get(label + ".menuitem.tooltip"));\r
-        }\r
-        Icon icon = getIcon(messages, label + ".menuitem.icon");\r
-        if(icon != null){\r
-            item.setIcon(icon);\r
-        }\r
-        return item;\r
-    }\r
-\r
-    public static JMenuItem createJMenuItem(Messages messages, String label, Action action){\r
-        JMenuItem item = new JMenuItem(action);\r
-        item.setText(messages.get(label + ".menuitem.label"));\r
-        item.setActionCommand(label);\r
-        if(messages.hasValue(label + ".menuitem.tooltip")){\r
-            item.setToolTipText(messages.get(label + ".menuitem.tooltip"));\r
-        }\r
-        Icon icon = getIcon(messages, label + ".menuitem.icon");\r
-        if(icon != null){\r
-            item.setIcon(icon);\r
-        }\r
-        return item;\r
-    }\r
-\r
-    public static JMenuItem createJMenuItem(Messages messages, String label){\r
-        JMenuItem item = new JMenuItem(messages.get(label + ".menuitem.label"));\r
-        item.setActionCommand(label);\r
-        if(messages.hasValue(label + ".menuitem.tooltip")){\r
-            item.setToolTipText(messages.get(label + ".menuitem.tooltip"));\r
-        }\r
-        Icon icon = getIcon(messages, label + ".menuitem.icon");\r
-        if(icon != null){\r
-            item.setIcon(icon);\r
-        }\r
-        return item;\r
-    }\r
-\r
-    public static JMenu createJMenu(Messages messages, String label){\r
-        JMenu menu = new JMenu(messages.get(label + ".menu.label"));\r
-        menu.setActionCommand(label);\r
-        if(messages.hasValue(label + ".menu.tooltip")){\r
-            menu.setToolTipText(messages.get(label + ".menu.tooltip"));\r
-        }\r
-        Icon icon = getIcon(messages, label + ".menu.icon");\r
-        if(icon != null){\r
-            menu.setIcon(icon);\r
-        }\r
-        return menu;\r
-    }\r
-\r
-    public static URL getResource(Messages messages, String resourcePathLabel, String resourcePathPrefix){\r
-        if(messages.hasValue(resourcePathLabel)){\r
-            String resourcePath = messages.get(resourcePathLabel);\r
-            if(resourcePathPrefix != null){\r
-                resourcePath = resourcePathPrefix + resourcePath;\r
-            }\r
-            return GUIUtility.class.getResource(resourcePath);\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public static URL getResource(Messages messages, String resourcePathLabel){\r
-        return getResource(messages, resourcePathLabel, null);\r
-    }\r
-\r
-    public static Icon getIcon(Messages messages, String label){\r
-        URL url = getResource(messages, label, messages.get("icon.path"));\r
-        if(url != null){\r
-            ImageIcon icon = new ImageIcon(url);\r
-            return icon;\r
-        }\r
-\r
-        return null;\r
-    }\r
-\r
-    public static Image getImage(Messages messages, String imageFilePathLabel){\r
-        Icon icon = getIcon(messages, imageFilePathLabel);\r
-        if(icon != null && icon instanceof ImageIcon){\r
-            return ((ImageIcon)icon).getImage();\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp){\r
-        addNewTab(messages, key, tabPane, comp, null, null);\r
-    }\r
-\r
-    public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp, Object[] tabnameValues, Object[] values){\r
-        String tabName = messages.get(key + ".tab.label");\r
-        String tooltip = messages.get(key + ".tab.tooltip");\r
-        Icon icon = getIcon(messages, key + ".tab.icon");\r
-\r
-        if(tabnameValues != null){\r
-            tabName = MessageFormat.format(tabName, tabnameValues);\r
-        }\r
-\r
-        if(values != null){\r
-            tooltip = MessageFormat.format(tooltip, values);\r
-        }\r
-        tabPane.addTab(tabName, icon, comp, tooltip);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Component;
+import java.awt.Image;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.text.MessageFormat;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JTabbedPane;
+import javax.swing.border.TitledBorder;
+
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * Utility routines for building GUI.
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class GUIUtility{
+    private GUIUtility(){
+    }
+
+    public static void decorateJComponent(Messages messages, JComponent component, String label){
+        if(messages.hasValue(label + ".tooltip")){
+            component.setToolTipText(messages.get(label + ".tooltip"));
+        }
+        if(messages.hasValue(label + ".border")){
+            component.setBorder(new TitledBorder(messages.get(label + ".border")));
+        }
+        try{
+            Icon icon = getIcon(messages, label + ".icon");
+            if(icon != null){
+                Method[] methods = component.getClass().getMethods();
+                for(Method m: methods){
+                    if(m.getName().equals("setIcon")){
+                        m.invoke(component, icon);
+                    }
+                }
+            }
+        } catch(IllegalAccessException e){
+            throw new InternalError(e.getMessage());
+        } catch(InvocationTargetException e){
+            throw new InternalError(e.getMessage());
+        }
+    }
+
+    public static JButton createButton(Messages messages, String label, Action action){
+        JButton button = new JButton(action);
+        button.setText(messages.get(label + ".button.label"));
+        button.setActionCommand(label);
+        if(messages.hasValue(label + ".button.tooltip")){
+            button.setToolTipText(messages.get(label + ".button.tooltip"));
+        }
+        Icon icon = getIcon(messages, label + ".button.icon");
+        if(icon != null){
+            button.setIcon(icon);
+        }
+
+        return button;
+    }
+
+    public static JButton createButton(Messages messages, String label){
+        JButton button = new JButton(messages.get(label + ".button.label"));
+        button.setActionCommand(label);
+        if(messages.hasValue(label + ".button.tooltip")){
+            button.setToolTipText(messages.get(label + ".button.tooltip"));
+        }
+        Icon icon = getIcon(messages, label + ".button.icon");
+        if(icon != null){
+            button.setIcon(icon);
+        }
+
+        return button;
+    }
+
+    public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label){
+        return createJCheckBoxMenuItem(messages, label, false);
+    }
+
+    public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label, boolean status){
+        JCheckBoxMenuItem item = new JCheckBoxMenuItem(messages.get(label + ".menuitem.label"), status);
+        item.setActionCommand(label);
+        if(messages.hasValue(label + ".menuitem.tooltip")){
+            item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
+        }
+        Icon icon = getIcon(messages, label + ".menuitem.icon");
+        if(icon != null){
+            item.setIcon(icon);
+        }
+        return item;
+    }
+
+    public static JMenuItem createJMenuItem(Messages messages, String label, Action action){
+        JMenuItem item = new JMenuItem(action);
+        item.setText(messages.get(label + ".menuitem.label"));
+        item.setActionCommand(label);
+        if(messages.hasValue(label + ".menuitem.tooltip")){
+            item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
+        }
+        Icon icon = getIcon(messages, label + ".menuitem.icon");
+        if(icon != null){
+            item.setIcon(icon);
+        }
+        return item;
+    }
+
+    public static JMenuItem createJMenuItem(Messages messages, String label){
+        JMenuItem item = new JMenuItem(messages.get(label + ".menuitem.label"));
+        item.setActionCommand(label);
+        if(messages.hasValue(label + ".menuitem.tooltip")){
+            item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
+        }
+        Icon icon = getIcon(messages, label + ".menuitem.icon");
+        if(icon != null){
+            item.setIcon(icon);
+        }
+        return item;
+    }
+
+    public static JMenu createJMenu(Messages messages, String label){
+        JMenu menu = new JMenu(messages.get(label + ".menu.label"));
+        menu.setActionCommand(label);
+        if(messages.hasValue(label + ".menu.tooltip")){
+            menu.setToolTipText(messages.get(label + ".menu.tooltip"));
+        }
+        Icon icon = getIcon(messages, label + ".menu.icon");
+        if(icon != null){
+            menu.setIcon(icon);
+        }
+        return menu;
+    }
+
+    public static URL getResource(Messages messages, String resourcePathLabel, String resourcePathPrefix){
+        if(messages.hasValue(resourcePathLabel)){
+            String resourcePath = messages.get(resourcePathLabel);
+            if(resourcePathPrefix != null){
+                resourcePath = resourcePathPrefix + resourcePath;
+            }
+            return GUIUtility.class.getResource(resourcePath);
+        }
+        return null;
+    }
+
+    public static URL getResource(Messages messages, String resourcePathLabel){
+        return getResource(messages, resourcePathLabel, null);
+    }
+
+    public static Icon getIcon(Messages messages, String label){
+        URL url = getResource(messages, label, messages.get("icon.path"));
+        if(url != null){
+            ImageIcon icon = new ImageIcon(url);
+            return icon;
+        }
+
+        return null;
+    }
+
+    public static Image getImage(Messages messages, String imageFilePathLabel){
+        Icon icon = getIcon(messages, imageFilePathLabel);
+        if(icon != null && icon instanceof ImageIcon){
+            return ((ImageIcon)icon).getImage();
+        }
+        return null;
+    }
+
+    public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp){
+        addNewTab(messages, key, tabPane, comp, null, null);
+    }
+
+    public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp, Object[] tabnameValues, Object[] values){
+        String tabName = messages.get(key + ".tab.label");
+        String tooltip = messages.get(key + ".tab.tooltip");
+        Icon icon = getIcon(messages, key + ".tab.icon");
+
+        if(tabnameValues != null){
+            tabName = MessageFormat.format(tabName, tabnameValues);
+        }
+
+        if(values != null){
+            tooltip = MessageFormat.format(tooltip, values);
+        }
+        tabPane.addTab(tabName, icon, comp, tooltip);
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Dimension;\r
-import java.awt.FlowLayout;\r
-import java.awt.GridLayout;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-\r
-import javax.swing.BorderFactory;\r
-import javax.swing.BoxLayout;\r
-import javax.swing.JButton;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JSplitPane;\r
-import javax.swing.JTree;\r
-import javax.swing.border.TitledBorder;\r
-\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonPairElement;\r
-import jp.naist.se.stigmata.printer.PrinterManager;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
-import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class PairComparisonPane extends JPanel{\r
-    private static final long serialVersionUID = 2342856785474356234L;\r
-\r
-    private StigmataFrame frame;\r
-    private ComparisonPair pair;\r
-\r
-    public PairComparisonPane(StigmataFrame frame, ComparisonPair pair){\r
-        this.frame = frame;\r
-        this.pair = pair;\r
-\r
-        initialize(frame);\r
-    }\r
-\r
-    private void initialize(StigmataFrame frame){\r
-        this.setLayout(new java.awt.BorderLayout());\r
-        this.add(getSouthPanel(frame), java.awt.BorderLayout.SOUTH);\r
-        this.add(getMainPane(frame), java.awt.BorderLayout.CENTER);\r
-    }\r
-\r
-    private JPanel getSouthPanel(StigmataFrame stigmata){\r
-        JPanel panel = new JPanel();\r
-        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));\r
-        JPanel similarityPanel = new JPanel();\r
-        similarityPanel.setLayout(new GridLayout(1, 3));\r
-\r
-        JLabel label = new JLabel(Double.toString(pair.calculateSimilarity()));\r
-        label.setBorder(BorderFactory.createTitledBorder(stigmata.getMessages().get("result.border")));\r
-        JComboBox combo = new JComboBox();\r
-        for(ComparisonPairElement elem : pair){\r
-            combo.addItem(new ClippedLRListCellRenderer.LRItem(elem.getType(), elem.getSimilarity()));\r
-        }\r
-        combo.setRenderer(new ClippedLRListCellRenderer(new Dimension(100, combo.getPreferredSize().height), 50));\r
-        combo.setBorder(BorderFactory.createTitledBorder(stigmata.getMessages().get("eachbirthmarksimilarity.border")));\r
-        similarityPanel.add(label);\r
-        similarityPanel.add(combo);\r
-        similarityPanel.setBorder(new TitledBorder(stigmata.getMessages().get("similarity.border")));\r
-\r
-        panel.add(similarityPanel);\r
-\r
-        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
-        JButton saveButton = GUIUtility.createButton(\r
-            frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){\r
-                public void writeAsciiData(PrintWriter out, String format) throws IOException{\r
-                    ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
-                    if(service == null){\r
-                        service = PrinterManager.getDefaultFormatService();\r
-                    }\r
-\r
-                    service.getComparisonPairPrinter().printResult(out, pair);\r
-                }\r
-            })\r
-        );\r
-\r
-        buttonPanel.add(saveButton);\r
-        panel.add(buttonPanel);\r
-\r
-        return panel;\r
-    }\r
-\r
-    private JSplitPane getMainPane(StigmataFrame frame){\r
-        JSplitPane spliter = new javax.swing.JSplitPane();\r
-        spliter.setLeftComponent(getSpliterPanel(frame, pair.getTarget1()));\r
-        spliter.setRightComponent(getSpliterPanel(frame, pair.getTarget2()));\r
-        spliter.setDividerLocation((spliter.getWidth() - spliter.getDividerSize()) / 2);\r
-        spliter.setContinuousLayout(true);\r
-\r
-        return spliter;\r
-    }\r
-\r
-    private JPanel getSpliterPanel(StigmataFrame stigmata, BirthmarkSet birthmark){\r
-        JPanel panel = new JPanel();\r
-        panel.setLayout(new BorderLayout());\r
-        JTree tree = new JTree(new BirthmarkTreeNode(birthmark));\r
-\r
-        panel.add(new JScrollPane(tree), BorderLayout.CENTER);\r
-        JPanel south = new JPanel(new BorderLayout());\r
-        panel.add(south, BorderLayout.SOUTH);\r
-\r
-        JLabel elementCount = new JLabel(Integer.toString(birthmark.getSumOfElementCount()));\r
-        elementCount.setBorder(new TitledBorder(stigmata.getMessages().get("elementcount.border")));\r
-        south.add(elementCount, BorderLayout.CENTER);\r
-\r
-        return panel;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTree;
+import javax.swing.border.TitledBorder;
+
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonPairElement;
+import jp.sourceforge.stigmata.printer.PrinterManager;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
+import jp.sourceforge.stigmata.utils.AsciiDataWritable;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class PairComparisonPane extends JPanel{
+    private static final long serialVersionUID = 2342856785474356234L;
+
+    private StigmataFrame frame;
+    private ComparisonPair pair;
+
+    public PairComparisonPane(StigmataFrame frame, ComparisonPair pair){
+        this.frame = frame;
+        this.pair = pair;
+
+        initialize(frame);
+    }
+
+    private void initialize(StigmataFrame frame){
+        this.setLayout(new java.awt.BorderLayout());
+        this.add(getSouthPanel(frame), java.awt.BorderLayout.SOUTH);
+        this.add(getMainPane(frame), java.awt.BorderLayout.CENTER);
+    }
+
+    private JPanel getSouthPanel(StigmataFrame stigmata){
+        JPanel panel = new JPanel();
+        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+        JPanel similarityPanel = new JPanel();
+        similarityPanel.setLayout(new GridLayout(1, 3));
+
+        JLabel label = new JLabel(Double.toString(pair.calculateSimilarity()));
+        label.setBorder(BorderFactory.createTitledBorder(stigmata.getMessages().get("result.border")));
+        JComboBox combo = new JComboBox();
+        for(ComparisonPairElement elem : pair){
+            combo.addItem(new ClippedLRListCellRenderer.LRItem(elem.getType(), elem.getSimilarity()));
+        }
+        combo.setRenderer(new ClippedLRListCellRenderer(new Dimension(100, combo.getPreferredSize().height), 50));
+        combo.setBorder(BorderFactory.createTitledBorder(stigmata.getMessages().get("eachbirthmarksimilarity.border")));
+        similarityPanel.add(label);
+        similarityPanel.add(combo);
+        similarityPanel.setBorder(new TitledBorder(stigmata.getMessages().get("similarity.border")));
+
+        panel.add(similarityPanel);
+
+        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+        JButton saveButton = GUIUtility.createButton(
+            frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){
+                public void writeAsciiData(PrintWriter out, String format) throws IOException{
+                    ResultPrinterSpi service = PrinterManager.getInstance().getService(format);
+                    if(service == null){
+                        service = PrinterManager.getDefaultFormatService();
+                    }
+
+                    service.getComparisonPairPrinter().printResult(out, pair);
+                }
+            })
+        );
+
+        buttonPanel.add(saveButton);
+        panel.add(buttonPanel);
+
+        return panel;
+    }
+
+    private JSplitPane getMainPane(StigmataFrame frame){
+        JSplitPane spliter = new javax.swing.JSplitPane();
+        spliter.setLeftComponent(getSpliterPanel(frame, pair.getTarget1()));
+        spliter.setRightComponent(getSpliterPanel(frame, pair.getTarget2()));
+        spliter.setDividerLocation((spliter.getWidth() - spliter.getDividerSize()) / 2);
+        spliter.setContinuousLayout(true);
+
+        return spliter;
+    }
+
+    private JPanel getSpliterPanel(StigmataFrame stigmata, BirthmarkSet birthmark){
+        JPanel panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+        JTree tree = new JTree(new BirthmarkTreeNode(birthmark));
+
+        panel.add(new JScrollPane(tree), BorderLayout.CENTER);
+        JPanel south = new JPanel(new BorderLayout());
+        panel.add(south, BorderLayout.SOUTH);
+
+        JLabel elementCount = new JLabel(Integer.toString(birthmark.getSumOfElementCount()));
+        elementCount.setBorder(new TitledBorder(stigmata.getMessages().get("elementcount.border")));
+        south.add(elementCount, BorderLayout.CENTER);
+
+        return panel;
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JLabel;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTable;\r
-import javax.swing.border.TitledBorder;\r
-import javax.swing.table.DefaultTableModel;\r
-\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-import jp.naist.se.stigmata.printer.PrinterManager;\r
-import jp.naist.se.stigmata.result.CertainPairComparisonResultSet;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
-import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
-import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
-\r
-/**\r
- * \r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class PairComparisonResultSetPane extends JPanel{\r
-    private static final long serialVersionUID = 3298346465652354302L;\r
-\r
-    private StigmataFrame frame;\r
-    private ComparisonResultSet comparison;\r
-    private DefaultTableModel model = new PairComparisonResultSetTableModel();\r
-    private JTable table = new JTable(model);\r
-    private JLabel averageLabel, maximumLabel, minimumLabel;\r
-    private double average, maximum, minimum;\r
-\r
-    public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){\r
-        this.frame = frame;\r
-        this.comparison = resultset;\r
-\r
-        initComponent();\r
-        initData(model, resultset);\r
-    }\r
-\r
-    private void obfuscateClassNames(){\r
-        ClassNameObfuscator obfuscator = new ClassNameObfuscator();\r
-        List<ComparisonPair> newList = new ArrayList<ComparisonPair>();\r
-        BirthmarkContext context = comparison.getContext();\r
-\r
-        for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){\r
-            ComparisonPair pair = i.next();\r
-            BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());\r
-            BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());\r
-\r
-            context = comparison.getContext();\r
-            newList.add(new ComparisonPair(set1, set2, context));\r
-        }\r
-\r
-        try{\r
-            File file = frame.getSaveFile(frame.getMessages().getArray("obfuscationmapping.extension"),\r
-                frame.getMessages().get("obfuscationmapping.description"));\r
-            if(file == null){\r
-                return;\r
-            }\r
-            obfuscator.outputNameMappings(file);\r
-        }catch(IOException e){\r
-            JOptionPane.showMessageDialog(\r
-                this, e.getMessage(), frame.getMessages().get("error.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-            return;\r
-        }\r
-\r
-        DefaultTableModel newModel = new PairComparisonResultSetTableModel();\r
-        initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));\r
-        model = newModel;\r
-        table.setModel(newModel);\r
-    }\r
-\r
-    private void initData(DefaultTableModel model, ComparisonResultSet comparison){\r
-        maximum = 0d;\r
-        minimum = 1d;\r
-        average = 0d;\r
-        model.setColumnIdentifiers(frame.getMessages().getArray("comparepair.table.columns"));\r
-\r
-        for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){\r
-            ComparisonPair pair = i.next();\r
-            double similarity = pair.calculateSimilarity();\r
-            if(similarity > maximum) maximum = similarity;\r
-            if(similarity < minimum) minimum = similarity;\r
-            average += similarity;\r
-\r
-            model.addRow(new Object[] { pair.getTarget1().getName(),\r
-                         pair.getTarget2().getName(), new Double(similarity) });\r
-        }\r
-        average = average / comparison.getPairCount();\r
-        \r
-        averageLabel.setText(Double.toString(average));\r
-        maximumLabel.setText(Double.toString(maximum));\r
-        minimumLabel.setText(Double.toString(minimum));\r
-    }\r
-\r
-    private void initComponent(){\r
-        JComponent buttonPanel = Box.createHorizontalBox();\r
-        JPanel similarityPane = new JPanel(new GridLayout(1, 3));\r
-        JComponent southPanel = Box.createVerticalBox();\r
-        JButton saveButton = GUIUtility.createButton(\r
-            frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){\r
-                public void writeAsciiData(PrintWriter out, String format) throws IOException{\r
-                    ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
-                    if(service == null){\r
-                        service = PrinterManager.getDefaultFormatService();\r
-                    }\r
-                    service.getComparisonResultSetPrinter().printResult(out, comparison);\r
-                }\r
-            })\r
-        );\r
-        JButton updateColorButton = GUIUtility.createButton(\r
-            frame.getMessages(), "updatecellcolor", new UpdateBirthmarkCellColorAction(frame, comparison.getEnvironment())\r
-        );\r
-        JButton obfuscateButton = GUIUtility.createButton(frame.getMessages(), "obfuscate");\r
-        JScrollPane scroll = new JScrollPane();\r
-        averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);\r
-        maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);\r
-        minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);\r
-\r
-        scroll.setViewportView(table);\r
-        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment()));\r
-        similarityPane.setBorder(new TitledBorder(frame.getMessages().get("similarity.border")));\r
-        averageLabel.setBorder(new TitledBorder(frame.getMessages().get("average.border")));\r
-        maximumLabel.setBorder(new TitledBorder(frame.getMessages().get("maximum.border")));\r
-        minimumLabel.setBorder(new TitledBorder(frame.getMessages().get("minimum.border")));\r
-\r
-        setLayout(new BorderLayout());\r
-        add(scroll, BorderLayout.CENTER);\r
-        add(southPanel, BorderLayout.SOUTH);\r
-        similarityPane.add(averageLabel);\r
-        similarityPane.add(maximumLabel);\r
-        similarityPane.add(minimumLabel);\r
-        southPanel.add(similarityPane);\r
-        southPanel.add(buttonPanel);\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-        buttonPanel.add(saveButton);\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-        buttonPanel.add(updateColorButton);\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-        buttonPanel.add(obfuscateButton);\r
-        buttonPanel.add(Box.createHorizontalGlue());\r
-\r
-        table.addMouseListener(new MouseAdapter(){\r
-            public void mouseClicked(MouseEvent e){\r
-                if(e.getClickCount() == 2){\r
-                    int row = table.rowAtPoint(e.getPoint());\r
-                    int col = table.columnAtPoint(e.getPoint());\r
-                    if(col >= 1 && col < table.getColumnCount() && row >= 0\r
-                            && row < table.getRowCount()){\r
-                        ComparisonPair pair = comparison.getPairAt(row);\r
-\r
-                        frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());\r
-                    }\r
-                }\r
-            }\r
-        });\r
-\r
-        obfuscateButton.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                obfuscateClassNames();\r
-            }\r
-        });\r
-    }\r
-\r
-    private static class PairComparisonResultSetTableModel extends DefaultTableModel{\r
-        private static final long serialVersionUID = 93457234571623497L;\r
-\r
-        @Override\r
-        public boolean isCellEditable(int row, int column){\r
-            return false;\r
-        }\r
-\r
-        @Override\r
-        public Class<?> getColumnClass(int column){\r
-            if(column == 2){\r
-                return Double.class;\r
-            }\r
-            else{\r
-                return String.class;\r
-            }\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.border.TitledBorder;
+import javax.swing.table.DefaultTableModel;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+import jp.sourceforge.stigmata.printer.PrinterManager;
+import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
+import jp.sourceforge.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
+import jp.sourceforge.stigmata.utils.AsciiDataWritable;
+
+/**
+ * 
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class PairComparisonResultSetPane extends JPanel{
+    private static final long serialVersionUID = 3298346465652354302L;
+
+    private StigmataFrame frame;
+    private ComparisonResultSet comparison;
+    private DefaultTableModel model = new PairComparisonResultSetTableModel();
+    private JTable table = new JTable(model);
+    private JLabel averageLabel, maximumLabel, minimumLabel;
+    private double average, maximum, minimum;
+
+    public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){
+        this.frame = frame;
+        this.comparison = resultset;
+
+        initComponent();
+        initData(model, resultset);
+    }
+
+    private void obfuscateClassNames(){
+        ClassNameObfuscator obfuscator = new ClassNameObfuscator();
+        List<ComparisonPair> newList = new ArrayList<ComparisonPair>();
+        BirthmarkContext context = comparison.getContext();
+
+        for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
+            ComparisonPair pair = i.next();
+            BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());
+            BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());
+
+            context = comparison.getContext();
+            newList.add(new ComparisonPair(set1, set2, context));
+        }
+
+        try{
+            File file = frame.getSaveFile(frame.getMessages().getArray("obfuscationmapping.extension"),
+                frame.getMessages().get("obfuscationmapping.description"));
+            if(file == null){
+                return;
+            }
+            obfuscator.outputNameMappings(file);
+        }catch(IOException e){
+            JOptionPane.showMessageDialog(
+                this, e.getMessage(), frame.getMessages().get("error.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+            return;
+        }
+
+        DefaultTableModel newModel = new PairComparisonResultSetTableModel();
+        initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));
+        model = newModel;
+        table.setModel(newModel);
+    }
+
+    private void initData(DefaultTableModel model, ComparisonResultSet comparison){
+        maximum = 0d;
+        minimum = 1d;
+        average = 0d;
+        model.setColumnIdentifiers(frame.getMessages().getArray("comparepair.table.columns"));
+
+        for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
+            ComparisonPair pair = i.next();
+            double similarity = pair.calculateSimilarity();
+            if(similarity > maximum) maximum = similarity;
+            if(similarity < minimum) minimum = similarity;
+            average += similarity;
+
+            model.addRow(new Object[] { pair.getTarget1().getName(),
+                         pair.getTarget2().getName(), new Double(similarity) });
+        }
+        average = average / comparison.getPairCount();
+        
+        averageLabel.setText(Double.toString(average));
+        maximumLabel.setText(Double.toString(maximum));
+        minimumLabel.setText(Double.toString(minimum));
+    }
+
+    private void initComponent(){
+        JComponent buttonPanel = Box.createHorizontalBox();
+        JPanel similarityPane = new JPanel(new GridLayout(1, 3));
+        JComponent southPanel = Box.createVerticalBox();
+        JButton saveButton = GUIUtility.createButton(
+            frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){
+                public void writeAsciiData(PrintWriter out, String format) throws IOException{
+                    ResultPrinterSpi service = PrinterManager.getInstance().getService(format);
+                    if(service == null){
+                        service = PrinterManager.getDefaultFormatService();
+                    }
+                    service.getComparisonResultSetPrinter().printResult(out, comparison);
+                }
+            })
+        );
+        JButton updateColorButton = GUIUtility.createButton(
+            frame.getMessages(), "updatecellcolor", new UpdateBirthmarkCellColorAction(frame, comparison.getEnvironment())
+        );
+        JButton obfuscateButton = GUIUtility.createButton(frame.getMessages(), "obfuscate");
+        JScrollPane scroll = new JScrollPane();
+        averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);
+        maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);
+        minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);
+
+        scroll.setViewportView(table);
+        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment()));
+        similarityPane.setBorder(new TitledBorder(frame.getMessages().get("similarity.border")));
+        averageLabel.setBorder(new TitledBorder(frame.getMessages().get("average.border")));
+        maximumLabel.setBorder(new TitledBorder(frame.getMessages().get("maximum.border")));
+        minimumLabel.setBorder(new TitledBorder(frame.getMessages().get("minimum.border")));
+
+        setLayout(new BorderLayout());
+        add(scroll, BorderLayout.CENTER);
+        add(southPanel, BorderLayout.SOUTH);
+        similarityPane.add(averageLabel);
+        similarityPane.add(maximumLabel);
+        similarityPane.add(minimumLabel);
+        southPanel.add(similarityPane);
+        southPanel.add(buttonPanel);
+        buttonPanel.add(Box.createHorizontalGlue());
+        buttonPanel.add(saveButton);
+        buttonPanel.add(Box.createHorizontalGlue());
+        buttonPanel.add(updateColorButton);
+        buttonPanel.add(Box.createHorizontalGlue());
+        buttonPanel.add(obfuscateButton);
+        buttonPanel.add(Box.createHorizontalGlue());
+
+        table.addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent e){
+                if(e.getClickCount() == 2){
+                    int row = table.rowAtPoint(e.getPoint());
+                    int col = table.columnAtPoint(e.getPoint());
+                    if(col >= 1 && col < table.getColumnCount() && row >= 0
+                            && row < table.getRowCount()){
+                        ComparisonPair pair = comparison.getPairAt(row);
+
+                        frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());
+                    }
+                }
+            }
+        });
+
+        obfuscateButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                obfuscateClassNames();
+            }
+        });
+    }
+
+    private static class PairComparisonResultSetTableModel extends DefaultTableModel{
+        private static final long serialVersionUID = 93457234571623497L;
+
+        @Override
+        public boolean isCellEditable(int row, int column){
+            return false;
+        }
+
+        @Override
+        public Class<?> getColumnClass(int column){
+            if(column == 2){
+                return Double.class;
+            }
+            else{
+                return String.class;
+            }
+        }
+    }
+}
@@ -1,88 +1,88 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Dimension;\r
-import java.awt.Point;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-\r
-import javax.swing.Icon;\r
-import javax.swing.JButton;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JPanel;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.plaf.metal.MetalComboBoxIcon;\r
-\r
-/**\r
- * Popup button.\r
- * \r
- * @author tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class PopupButton extends JPanel{\r
-    private static final long serialVersionUID = -4428839967597028837L;\r
-\r
-    private JButton button;\r
-    private JPopupMenu popup;\r
-    private JButton arrowButton;\r
-    private Icon icon;\r
-\r
-    public PopupButton(JButton initButton){\r
-        setLayout(new BorderLayout());\r
-\r
-        button = initButton;\r
-        icon = new MetalComboBoxIcon();\r
-        arrowButton = new JButton(icon);\r
-        popup = new JPopupMenu();\r
-        add(button, BorderLayout.CENTER);\r
-        add(arrowButton, BorderLayout.EAST);\r
-\r
-        arrowButton.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                Point p = button.getLocation();\r
-                popup.show(PopupButton.this, p.x, button.getHeight());\r
-            }\r
-        });\r
-        updateUI();\r
-    }\r
-\r
-    @Override\r
-    public void setEnabled(boolean enabled){\r
-        super.setEnabled(enabled);\r
-        button.setEnabled(enabled);\r
-        arrowButton.setEnabled(enabled);\r
-    }\r
-\r
-    public JButton getButton(){\r
-        return button;\r
-    }\r
-\r
-    public JMenuItem addMenuItem(JMenuItem menuItem){\r
-        return popup.add(menuItem);\r
-    }\r
-\r
-    public void updateUI(){\r
-        super.updateUI();\r
-        if(button != null){\r
-            Dimension prefferedSize = button.getPreferredSize();\r
-\r
-            arrowButton.setPreferredSize(new Dimension(icon.getIconWidth() + 4, prefferedSize.height));\r
-            setPreferredSize(new Dimension(prefferedSize.width + icon.getIconWidth() + 4, prefferedSize.height));\r
-\r
-            Dimension maxSize = button.getMaximumSize();\r
-            arrowButton.setMaximumSize(new Dimension(icon.getIconWidth() + 4, maxSize.height));\r
-            setMaximumSize(new Dimension(maxSize.width + icon.getIconWidth() + 4, maxSize.height));\r
-\r
-            Dimension minSize = button.getMinimumSize();\r
-            arrowButton.setMaximumSize(new Dimension(icon.getIconWidth() + 4, minSize.height));\r
-            setMinimumSize(new Dimension(minSize.width + icon.getIconWidth() + 4, minSize.height));\r
-\r
-            arrowButton.setSize(arrowButton.getPreferredSize());\r
-            setSize(getPreferredSize());\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.plaf.metal.MetalComboBoxIcon;
+
+/**
+ * Popup button.
+ * 
+ * @author tamada
+ * @version $Revision$ $Date$
+ */
+public class PopupButton extends JPanel{
+    private static final long serialVersionUID = -4428839967597028837L;
+
+    private JButton button;
+    private JPopupMenu popup;
+    private JButton arrowButton;
+    private Icon icon;
+
+    public PopupButton(JButton initButton){
+        setLayout(new BorderLayout());
+
+        button = initButton;
+        icon = new MetalComboBoxIcon();
+        arrowButton = new JButton(icon);
+        popup = new JPopupMenu();
+        add(button, BorderLayout.CENTER);
+        add(arrowButton, BorderLayout.EAST);
+
+        arrowButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                Point p = button.getLocation();
+                popup.show(PopupButton.this, p.x, button.getHeight());
+            }
+        });
+        updateUI();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled){
+        super.setEnabled(enabled);
+        button.setEnabled(enabled);
+        arrowButton.setEnabled(enabled);
+    }
+
+    public JButton getButton(){
+        return button;
+    }
+
+    public JMenuItem addMenuItem(JMenuItem menuItem){
+        return popup.add(menuItem);
+    }
+
+    public void updateUI(){
+        super.updateUI();
+        if(button != null){
+            Dimension prefferedSize = button.getPreferredSize();
+
+            arrowButton.setPreferredSize(new Dimension(icon.getIconWidth() + 4, prefferedSize.height));
+            setPreferredSize(new Dimension(prefferedSize.width + icon.getIconWidth() + 4, prefferedSize.height));
+
+            Dimension maxSize = button.getMaximumSize();
+            arrowButton.setMaximumSize(new Dimension(icon.getIconWidth() + 4, maxSize.height));
+            setMaximumSize(new Dimension(maxSize.width + icon.getIconWidth() + 4, maxSize.height));
+
+            Dimension minSize = button.getMinimumSize();
+            arrowButton.setMaximumSize(new Dimension(icon.getIconWidth() + 4, minSize.height));
+            setMinimumSize(new Dimension(minSize.width + icon.getIconWidth() + 4, minSize.height));
+
+            arrowButton.setSize(arrowButton.getPreferredSize());
+            setSize(getPreferredSize());
+        }
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.GridBagConstraints;\r
-import java.awt.GridBagLayout;\r
-import java.awt.Insets;\r
-import java.awt.event.ActionEvent;\r
-import java.beans.PropertyChangeEvent;\r
-import java.beans.PropertyChangeListener;\r
-import java.util.Iterator;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.Action;\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JLabel;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTable;\r
-import javax.swing.JTextField;\r
-import javax.swing.ListSelectionModel;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-import javax.swing.table.DefaultTableModel;\r
-\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class PropertyEditPane extends JPanel{\r
-    private static final long serialVersionUID = 12397342543653L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private JTable table;\r
-    private DefaultTableModel model;\r
-\r
-    public PropertyEditPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-\r
-        initLayouts();\r
-        initData();\r
-    }\r
-\r
-    public void updateEnvironment(BirthmarkEnvironment environment){\r
-        environment.clearProperties();\r
-        for(int i = 0; i < model.getRowCount(); i++){\r
-            environment.addProperty(\r
-                (String)model.getValueAt(i, 0),\r
-                (String)model.getValueAt(i, 1)\r
-            );\r
-        }\r
-    }\r
-\r
-    private void initData(){\r
-        BirthmarkEnvironment environment = stigmata.getEnvironment();\r
-        environment.addPropertyListener(new PropertyChangeListener(){\r
-            public void propertyChange(PropertyChangeEvent evt){\r
-                String name = evt.getPropertyName();\r
-                String value = (String)evt.getNewValue();\r
-                if(value == null){\r
-                    removeProperty(name);\r
-                }\r
-                else{\r
-                    addOrUpdateProperty(name, value);\r
-                }\r
-            }\r
-        });\r
-        for(Iterator<String> i = environment.propertyKeys(); i.hasNext(); ){\r
-            String key = i.next();\r
-            model.addRow(new Object[] { key, environment.getProperty(key), });\r
-        }\r
-    }\r
-\r
-    private void removeProperty(String name){\r
-        int index = findIndex(name);\r
-        if(index >= 0){\r
-            model.removeRow(index);\r
-        }\r
-        stigmata.setNeedToSaveSettings(true);\r
-    }\r
-\r
-    private void addOrUpdateProperty(String name, String value){\r
-        int index = findIndex(name);\r
-        if(index >= 0){\r
-            model.setValueAt(value, index, 1);\r
-        }\r
-        else{\r
-            model.addRow(new Object[] { name, value, });\r
-        }\r
-        stigmata.setNeedToSaveSettings(true);\r
-    }\r
-\r
-    private int findIndex(String name){\r
-        for(int i = 0; i < model.getRowCount(); i++){\r
-            String v = (String)model.getValueAt(i, 0);\r
-            if(v.equals(name)){\r
-                return i;\r
-            }\r
-        }\r
-        return -1;\r
-    }\r
-\r
-    private void addNewProperty(int index){\r
-        final Messages messages = stigmata.getMessages();\r
-        GridBagLayout layout = new GridBagLayout();\r
-        JPanel panel = new JPanel(layout);\r
-        JLabel nameLabel = new JLabel(messages.get("propertyname.label"));\r
-        JLabel valueLabel = new JLabel(messages.get("propertyvalue.label"));\r
-        JTextField name = new JTextField(15);\r
-        JTextField value = new JTextField(15);\r
-\r
-        GridBagConstraints gbc = new GridBagConstraints();\r
-        gbc.gridx = 0; gbc.gridwidth = 1;\r
-        gbc.gridy = 0; gbc.gridheight = 1;\r
-        gbc.insets = new Insets(5, 5, 5, 0);\r
-        layout.setConstraints(nameLabel, gbc);\r
-        panel.add(nameLabel);\r
-\r
-        gbc.gridx = 1; gbc.gridwidth = 2;\r
-        gbc.gridy = 0; gbc.gridheight = 1;\r
-        gbc.fill = GridBagConstraints.HORIZONTAL;\r
-        layout.setConstraints(name, gbc);\r
-        panel.add(name);\r
-\r
-        gbc.gridx = 0; gbc.gridwidth = 1;\r
-        gbc.gridy = 1; gbc.gridheight = 1;\r
-        layout.setConstraints(valueLabel, gbc);\r
-        panel.add(valueLabel);\r
-\r
-        gbc.gridx = 1; gbc.gridwidth = 2;\r
-        gbc.gridy = 1; gbc.gridheight = 1;\r
-        gbc.fill = GridBagConstraints.HORIZONTAL;\r
-        layout.setConstraints(value, gbc);\r
-        panel.add(value);\r
-\r
-        if(index >= 0){\r
-            String keyValue = String.valueOf(table.getValueAt(index, 0));\r
-            String valueValue = String.valueOf(table.getValueAt(index, 1));\r
-            if(keyValue != null)   name.setText(keyValue);\r
-            if(valueValue != null) value.setText(valueValue);\r
-        }\r
-\r
-        int val = JOptionPane.showConfirmDialog(\r
-            stigmata, panel, messages.get("propertyadd.dialog.title"),\r
-            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE\r
-        );\r
-        if(val == JOptionPane.YES_OPTION){\r
-            if(index >= 0){\r
-                model.setValueAt(name.getText(), index, 0);\r
-                model.setValueAt(value.getText(), index, 1);\r
-            }\r
-            else{\r
-                model.addRow(new Object[] {\r
-                    name.getText().trim(),\r
-                    value.getText()\r
-                });\r
-            }\r
-            stigmata.setNeedToSaveSettings(true);\r
-        }\r
-    }\r
-\r
-    private void removeSelectedProperty(){\r
-        int[] indexes = table.getSelectedRows();\r
-        for(int i = indexes.length - 1; i >= 0; i--){\r
-            model.removeRow(indexes[i]);\r
-        }\r
-        stigmata.setNeedToSaveSettings(true);\r
-    }\r
-\r
-    private void initLayouts(){\r
-        final Messages messages = stigmata.getMessages();\r
-        model = new DefaultTableModel();\r
-        model.addColumn(messages.get("propertyname.label"));\r
-        model.addColumn(messages.get("propertyvalue.label"));\r
-        table = new JTable(model);\r
-        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);\r
-        table.setColumnSelectionAllowed(false);\r
-\r
-        Action addAction = new AbstractAction(){\r
-            private static final long serialVersionUID = 1283676936119122278L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                addNewProperty(-1);\r
-            }\r
-        };\r
-        final Action removeAction = new AbstractAction(){\r
-            private static final long serialVersionUID = -411260949451039374L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                removeSelectedProperty();\r
-            }\r
-        };\r
-        final Action changeAction = new AbstractAction(){\r
-            private static final long serialVersionUID = -7406073660916286349L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                addNewProperty(table.getSelectedRow());\r
-            }\r
-        };\r
-        JButton addButton = GUIUtility.createButton(messages, "propertyadd", addAction);\r
-        JButton changeButton = GUIUtility.createButton(messages, "propertychange", changeAction);\r
-        JButton removeButton = GUIUtility.createButton(messages, "propertyremove", removeAction);\r
-\r
-        final JPopupMenu popup = new JPopupMenu();\r
-        popup.add(GUIUtility.createJMenuItem(messages, "propertyadd", addAction));\r
-        popup.add(GUIUtility.createJMenuItem(messages, "propertychange", changeAction));\r
-        popup.add(GUIUtility.createJMenuItem(messages, "propertyremove", removeAction));\r
-\r
-        setLayout(new BorderLayout());\r
-        JScrollPane scroll = new JScrollPane(table);\r
-        Box box = Box.createHorizontalBox();\r
-        box.add(Box.createHorizontalGlue());\r
-        box.add(addButton);\r
-        box.add(Box.createHorizontalGlue());\r
-        box.add(changeButton);\r
-        box.add(Box.createHorizontalGlue());\r
-        box.add(removeButton);\r
-        box.add(Box.createHorizontalGlue());\r
-\r
-        add(scroll, BorderLayout.CENTER);\r
-        add(box, BorderLayout.SOUTH);\r
-\r
-        table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent arg0){\r
-                removeAction.setEnabled(table.getSelectedRowCount() != 0);\r
-                changeAction.setEnabled(table.getSelectedRowCount() == 1);\r
-            }\r
-        });\r
-        table.addMouseListener(new PopupShowAction(popup));\r
-        changeAction.setEnabled(false);\r
-        removeAction.setEnabled(false);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Iterator;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableModel;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class PropertyEditPane extends JPanel{
+    private static final long serialVersionUID = 12397342543653L;
+
+    private StigmataFrame stigmata;
+    private JTable table;
+    private DefaultTableModel model;
+
+    public PropertyEditPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+
+        initLayouts();
+        initData();
+    }
+
+    public void updateEnvironment(BirthmarkEnvironment environment){
+        environment.clearProperties();
+        for(int i = 0; i < model.getRowCount(); i++){
+            environment.addProperty(
+                (String)model.getValueAt(i, 0),
+                (String)model.getValueAt(i, 1)
+            );
+        }
+    }
+
+    private void initData(){
+        BirthmarkEnvironment environment = stigmata.getEnvironment();
+        environment.addPropertyListener(new PropertyChangeListener(){
+            public void propertyChange(PropertyChangeEvent evt){
+                String name = evt.getPropertyName();
+                String value = (String)evt.getNewValue();
+                if(value == null){
+                    removeProperty(name);
+                }
+                else{
+                    addOrUpdateProperty(name, value);
+                }
+            }
+        });
+        for(Iterator<String> i = environment.propertyKeys(); i.hasNext(); ){
+            String key = i.next();
+            model.addRow(new Object[] { key, environment.getProperty(key), });
+        }
+    }
+
+    private void removeProperty(String name){
+        int index = findIndex(name);
+        if(index >= 0){
+            model.removeRow(index);
+        }
+        stigmata.setNeedToSaveSettings(true);
+    }
+
+    private void addOrUpdateProperty(String name, String value){
+        int index = findIndex(name);
+        if(index >= 0){
+            model.setValueAt(value, index, 1);
+        }
+        else{
+            model.addRow(new Object[] { name, value, });
+        }
+        stigmata.setNeedToSaveSettings(true);
+    }
+
+    private int findIndex(String name){
+        for(int i = 0; i < model.getRowCount(); i++){
+            String v = (String)model.getValueAt(i, 0);
+            if(v.equals(name)){
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    private void addNewProperty(int index){
+        final Messages messages = stigmata.getMessages();
+        GridBagLayout layout = new GridBagLayout();
+        JPanel panel = new JPanel(layout);
+        JLabel nameLabel = new JLabel(messages.get("propertyname.label"));
+        JLabel valueLabel = new JLabel(messages.get("propertyvalue.label"));
+        JTextField name = new JTextField(15);
+        JTextField value = new JTextField(15);
+
+        GridBagConstraints gbc = new GridBagConstraints();
+        gbc.gridx = 0; gbc.gridwidth = 1;
+        gbc.gridy = 0; gbc.gridheight = 1;
+        gbc.insets = new Insets(5, 5, 5, 0);
+        layout.setConstraints(nameLabel, gbc);
+        panel.add(nameLabel);
+
+        gbc.gridx = 1; gbc.gridwidth = 2;
+        gbc.gridy = 0; gbc.gridheight = 1;
+        gbc.fill = GridBagConstraints.HORIZONTAL;
+        layout.setConstraints(name, gbc);
+        panel.add(name);
+
+        gbc.gridx = 0; gbc.gridwidth = 1;
+        gbc.gridy = 1; gbc.gridheight = 1;
+        layout.setConstraints(valueLabel, gbc);
+        panel.add(valueLabel);
+
+        gbc.gridx = 1; gbc.gridwidth = 2;
+        gbc.gridy = 1; gbc.gridheight = 1;
+        gbc.fill = GridBagConstraints.HORIZONTAL;
+        layout.setConstraints(value, gbc);
+        panel.add(value);
+
+        if(index >= 0){
+            String keyValue = String.valueOf(table.getValueAt(index, 0));
+            String valueValue = String.valueOf(table.getValueAt(index, 1));
+            if(keyValue != null)   name.setText(keyValue);
+            if(valueValue != null) value.setText(valueValue);
+        }
+
+        int val = JOptionPane.showConfirmDialog(
+            stigmata, panel, messages.get("propertyadd.dialog.title"),
+            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE
+        );
+        if(val == JOptionPane.YES_OPTION){
+            if(index >= 0){
+                model.setValueAt(name.getText(), index, 0);
+                model.setValueAt(value.getText(), index, 1);
+            }
+            else{
+                model.addRow(new Object[] {
+                    name.getText().trim(),
+                    value.getText()
+                });
+            }
+            stigmata.setNeedToSaveSettings(true);
+        }
+    }
+
+    private void removeSelectedProperty(){
+        int[] indexes = table.getSelectedRows();
+        for(int i = indexes.length - 1; i >= 0; i--){
+            model.removeRow(indexes[i]);
+        }
+        stigmata.setNeedToSaveSettings(true);
+    }
+
+    private void initLayouts(){
+        final Messages messages = stigmata.getMessages();
+        model = new DefaultTableModel();
+        model.addColumn(messages.get("propertyname.label"));
+        model.addColumn(messages.get("propertyvalue.label"));
+        table = new JTable(model);
+        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        table.setColumnSelectionAllowed(false);
+
+        Action addAction = new AbstractAction(){
+            private static final long serialVersionUID = 1283676936119122278L;
+
+            public void actionPerformed(ActionEvent e){
+                addNewProperty(-1);
+            }
+        };
+        final Action removeAction = new AbstractAction(){
+            private static final long serialVersionUID = -411260949451039374L;
+
+            public void actionPerformed(ActionEvent e){
+                removeSelectedProperty();
+            }
+        };
+        final Action changeAction = new AbstractAction(){
+            private static final long serialVersionUID = -7406073660916286349L;
+
+            public void actionPerformed(ActionEvent e){
+                addNewProperty(table.getSelectedRow());
+            }
+        };
+        JButton addButton = GUIUtility.createButton(messages, "propertyadd", addAction);
+        JButton changeButton = GUIUtility.createButton(messages, "propertychange", changeAction);
+        JButton removeButton = GUIUtility.createButton(messages, "propertyremove", removeAction);
+
+        final JPopupMenu popup = new JPopupMenu();
+        popup.add(GUIUtility.createJMenuItem(messages, "propertyadd", addAction));
+        popup.add(GUIUtility.createJMenuItem(messages, "propertychange", changeAction));
+        popup.add(GUIUtility.createJMenuItem(messages, "propertyremove", removeAction));
+
+        setLayout(new BorderLayout());
+        JScrollPane scroll = new JScrollPane(table);
+        Box box = Box.createHorizontalBox();
+        box.add(Box.createHorizontalGlue());
+        box.add(addButton);
+        box.add(Box.createHorizontalGlue());
+        box.add(changeButton);
+        box.add(Box.createHorizontalGlue());
+        box.add(removeButton);
+        box.add(Box.createHorizontalGlue());
+
+        add(scroll, BorderLayout.CENTER);
+        add(box, BorderLayout.SOUTH);
+
+        table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent arg0){
+                removeAction.setEnabled(table.getSelectedRowCount() != 0);
+                changeAction.setEnabled(table.getSelectedRowCount() == 1);
+            }
+        });
+        table.addMouseListener(new PopupShowAction(popup));
+        changeAction.setEnabled(false);
+        removeAction.setEnabled(false);
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Component;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.net.URL;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JLabel;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTable;\r
-import javax.swing.border.TitledBorder;\r
-import javax.swing.table.DefaultTableModel;\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkComparator;\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.ComparisonResultSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.ExtractionTarget;\r
-import jp.naist.se.stigmata.filter.FilteredComparisonResultSet;\r
-import jp.naist.se.stigmata.printer.PrinterManager;\r
-import jp.naist.se.stigmata.result.CertainPairComparisonResultSet;\r
-import jp.naist.se.stigmata.result.RoundRobinComparisonResultSet;\r
-import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
-import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
-import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
-import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class RoundRobinComparisonResultPane extends JPanel{\r
-    private static final long serialVersionUID = 2134574576543623L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private ExtractionResultSet extraction;\r
-    private JTable table;\r
-    private DefaultTableModel model;\r
-    private JLabel classCount, comparisonCount, distinctionRatio;\r
-    private JLabel average, minimum, maximum;\r
-\r
-    public RoundRobinComparisonResultPane(StigmataFrame stigmata, ExtractionResultSet resultset){\r
-        this.stigmata = stigmata;\r
-        this.extraction = resultset;\r
-        initialize();\r
-        compare(model);\r
-    }\r
-\r
-    private void compare(DefaultTableModel model){\r
-        ExtractionTarget targetX = ExtractionTarget.TARGET_X;\r
-        ExtractionTarget targetY = ExtractionTarget.TARGET_Y;\r
-        int countX = extraction.getBirthmarkSetSize(targetX);\r
-        int countY = extraction.getBirthmarkSetSize(targetY);\r
-        int comparisonCount = countX * countY;\r
-        if(countX == 0 && countY == 0){\r
-            targetX = ExtractionTarget.TARGET_XY;\r
-            targetY = ExtractionTarget.TARGET_XY;\r
-            countX = extraction.getBirthmarkSetSize(targetX);\r
-            countY = extraction.getBirthmarkSetSize(targetY);\r
-            comparisonCount = countX * (countY - 1) / 2;\r
-        }\r
-        else if(countX == 0 || countY == 0){\r
-            targetX = ExtractionTarget.TARGET_BOTH;\r
-            targetY = ExtractionTarget.TARGET_BOTH;\r
-            countX = extraction.getBirthmarkSetSize(targetX);\r
-            countY = extraction.getBirthmarkSetSize(targetY);\r
-            comparisonCount = countX * (countY - 1) / 2;\r
-        }\r
-\r
-        classCount.setText(Integer.toString(countX + countY));\r
-        this.comparisonCount.setText(Integer.toString(comparisonCount));\r
-        int correct = 0;\r
-        double avg = 0d;\r
-        double max = 0d;\r
-        double min = 100d;\r
-        model.addColumn("");\r
-        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(targetX); i.hasNext(); ){\r
-            BirthmarkSet x = i.next();\r
-            model.addColumn(x.getName());\r
-        }\r
-        int sizeX = extraction.getBirthmarkSetSize(targetX);\r
-        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(targetY); i.hasNext(); ){\r
-            Object[] rows = new Object[sizeX + 1];\r
-            BirthmarkSet setY = i.next();\r
-            rows[0] = setY.getName();\r
-\r
-            int index = 0;\r
-            for(Iterator<BirthmarkSet> j = extraction.birthmarkSets(targetX); j.hasNext(); ){\r
-                BirthmarkSet setX = j.next();\r
-                double similarity = compare(setX, setY, extraction.getEnvironment());\r
-                rows[index + 1] = new Double(similarity);\r
-\r
-                if(Math.abs(similarity - 1) < 1E-8){\r
-                    correct += 1;\r
-                }\r
-                avg += similarity;\r
-                if(max < similarity) max = similarity;\r
-                if(min > similarity) min = similarity;\r
-                index++;\r
-            }\r
-            model.addRow(rows);\r
-        }\r
-        distinctionRatio.setText(\r
-            Double.toString((double)(comparisonCount - correct) / (double)comparisonCount)\r
-        );\r
-        avg = avg / comparisonCount;\r
-        average.setText(Double.toString(avg));\r
-        minimum.setText(Double.toString(min));\r
-        maximum.setText(Double.toString(max));\r
-    }\r
-\r
-    private double compare(BirthmarkSet x, BirthmarkSet y, BirthmarkEnvironment environment){\r
-        double similarity = 0d;\r
-        int count = 0;\r
-\r
-        for(String type: x.getBirthmarkTypes()){\r
-            Birthmark b1 = x.getBirthmark(type);\r
-            Birthmark b2 = y.getBirthmark(type);\r
-            if(b1 != null && b2 != null){\r
-                BirthmarkComparator comparator = environment.getService(type).getComparator();\r
-                double result = comparator.compare(b1, b2);\r
-                if(!Double.isNaN(result)){\r
-                    similarity += result;\r
-                    count++;\r
-                }\r
-            }\r
-        }\r
-        return similarity / count;\r
-    }\r
-\r
-    private Component getMainPane(){\r
-        JPanel panel = new JPanel();\r
-        panel.setLayout(new BorderLayout());\r
-\r
-        model = new RoundRobinComparisonResultSetTableModel();\r
-        table = new JTable(model);\r
-        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(extraction.getEnvironment()));\r
-        table.addMouseListener(new MouseAdapter(){\r
-            public void mouseClicked(MouseEvent e){\r
-                if(e.getClickCount() == 2){\r
-                    int row = table.rowAtPoint(e.getPoint());\r
-                    int col = table.columnAtPoint(e.getPoint());\r
-                    if(col >= 1 && col < table.getColumnCount() && row >= 0\r
-                            && row < table.getRowCount()){\r
-                        BirthmarkSet b1 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_X, col - 1);\r
-                        BirthmarkSet b2 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_Y, row);\r
-\r
-                        stigmata.compareDetails(b1, b2, extraction.getContext());\r
-                    }\r
-                }\r
-            }\r
-        });\r
-        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);\r
-        table.setCellSelectionEnabled(true);\r
-        JScrollPane scroll = new JScrollPane();\r
-        scroll.setViewportView(table);\r
-        scroll.setWheelScrollingEnabled(true);\r
-        panel.add(scroll, BorderLayout.CENTER);\r
-        JComponent south = Box.createVerticalBox();\r
-        JPanel box1 = new JPanel(new GridLayout(1, 3));\r
-        box1.add(classCount = new JLabel());\r
-        box1.add(comparisonCount = new JLabel());\r
-        box1.add(distinctionRatio = new JLabel());\r
-        south.add(box1);\r
-        JPanel box2 = new JPanel(new GridLayout(1, 3));\r
-        box2.setBorder(new TitledBorder(stigmata.getMessages().get("similarity.border")));\r
-        box2.add(average = new JLabel());\r
-        box2.add(minimum = new JLabel());\r
-        box2.add(maximum = new JLabel());\r
-        south.add(box2);\r
-\r
-        classCount.setBorder(new TitledBorder(stigmata.getMessages().get("numberofclasses.border")));\r
-        comparisonCount.setBorder(new TitledBorder(stigmata.getMessages().get("comparisoncount.border")));\r
-        distinctionRatio.setBorder(new TitledBorder(stigmata.getMessages().get("distinctionratio.border")));\r
-        average.setBorder(new TitledBorder(stigmata.getMessages().get("average.border")));\r
-        minimum.setBorder(new TitledBorder(stigmata.getMessages().get("minimum.border")));\r
-        maximum.setBorder(new TitledBorder(stigmata.getMessages().get("maximum.border")));\r
-\r
-        panel.add(south, BorderLayout.SOUTH);\r
-\r
-        return panel;\r
-    }\r
-\r
-    private void mdsButtonActionPerformed(ActionEvent e){\r
-        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();\r
-        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
-            BirthmarkSet bs = i.next();\r
-            map.put(bs.getLocation(), bs);\r
-        }\r
-        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
-            BirthmarkSet bs = i.next();\r
-            map.put(bs.getLocation(), bs);\r
-        }\r
-        int index = 0;\r
-        BirthmarkSet[] set = new BirthmarkSet[map.size()];\r
-        for(Map.Entry<URL, BirthmarkSet> entry: map.entrySet()){\r
-            set[index] = entry.getValue();\r
-            index++;\r
-        }\r
-        \r
-        stigmata.showMDSGraph(set, extraction.getContext());\r
-    }\r
-\r
-    private void graphButtonActionPerformed(ActionEvent e){\r
-        Map<Integer, Integer> values = new HashMap<Integer, Integer>();\r
-        for(int i = 0; i < table.getRowCount(); i++){\r
-            for(int j = 1; j < table.getColumnCount(); j++){\r
-                Double d = (Double)table.getValueAt(i, j);\r
-                int similarity = (int)Math.round(d.doubleValue() * 100);\r
-                Integer dist = values.get(new Integer(similarity));\r
-                if(dist == null){\r
-                    dist = new Integer(0);\r
-                }\r
-                dist = new Integer(dist.intValue() + 1);\r
-                values.put(new Integer(similarity), dist);\r
-            }\r
-        }\r
-        stigmata.showSimilarityDistributionGraph(values);\r
-    }\r
-\r
-    private void initialize(){\r
-        final Messages messages = stigmata.getMessages();\r
-        JButton save = GUIUtility.createButton(\r
-            messages, "savecomparison", new SaveAction(stigmata, new AsciiDataWritable(){\r
-                public void writeAsciiData(PrintWriter out, String format){\r
-                    ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
-                    if(service == null){\r
-                        service = PrinterManager.getDefaultFormatService();\r
-                    }\r
-\r
-                    service.getComparisonResultSetPrinter().printResult(\r
-                        out, new RoundRobinComparisonResultSet(extraction)\r
-                    );\r
-                }\r
-            }\r
-        ));\r
-        JButton graph = GUIUtility.createButton(messages, "showgraph");\r
-        JButton obfuscate = GUIUtility.createButton(messages, "obfuscate");\r
-        JButton compare = GUIUtility.createButton(messages, "guessedpair");\r
-        JButton updateColor = GUIUtility.createButton(\r
-            messages, "updatecellcolor",\r
-            new UpdateBirthmarkCellColorAction(stigmata, extraction.getEnvironment())\r
-        );\r
-        JMenuItem mdsMenu = GUIUtility.createJMenuItem(messages, "mdsmap");\r
-\r
-        PopupButton comparePopup = new PopupButton(compare);\r
-        PopupButton graphPopup = new PopupButton(graph);\r
-\r
-        JComponent southPanel = Box.createHorizontalBox();\r
-\r
-        setLayout(new BorderLayout());\r
-        add(getMainPane(), BorderLayout.CENTER);\r
-        add(southPanel, BorderLayout.SOUTH);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(save);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(updateColor);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(graphPopup);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(obfuscate);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(comparePopup);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-\r
-        graph.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                graphButtonActionPerformed(e);\r
-            }\r
-        });\r
-        mdsMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                mdsButtonActionPerformed(e);\r
-            }\r
-        });\r
-\r
-        obfuscate.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                obfuscateClassNames();\r
-            }\r
-        });\r
-\r
-        ActionListener compareListener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                String item = e.getActionCommand();\r
-                if(item.equals("guessedpair")){\r
-                    compareGuessedPair();\r
-                }\r
-                else if(item.equals("specifiedpair")){\r
-                    compareSpecifiedPair();\r
-                }\r
-                else if(item.equals("roundrobin.filtering")){\r
-                    compareRoundRobinWithFiltering();\r
-                }\r
-            }\r
-        };\r
-\r
-        compare.addActionListener(compareListener);\r
-        String[] comparisonMethods = stigmata.getMessages().getArray("comparison.methods.inroundrobinresult");\r
-        for(int i = 1; i < comparisonMethods.length; i++){\r
-            JMenuItem item = GUIUtility.createJMenuItem(messages, comparisonMethods[i]);\r
-            comparePopup.addMenuItem(item);\r
-            item.addActionListener(compareListener);\r
-        }\r
-        graphPopup.addMenuItem(mdsMenu);\r
-    }\r
-\r
-    private void compareRoundRobinWithFiltering(){\r
-        FilterSelectionPane pane = new FilterSelectionPane(\r
-            stigmata, extraction.getEnvironment().getFilterManager()\r
-        );\r
-        int returnValue = JOptionPane.showConfirmDialog(\r
-            stigmata, pane, stigmata.getMessages().get("filterselection.dialog.title"),\r
-            JOptionPane.OK_CANCEL_OPTION,\r
-            JOptionPane.QUESTION_MESSAGE\r
-        );\r
-        if(returnValue == JOptionPane.OK_OPTION){\r
-            String[] filterSetList = pane.getSelectedFilters();\r
-\r
-            ComparisonResultSet rs = new RoundRobinComparisonResultSet(extraction);\r
-            \r
-            ComparisonResultSet filterResultSet = new FilteredComparisonResultSet(\r
-                rs, extraction.getEnvironment().getFilterManager().getFilterSets(filterSetList)\r
-            );\r
-            stigmata.showComparisonResultSet(filterResultSet);\r
-        }\r
-    }\r
-\r
-    private void compareGuessedPair(){\r
-        ComparisonResultSet rs = new CertainPairComparisonResultSet(extraction);\r
-        stigmata.showComparisonResultSet(rs);\r
-    }\r
-\r
-    private void compareSpecifiedPair(){\r
-        File file = stigmata.getOpenFile(\r
-            stigmata.getMessages().getArray("comparemapping.extension"),\r
-            stigmata.getMessages().get("comparemapping.description")\r
-        );\r
-        if(file != null){\r
-            Map<String, String> mapping = stigmata.constructMapping(file);\r
-\r
-            ComparisonResultSet comparison = new CertainPairComparisonResultSet(extraction, mapping);\r
-            stigmata.showComparisonResultSet(comparison);\r
-        }\r
-    }\r
-\r
-    private void obfuscateClassNames(){\r
-        ClassNameObfuscator obfuscator = new ClassNameObfuscator();\r
-\r
-        try{\r
-            File file = stigmata.getSaveFile(\r
-                stigmata.getMessages().getArray("obfuscationmapping.extension"),\r
-                stigmata.getMessages().get("obfuscationmapping.description")\r
-            );\r
-            if(file != null){\r
-                BirthmarkContext context = extraction.getContext();\r
-                BirthmarkEnvironment env = context.getEnvironment();\r
-                ExtractionResultSet ers = env.getHistoryManager().createDefaultResultSet(context);\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
-        }catch(IOException e){\r
-            JOptionPane.showMessageDialog(\r
-                this, e.getMessage(), stigmata.getMessages().get("error.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-            return;\r
-        }\r
-\r
-        DefaultTableModel model = new RoundRobinComparisonResultSetTableModel();\r
-        compare(model);\r
-        table.setModel(model);\r
-        this.model = model;\r
-    }\r
-\r
-    private static class RoundRobinComparisonResultSetTableModel extends DefaultTableModel{\r
-        private static final long serialVersionUID = 765435324523543242L;\r
-\r
-        @Override\r
-        public boolean isCellEditable(int row, int col){\r
-            return false;\r
-        }\r
-\r
-        public Class<?> getColumnClass(int column){\r
-            if(column == 0){\r
-                return String.class;\r
-            }\r
-            else{\r
-                return Double.class;\r
-            }\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.border.TitledBorder;
+import javax.swing.table.DefaultTableModel;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.BirthmarkStoreException;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.filter.FilteredComparisonResultSet;
+import jp.sourceforge.stigmata.printer.PrinterManager;
+import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
+import jp.sourceforge.stigmata.result.RoundRobinComparisonResultSet;
+import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
+import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
+import jp.sourceforge.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
+import jp.sourceforge.stigmata.utils.AsciiDataWritable;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class RoundRobinComparisonResultPane extends JPanel{
+    private static final long serialVersionUID = 2134574576543623L;
+
+    private StigmataFrame stigmata;
+    private ExtractionResultSet extraction;
+    private JTable table;
+    private DefaultTableModel model;
+    private JLabel classCount, comparisonCount, distinctionRatio;
+    private JLabel average, minimum, maximum;
+
+    public RoundRobinComparisonResultPane(StigmataFrame stigmata, ExtractionResultSet resultset){
+        this.stigmata = stigmata;
+        this.extraction = resultset;
+        initialize();
+        compare(model);
+    }
+
+    private void compare(DefaultTableModel model){
+        ExtractionTarget targetX = ExtractionTarget.TARGET_X;
+        ExtractionTarget targetY = ExtractionTarget.TARGET_Y;
+        int countX = extraction.getBirthmarkSetSize(targetX);
+        int countY = extraction.getBirthmarkSetSize(targetY);
+        int comparisonCount = countX * countY;
+        if(countX == 0 && countY == 0){
+            targetX = ExtractionTarget.TARGET_XY;
+            targetY = ExtractionTarget.TARGET_XY;
+            countX = extraction.getBirthmarkSetSize(targetX);
+            countY = extraction.getBirthmarkSetSize(targetY);
+            comparisonCount = countX * (countY - 1) / 2;
+        }
+        else if(countX == 0 || countY == 0){
+            targetX = ExtractionTarget.TARGET_BOTH;
+            targetY = ExtractionTarget.TARGET_BOTH;
+            countX = extraction.getBirthmarkSetSize(targetX);
+            countY = extraction.getBirthmarkSetSize(targetY);
+            comparisonCount = countX * (countY - 1) / 2;
+        }
+
+        classCount.setText(Integer.toString(countX + countY));
+        this.comparisonCount.setText(Integer.toString(comparisonCount));
+        int correct = 0;
+        double avg = 0d;
+        double max = 0d;
+        double min = 100d;
+        model.addColumn("");
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(targetX); i.hasNext(); ){
+            BirthmarkSet x = i.next();
+            model.addColumn(x.getName());
+        }
+        int sizeX = extraction.getBirthmarkSetSize(targetX);
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(targetY); i.hasNext(); ){
+            Object[] rows = new Object[sizeX + 1];
+            BirthmarkSet setY = i.next();
+            rows[0] = setY.getName();
+
+            int index = 0;
+            for(Iterator<BirthmarkSet> j = extraction.birthmarkSets(targetX); j.hasNext(); ){
+                BirthmarkSet setX = j.next();
+                double similarity = compare(setX, setY, extraction.getEnvironment());
+                rows[index + 1] = new Double(similarity);
+
+                if(Math.abs(similarity - 1) < 1E-8){
+                    correct += 1;
+                }
+                avg += similarity;
+                if(max < similarity) max = similarity;
+                if(min > similarity) min = similarity;
+                index++;
+            }
+            model.addRow(rows);
+        }
+        distinctionRatio.setText(
+            Double.toString((double)(comparisonCount - correct) / (double)comparisonCount)
+        );
+        avg = avg / comparisonCount;
+        average.setText(Double.toString(avg));
+        minimum.setText(Double.toString(min));
+        maximum.setText(Double.toString(max));
+    }
+
+    private double compare(BirthmarkSet x, BirthmarkSet y, BirthmarkEnvironment environment){
+        double similarity = 0d;
+        int count = 0;
+
+        for(String type: x.getBirthmarkTypes()){
+            Birthmark b1 = x.getBirthmark(type);
+            Birthmark b2 = y.getBirthmark(type);
+            if(b1 != null && b2 != null){
+                BirthmarkComparator comparator = environment.getService(type).getComparator();
+                double result = comparator.compare(b1, b2);
+                if(!Double.isNaN(result)){
+                    similarity += result;
+                    count++;
+                }
+            }
+        }
+        return similarity / count;
+    }
+
+    private Component getMainPane(){
+        JPanel panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+
+        model = new RoundRobinComparisonResultSetTableModel();
+        table = new JTable(model);
+        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(extraction.getEnvironment()));
+        table.addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent e){
+                if(e.getClickCount() == 2){
+                    int row = table.rowAtPoint(e.getPoint());
+                    int col = table.columnAtPoint(e.getPoint());
+                    if(col >= 1 && col < table.getColumnCount() && row >= 0
+                            && row < table.getRowCount()){
+                        BirthmarkSet b1 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_X, col - 1);
+                        BirthmarkSet b2 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_Y, row);
+
+                        stigmata.compareDetails(b1, b2, extraction.getContext());
+                    }
+                }
+            }
+        });
+        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+        table.setCellSelectionEnabled(true);
+        JScrollPane scroll = new JScrollPane();
+        scroll.setViewportView(table);
+        scroll.setWheelScrollingEnabled(true);
+        panel.add(scroll, BorderLayout.CENTER);
+        JComponent south = Box.createVerticalBox();
+        JPanel box1 = new JPanel(new GridLayout(1, 3));
+        box1.add(classCount = new JLabel());
+        box1.add(comparisonCount = new JLabel());
+        box1.add(distinctionRatio = new JLabel());
+        south.add(box1);
+        JPanel box2 = new JPanel(new GridLayout(1, 3));
+        box2.setBorder(new TitledBorder(stigmata.getMessages().get("similarity.border")));
+        box2.add(average = new JLabel());
+        box2.add(minimum = new JLabel());
+        box2.add(maximum = new JLabel());
+        south.add(box2);
+
+        classCount.setBorder(new TitledBorder(stigmata.getMessages().get("numberofclasses.border")));
+        comparisonCount.setBorder(new TitledBorder(stigmata.getMessages().get("comparisoncount.border")));
+        distinctionRatio.setBorder(new TitledBorder(stigmata.getMessages().get("distinctionratio.border")));
+        average.setBorder(new TitledBorder(stigmata.getMessages().get("average.border")));
+        minimum.setBorder(new TitledBorder(stigmata.getMessages().get("minimum.border")));
+        maximum.setBorder(new TitledBorder(stigmata.getMessages().get("maximum.border")));
+
+        panel.add(south, BorderLayout.SOUTH);
+
+        return panel;
+    }
+
+    private void mdsButtonActionPerformed(ActionEvent e){
+        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){
+            BirthmarkSet bs = i.next();
+            map.put(bs.getLocation(), bs);
+        }
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){
+            BirthmarkSet bs = i.next();
+            map.put(bs.getLocation(), bs);
+        }
+        int index = 0;
+        BirthmarkSet[] set = new BirthmarkSet[map.size()];
+        for(Map.Entry<URL, BirthmarkSet> entry: map.entrySet()){
+            set[index] = entry.getValue();
+            index++;
+        }
+        
+        stigmata.showMDSGraph(set, extraction.getContext());
+    }
+
+    private void graphButtonActionPerformed(ActionEvent e){
+        Map<Integer, Integer> values = new HashMap<Integer, Integer>();
+        for(int i = 0; i < table.getRowCount(); i++){
+            for(int j = 1; j < table.getColumnCount(); j++){
+                Double d = (Double)table.getValueAt(i, j);
+                int similarity = (int)Math.round(d.doubleValue() * 100);
+                Integer dist = values.get(new Integer(similarity));
+                if(dist == null){
+                    dist = new Integer(0);
+                }
+                dist = new Integer(dist.intValue() + 1);
+                values.put(new Integer(similarity), dist);
+            }
+        }
+        stigmata.showSimilarityDistributionGraph(values);
+    }
+
+    private void initialize(){
+        final Messages messages = stigmata.getMessages();
+        JButton save = GUIUtility.createButton(
+            messages, "savecomparison", new SaveAction(stigmata, new AsciiDataWritable(){
+                public void writeAsciiData(PrintWriter out, String format){
+                    ResultPrinterSpi service = PrinterManager.getInstance().getService(format);
+                    if(service == null){
+                        service = PrinterManager.getDefaultFormatService();
+                    }
+
+                    service.getComparisonResultSetPrinter().printResult(
+                        out, new RoundRobinComparisonResultSet(extraction)
+                    );
+                }
+            }
+        ));
+        JButton graph = GUIUtility.createButton(messages, "showgraph");
+        JButton obfuscate = GUIUtility.createButton(messages, "obfuscate");
+        JButton compare = GUIUtility.createButton(messages, "guessedpair");
+        JButton updateColor = GUIUtility.createButton(
+            messages, "updatecellcolor",
+            new UpdateBirthmarkCellColorAction(stigmata, extraction.getEnvironment())
+        );
+        JMenuItem mdsMenu = GUIUtility.createJMenuItem(messages, "mdsmap");
+
+        PopupButton comparePopup = new PopupButton(compare);
+        PopupButton graphPopup = new PopupButton(graph);
+
+        JComponent southPanel = Box.createHorizontalBox();
+
+        setLayout(new BorderLayout());
+        add(getMainPane(), BorderLayout.CENTER);
+        add(southPanel, BorderLayout.SOUTH);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(save);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(updateColor);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(graphPopup);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(obfuscate);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(comparePopup);
+        southPanel.add(Box.createHorizontalGlue());
+
+        graph.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                graphButtonActionPerformed(e);
+            }
+        });
+        mdsMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                mdsButtonActionPerformed(e);
+            }
+        });
+
+        obfuscate.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                obfuscateClassNames();
+            }
+        });
+
+        ActionListener compareListener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                String item = e.getActionCommand();
+                if(item.equals("guessedpair")){
+                    compareGuessedPair();
+                }
+                else if(item.equals("specifiedpair")){
+                    compareSpecifiedPair();
+                }
+                else if(item.equals("roundrobin.filtering")){
+                    compareRoundRobinWithFiltering();
+                }
+            }
+        };
+
+        compare.addActionListener(compareListener);
+        String[] comparisonMethods = stigmata.getMessages().getArray("comparison.methods.inroundrobinresult");
+        for(int i = 1; i < comparisonMethods.length; i++){
+            JMenuItem item = GUIUtility.createJMenuItem(messages, comparisonMethods[i]);
+            comparePopup.addMenuItem(item);
+            item.addActionListener(compareListener);
+        }
+        graphPopup.addMenuItem(mdsMenu);
+    }
+
+    private void compareRoundRobinWithFiltering(){
+        FilterSelectionPane pane = new FilterSelectionPane(
+            stigmata, extraction.getEnvironment().getFilterManager()
+        );
+        int returnValue = JOptionPane.showConfirmDialog(
+            stigmata, pane, stigmata.getMessages().get("filterselection.dialog.title"),
+            JOptionPane.OK_CANCEL_OPTION,
+            JOptionPane.QUESTION_MESSAGE
+        );
+        if(returnValue == JOptionPane.OK_OPTION){
+            String[] filterSetList = pane.getSelectedFilters();
+
+            ComparisonResultSet rs = new RoundRobinComparisonResultSet(extraction);
+            
+            ComparisonResultSet filterResultSet = new FilteredComparisonResultSet(
+                rs, extraction.getEnvironment().getFilterManager().getFilterSets(filterSetList)
+            );
+            stigmata.showComparisonResultSet(filterResultSet);
+        }
+    }
+
+    private void compareGuessedPair(){
+        ComparisonResultSet rs = new CertainPairComparisonResultSet(extraction);
+        stigmata.showComparisonResultSet(rs);
+    }
+
+    private void compareSpecifiedPair(){
+        File file = stigmata.getOpenFile(
+            stigmata.getMessages().getArray("comparemapping.extension"),
+            stigmata.getMessages().get("comparemapping.description")
+        );
+        if(file != null){
+            Map<String, String> mapping = stigmata.constructMapping(file);
+
+            ComparisonResultSet comparison = new CertainPairComparisonResultSet(extraction, mapping);
+            stigmata.showComparisonResultSet(comparison);
+        }
+    }
+
+    private void obfuscateClassNames(){
+        ClassNameObfuscator obfuscator = new ClassNameObfuscator();
+
+        try{
+            File file = stigmata.getSaveFile(
+                stigmata.getMessages().getArray("obfuscationmapping.extension"),
+                stigmata.getMessages().get("obfuscationmapping.description")
+            );
+            if(file != null){
+                BirthmarkContext context = extraction.getContext();
+                BirthmarkEnvironment env = context.getEnvironment();
+                ExtractionResultSet ers = env.getHistoryManager().createDefaultResultSet(context);
+                try{
+                    for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){
+                        BirthmarkSet bs = i.next();
+                        ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs));
+                    }
+                    for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){
+                        BirthmarkSet bs = i.next();
+                        ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs));
+                    }
+                } catch(BirthmarkStoreException e){
+                }
+                this.extraction = ers;
+                obfuscator.outputNameMappings(file);
+            }
+        }catch(IOException e){
+            JOptionPane.showMessageDialog(
+                this, e.getMessage(), stigmata.getMessages().get("error.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+            return;
+        }
+
+        DefaultTableModel model = new RoundRobinComparisonResultSetTableModel();
+        compare(model);
+        table.setModel(model);
+        this.model = model;
+    }
+
+    private static class RoundRobinComparisonResultSetTableModel extends DefaultTableModel{
+        private static final long serialVersionUID = 765435324523543242L;
+
+        @Override
+        public boolean isCellEditable(int row, int col){
+            return false;
+        }
+
+        public Class<?> getColumnClass(int column){
+            if(column == 0){
+                return String.class;
+            }
+            else{
+                return Double.class;
+            }
+        }
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Image;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.WindowAdapter;\r
-import java.awt.event.WindowEvent;\r
-import java.io.BufferedReader;\r
-import java.io.File;\r
-import java.io.FileReader;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.io.StringWriter;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import javax.swing.ButtonGroup;\r
-import javax.swing.JCheckBoxMenuItem;\r
-import javax.swing.JFrame;\r
-import javax.swing.JLabel;\r
-import javax.swing.JMenu;\r
-import javax.swing.JMenuBar;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JSeparator;\r
-import javax.swing.JTabbedPane;\r
-import javax.swing.JTextArea;\r
-import javax.swing.LookAndFeel;\r
-import javax.swing.SwingUtilities;\r
-import javax.swing.UIManager;\r
-import javax.swing.WindowConstants;\r
-import javax.swing.event.ChangeEvent;\r
-import javax.swing.event.ChangeListener;\r
-import javax.swing.filechooser.FileFilter;\r
-\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkElementClassNotFoundException;\r
-import jp.naist.se.stigmata.BirthmarkEngine;\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.BirthmarkExtractionFailedException;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ComparisonPair;\r
-import jp.naist.se.stigmata.ComparisonResultSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.Main;\r
-import jp.naist.se.stigmata.Stigmata;\r
-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.result.CertainPairComparisonResultSet;\r
-import jp.naist.se.stigmata.ui.swing.actions.AboutAction;\r
-import jp.naist.se.stigmata.ui.swing.actions.LicenseAction;\r
-import jp.naist.se.stigmata.ui.swing.graph.SimilarityDistributionGraphPane;\r
-import jp.naist.se.stigmata.ui.swing.mds.MDSGraphPanel;\r
-import jp.naist.se.stigmata.ui.swing.tab.EditableTabbedPane;\r
-import jp.naist.se.stigmata.utils.Utility;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-import jp.sourceforge.talisman.i18n.ResourceNotFoundException;\r
-\r
-import org.apache.commons.cli.ParseException;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class StigmataFrame extends JFrame{\r
-    private static final long serialVersionUID = 92345543665342134L;\r
-\r
-    private Messages messages;\r
-    private JTabbedPane tabPane;\r
-    private JMenuItem closeTabMenu;\r
-    private JMenuItem saveMenu;\r
-    private JCheckBoxMenuItem expertmodeMenu;\r
-    private Stigmata stigmata;\r
-    private BirthmarkEnvironment environment;\r
-    private ControlPane control;\r
-    private FileIOManager fileio;\r
-    private Map<String, Integer> countmap = new HashMap<String, Integer>();\r
-\r
-    public StigmataFrame(){\r
-        this(Stigmata.getInstance());\r
-    }\r
-\r
-    public StigmataFrame(Stigmata stigmata){\r
-        this(stigmata, BirthmarkEnvironment.getDefaultEnvironment());\r
-    }\r
-\r
-    public StigmataFrame(Stigmata stigmata, BirthmarkEnvironment environment){\r
-        this.stigmata = stigmata;\r
-        this.environment = environment;\r
-        this.fileio = new FileIOManager(this, environment);\r
-        try{\r
-            this.messages = new Messages("resources.messages");\r
-        } catch(ResourceNotFoundException e){\r
-            throw new InternalError(e.getMessage());\r
-        }\r
-        Image iconImage = GUIUtility.getImage(getMessages(), "stigmata.icon");\r
-        if(iconImage != null){\r
-            setIconImage(iconImage);\r
-        }\r
-\r
-        stigmata.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){\r
-            @Override\r
-            public void operationDone(BirthmarkEngineEvent e){\r
-                showWarnings(e.getMessage());\r
-            }\r
-        });\r
-\r
-        initLayouts();\r
-    }\r
-\r
-    public Messages getMessages(){\r
-        return messages;\r
-    }\r
-\r
-    public boolean isNeedToSaveSettings(){\r
-        return saveMenu.isEnabled();\r
-    }\r
-\r
-    public void setNeedToSaveSettings(boolean flag){\r
-        saveMenu.setEnabled(flag);\r
-    }\r
-\r
-    public Stigmata getStigmata(){\r
-        return stigmata;\r
-    }\r
-\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return environment;\r
-    }\r
-\r
-    public File getCurrentDirectory(){\r
-        return fileio.getCurrentDirectory();\r
-    }\r
-\r
-    public void setCurrentDirectory(File file){\r
-        try{\r
-            fileio.setCurrentDirectory(file);\r
-        } catch(IllegalArgumentException e){\r
-            JOptionPane.showMessageDialog(\r
-                this,\r
-                getMessages().get("notdirectory.dialog.message", file.getName()),\r
-                getMessages().get("notdirectory.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-        } catch(Exception e){\r
-            showExceptionMessage(e);\r
-        }\r
-    }\r
-\r
-    public File[] openFiles(FileFilter[] filters, boolean multipleSelectable, boolean directorySelectable){\r
-        return fileio.openFiles(filters, multipleSelectable, directorySelectable);\r
-    }\r
-\r
-    /**\r
-     * Find file to open it.\r
-     */\r
-    public File getOpenFile(String[] exts, String desc){\r
-        return fileio.findFile(true, exts, desc);\r
-    }\r
-\r
-    /**\r
-     * Find file for storing data to it.\r
-     * Extension of found file is correct as selected extension.\r
-     */\r
-    public File getSaveFile(String[] exts, String desc){\r
-        return fileio.findFile(false, exts, desc);\r
-    }\r
-\r
-    public void addBirthmarkServiceListener(BirthmarkServiceListener listener){\r
-        control.addBirthmarkServiceListener(listener);\r
-    }\r
-\r
-    public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){\r
-        control.removeBirthmarkServiceListener(listener);\r
-    }\r
-\r
-    public void compareDetails(BirthmarkSet target1, BirthmarkSet target2, BirthmarkContext context){\r
-        PairComparisonPane detail = new PairComparisonPane(\r
-            this, new ComparisonPair(target1, target2, context)\r
-        );\r
-        int compareDetail = getNextCount("compare_detail");\r
-\r
-        GUIUtility.addNewTab(getMessages(), "comparedetail", tabPane, detail,\r
-            new Object[] { new Integer(compareDetail), },\r
-            new Object[] {\r
-                Utility.array2String(target1.getBirthmarkTypes()),\r
-                target1.getName(),\r
-                target2.getName(),\r
-            }\r
-        );\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-    }\r
-\r
-    public void compareRoundRobin(String[] targetX, String[] targetY, \r
-            BirthmarkContext context){\r
-        try{\r
-            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());\r
-            ExtractionResultSet ers = engine.extract(targetX, targetY, context);\r
-\r
-            RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers);\r
-            int compareCount = getNextCount("compare");\r
-            GUIUtility.addNewTab(\r
-                getMessages(), "compare", tabPane, compare,\r
-                new Object[] { new Integer(compareCount), },\r
-                new Object[] {\r
-                    Utility.array2String(context.getBirthmarkTypes()),\r
-                    Utility.array2String(targetX),\r
-                    Utility.array2String(targetY),\r
-                }\r
-            );\r
-            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-        } catch(Throwable e){\r
-            showExceptionMessage(e);\r
-        }\r
-    }\r
-\r
-    public void compareRoundRobinFilter(String[] targetX, String[] targetY, \r
-            BirthmarkContext context){\r
-        try{\r
-            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());\r
-\r
-            ExtractionResultSet ers = engine.extract(targetX, targetY, context);\r
-            ComparisonResultSet resultset = engine.compare(ers);\r
-            if(context.hasFilter()){\r
-                resultset = engine.filter(resultset);\r
-            }\r
-            int compareCount = getNextCount("compare");\r
-            GUIUtility.addNewTab(\r
-                getMessages(), "compare", tabPane, new PairComparisonResultSetPane(this, resultset),\r
-                new Object[] { new Integer(compareCount), },\r
-                new Object[] {\r
-                    Utility.array2String(context.getBirthmarkTypes()),\r
-                    Utility.array2String(targetX),\r
-                    Utility.array2String(targetY),\r
-                }\r
-            );\r
-            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-        } catch(Throwable e){\r
-            showExceptionMessage(e);\r
-        }\r
-    }\r
-\r
-    public void compareGuessedPair(String[] targetX, String[] targetY, BirthmarkContext context){\r
-        try{\r
-            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());\r
-            ExtractionResultSet extraction = engine.extract(targetX, targetY, context);\r
-            int comparePair = getNextCount("compare_pair");\r
-\r
-            ComparisonResultSet resultset = new CertainPairComparisonResultSet(extraction);\r
-            GUIUtility.addNewTab(\r
-                getMessages(), "comparepair", tabPane,\r
-                new PairComparisonResultSetPane(this, resultset),\r
-                new Object[] { new Integer(comparePair), },\r
-                new Object[] {\r
-                    Utility.array2String(context.getBirthmarkTypes()),\r
-                    Utility.array2String(targetX),\r
-                    Utility.array2String(targetY),\r
-                }\r
-            );\r
-            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-        }catch(Throwable e){\r
-            showExceptionMessage(e);\r
-        }\r
-    }\r
-\r
-    public void compareSpecifiedPair(String[] targetX, String[] targetY, BirthmarkContext context){\r
-        File file = getOpenFile(\r
-            getMessages().getArray("comparemapping.extension"),\r
-            getMessages().get("comparemapping.description")\r
-        );\r
-\r
-        if(file != null){\r
-            Map<String, String> mapping = constructMapping(file);\r
-\r
-            try{\r
-                BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());\r
-                context.setNameMappings(mapping);\r
-                ComparisonResultSet crs = engine.compare(targetX, targetY, context);\r
-                int comparePair = getNextCount("compare_pair");\r
-\r
-                GUIUtility.addNewTab(\r
-                    getMessages(), "comparepair", tabPane,\r
-                    new PairComparisonResultSetPane(this, crs),\r
-                    new Object[] { new Integer(comparePair), },\r
-                    new Object[] {\r
-                        Utility.array2String(context.getBirthmarkTypes()),\r
-                        Utility.array2String(targetX),\r
-                        Utility.array2String(targetY),\r
-                    }\r
-                );\r
-                tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-            }catch(Exception e){\r
-                showExceptionMessage(e);\r
-            }\r
-        }\r
-    }\r
-\r
-    public void showComparisonResultSet(ComparisonResultSet resultset){\r
-        int comparePair = getNextCount("compare_pair");\r
-        GUIUtility.addNewTab(\r
-            getMessages(), "comparisonresultset", tabPane,\r
-            new PairComparisonResultSetPane(this, resultset),\r
-            new Object[] { new Integer(comparePair), }, null\r
-        );\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-    }\r
-\r
-    public void showMDSGraph(BirthmarkSet[] set, BirthmarkContext context){\r
-        try{\r
-            MDSGraphPanel panel = new MDSGraphPanel(this, set, context);\r
-            int mappingGraphCount = getNextCount("mds_graph");\r
-            GUIUtility.addNewTab(\r
-                getMessages(), "mappinggraph", tabPane, panel,\r
-                new Object[] { new Integer(mappingGraphCount), }, null\r
-            );\r
-            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-        } catch(Exception e){\r
-            showExceptionMessage(e);\r
-        }\r
-    }\r
-\r
-    public void showSimilarityDistributionGraph(Map<Integer, Integer> distributions){\r
-        SimilarityDistributionGraphPane graph = new SimilarityDistributionGraphPane(this, distributions);\r
-\r
-        int similarityGraphCount = getNextCount("similarity_graph");\r
-        GUIUtility.addNewTab(\r
-            getMessages(), "similaritygraph", tabPane, graph,\r
-            new Object[] { new Integer(similarityGraphCount), }, null\r
-        );\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-    }\r
-\r
-    public void compareExtractionResult(ExtractionResultSet ers){\r
-        RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers);\r
-        int compareCount = getNextCount("compare");\r
-        GUIUtility.addNewTab(\r
-            getMessages(), "compare", tabPane, compare,\r
-            new Object[] { new Integer(compareCount), },\r
-            new Object[] {\r
-                Utility.array2String(ers.getBirthmarkTypes()),\r
-                Utility.array2String(new String[0]),\r
-                Utility.array2String(new String[0]),\r
-            }\r
-        );\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-    }\r
-\r
-    public void showExtractionResult(ExtractionResultSet ers){\r
-        int extractCount = getNextCount("extract");\r
-        BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, ers);\r
-        GUIUtility.addNewTab(\r
-            getMessages(), "extract", tabPane, viewer,\r
-            new Object[] { new Integer(extractCount), },\r
-            new Object[] { Utility.array2String(ers.getBirthmarkTypes()), }\r
-        );\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-        \r
-    }\r
-\r
-    public void extract(String[] targetX, String[] targetY, BirthmarkContext context){\r
-        try{\r
-            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());\r
-            ExtractionResultSet ers = engine.extract(targetX, targetY, context);\r
-            showExtractionResult(ers);\r
-        }catch(Throwable e){\r
-            showExceptionMessage(e);\r
-        }\r
-    }\r
-\r
-    /**\r
-     * csv file to Map.\r
-     */\r
-    public Map<String, String> constructMapping(File file){\r
-        Map<String, String> mapping = new HashMap<String, String>();\r
-        BufferedReader in = null;\r
-        try{\r
-            in = new BufferedReader(new FileReader(file));\r
-            String line;\r
-            while((line = in.readLine()) != null){\r
-                String[] tokens = line.split(", *");\r
-                if(tokens.length >= 2){\r
-                    mapping.put(tokens[0], tokens[1]);\r
-                }\r
-            }\r
-\r
-        }catch(Exception e){\r
-            showExceptionMessage(e);\r
-        }finally{\r
-            if(in != null){\r
-                try{\r
-                    in.close();\r
-                }catch(IOException e){\r
-                }\r
-            }\r
-        }\r
-        return mapping;\r
-    }\r
-\r
-    private void reloadSettings(String[] args){\r
-        try{\r
-            setVisible(false);\r
-            dispose();\r
-            new Main(args);\r
-        } catch(ParseException e){\r
-        }\r
-    }\r
-\r
-    private void clearSettings(){\r
-        Utility.deleteDirectory(new File(BirthmarkEnvironment.getStigmataHome()));\r
-        reloadSettings(new String[] { "--reset-config", "--mode", "gui", });\r
-    }\r
-\r
-    private void initLayouts(){\r
-        setTitle(getMessages().get("stigmata.frame.title"));\r
-        initComponents();\r
-\r
-        GUIUtility.addNewTab(getMessages(), "control", tabPane, control = new ControlPane(this), null, null);\r
-        control.inititalize();\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
-\r
-        setNeedToSaveSettings(false);\r
-        setSize(900, 600);\r
-    }\r
-\r
-    private void showWarnings(WarningMessages warnings){\r
-        if(warnings.getWarningCount() > 0){\r
-            StringBuilder sb = new StringBuilder("<html><body><dl>");\r
-            for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){\r
-                Exception e = i.next();\r
-                sb.append("<dt>").append(e.getClass().getName()).append("</dt>");\r
-                sb.append("<dd>").append(e.getMessage()).append("</dd>");\r
-                sb.append("<dd>").append(warnings.getString(e)).append("</dd>");\r
-            }\r
-            sb.append("</dl></body></html>");\r
-\r
-            JOptionPane.showMessageDialog(\r
-                this, new String(sb), getMessages().get("warning.dialog.title"),\r
-                JOptionPane.WARNING_MESSAGE\r
-            );\r
-        }\r
-    }\r
-\r
-    private void initComponents(){\r
-        setDefaultUI();\r
-        JMenuBar menubar = new JMenuBar();\r
-        menubar.add(createFileMenu());\r
-        menubar.add(createHelpMenu());\r
-\r
-        setJMenuBar(menubar);\r
-\r
-        tabPane = new EditableTabbedPane(this);\r
-        add(tabPane, BorderLayout.CENTER);\r
-\r
-        tabPane.addChangeListener(new ChangeListener(){\r
-            public void stateChanged(ChangeEvent arg0){\r
-                String title = tabPane.getTitleAt(tabPane.getSelectedIndex());\r
-                closeTabMenu.setEnabled(!title.equals(getMessages().get("control.tab.label")));\r
-            }\r
-        });\r
-        addWindowListener(new WindowAdapter(){\r
-            @Override\r
-            public void windowClosing(WindowEvent e){\r
-                boolean closeFlag = true;\r
-                if(isNeedToSaveSettings()){\r
-                    int returnValue = JOptionPane.showConfirmDialog(\r
-                        StigmataFrame.this,\r
-                        getMessages().get("needtosave.settings.message"),\r
-                        getMessages().get("needtosave.settings.title"),\r
-                        JOptionPane.YES_NO_CANCEL_OPTION,\r
-                        JOptionPane.WARNING_MESSAGE\r
-                    );\r
-                    closeFlag = returnValue != JOptionPane.CANCEL_OPTION;\r
-                    if(returnValue == JOptionPane.YES_OPTION){\r
-                        control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml"));\r
-                    }\r
-                }\r
-                if(closeFlag){\r
-                    setVisible(false);\r
-                    dispose();\r
-                }\r
-            }\r
-        });\r
-        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
-    }\r
-\r
-    private JMenu createFileMenu(){\r
-        JMenu fileMenu = GUIUtility.createJMenu(getMessages(), "fileMenu");\r
-        JMenuItem newFrameMenu = GUIUtility.createJMenuItem(getMessages(), "newframe");\r
-        JMenuItem saveMenu = GUIUtility.createJMenuItem(getMessages(), "savesetting");\r
-        JMenuItem exportMenu = GUIUtility.createJMenuItem(getMessages(), "exportsetting");\r
-        JMenuItem clearMenu = GUIUtility.createJMenuItem(getMessages(), "clearsetting");\r
-        JMenuItem refreshMenu = GUIUtility.createJMenuItem(getMessages(), "refreshsetting");\r
-        JMenuItem closeTabMenu = GUIUtility.createJMenuItem(getMessages(), "closetab");\r
-        JMenuItem closeMenu = GUIUtility.createJMenuItem(getMessages(), "closeframe");\r
-        JMenuItem exitMenu = GUIUtility.createJMenuItem(getMessages(), "exit");\r
-        this.closeTabMenu = closeTabMenu;\r
-        this.saveMenu = saveMenu;\r
-        saveMenu.setEnabled(false);\r
-\r
-        fileMenu.add(newFrameMenu);\r
-        fileMenu.add(new JSeparator());\r
-        fileMenu.add(saveMenu);\r
-        fileMenu.add(exportMenu);\r
-        fileMenu.add(refreshMenu);\r
-        fileMenu.add(clearMenu);\r
-        fileMenu.add(new JSeparator());\r
-        fileMenu.add(closeTabMenu);\r
-        fileMenu.add(closeMenu);\r
-        fileMenu.add(new JSeparator());\r
-        fileMenu.add(exitMenu);\r
-\r
-        newFrameMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent evt){\r
-                StigmataFrame frame = new StigmataFrame(stigmata, environment);\r
-                frame.setVisible(true);\r
-            }\r
-        });\r
-        saveMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml"));\r
-                setNeedToSaveSettings(false);\r
-            }\r
-        });\r
-\r
-        exportMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                control.exportSettings();\r
-            }\r
-        });\r
-\r
-        closeTabMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent evt){\r
-                closeTabMenuActionPerformed();\r
-            }\r
-        });\r
-\r
-        clearMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent evt){\r
-                clearSettings();\r
-            }\r
-        });\r
-        refreshMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent evt){\r
-                reloadSettings(new String[] { "--mode", "gui", });\r
-            }\r
-        });\r
-\r
-        closeMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent evt){\r
-                setVisible(false);\r
-                dispose();\r
-            }\r
-        });\r
-\r
-        exitMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent evt){\r
-                System.exit(0);\r
-            }\r
-        });\r
-        return fileMenu;\r
-    }\r
-\r
-    private JMenu createHelpMenu(){\r
-        JMenu menu = GUIUtility.createJMenu(getMessages(), "helpmenu");\r
-        JMenuItem about = GUIUtility.createJMenuItem(getMessages(), "about", new AboutAction(this));\r
-        JMenuItem license = GUIUtility.createJMenuItem(getMessages(), "license", new LicenseAction(this));\r
-        JMenuItem help = GUIUtility.createJMenuItem(getMessages(), "helpmenu");\r
-        expertmodeMenu = GUIUtility.createJCheckBoxMenuItem(getMessages(), "expertmenu");\r
-\r
-        menu.add(about);\r
-        menu.add(license);\r
-        menu.add(help);\r
-        menu.add(new JSeparator());\r
-        menu.add(createLookAndFeelMenu());\r
-        menu.add(new JSeparator());\r
-        menu.add(expertmodeMenu);\r
-\r
-        expertmodeMenu.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                expertMenuActionPerformed(((JCheckBoxMenuItem)e.getSource()).getState());\r
-            }\r
-        });\r
-        help.setEnabled(false);\r
-\r
-        return menu;\r
-    }\r
-\r
-    private JMenu createLookAndFeelMenu(){\r
-        JMenu laf = GUIUtility.createJMenu(getMessages(), "lookandfeel");\r
-        ButtonGroup bg = new ButtonGroup();\r
-        UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels();\r
-        LookAndFeel lookfeel = UIManager.getLookAndFeel();\r
-\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                try{\r
-                    String command = e.getActionCommand();\r
-                    UIManager.setLookAndFeel(command);\r
-                    SwingUtilities.updateComponentTreeUI(StigmataFrame.this);\r
-                } catch(Exception ee){\r
-                }\r
-            }\r
-        };\r
-        for(int i = 0; i < info.length; i++){\r
-            JCheckBoxMenuItem item = new JCheckBoxMenuItem(info[i].getName());\r
-            item.setActionCommand(info[i].getClassName());\r
-            item.addActionListener(listener);\r
-            bg.add(item);\r
-            laf.add(item);\r
-\r
-            if(info[i].getClassName().equals(lookfeel.getClass().getName())){\r
-                item.setState(true);\r
-            }\r
-        }\r
-\r
-        return laf;\r
-    }\r
-\r
-    public void setExpertMode(boolean expertmode){\r
-        expertmodeMenu.setState(expertmode);\r
-    }\r
-\r
-    private void expertMenuActionPerformed(boolean status){\r
-        control.setExpertMode(status);\r
-    }\r
-\r
-    private void showExceptionMessage(Throwable e){\r
-        if(e instanceof BirthmarkElementClassNotFoundException){\r
-            showClassNotFoundMessage((BirthmarkElementClassNotFoundException)e);\r
-        }\r
-        else if(e instanceof OutOfMemoryError){\r
-            showOutOfMemoryError();\r
-        }\r
-        else{\r
-            JTextArea area = new JTextArea(20, 60);\r
-            StringWriter writer = new StringWriter();\r
-            PrintWriter out = new PrintWriter(writer);\r
-            e.printStackTrace(out);\r
-            if(e instanceof BirthmarkExtractionFailedException){\r
-                out.println("Causes:");\r
-                for(Throwable t: ((BirthmarkExtractionFailedException)e).getCauses()){\r
-                    t.printStackTrace(out);\r
-                }\r
-            }\r
-            out.close();\r
-            area.setText(writer.toString());\r
-            JPanel panel = new JPanel(new BorderLayout());\r
-            panel.add(new JLabel("<html><body><p>" + getMessages().get("error.message.contactus") + "</p></body></html>"), BorderLayout.NORTH);\r
-            panel.add(new JScrollPane(area), BorderLayout.CENTER);\r
-\r
-            JOptionPane.showMessageDialog(\r
-                this, panel, getMessages().get("error.dialog.title"),\r
-                JOptionPane.WARNING_MESSAGE\r
-            );\r
-        }\r
-    }\r
-\r
-    private void showOutOfMemoryError(){\r
-        StringBuffer sb = new StringBuffer();\r
-        sb.append("<html><body><p>");\r
-        sb.append(getMessages().get("error.message.outofmemory"));\r
-        sb.append("</p></body></html>");\r
-        JOptionPane.showMessageDialog(\r
-            this, new String(sb), getMessages().get("error.dialog.title"),\r
-            JOptionPane.WARNING_MESSAGE\r
-        );\r
-    }\r
-\r
-    private void showClassNotFoundMessage(BirthmarkElementClassNotFoundException e){\r
-        StringBuffer sb = new StringBuffer();\r
-        sb.append("<html><body><p>");\r
-        sb.append(getMessages().get("error.message.classpath"));\r
-        sb.append("</p><ul>");\r
-        for(String name: e.getClassNames()){\r
-            sb.append("<li>").append(name).append("</li>");\r
-        }\r
-        sb.append("</ul></body></html>");\r
-        JOptionPane.showMessageDialog(\r
-            this, new String(sb), getMessages().get("error.dialog.title"),\r
-            JOptionPane.WARNING_MESSAGE\r
-        );\r
-    }\r
-\r
-    private void closeTabMenuActionPerformed(){\r
-        int index = tabPane.getSelectedIndex();\r
-        if(index == 0){\r
-            JOptionPane.showMessageDialog(\r
-                this, getMessages().get("cannotclosecontroltab.dialog.message"),\r
-                getMessages().get("cannotclosecontroltab.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-        }\r
-        else{\r
-            tabPane.removeTabAt(index);\r
-        }\r
-    }\r
-\r
-    private int getNextCount(String label){\r
-        Integer i = countmap.get(label);\r
-        if(i == null){\r
-            i = new Integer(0);\r
-        }\r
-        i = i + 1;\r
-        countmap.put(label, i);\r
-        return i;\r
-    }\r
-\r
-    private void setDefaultUI(){\r
-        try{\r
-            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\r
-        } catch(Exception e){\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.filechooser.FileFilter;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElementClassNotFoundException;
+import jp.sourceforge.stigmata.BirthmarkEngine;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ComparisonResultSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.Main;
+import jp.sourceforge.stigmata.Stigmata;
+import jp.sourceforge.stigmata.event.BirthmarkEngineAdapter;
+import jp.sourceforge.stigmata.event.BirthmarkEngineEvent;
+import jp.sourceforge.stigmata.event.WarningMessages;
+import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
+import jp.sourceforge.stigmata.ui.swing.actions.AboutAction;
+import jp.sourceforge.stigmata.ui.swing.actions.LicenseAction;
+import jp.sourceforge.stigmata.ui.swing.graph.SimilarityDistributionGraphPane;
+import jp.sourceforge.stigmata.ui.swing.mds.MDSGraphPanel;
+import jp.sourceforge.stigmata.ui.swing.tab.EditableTabbedPane;
+import jp.sourceforge.stigmata.utils.Utility;
+import jp.sourceforge.talisman.i18n.Messages;
+import jp.sourceforge.talisman.i18n.ResourceNotFoundException;
+
+import org.apache.commons.cli.ParseException;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class StigmataFrame extends JFrame{
+    private static final long serialVersionUID = 92345543665342134L;
+
+    private Messages messages;
+    private JTabbedPane tabPane;
+    private JMenuItem closeTabMenu;
+    private JMenuItem saveMenu;
+    private JCheckBoxMenuItem expertmodeMenu;
+    private Stigmata stigmata;
+    private BirthmarkEnvironment environment;
+    private ControlPane control;
+    private FileIOManager fileio;
+    private Map<String, Integer> countmap = new HashMap<String, Integer>();
+
+    public StigmataFrame(){
+        this(Stigmata.getInstance());
+    }
+
+    public StigmataFrame(Stigmata stigmata){
+        this(stigmata, BirthmarkEnvironment.getDefaultEnvironment());
+    }
+
+    public StigmataFrame(Stigmata stigmata, BirthmarkEnvironment environment){
+        this.stigmata = stigmata;
+        this.environment = environment;
+        this.fileio = new FileIOManager(this, environment);
+        try{
+            this.messages = new Messages("resources.messages");
+        } catch(ResourceNotFoundException e){
+            throw new InternalError(e.getMessage());
+        }
+        Image iconImage = GUIUtility.getImage(getMessages(), "stigmata.icon");
+        if(iconImage != null){
+            setIconImage(iconImage);
+        }
+
+        stigmata.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){
+            @Override
+            public void operationDone(BirthmarkEngineEvent e){
+                showWarnings(e.getMessage());
+            }
+        });
+
+        initLayouts();
+    }
+
+    public Messages getMessages(){
+        return messages;
+    }
+
+    public boolean isNeedToSaveSettings(){
+        return saveMenu.isEnabled();
+    }
+
+    public void setNeedToSaveSettings(boolean flag){
+        saveMenu.setEnabled(flag);
+    }
+
+    public Stigmata getStigmata(){
+        return stigmata;
+    }
+
+    public BirthmarkEnvironment getEnvironment(){
+        return environment;
+    }
+
+    public File getCurrentDirectory(){
+        return fileio.getCurrentDirectory();
+    }
+
+    public void setCurrentDirectory(File file){
+        try{
+            fileio.setCurrentDirectory(file);
+        } catch(IllegalArgumentException e){
+            JOptionPane.showMessageDialog(
+                this,
+                getMessages().get("notdirectory.dialog.message", file.getName()),
+                getMessages().get("notdirectory.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+        } catch(Exception e){
+            showExceptionMessage(e);
+        }
+    }
+
+    public File[] openFiles(FileFilter[] filters, boolean multipleSelectable, boolean directorySelectable){
+        return fileio.openFiles(filters, multipleSelectable, directorySelectable);
+    }
+
+    /**
+     * Find file to open it.
+     */
+    public File getOpenFile(String[] exts, String desc){
+        return fileio.findFile(true, exts, desc);
+    }
+
+    /**
+     * Find file for storing data to it.
+     * Extension of found file is correct as selected extension.
+     */
+    public File getSaveFile(String[] exts, String desc){
+        return fileio.findFile(false, exts, desc);
+    }
+
+    public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
+        control.addBirthmarkServiceListener(listener);
+    }
+
+    public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
+        control.removeBirthmarkServiceListener(listener);
+    }
+
+    public void compareDetails(BirthmarkSet target1, BirthmarkSet target2, BirthmarkContext context){
+        PairComparisonPane detail = new PairComparisonPane(
+            this, new ComparisonPair(target1, target2, context)
+        );
+        int compareDetail = getNextCount("compare_detail");
+
+        GUIUtility.addNewTab(getMessages(), "comparedetail", tabPane, detail,
+            new Object[] { new Integer(compareDetail), },
+            new Object[] {
+                Utility.array2String(target1.getBirthmarkTypes()),
+                target1.getName(),
+                target2.getName(),
+            }
+        );
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+    }
+
+    public void compareRoundRobin(String[] targetX, String[] targetY, 
+            BirthmarkContext context){
+        try{
+            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());
+            ExtractionResultSet ers = engine.extract(targetX, targetY, context);
+
+            RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers);
+            int compareCount = getNextCount("compare");
+            GUIUtility.addNewTab(
+                getMessages(), "compare", tabPane, compare,
+                new Object[] { new Integer(compareCount), },
+                new Object[] {
+                    Utility.array2String(context.getBirthmarkTypes()),
+                    Utility.array2String(targetX),
+                    Utility.array2String(targetY),
+                }
+            );
+            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+        } catch(Throwable e){
+            showExceptionMessage(e);
+        }
+    }
+
+    public void compareRoundRobinFilter(String[] targetX, String[] targetY, 
+            BirthmarkContext context){
+        try{
+            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());
+
+            ExtractionResultSet ers = engine.extract(targetX, targetY, context);
+            ComparisonResultSet resultset = engine.compare(ers);
+            if(context.hasFilter()){
+                resultset = engine.filter(resultset);
+            }
+            int compareCount = getNextCount("compare");
+            GUIUtility.addNewTab(
+                getMessages(), "compare", tabPane, new PairComparisonResultSetPane(this, resultset),
+                new Object[] { new Integer(compareCount), },
+                new Object[] {
+                    Utility.array2String(context.getBirthmarkTypes()),
+                    Utility.array2String(targetX),
+                    Utility.array2String(targetY),
+                }
+            );
+            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+        } catch(Throwable e){
+            showExceptionMessage(e);
+        }
+    }
+
+    public void compareGuessedPair(String[] targetX, String[] targetY, BirthmarkContext context){
+        try{
+            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());
+            ExtractionResultSet extraction = engine.extract(targetX, targetY, context);
+            int comparePair = getNextCount("compare_pair");
+
+            ComparisonResultSet resultset = new CertainPairComparisonResultSet(extraction);
+            GUIUtility.addNewTab(
+                getMessages(), "comparepair", tabPane,
+                new PairComparisonResultSetPane(this, resultset),
+                new Object[] { new Integer(comparePair), },
+                new Object[] {
+                    Utility.array2String(context.getBirthmarkTypes()),
+                    Utility.array2String(targetX),
+                    Utility.array2String(targetY),
+                }
+            );
+            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+        }catch(Throwable e){
+            showExceptionMessage(e);
+        }
+    }
+
+    public void compareSpecifiedPair(String[] targetX, String[] targetY, BirthmarkContext context){
+        File file = getOpenFile(
+            getMessages().getArray("comparemapping.extension"),
+            getMessages().get("comparemapping.description")
+        );
+
+        if(file != null){
+            Map<String, String> mapping = constructMapping(file);
+
+            try{
+                BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());
+                context.setNameMappings(mapping);
+                ComparisonResultSet crs = engine.compare(targetX, targetY, context);
+                int comparePair = getNextCount("compare_pair");
+
+                GUIUtility.addNewTab(
+                    getMessages(), "comparepair", tabPane,
+                    new PairComparisonResultSetPane(this, crs),
+                    new Object[] { new Integer(comparePair), },
+                    new Object[] {
+                        Utility.array2String(context.getBirthmarkTypes()),
+                        Utility.array2String(targetX),
+                        Utility.array2String(targetY),
+                    }
+                );
+                tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+            }catch(Exception e){
+                showExceptionMessage(e);
+            }
+        }
+    }
+
+    public void showComparisonResultSet(ComparisonResultSet resultset){
+        int comparePair = getNextCount("compare_pair");
+        GUIUtility.addNewTab(
+            getMessages(), "comparisonresultset", tabPane,
+            new PairComparisonResultSetPane(this, resultset),
+            new Object[] { new Integer(comparePair), }, null
+        );
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+    }
+
+    public void showMDSGraph(BirthmarkSet[] set, BirthmarkContext context){
+        try{
+            MDSGraphPanel panel = new MDSGraphPanel(this, set, context);
+            int mappingGraphCount = getNextCount("mds_graph");
+            GUIUtility.addNewTab(
+                getMessages(), "mappinggraph", tabPane, panel,
+                new Object[] { new Integer(mappingGraphCount), }, null
+            );
+            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+        } catch(Exception e){
+            showExceptionMessage(e);
+        }
+    }
+
+    public void showSimilarityDistributionGraph(Map<Integer, Integer> distributions){
+        SimilarityDistributionGraphPane graph = new SimilarityDistributionGraphPane(this, distributions);
+
+        int similarityGraphCount = getNextCount("similarity_graph");
+        GUIUtility.addNewTab(
+            getMessages(), "similaritygraph", tabPane, graph,
+            new Object[] { new Integer(similarityGraphCount), }, null
+        );
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+    }
+
+    public void compareExtractionResult(ExtractionResultSet ers){
+        RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers);
+        int compareCount = getNextCount("compare");
+        GUIUtility.addNewTab(
+            getMessages(), "compare", tabPane, compare,
+            new Object[] { new Integer(compareCount), },
+            new Object[] {
+                Utility.array2String(ers.getBirthmarkTypes()),
+                Utility.array2String(new String[0]),
+                Utility.array2String(new String[0]),
+            }
+        );
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+    }
+
+    public void showExtractionResult(ExtractionResultSet ers){
+        int extractCount = getNextCount("extract");
+        BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, ers);
+        GUIUtility.addNewTab(
+            getMessages(), "extract", tabPane, viewer,
+            new Object[] { new Integer(extractCount), },
+            new Object[] { Utility.array2String(ers.getBirthmarkTypes()), }
+        );
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+        
+    }
+
+    public void extract(String[] targetX, String[] targetY, BirthmarkContext context){
+        try{
+            BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());
+            ExtractionResultSet ers = engine.extract(targetX, targetY, context);
+            showExtractionResult(ers);
+        }catch(Throwable e){
+            showExceptionMessage(e);
+        }
+    }
+
+    /**
+     * csv file to Map.
+     */
+    public Map<String, String> constructMapping(File file){
+        Map<String, String> mapping = new HashMap<String, String>();
+        BufferedReader in = null;
+        try{
+            in = new BufferedReader(new FileReader(file));
+            String line;
+            while((line = in.readLine()) != null){
+                String[] tokens = line.split(", *");
+                if(tokens.length >= 2){
+                    mapping.put(tokens[0], tokens[1]);
+                }
+            }
+
+        }catch(Exception e){
+            showExceptionMessage(e);
+        }finally{
+            if(in != null){
+                try{
+                    in.close();
+                }catch(IOException e){
+                }
+            }
+        }
+        return mapping;
+    }
+
+    private void reloadSettings(String[] args){
+        try{
+            setVisible(false);
+            dispose();
+            new Main(args);
+        } catch(ParseException e){
+        }
+    }
+
+    private void clearSettings(){
+        Utility.deleteDirectory(new File(BirthmarkEnvironment.getStigmataHome()));
+        reloadSettings(new String[] { "--reset-config", "--mode", "gui", });
+    }
+
+    private void initLayouts(){
+        setTitle(getMessages().get("stigmata.frame.title"));
+        initComponents();
+
+        GUIUtility.addNewTab(getMessages(), "control", tabPane, control = new ControlPane(this), null, null);
+        control.inititalize();
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
+
+        setNeedToSaveSettings(false);
+        setSize(900, 600);
+    }
+
+    private void showWarnings(WarningMessages warnings){
+        if(warnings.getWarningCount() > 0){
+            StringBuilder sb = new StringBuilder("<html><body><dl>");
+            for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){
+                Exception e = i.next();
+                sb.append("<dt>").append(e.getClass().getName()).append("</dt>");
+                sb.append("<dd>").append(e.getMessage()).append("</dd>");
+                sb.append("<dd>").append(warnings.getString(e)).append("</dd>");
+            }
+            sb.append("</dl></body></html>");
+
+            JOptionPane.showMessageDialog(
+                this, new String(sb), getMessages().get("warning.dialog.title"),
+                JOptionPane.WARNING_MESSAGE
+            );
+        }
+    }
+
+    private void initComponents(){
+        setDefaultUI();
+        JMenuBar menubar = new JMenuBar();
+        menubar.add(createFileMenu());
+        menubar.add(createHelpMenu());
+
+        setJMenuBar(menubar);
+
+        tabPane = new EditableTabbedPane(this);
+        add(tabPane, BorderLayout.CENTER);
+
+        tabPane.addChangeListener(new ChangeListener(){
+            public void stateChanged(ChangeEvent arg0){
+                String title = tabPane.getTitleAt(tabPane.getSelectedIndex());
+                closeTabMenu.setEnabled(!title.equals(getMessages().get("control.tab.label")));
+            }
+        });
+        addWindowListener(new WindowAdapter(){
+            @Override
+            public void windowClosing(WindowEvent e){
+                boolean closeFlag = true;
+                if(isNeedToSaveSettings()){
+                    int returnValue = JOptionPane.showConfirmDialog(
+                        StigmataFrame.this,
+                        getMessages().get("needtosave.settings.message"),
+                        getMessages().get("needtosave.settings.title"),
+                        JOptionPane.YES_NO_CANCEL_OPTION,
+                        JOptionPane.WARNING_MESSAGE
+                    );
+                    closeFlag = returnValue != JOptionPane.CANCEL_OPTION;
+                    if(returnValue == JOptionPane.YES_OPTION){
+                        control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml"));
+                    }
+                }
+                if(closeFlag){
+                    setVisible(false);
+                    dispose();
+                }
+            }
+        });
+        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+    }
+
+    private JMenu createFileMenu(){
+        JMenu fileMenu = GUIUtility.createJMenu(getMessages(), "fileMenu");
+        JMenuItem newFrameMenu = GUIUtility.createJMenuItem(getMessages(), "newframe");
+        JMenuItem saveMenu = GUIUtility.createJMenuItem(getMessages(), "savesetting");
+        JMenuItem exportMenu = GUIUtility.createJMenuItem(getMessages(), "exportsetting");
+        JMenuItem clearMenu = GUIUtility.createJMenuItem(getMessages(), "clearsetting");
+        JMenuItem refreshMenu = GUIUtility.createJMenuItem(getMessages(), "refreshsetting");
+        JMenuItem closeTabMenu = GUIUtility.createJMenuItem(getMessages(), "closetab");
+        JMenuItem closeMenu = GUIUtility.createJMenuItem(getMessages(), "closeframe");
+        JMenuItem exitMenu = GUIUtility.createJMenuItem(getMessages(), "exit");
+        this.closeTabMenu = closeTabMenu;
+        this.saveMenu = saveMenu;
+        saveMenu.setEnabled(false);
+
+        fileMenu.add(newFrameMenu);
+        fileMenu.add(new JSeparator());
+        fileMenu.add(saveMenu);
+        fileMenu.add(exportMenu);
+        fileMenu.add(refreshMenu);
+        fileMenu.add(clearMenu);
+        fileMenu.add(new JSeparator());
+        fileMenu.add(closeTabMenu);
+        fileMenu.add(closeMenu);
+        fileMenu.add(new JSeparator());
+        fileMenu.add(exitMenu);
+
+        newFrameMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                StigmataFrame frame = new StigmataFrame(stigmata, environment);
+                frame.setVisible(true);
+            }
+        });
+        saveMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml"));
+                setNeedToSaveSettings(false);
+            }
+        });
+
+        exportMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                control.exportSettings();
+            }
+        });
+
+        closeTabMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                closeTabMenuActionPerformed();
+            }
+        });
+
+        clearMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                clearSettings();
+            }
+        });
+        refreshMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                reloadSettings(new String[] { "--mode", "gui", });
+            }
+        });
+
+        closeMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                setVisible(false);
+                dispose();
+            }
+        });
+
+        exitMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                System.exit(0);
+            }
+        });
+        return fileMenu;
+    }
+
+    private JMenu createHelpMenu(){
+        JMenu menu = GUIUtility.createJMenu(getMessages(), "helpmenu");
+        JMenuItem about = GUIUtility.createJMenuItem(getMessages(), "about", new AboutAction(this));
+        JMenuItem license = GUIUtility.createJMenuItem(getMessages(), "license", new LicenseAction(this));
+        JMenuItem help = GUIUtility.createJMenuItem(getMessages(), "helpmenu");
+        expertmodeMenu = GUIUtility.createJCheckBoxMenuItem(getMessages(), "expertmenu");
+
+        menu.add(about);
+        menu.add(license);
+        menu.add(help);
+        menu.add(new JSeparator());
+        menu.add(createLookAndFeelMenu());
+        menu.add(new JSeparator());
+        menu.add(expertmodeMenu);
+
+        expertmodeMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                expertMenuActionPerformed(((JCheckBoxMenuItem)e.getSource()).getState());
+            }
+        });
+        help.setEnabled(false);
+
+        return menu;
+    }
+
+    private JMenu createLookAndFeelMenu(){
+        JMenu laf = GUIUtility.createJMenu(getMessages(), "lookandfeel");
+        ButtonGroup bg = new ButtonGroup();
+        UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels();
+        LookAndFeel lookfeel = UIManager.getLookAndFeel();
+
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                try{
+                    String command = e.getActionCommand();
+                    UIManager.setLookAndFeel(command);
+                    SwingUtilities.updateComponentTreeUI(StigmataFrame.this);
+                } catch(Exception ee){
+                }
+            }
+        };
+        for(int i = 0; i < info.length; i++){
+            JCheckBoxMenuItem item = new JCheckBoxMenuItem(info[i].getName());
+            item.setActionCommand(info[i].getClassName());
+            item.addActionListener(listener);
+            bg.add(item);
+            laf.add(item);
+
+            if(info[i].getClassName().equals(lookfeel.getClass().getName())){
+                item.setState(true);
+            }
+        }
+
+        return laf;
+    }
+
+    public void setExpertMode(boolean expertmode){
+        expertmodeMenu.setState(expertmode);
+    }
+
+    private void expertMenuActionPerformed(boolean status){
+        control.setExpertMode(status);
+    }
+
+    private void showExceptionMessage(Throwable e){
+        if(e instanceof BirthmarkElementClassNotFoundException){
+            showClassNotFoundMessage((BirthmarkElementClassNotFoundException)e);
+        }
+        else if(e instanceof OutOfMemoryError){
+            showOutOfMemoryError();
+        }
+        else{
+            JTextArea area = new JTextArea(20, 60);
+            StringWriter writer = new StringWriter();
+            PrintWriter out = new PrintWriter(writer);
+            e.printStackTrace(out);
+            if(e instanceof BirthmarkExtractionFailedException){
+                out.println("Causes:");
+                for(Throwable t: ((BirthmarkExtractionFailedException)e).getCauses()){
+                    t.printStackTrace(out);
+                }
+            }
+            out.close();
+            area.setText(writer.toString());
+            JPanel panel = new JPanel(new BorderLayout());
+            panel.add(new JLabel("<html><body><p>" + getMessages().get("error.message.contactus") + "</p></body></html>"), BorderLayout.NORTH);
+            panel.add(new JScrollPane(area), BorderLayout.CENTER);
+
+            JOptionPane.showMessageDialog(
+                this, panel, getMessages().get("error.dialog.title"),
+                JOptionPane.WARNING_MESSAGE
+            );
+        }
+    }
+
+    private void showOutOfMemoryError(){
+        StringBuffer sb = new StringBuffer();
+        sb.append("<html><body><p>");
+        sb.append(getMessages().get("error.message.outofmemory"));
+        sb.append("</p></body></html>");
+        JOptionPane.showMessageDialog(
+            this, new String(sb), getMessages().get("error.dialog.title"),
+            JOptionPane.WARNING_MESSAGE
+        );
+    }
+
+    private void showClassNotFoundMessage(BirthmarkElementClassNotFoundException e){
+        StringBuffer sb = new StringBuffer();
+        sb.append("<html><body><p>");
+        sb.append(getMessages().get("error.message.classpath"));
+        sb.append("</p><ul>");
+        for(String name: e.getClassNames()){
+            sb.append("<li>").append(name).append("</li>");
+        }
+        sb.append("</ul></body></html>");
+        JOptionPane.showMessageDialog(
+            this, new String(sb), getMessages().get("error.dialog.title"),
+            JOptionPane.WARNING_MESSAGE
+        );
+    }
+
+    private void closeTabMenuActionPerformed(){
+        int index = tabPane.getSelectedIndex();
+        if(index == 0){
+            JOptionPane.showMessageDialog(
+                this, getMessages().get("cannotclosecontroltab.dialog.message"),
+                getMessages().get("cannotclosecontroltab.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+        }
+        else{
+            tabPane.removeTabAt(index);
+        }
+    }
+
+    private int getNextCount(String label){
+        Integer i = countmap.get(label);
+        if(i == null){
+            i = new Integer(0);
+        }
+        i = i + 1;
+        countmap.put(label, i);
+        return i;
+    }
+
+    private void setDefaultUI(){
+        try{
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+        } catch(Exception e){
+        }
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.datatransfer.DataFlavor;\r
-import java.awt.datatransfer.Transferable;\r
-import java.awt.datatransfer.UnsupportedFlavorException;\r
-import java.awt.dnd.DnDConstants;\r
-import java.awt.dnd.DragGestureEvent;\r
-import java.awt.dnd.DragGestureListener;\r
-import java.awt.dnd.DragSource;\r
-import java.awt.dnd.DragSourceAdapter;\r
-import java.awt.dnd.DragSourceDropEvent;\r
-import java.awt.dnd.DragSourceListener;\r
-import java.awt.dnd.DropTarget;\r
-import java.awt.dnd.DropTargetDragEvent;\r
-import java.awt.dnd.DropTargetDropEvent;\r
-import java.awt.dnd.DropTargetEvent;\r
-import java.awt.event.ActionEvent;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.text.MessageFormat;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.Action;\r
-import javax.swing.Box;\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JList;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-import javax.swing.filechooser.FileFilter;\r
-\r
-import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TargetSelectionPane extends JPanel{\r
-    private static final long serialVersionUID = 3209435745432235432L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private FileFilter[] filters;\r
-    private List<String> extensions = new ArrayList<String>();\r
-    private String description;\r
-    private DefaultListModel model = new DefaultListModel();\r
-    private List<DataChangeListener> listeners = new ArrayList<DataChangeListener>();\r
-    private boolean directorySelectable = false;\r
-    private boolean multipleSelectable = true;\r
-    private JList list;\r
-    private Action addAction;\r
-    private Action removeAction;\r
-\r
-    public TargetSelectionPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-        initComponents();\r
-        list.setModel(model);\r
-\r
-        DropTarget dropTarget = new TargetSelectionDropTarget();\r
-        list.setDropTarget(dropTarget);\r
-        DragSource dragSource = DragSource.getDefaultDragSource();\r
-        dragSource.createDefaultDragGestureRecognizer(\r
-            list, DnDConstants.ACTION_MOVE,\r
-            new TargetDragGestureListener(list, model)\r
-        );\r
-    }\r
-\r
-    public void addDataChangeListener(DataChangeListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void addTargetExtension(String ext){\r
-        if(filters != null){\r
-            filters = null;\r
-        }\r
-        extensions.add(ext);\r
-    }\r
-\r
-    public void addTargetExtensions(String[] exts){\r
-        if(filters != null){\r
-            filters = null;\r
-        }\r
-        for(String ext: exts){\r
-            extensions.add(ext);\r
-        }\r
-    }\r
-\r
-    public void addValue(String value){\r
-        model.addElement(value);\r
-        fireEvent();\r
-    }\r
-\r
-    public void addValues(String[] values){\r
-        for(String value: values){\r
-            addValue(value);\r
-        }\r
-    }\r
-\r
-    public String getDescription(){\r
-        return description;\r
-    }\r
-\r
-    public synchronized String[] getExtensions(){\r
-        return extensions.toArray(new String[extensions.size()]);\r
-    }\r
-\r
-    public FileFilter[] getFileFilters(){\r
-        if(filters == null){\r
-            String[] exts = getExtensions();\r
-            filters = new FileFilter[exts.length];\r
-            for(int i = 0; i < exts.length; i++){\r
-                filters[i] = new ExtensionFilter(\r
-                    exts[i], MessageFormat.format(getSelectDescription(), exts[i])\r
-                );\r
-            }\r
-            ;\r
-        }\r
-        return filters;\r
-    }\r
-\r
-    public String getSelectDescription(){\r
-        return description;\r
-    }\r
-\r
-    public String[] getSelectedValues(){\r
-        int[] indeces = list.getSelectedIndices();\r
-        String[] strings = new String[indeces.length];\r
-        for(int i = 0; i < strings.length; i++){\r
-            strings[i] = (String)model.getElementAt(indeces[i]);\r
-        }\r
-        return strings;\r
-    }\r
-\r
-    public String[] getValues(){\r
-        String[] strings = new String[model.getSize()];\r
-        for(int i = 0; i < strings.length; i++){\r
-            strings[i] = (String)model.getElementAt(i);\r
-        }\r
-        return strings;\r
-    }\r
-\r
-    public boolean isDirectorySelectable(){\r
-        return directorySelectable;\r
-    }\r
-\r
-    public boolean isMultipleSelectable(){\r
-        return multipleSelectable;\r
-    }\r
-\r
-    public void removeAllElements(){\r
-        model.removeAllElements();\r
-        fireEvent();\r
-    }\r
-\r
-    public void setDescription(String description){\r
-        this.description = description;\r
-    }\r
-\r
-    public void setDirectorySelectable(boolean flag){\r
-        directorySelectable = flag;\r
-    }\r
-\r
-    @Override\r
-    public void setEnabled(boolean flag){\r
-        super.setEnabled(flag);\r
-        addAction.setEnabled(flag);\r
-        removeAction.setEnabled(false);\r
-        list.setEnabled(flag);\r
-    }\r
-\r
-    public void setFileFilter(FileFilter filter){\r
-        setFileFilters(new FileFilter[] { filter, });\r
-    }\r
-\r
-    public void setFileFilters(FileFilter[] filters){\r
-        this.filters = filters;\r
-    }\r
-\r
-    public void setMultipleSelectable(boolean flag){\r
-        multipleSelectable = flag;\r
-    }\r
-\r
-    public void setSelectDescription(String description){\r
-        this.description = description;\r
-    }\r
-\r
-    private void addButtonActionPerformed(ActionEvent evt){\r
-        File[] files = stigmata.openFiles(getFileFilters(), true, true);\r
-        for(File file: files){\r
-            addValue(file.getPath());\r
-        }\r
-    }\r
-\r
-    private void fireEvent(){\r
-        for(int i = listeners.size() - 1; i >= 0; i--){\r
-            DataChangeListener listener = listeners.get(i);\r
-            listener.valueChanged(model);\r
-        }\r
-    }\r
-\r
-    private void initComponents(){\r
-        final Messages messages = stigmata.getMessages();\r
-        JScrollPane scroll = new JScrollPane();\r
-        JComponent south = Box.createHorizontalBox();\r
-        list = new JList();\r
-\r
-        addAction = new AbstractAction(){\r
-            private static final long serialVersionUID = 1406018312294328837L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                addButtonActionPerformed(e);\r
-            }\r
-        };\r
-        removeAction = new AbstractAction(){\r
-            private static final long serialVersionUID = 7910621850068803554L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                removeButtonActionPerformed(e);\r
-            }\r
-        };\r
-\r
-        JButton addButton = GUIUtility.createButton(messages, "addpackage", addAction);\r
-        JButton removeButton = GUIUtility.createButton(messages, "removepackage", removeAction);\r
-        removeAction.setEnabled(false);\r
-\r
-        final JPopupMenu popup = new JPopupMenu();\r
-        popup.add(GUIUtility.createJMenuItem(messages, "addpackage", addAction));\r
-        popup.add(GUIUtility.createJMenuItem(messages, "removepackage", removeAction));\r
-\r
-        setLayout(new BorderLayout());\r
-\r
-        scroll.setViewportView(list);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(addButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(removeButton);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        list.addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent evt){\r
-                listValueChanged(evt);\r
-            }\r
-        });\r
-\r
-        list.addMouseListener(new PopupShowAction(popup));\r
-\r
-        add(scroll, java.awt.BorderLayout.CENTER);\r
-        add(south, BorderLayout.SOUTH);\r
-    }\r
-\r
-    private void listValueChanged(ListSelectionEvent evt){\r
-        int[] indeces = list.getSelectedIndices();\r
-        removeAction.setEnabled(isEnabled() && indeces != null);\r
-    }\r
-\r
-    private void removeButtonActionPerformed(ActionEvent evt){\r
-        int[] indeces = list.getSelectedIndices();\r
-        if(indeces != null && indeces.length >= 1){\r
-            for(int i = indeces.length - 1; i >= 0; i--){\r
-                model.removeElementAt(indeces[i]);\r
-                fireEvent();\r
-            }\r
-        }\r
-        removeAction.setEnabled(false);\r
-    }\r
-\r
-    private class DataRemoveWhenDragSuccessfulAdapter extends DragSourceAdapter{\r
-        private DefaultListModel model;\r
-        private int[] indeces;\r
-\r
-        public DataRemoveWhenDragSuccessfulAdapter(DefaultListModel model,\r
-            int[] indeces){\r
-            this.model = model;\r
-            this.indeces = indeces;\r
-        }\r
-\r
-        @Override\r
-        public void dragDropEnd(DragSourceDropEvent dsde){\r
-            for(int i = indeces.length - 1; i >= 0; i--){\r
-                model.removeElementAt(indeces[i]);\r
-            }\r
-            fireEvent();\r
-            super.dragDropEnd(dsde);\r
-        }\r
-    };\r
-\r
-    private class TargetDragGestureListener implements DragGestureListener{\r
-        private JList list;\r
-\r
-        public TargetDragGestureListener(JList list, DefaultListModel model){\r
-            this.list = list;\r
-        }\r
-\r
-        public void dragGestureRecognized(DragGestureEvent dge){\r
-            int[] indeces = list.getSelectedIndices();\r
-            if(indeces.length > 0){\r
-                String[] strings = new String[indeces.length];\r
-                for(int i = 0; i < strings.length; i++){\r
-                    strings[i] = (String)model.getElementAt(indeces[i]);\r
-                }\r
-                Transferable transferable = new TargetTransferable(strings);\r
-                DragSourceListener listener = new DataRemoveWhenDragSuccessfulAdapter(\r
-                    model, indeces);\r
-\r
-                dge.startDrag(DragSource.DefaultMoveDrop, transferable,\r
-                    listener);\r
-            }\r
-        }\r
-    };\r
-\r
-    @SuppressWarnings("unchecked")\r
-    private class TargetSelectionDropTarget extends DropTarget{\r
-        private static final long serialVersionUID = 3204457621345L;\r
-\r
-        @Override\r
-        public void dragEnter(DropTargetDragEvent arg0){\r
-        }\r
-\r
-        @Override\r
-        public void dragExit(DropTargetEvent arg0){\r
-        }\r
-\r
-        @Override\r
-        public void dragOver(DropTargetDragEvent arg0){\r
-        }\r
-\r
-        @Override\r
-        public void drop(DropTargetDropEvent dtde){\r
-            dtde.acceptDrop(DnDConstants.ACTION_REFERENCE);\r
-            Transferable trans = dtde.getTransferable();\r
-            try{\r
-                if(trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){\r
-                    List list = (List)trans\r
-                        .getTransferData(DataFlavor.javaFileListFlavor);\r
-                    List<String> errorList = checkAndAddDroppedFile(list);\r
-                    if(errorList.size() > 0){\r
-                        showError(errorList);\r
-                    }\r
-                }\r
-            } catch(UnsupportedFlavorException e){\r
-            } catch(IOException e){\r
-            }\r
-        }\r
-\r
-        @Override\r
-        public void dropActionChanged(DropTargetDragEvent arg0){\r
-        }\r
-\r
-        private List<String> checkAndAddDroppedFile(List list){\r
-            List<String> errorList = new ArrayList<String>();\r
-\r
-            FileFilter[] filters = getFileFilters();\r
-            for(int i = 0; i < list.size(); i++){\r
-                File file = (File)list.get(i);\r
-                boolean neverAddedFlag = true;\r
-                for(FileFilter filter: filters){\r
-                    if(filter.accept(file)){\r
-                        addValue(file.getPath());\r
-                        neverAddedFlag = false;\r
-                    }\r
-                }\r
-                if(neverAddedFlag){\r
-                    errorList.add(file.getName());\r
-                }\r
-            }\r
-            return errorList;\r
-        }\r
-\r
-        private void showError(List<String> errorList){\r
-            StringBuilder builder = new StringBuilder("<html><body>");\r
-            builder.append(stigmata.getMessages().get("unsupportedfiletype.dialog.message"));\r
-            builder.append("<ul>");\r
-            for(int i = 0; i < errorList.size(); i++){\r
-                builder.append("<li>").append(errorList.get(i)).append("</li>");\r
-            }\r
-            builder.append("</ul></body></html>");\r
-            JOptionPane.showMessageDialog(\r
-                TargetSelectionPane.this, new String(builder),\r
-                stigmata.getMessages().get("unsupportedfiletype.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-        }\r
-    };\r
-\r
-    private class TargetTransferable implements Transferable{\r
-        private String[] strings;\r
-\r
-        public TargetTransferable(String[] strings){\r
-            this.strings = strings;\r
-        }\r
-\r
-        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException,\r
-                                                        IOException{\r
-            List<File> list = new ArrayList<File>();\r
-            for(int i = 0; i < strings.length; i++){\r
-                list.add(new File(strings[i]));\r
-            }\r
-            return list;\r
-        }\r
-\r
-        public DataFlavor[] getTransferDataFlavors(){\r
-            return new DataFlavor[] { DataFlavor.javaFileListFlavor, };\r
-        }\r
-\r
-        public boolean isDataFlavorSupported(DataFlavor flavor){\r
-            return flavor.equals(DataFlavor.javaFileListFlavor);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceAdapter;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceListener;
+import java.awt.dnd.DropTarget;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.filechooser.FileFilter;
+
+import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TargetSelectionPane extends JPanel{
+    private static final long serialVersionUID = 3209435745432235432L;
+
+    private StigmataFrame stigmata;
+    private FileFilter[] filters;
+    private List<String> extensions = new ArrayList<String>();
+    private String description;
+    private DefaultListModel model = new DefaultListModel();
+    private List<DataChangeListener> listeners = new ArrayList<DataChangeListener>();
+    private boolean directorySelectable = false;
+    private boolean multipleSelectable = true;
+    private JList list;
+    private Action addAction;
+    private Action removeAction;
+
+    public TargetSelectionPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+        initComponents();
+        list.setModel(model);
+
+        DropTarget dropTarget = new TargetSelectionDropTarget();
+        list.setDropTarget(dropTarget);
+        DragSource dragSource = DragSource.getDefaultDragSource();
+        dragSource.createDefaultDragGestureRecognizer(
+            list, DnDConstants.ACTION_MOVE,
+            new TargetDragGestureListener(list, model)
+        );
+    }
+
+    public void addDataChangeListener(DataChangeListener listener){
+        listeners.add(listener);
+    }
+
+    public void addTargetExtension(String ext){
+        if(filters != null){
+            filters = null;
+        }
+        extensions.add(ext);
+    }
+
+    public void addTargetExtensions(String[] exts){
+        if(filters != null){
+            filters = null;
+        }
+        for(String ext: exts){
+            extensions.add(ext);
+        }
+    }
+
+    public void addValue(String value){
+        model.addElement(value);
+        fireEvent();
+    }
+
+    public void addValues(String[] values){
+        for(String value: values){
+            addValue(value);
+        }
+    }
+
+    public String getDescription(){
+        return description;
+    }
+
+    public synchronized String[] getExtensions(){
+        return extensions.toArray(new String[extensions.size()]);
+    }
+
+    public FileFilter[] getFileFilters(){
+        if(filters == null){
+            String[] exts = getExtensions();
+            filters = new FileFilter[exts.length];
+            for(int i = 0; i < exts.length; i++){
+                filters[i] = new ExtensionFilter(
+                    exts[i], MessageFormat.format(getSelectDescription(), exts[i])
+                );
+            }
+            ;
+        }
+        return filters;
+    }
+
+    public String getSelectDescription(){
+        return description;
+    }
+
+    public String[] getSelectedValues(){
+        int[] indeces = list.getSelectedIndices();
+        String[] strings = new String[indeces.length];
+        for(int i = 0; i < strings.length; i++){
+            strings[i] = (String)model.getElementAt(indeces[i]);
+        }
+        return strings;
+    }
+
+    public String[] getValues(){
+        String[] strings = new String[model.getSize()];
+        for(int i = 0; i < strings.length; i++){
+            strings[i] = (String)model.getElementAt(i);
+        }
+        return strings;
+    }
+
+    public boolean isDirectorySelectable(){
+        return directorySelectable;
+    }
+
+    public boolean isMultipleSelectable(){
+        return multipleSelectable;
+    }
+
+    public void removeAllElements(){
+        model.removeAllElements();
+        fireEvent();
+    }
+
+    public void setDescription(String description){
+        this.description = description;
+    }
+
+    public void setDirectorySelectable(boolean flag){
+        directorySelectable = flag;
+    }
+
+    @Override
+    public void setEnabled(boolean flag){
+        super.setEnabled(flag);
+        addAction.setEnabled(flag);
+        removeAction.setEnabled(false);
+        list.setEnabled(flag);
+    }
+
+    public void setFileFilter(FileFilter filter){
+        setFileFilters(new FileFilter[] { filter, });
+    }
+
+    public void setFileFilters(FileFilter[] filters){
+        this.filters = filters;
+    }
+
+    public void setMultipleSelectable(boolean flag){
+        multipleSelectable = flag;
+    }
+
+    public void setSelectDescription(String description){
+        this.description = description;
+    }
+
+    private void addButtonActionPerformed(ActionEvent evt){
+        File[] files = stigmata.openFiles(getFileFilters(), true, true);
+        for(File file: files){
+            addValue(file.getPath());
+        }
+    }
+
+    private void fireEvent(){
+        for(int i = listeners.size() - 1; i >= 0; i--){
+            DataChangeListener listener = listeners.get(i);
+            listener.valueChanged(model);
+        }
+    }
+
+    private void initComponents(){
+        final Messages messages = stigmata.getMessages();
+        JScrollPane scroll = new JScrollPane();
+        JComponent south = Box.createHorizontalBox();
+        list = new JList();
+
+        addAction = new AbstractAction(){
+            private static final long serialVersionUID = 1406018312294328837L;
+
+            public void actionPerformed(ActionEvent e){
+                addButtonActionPerformed(e);
+            }
+        };
+        removeAction = new AbstractAction(){
+            private static final long serialVersionUID = 7910621850068803554L;
+
+            public void actionPerformed(ActionEvent e){
+                removeButtonActionPerformed(e);
+            }
+        };
+
+        JButton addButton = GUIUtility.createButton(messages, "addpackage", addAction);
+        JButton removeButton = GUIUtility.createButton(messages, "removepackage", removeAction);
+        removeAction.setEnabled(false);
+
+        final JPopupMenu popup = new JPopupMenu();
+        popup.add(GUIUtility.createJMenuItem(messages, "addpackage", addAction));
+        popup.add(GUIUtility.createJMenuItem(messages, "removepackage", removeAction));
+
+        setLayout(new BorderLayout());
+
+        scroll.setViewportView(list);
+        south.add(Box.createHorizontalGlue());
+        south.add(addButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(removeButton);
+        south.add(Box.createHorizontalGlue());
+
+        list.addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent evt){
+                listValueChanged(evt);
+            }
+        });
+
+        list.addMouseListener(new PopupShowAction(popup));
+
+        add(scroll, java.awt.BorderLayout.CENTER);
+        add(south, BorderLayout.SOUTH);
+    }
+
+    private void listValueChanged(ListSelectionEvent evt){
+        int[] indeces = list.getSelectedIndices();
+        removeAction.setEnabled(isEnabled() && indeces != null);
+    }
+
+    private void removeButtonActionPerformed(ActionEvent evt){
+        int[] indeces = list.getSelectedIndices();
+        if(indeces != null && indeces.length >= 1){
+            for(int i = indeces.length - 1; i >= 0; i--){
+                model.removeElementAt(indeces[i]);
+                fireEvent();
+            }
+        }
+        removeAction.setEnabled(false);
+    }
+
+    private class DataRemoveWhenDragSuccessfulAdapter extends DragSourceAdapter{
+        private DefaultListModel model;
+        private int[] indeces;
+
+        public DataRemoveWhenDragSuccessfulAdapter(DefaultListModel model,
+            int[] indeces){
+            this.model = model;
+            this.indeces = indeces;
+        }
+
+        @Override
+        public void dragDropEnd(DragSourceDropEvent dsde){
+            for(int i = indeces.length - 1; i >= 0; i--){
+                model.removeElementAt(indeces[i]);
+            }
+            fireEvent();
+            super.dragDropEnd(dsde);
+        }
+    };
+
+    private class TargetDragGestureListener implements DragGestureListener{
+        private JList list;
+
+        public TargetDragGestureListener(JList list, DefaultListModel model){
+            this.list = list;
+        }
+
+        public void dragGestureRecognized(DragGestureEvent dge){
+            int[] indeces = list.getSelectedIndices();
+            if(indeces.length > 0){
+                String[] strings = new String[indeces.length];
+                for(int i = 0; i < strings.length; i++){
+                    strings[i] = (String)model.getElementAt(indeces[i]);
+                }
+                Transferable transferable = new TargetTransferable(strings);
+                DragSourceListener listener = new DataRemoveWhenDragSuccessfulAdapter(
+                    model, indeces);
+
+                dge.startDrag(DragSource.DefaultMoveDrop, transferable,
+                    listener);
+            }
+        }
+    };
+
+    @SuppressWarnings("unchecked")
+    private class TargetSelectionDropTarget extends DropTarget{
+        private static final long serialVersionUID = 3204457621345L;
+
+        @Override
+        public void dragEnter(DropTargetDragEvent arg0){
+        }
+
+        @Override
+        public void dragExit(DropTargetEvent arg0){
+        }
+
+        @Override
+        public void dragOver(DropTargetDragEvent arg0){
+        }
+
+        @Override
+        public void drop(DropTargetDropEvent dtde){
+            dtde.acceptDrop(DnDConstants.ACTION_REFERENCE);
+            Transferable trans = dtde.getTransferable();
+            try{
+                if(trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){
+                    List list = (List)trans
+                        .getTransferData(DataFlavor.javaFileListFlavor);
+                    List<String> errorList = checkAndAddDroppedFile(list);
+                    if(errorList.size() > 0){
+                        showError(errorList);
+                    }
+                }
+            } catch(UnsupportedFlavorException e){
+            } catch(IOException e){
+            }
+        }
+
+        @Override
+        public void dropActionChanged(DropTargetDragEvent arg0){
+        }
+
+        private List<String> checkAndAddDroppedFile(List list){
+            List<String> errorList = new ArrayList<String>();
+
+            FileFilter[] filters = getFileFilters();
+            for(int i = 0; i < list.size(); i++){
+                File file = (File)list.get(i);
+                boolean neverAddedFlag = true;
+                for(FileFilter filter: filters){
+                    if(filter.accept(file)){
+                        addValue(file.getPath());
+                        neverAddedFlag = false;
+                    }
+                }
+                if(neverAddedFlag){
+                    errorList.add(file.getName());
+                }
+            }
+            return errorList;
+        }
+
+        private void showError(List<String> errorList){
+            StringBuilder builder = new StringBuilder("<html><body>");
+            builder.append(stigmata.getMessages().get("unsupportedfiletype.dialog.message"));
+            builder.append("<ul>");
+            for(int i = 0; i < errorList.size(); i++){
+                builder.append("<li>").append(errorList.get(i)).append("</li>");
+            }
+            builder.append("</ul></body></html>");
+            JOptionPane.showMessageDialog(
+                TargetSelectionPane.this, new String(builder),
+                stigmata.getMessages().get("unsupportedfiletype.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+        }
+    };
+
+    private class TargetTransferable implements Transferable{
+        private String[] strings;
+
+        public TargetTransferable(String[] strings){
+            this.strings = strings;
+        }
+
+        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException,
+                                                        IOException{
+            List<File> list = new ArrayList<File>();
+            for(int i = 0; i < strings.length; i++){
+                list.add(new File(strings[i]));
+            }
+            return list;
+        }
+
+        public DataFlavor[] getTransferDataFlavors(){
+            return new DataFlavor[] { DataFlavor.javaFileListFlavor, };
+        }
+
+        public boolean isDataFlavorSupported(DataFlavor flavor){
+            return flavor.equals(DataFlavor.javaFileListFlavor);
+        }
+    }
+}
@@ -1,29 +1,29 @@
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class UnsupportedFormatException extends Exception{\r
-    private static final long serialVersionUID = 8165384564671102575L;\r
-\r
-    public UnsupportedFormatException(){\r
-    }\r
-\r
-    public UnsupportedFormatException(String message){\r
-        super(message);\r
-    }\r
-\r
-    public UnsupportedFormatException(Throwable cause){\r
-        super(cause);\r
-    }\r
-\r
-    public UnsupportedFormatException(String message, Throwable cause){\r
-        super(message, cause);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class UnsupportedFormatException extends Exception{
+    private static final long serialVersionUID = 8165384564671102575L;
+
+    public UnsupportedFormatException(){
+    }
+
+    public UnsupportedFormatException(String message){
+        super(message);
+    }
+
+    public UnsupportedFormatException(Throwable cause){
+        super(cause);
+    }
+
+    public UnsupportedFormatException(String message, Throwable cause){
+        super(message, cause);
+    }
+}
-package jp.naist.se.stigmata.ui.swing;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.FlowLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.Action;\r
-import javax.swing.Box;\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JButton;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JComponent;\r
-import javax.swing.JLabel;\r
-import javax.swing.JList;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTextField;\r
-import javax.swing.border.TitledBorder;\r
-import javax.swing.event.DocumentEvent;\r
-import javax.swing.event.DocumentListener;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-\r
-import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;\r
-import jp.naist.se.stigmata.utils.WellknownClassJudgeRule;\r
-import jp.naist.se.stigmata.utils.WellknownClassManager;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * Well-known classes judge rules management pane.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class WellknownClassesSettingsPane extends JPanel{\r
-    private static final long serialVersionUID = 329734546345634532L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private WellknownClassManager manager;\r
-    private JList list;\r
-    private DefaultListModel listmodel;\r
-\r
-    private Map<String, String> matchTypeMap = new HashMap<String, String>();\r
-    private Map<String, String> partTypeMap = new HashMap<String, String>();\r
-\r
-    public WellknownClassesSettingsPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-        this.manager = stigmata.getEnvironment().getWellknownClassManager();\r
-\r
-        initLayouts();\r
-        initializeData();\r
-    }\r
-\r
-    public synchronized void setWellknownClasses(WellknownClassManager manager){\r
-        manager.clear();\r
-        for(int i = 0; i < listmodel.getSize(); i++){\r
-            WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(i);\r
-            manager.add(rule);\r
-        }\r
-    }\r
-\r
-    public synchronized WellknownClassManager createWellknownClassManager(){\r
-        WellknownClassManager manager = new WellknownClassManager();\r
-        setWellknownClasses(manager);\r
-        return manager;\r
-    }\r
-\r
-    public void reset(){\r
-        listmodel.clear();\r
-        initializeData();\r
-    }\r
-\r
-    private synchronized boolean isWellknownClass(String className){\r
-        WellknownClassManager manager = createWellknownClassManager();\r
-\r
-        return manager.isWellKnownClass(className);\r
-    }\r
-\r
-    private String findType(JComboBox combo, Map<String, String> map){\r
-        String item = (String)combo.getSelectedItem();\r
-        for(Map.Entry<String, String> entry: map.entrySet()){\r
-            if(item.equals(entry.getValue())){\r
-                return entry.getKey();\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public void addRule(WellknownClassJudgeRule rule){\r
-        if(rule != null){\r
-            listmodel.addElement(rule);\r
-            stigmata.setNeedToSaveSettings(true);\r
-        }\r
-    }\r
-\r
-    public void editRule(int index){\r
-        WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(index);\r
-        WellknownClassJudgeRule newrule = createOrUpdateRule(stigmata.getMessages(), rule);\r
-        if(newrule != null){\r
-            listmodel.setElementAt(newrule, index);\r
-            stigmata.setNeedToSaveSettings(true);\r
-        }\r
-    }\r
-\r
-\r
-    private void initializeData(){\r
-        for(WellknownClassJudgeRule rule : manager){\r
-            listmodel.addElement(rule);\r
-        }\r
-\r
-        for(WellknownClassJudgeRule.MatchType type: WellknownClassJudgeRule.MatchType.values()){\r
-            matchTypeMap.put(type.name(), stigmata.getMessages().get("matchtype." + type.name()));\r
-        }\r
-        for(WellknownClassJudgeRule.MatchPartType type: WellknownClassJudgeRule.MatchPartType.values()){\r
-            partTypeMap.put(type.name(), stigmata.getMessages().get("matchparttype." + type.name()));\r
-        }\r
-    }\r
-\r
-    private void initLayouts(){\r
-        setLayout(new BorderLayout());\r
-        JPanel center = new JPanel(new BorderLayout());\r
-        listmodel = new DefaultListModel();\r
-\r
-        list = new JList(listmodel);\r
-        JScrollPane scroll = new JScrollPane(list);\r
-\r
-        center.add(scroll, BorderLayout.CENTER);\r
-        center.add(createSouthPane(stigmata.getMessages()), BorderLayout.SOUTH);\r
-\r
-        add(center, BorderLayout.CENTER);\r
-        add(createCheckPane(stigmata.getMessages()), BorderLayout.SOUTH);\r
-    }\r
-\r
-    private JComponent createCheckPane(final Messages messages){\r
-        final JTextField text = new JTextField();\r
-        final JButton checkButton = GUIUtility.createButton(messages, "checkwellknown");\r
-        final JLabel label = new JLabel(GUIUtility.getIcon(messages, "wellknownclasschecker.default.icon"));\r
-        checkButton.setEnabled(false);\r
-\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                String t = text.getText().trim();\r
-                if(t.length() > 0){\r
-                    String message = messages.get("wellknownclasschecker.wellknown.tooltip");\r
-                    if(isWellknownClass(t)){\r
-                        label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.wellknown.icon"));\r
-                    }\r
-                    else{\r
-                        label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.notwellknown.icon"));\r
-                        message = messages.get("wellknownclasschecker.notwellknown.tooltip");\r
-                    }\r
-                    label.setToolTipText(message);\r
-                    String dm = String.format(\r
-                        "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message\r
-                    );\r
-                    JOptionPane.showMessageDialog(\r
-                        stigmata, dm, stigmata.getMessages().get("wellknownclasschecker.dialog.title"),\r
-                        JOptionPane.INFORMATION_MESSAGE\r
-                    );\r
-                }\r
-            }\r
-        };\r
-        checkButton.addActionListener(listener);\r
-        text.addActionListener(listener);\r
-        text.getDocument().addDocumentListener(new DocumentListener(){\r
-            public void changedUpdate(DocumentEvent arg0){\r
-                checkButton.setEnabled(text.getText().trim().length() > 0);\r
-            }\r
-\r
-            public void insertUpdate(DocumentEvent arg0){\r
-                checkButton.setEnabled(text.getText().trim().length() > 0);\r
-            }\r
-\r
-            public void removeUpdate(DocumentEvent arg0){\r
-                checkButton.setEnabled(text.getText().trim().length() > 0);\r
-            }\r
-        });\r
-\r
-        JComponent south = Box.createHorizontalBox();\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(text);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(checkButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(label);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        south.setBorder(new TitledBorder(stigmata.getMessages().get("wellknownclasschecker.border")));\r
-\r
-        return south;\r
-    }\r
-\r
-    private JComponent createSouthPane(final Messages messages){\r
-        JComponent southPanel = Box.createHorizontalBox();\r
-        Action addAction = new AbstractAction(){\r
-            private static final long serialVersionUID = -8749957850400877529L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                addRule(createOrUpdateRule(messages, null));\r
-            }\r
-        };\r
-        final Action removeAction = new AbstractAction(){\r
-            private static final long serialVersionUID = 8776209200186477040L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                int[] indeces = list.getSelectedIndices();\r
-                for(int i = indeces.length - 1; i >= 0; i--){\r
-                    listmodel.removeElementAt(indeces[i]);\r
-                }\r
-                list.getSelectionModel().clearSelection();\r
-                stigmata.setNeedToSaveSettings(true);\r
-            }\r
-        };\r
-        final Action updateAction = new AbstractAction(){\r
-            private static final long serialVersionUID = 852965501722574084L;\r
-\r
-            public void actionPerformed(ActionEvent e){\r
-                editRule(list.getSelectedIndex());\r
-            }\r
-        };\r
-        JButton addButton = GUIUtility.createButton(messages, "addwellknown", addAction);\r
-        JButton removeButton = GUIUtility.createButton(messages, "removewellknown", removeAction);\r
-        JButton updateButton = GUIUtility.createButton(messages, "updatewellknown", updateAction);\r
-        removeAction.setEnabled(false);\r
-        updateAction.setEnabled(false);\r
-\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(addButton);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(updateButton);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(removeButton);\r
-        southPanel.add(Box.createHorizontalGlue());\r
-\r
-        list.addMouseListener(new MouseAdapter(){\r
-            @Override\r
-            public void mouseClicked(MouseEvent e){\r
-                if(e.getClickCount() == 2){\r
-                    editRule(list.getSelectedIndex());\r
-                }\r
-            }\r
-        });\r
-        JPopupMenu popup = new JPopupMenu();\r
-        popup.add(GUIUtility.createJMenuItem(messages, "addwellknown", addAction));\r
-        popup.add(GUIUtility.createJMenuItem(messages, "updatewellknown", updateAction));\r
-        popup.add(GUIUtility.createJMenuItem(messages, "removewellknown", removeAction));\r
-\r
-        list.addMouseListener(new PopupShowAction(popup));\r
-        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent arg0){\r
-                int[] indeces = list.getSelectedIndices();\r
-                removeAction.setEnabled(indeces != null && indeces.length > 0);\r
-                updateAction.setEnabled(indeces != null && indeces.length == 1);\r
-            }\r
-        });\r
-\r
-        return southPanel;\r
-    }\r
-\r
-    private WellknownClassJudgeRule createOrUpdateRule(Messages messages, WellknownClassJudgeRule rule){\r
-        JTextField text = new JTextField();\r
-        text.setOpaque(true);\r
-        GUIUtility.decorateJComponent(messages, text, "addwellknown.newrule.pattern");\r
-        JCheckBox excludeCheck = new JCheckBox(messages.get("addwellknown.newrule.exclude.label"), false);\r
-        GUIUtility.decorateJComponent(messages, excludeCheck, "addwellknown.newrule.exclude");\r
-        JComboBox matchTypeComboBox = new JComboBox();\r
-        for(Map.Entry<String, String> entry: matchTypeMap.entrySet()){\r
-            matchTypeComboBox.addItem(entry.getValue());\r
-        }\r
-        JComboBox partTypeComboBox = new JComboBox();\r
-        for(Map.Entry<String, String> entry: partTypeMap.entrySet()){\r
-            partTypeComboBox.addItem(entry.getValue());\r
-        }\r
-        if(rule != null){\r
-            text.setText(rule.getPattern());\r
-            excludeCheck.setSelected(rule.isExclude());\r
-            matchTypeComboBox.setSelectedItem(matchTypeMap.get(rule.getMatchType().name()));\r
-            partTypeComboBox.setSelectedItem(partTypeMap.get(rule.getMatchPartType().name()));\r
-        }\r
-\r
-        JPanel panel = new JPanel(new BorderLayout());\r
-        panel.setOpaque(true);\r
-        JPanel centerPanel = new JPanel(new FlowLayout());\r
-\r
-        centerPanel.add(partTypeComboBox);\r
-        centerPanel.add(matchTypeComboBox);\r
-\r
-        panel.add(excludeCheck, BorderLayout.NORTH);\r
-        panel.add(centerPanel, BorderLayout.CENTER);\r
-        panel.add(text, BorderLayout.SOUTH);\r
-\r
-        int value = JOptionPane.showConfirmDialog(\r
-            stigmata, panel, stigmata.getMessages().get("addwellknown.dialog.title"),\r
-            JOptionPane.OK_CANCEL_OPTION\r
-        );\r
-        if(value == JOptionPane.OK_OPTION){\r
-            String matchType = findType(matchTypeComboBox, matchTypeMap);\r
-            String partType = findType(partTypeComboBox, partTypeMap);\r
-            WellknownClassJudgeRule.MatchType match = null;\r
-            WellknownClassJudgeRule.MatchPartType part = null;\r
-            String pattern = text.getText();\r
-            boolean excludeFlag = excludeCheck.isSelected();\r
-\r
-            if(matchType != null && partType != null){\r
-                match = WellknownClassJudgeRule.MatchType.valueOf(matchType);\r
-                part = WellknownClassJudgeRule.MatchPartType.valueOf(partType);\r
-            }\r
-\r
-            if(match != null && partType != null && pattern != null && !pattern.equals("")){\r
-                return new WellknownClassJudgeRule(pattern, match, part, excludeFlag);\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
+import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule;
+import jp.sourceforge.stigmata.utils.WellknownClassManager;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * Well-known classes judge rules management pane.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class WellknownClassesSettingsPane extends JPanel{
+    private static final long serialVersionUID = 329734546345634532L;
+
+    private StigmataFrame stigmata;
+    private WellknownClassManager manager;
+    private JList list;
+    private DefaultListModel listmodel;
+
+    private Map<String, String> matchTypeMap = new HashMap<String, String>();
+    private Map<String, String> partTypeMap = new HashMap<String, String>();
+
+    public WellknownClassesSettingsPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+        this.manager = stigmata.getEnvironment().getWellknownClassManager();
+
+        initLayouts();
+        initializeData();
+    }
+
+    public synchronized void setWellknownClasses(WellknownClassManager manager){
+        manager.clear();
+        for(int i = 0; i < listmodel.getSize(); i++){
+            WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(i);
+            manager.add(rule);
+        }
+    }
+
+    public synchronized WellknownClassManager createWellknownClassManager(){
+        WellknownClassManager manager = new WellknownClassManager();
+        setWellknownClasses(manager);
+        return manager;
+    }
+
+    public void reset(){
+        listmodel.clear();
+        initializeData();
+    }
+
+    private synchronized boolean isWellknownClass(String className){
+        WellknownClassManager manager = createWellknownClassManager();
+
+        return manager.isWellKnownClass(className);
+    }
+
+    private String findType(JComboBox combo, Map<String, String> map){
+        String item = (String)combo.getSelectedItem();
+        for(Map.Entry<String, String> entry: map.entrySet()){
+            if(item.equals(entry.getValue())){
+                return entry.getKey();
+            }
+        }
+        return null;
+    }
+
+    public void addRule(WellknownClassJudgeRule rule){
+        if(rule != null){
+            listmodel.addElement(rule);
+            stigmata.setNeedToSaveSettings(true);
+        }
+    }
+
+    public void editRule(int index){
+        WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(index);
+        WellknownClassJudgeRule newrule = createOrUpdateRule(stigmata.getMessages(), rule);
+        if(newrule != null){
+            listmodel.setElementAt(newrule, index);
+            stigmata.setNeedToSaveSettings(true);
+        }
+    }
+
+
+    private void initializeData(){
+        for(WellknownClassJudgeRule rule : manager){
+            listmodel.addElement(rule);
+        }
+
+        for(WellknownClassJudgeRule.MatchType type: WellknownClassJudgeRule.MatchType.values()){
+            matchTypeMap.put(type.name(), stigmata.getMessages().get("matchtype." + type.name()));
+        }
+        for(WellknownClassJudgeRule.MatchPartType type: WellknownClassJudgeRule.MatchPartType.values()){
+            partTypeMap.put(type.name(), stigmata.getMessages().get("matchparttype." + type.name()));
+        }
+    }
+
+    private void initLayouts(){
+        setLayout(new BorderLayout());
+        JPanel center = new JPanel(new BorderLayout());
+        listmodel = new DefaultListModel();
+
+        list = new JList(listmodel);
+        JScrollPane scroll = new JScrollPane(list);
+
+        center.add(scroll, BorderLayout.CENTER);
+        center.add(createSouthPane(stigmata.getMessages()), BorderLayout.SOUTH);
+
+        add(center, BorderLayout.CENTER);
+        add(createCheckPane(stigmata.getMessages()), BorderLayout.SOUTH);
+    }
+
+    private JComponent createCheckPane(final Messages messages){
+        final JTextField text = new JTextField();
+        final JButton checkButton = GUIUtility.createButton(messages, "checkwellknown");
+        final JLabel label = new JLabel(GUIUtility.getIcon(messages, "wellknownclasschecker.default.icon"));
+        checkButton.setEnabled(false);
+
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                String t = text.getText().trim();
+                if(t.length() > 0){
+                    String message = messages.get("wellknownclasschecker.wellknown.tooltip");
+                    if(isWellknownClass(t)){
+                        label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.wellknown.icon"));
+                    }
+                    else{
+                        label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.notwellknown.icon"));
+                        message = messages.get("wellknownclasschecker.notwellknown.tooltip");
+                    }
+                    label.setToolTipText(message);
+                    String dm = String.format(
+                        "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message
+                    );
+                    JOptionPane.showMessageDialog(
+                        stigmata, dm, stigmata.getMessages().get("wellknownclasschecker.dialog.title"),
+                        JOptionPane.INFORMATION_MESSAGE
+                    );
+                }
+            }
+        };
+        checkButton.addActionListener(listener);
+        text.addActionListener(listener);
+        text.getDocument().addDocumentListener(new DocumentListener(){
+            public void changedUpdate(DocumentEvent arg0){
+                checkButton.setEnabled(text.getText().trim().length() > 0);
+            }
+
+            public void insertUpdate(DocumentEvent arg0){
+                checkButton.setEnabled(text.getText().trim().length() > 0);
+            }
+
+            public void removeUpdate(DocumentEvent arg0){
+                checkButton.setEnabled(text.getText().trim().length() > 0);
+            }
+        });
+
+        JComponent south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(text);
+        south.add(Box.createHorizontalGlue());
+        south.add(checkButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(label);
+        south.add(Box.createHorizontalGlue());
+
+        south.setBorder(new TitledBorder(stigmata.getMessages().get("wellknownclasschecker.border")));
+
+        return south;
+    }
+
+    private JComponent createSouthPane(final Messages messages){
+        JComponent southPanel = Box.createHorizontalBox();
+        Action addAction = new AbstractAction(){
+            private static final long serialVersionUID = -8749957850400877529L;
+
+            public void actionPerformed(ActionEvent e){
+                addRule(createOrUpdateRule(messages, null));
+            }
+        };
+        final Action removeAction = new AbstractAction(){
+            private static final long serialVersionUID = 8776209200186477040L;
+
+            public void actionPerformed(ActionEvent e){
+                int[] indeces = list.getSelectedIndices();
+                for(int i = indeces.length - 1; i >= 0; i--){
+                    listmodel.removeElementAt(indeces[i]);
+                }
+                list.getSelectionModel().clearSelection();
+                stigmata.setNeedToSaveSettings(true);
+            }
+        };
+        final Action updateAction = new AbstractAction(){
+            private static final long serialVersionUID = 852965501722574084L;
+
+            public void actionPerformed(ActionEvent e){
+                editRule(list.getSelectedIndex());
+            }
+        };
+        JButton addButton = GUIUtility.createButton(messages, "addwellknown", addAction);
+        JButton removeButton = GUIUtility.createButton(messages, "removewellknown", removeAction);
+        JButton updateButton = GUIUtility.createButton(messages, "updatewellknown", updateAction);
+        removeAction.setEnabled(false);
+        updateAction.setEnabled(false);
+
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(addButton);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(updateButton);
+        southPanel.add(Box.createHorizontalGlue());
+        southPanel.add(removeButton);
+        southPanel.add(Box.createHorizontalGlue());
+
+        list.addMouseListener(new MouseAdapter(){
+            @Override
+            public void mouseClicked(MouseEvent e){
+                if(e.getClickCount() == 2){
+                    editRule(list.getSelectedIndex());
+                }
+            }
+        });
+        JPopupMenu popup = new JPopupMenu();
+        popup.add(GUIUtility.createJMenuItem(messages, "addwellknown", addAction));
+        popup.add(GUIUtility.createJMenuItem(messages, "updatewellknown", updateAction));
+        popup.add(GUIUtility.createJMenuItem(messages, "removewellknown", removeAction));
+
+        list.addMouseListener(new PopupShowAction(popup));
+        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent arg0){
+                int[] indeces = list.getSelectedIndices();
+                removeAction.setEnabled(indeces != null && indeces.length > 0);
+                updateAction.setEnabled(indeces != null && indeces.length == 1);
+            }
+        });
+
+        return southPanel;
+    }
+
+    private WellknownClassJudgeRule createOrUpdateRule(Messages messages, WellknownClassJudgeRule rule){
+        JTextField text = new JTextField();
+        text.setOpaque(true);
+        GUIUtility.decorateJComponent(messages, text, "addwellknown.newrule.pattern");
+        JCheckBox excludeCheck = new JCheckBox(messages.get("addwellknown.newrule.exclude.label"), false);
+        GUIUtility.decorateJComponent(messages, excludeCheck, "addwellknown.newrule.exclude");
+        JComboBox matchTypeComboBox = new JComboBox();
+        for(Map.Entry<String, String> entry: matchTypeMap.entrySet()){
+            matchTypeComboBox.addItem(entry.getValue());
+        }
+        JComboBox partTypeComboBox = new JComboBox();
+        for(Map.Entry<String, String> entry: partTypeMap.entrySet()){
+            partTypeComboBox.addItem(entry.getValue());
+        }
+        if(rule != null){
+            text.setText(rule.getPattern());
+            excludeCheck.setSelected(rule.isExclude());
+            matchTypeComboBox.setSelectedItem(matchTypeMap.get(rule.getMatchType().name()));
+            partTypeComboBox.setSelectedItem(partTypeMap.get(rule.getMatchPartType().name()));
+        }
+
+        JPanel panel = new JPanel(new BorderLayout());
+        panel.setOpaque(true);
+        JPanel centerPanel = new JPanel(new FlowLayout());
+
+        centerPanel.add(partTypeComboBox);
+        centerPanel.add(matchTypeComboBox);
+
+        panel.add(excludeCheck, BorderLayout.NORTH);
+        panel.add(centerPanel, BorderLayout.CENTER);
+        panel.add(text, BorderLayout.SOUTH);
+
+        int value = JOptionPane.showConfirmDialog(
+            stigmata, panel, stigmata.getMessages().get("addwellknown.dialog.title"),
+            JOptionPane.OK_CANCEL_OPTION
+        );
+        if(value == JOptionPane.OK_OPTION){
+            String matchType = findType(matchTypeComboBox, matchTypeMap);
+            String partType = findType(partTypeComboBox, partTypeMap);
+            WellknownClassJudgeRule.MatchType match = null;
+            WellknownClassJudgeRule.MatchPartType part = null;
+            String pattern = text.getText();
+            boolean excludeFlag = excludeCheck.isSelected();
+
+            if(matchType != null && partType != null){
+                match = WellknownClassJudgeRule.MatchType.valueOf(matchType);
+                part = WellknownClassJudgeRule.MatchPartType.valueOf(partType);
+            }
+
+            if(match != null && partType != null && pattern != null && !pattern.equals("")){
+                return new WellknownClassJudgeRule(pattern, match, part, excludeFlag);
+            }
+        }
+        return null;
+    }
+}
@@ -1,54 +1,54 @@
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-\r
-import javax.swing.JLabel;\r
-import javax.swing.JPanel;\r
-\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class AboutAction extends ShowTextAction{\r
-    private static final long serialVersionUID = -7060581883871662749L;\r
-\r
-    public AboutAction(StigmataFrame stigmata){\r
-        super(stigmata);\r
-    }\r
-\r
-    @Override\r
-    public boolean isHtmlDocument(){\r
-        return true;\r
-    }\r
-\r
-    @Override\r
-    public String getTitle(){\r
-        return getMessages().get("about.dialog.title");\r
-    }\r
-\r
-    @Override\r
-    public String getMessage(){\r
-        String aboutMessage = loadStringFromFile(GUIUtility.getResource(getMessages(), "about.message.file"));\r
-\r
-        Package p = getClass().getPackage();\r
-        aboutMessage = aboutMessage.replace("${implementation.version}", p.getImplementationVersion());\r
-        aboutMessage = aboutMessage.replace("${implementation.vendor}",  p.getImplementationVendor());\r
-        aboutMessage = aboutMessage.replace("${implementation.title}",   p.getImplementationTitle());\r
-\r
-        return aboutMessage;\r
-    }\r
-\r
-    @Override\r
-    protected void updatePanel(JPanel panel){\r
-        JLabel logo = new JLabel(GUIUtility.getIcon(getMessages(), "stigmata.logo"));\r
-        panel.add(logo, BorderLayout.NORTH);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class AboutAction extends ShowTextAction{
+    private static final long serialVersionUID = -7060581883871662749L;
+
+    public AboutAction(StigmataFrame stigmata){
+        super(stigmata);
+    }
+
+    @Override
+    public boolean isHtmlDocument(){
+        return true;
+    }
+
+    @Override
+    public String getTitle(){
+        return getMessages().get("about.dialog.title");
+    }
+
+    @Override
+    public String getMessage(){
+        String aboutMessage = loadStringFromFile(GUIUtility.getResource(getMessages(), "about.message.file"));
+
+        Package p = getClass().getPackage();
+        aboutMessage = aboutMessage.replace("${implementation.version}", p.getImplementationVersion());
+        aboutMessage = aboutMessage.replace("${implementation.vendor}",  p.getImplementationVendor());
+        aboutMessage = aboutMessage.replace("${implementation.title}",   p.getImplementationTitle());
+
+        return aboutMessage;
+    }
+
+    @Override
+    protected void updatePanel(JPanel panel){
+        JLabel logo = new JLabel(GUIUtility.getIcon(getMessages(), "stigmata.logo"));
+        panel.add(logo, BorderLayout.NORTH);
+    }
+}
@@ -1,79 +1,79 @@
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Color;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.JColorChooser;\r
-import javax.swing.JDialog;\r
-\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ChangeColorAction extends AbstractAction{\r
-    private static final long serialVersionUID = -7617597154707466764L;\r
-\r
-    private StigmataFrame frame;\r
-    private Color currentColor = Color.RED;\r
-    private JColorChooser chooser;\r
-    private boolean colorSelected = false;\r
-    private ActionListener listener;\r
-\r
-    public ChangeColorAction(String label, StigmataFrame frame, \r
-                              Color initialColor, ActionListener listener){\r
-        super(frame.getMessages().get(label + ".label"), GUIUtility.getIcon(frame.getMessages(), label + ".icon"));\r
-        this.frame = frame;\r
-        this.listener = listener;\r
-        this.currentColor = initialColor;\r
-\r
-        chooser = new JColorChooser();\r
-        chooser.setColor(initialColor);\r
-    }\r
-\r
-    public ChangeColorAction(StigmataFrame frame, Color color, ActionListener listener){\r
-        this("changecolor", frame, color, listener);\r
-    }\r
-\r
-    public ChangeColorAction(StigmataFrame frame, ActionListener listener){\r
-        this(frame, Color.RED, listener);\r
-    }\r
-\r
-    public boolean isColorSelected(){\r
-        return colorSelected;\r
-    }\r
-\r
-    public Color getColor(){\r
-        return currentColor;\r
-    }\r
-\r
-    public void actionPerformed(ActionEvent e){\r
-        chooser.setColor(currentColor);\r
-        JDialog dialog = JColorChooser.createDialog(\r
-            frame, frame.getMessages().get("changecolor.title"), \r
-            true, chooser,\r
-            new ActionListener(){ // ok\r
-                public void actionPerformed(ActionEvent e){\r
-                    currentColor = chooser.getColor();\r
-                    colorSelected = true;\r
-                    listener.actionPerformed(new ActionEvent(ChangeColorAction.this, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers()));\r
-                }\r
-            },\r
-            new ActionListener(){ // cancel\r
-                public void actionPerformed(ActionEvent e){\r
-                    colorSelected = false;\r
-                }\r
-            }\r
-        );\r
-        dialog.setVisible(true);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.JColorChooser;
+import javax.swing.JDialog;
+
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ChangeColorAction extends AbstractAction{
+    private static final long serialVersionUID = -7617597154707466764L;
+
+    private StigmataFrame frame;
+    private Color currentColor = Color.RED;
+    private JColorChooser chooser;
+    private boolean colorSelected = false;
+    private ActionListener listener;
+
+    public ChangeColorAction(String label, StigmataFrame frame, 
+                              Color initialColor, ActionListener listener){
+        super(frame.getMessages().get(label + ".label"), GUIUtility.getIcon(frame.getMessages(), label + ".icon"));
+        this.frame = frame;
+        this.listener = listener;
+        this.currentColor = initialColor;
+
+        chooser = new JColorChooser();
+        chooser.setColor(initialColor);
+    }
+
+    public ChangeColorAction(StigmataFrame frame, Color color, ActionListener listener){
+        this("changecolor", frame, color, listener);
+    }
+
+    public ChangeColorAction(StigmataFrame frame, ActionListener listener){
+        this(frame, Color.RED, listener);
+    }
+
+    public boolean isColorSelected(){
+        return colorSelected;
+    }
+
+    public Color getColor(){
+        return currentColor;
+    }
+
+    public void actionPerformed(ActionEvent e){
+        chooser.setColor(currentColor);
+        JDialog dialog = JColorChooser.createDialog(
+            frame, frame.getMessages().get("changecolor.title"), 
+            true, chooser,
+            new ActionListener(){ // ok
+                public void actionPerformed(ActionEvent e){
+                    currentColor = chooser.getColor();
+                    colorSelected = true;
+                    listener.actionPerformed(new ActionEvent(ChangeColorAction.this, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers()));
+                }
+            },
+            new ActionListener(){ // cancel
+                public void actionPerformed(ActionEvent e){
+                    colorSelected = false;
+                }
+            }
+        );
+        dialog.setVisible(true);
+    }
+}
@@ -1,28 +1,28 @@
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class LicenseAction extends ShowTextAction{\r
-    private static final long serialVersionUID = 7727665273988881423L;\r
-\r
-    public LicenseAction(StigmataFrame parent){\r
-        super(parent);\r
-    }\r
-\r
-    public String getTitle(){\r
-        return getMessages().get("license.dialog.title");\r
-    }\r
-\r
-    public String getMessage(){\r
-        return loadStringFromFile(GUIUtility.getResource(getMessages(), "license.file"));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class LicenseAction extends ShowTextAction{
+    private static final long serialVersionUID = 7727665273988881423L;
+
+    public LicenseAction(StigmataFrame parent){
+        super(parent);
+    }
+
+    public String getTitle(){
+        return getMessages().get("license.dialog.title");
+    }
+
+    public String getMessage(){
+        return loadStringFromFile(GUIUtility.getResource(getMessages(), "license.file"));
+    }
+}
@@ -1,39 +1,39 @@
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.lang.reflect.Method;\r
-import java.net.URL;\r
-\r
-import javax.swing.event.HyperlinkEvent;\r
-import javax.swing.event.HyperlinkListener;\r
-\r
-/**\r
- *\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-class LinkFollower implements HyperlinkListener{\r
-    public void hyperlinkUpdate(HyperlinkEvent e){\r
-        if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){\r
-            URL url = null;\r
-            try{\r
-                url = e.getURL();\r
-                browse(url);\r
-            } catch(RuntimeException ee){\r
-                throw ee;\r
-            } catch(Exception ee){\r
-                ee.printStackTrace();\r
-            }\r
-        }\r
-    }\r
-\r
-    private void browse(URL url) throws Exception{\r
-        Class<?> c = Class.forName("edu.stanford.ejalbert.BrowserLauncher");\r
-        Object o = c.newInstance();\r
-        Method m = c.getMethod("openURLinBrowser", String.class);\r
-        m.invoke(o, url.toString());\r
-    }\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+/*
+ * $Id$
+ */
+
+import java.lang.reflect.Method;
+import java.net.URL;
+
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+
+/**
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+class LinkFollower implements HyperlinkListener{
+    public void hyperlinkUpdate(HyperlinkEvent e){
+        if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
+            URL url = null;
+            try{
+                url = e.getURL();
+                browse(url);
+            } catch(RuntimeException ee){
+                throw ee;
+            } catch(Exception ee){
+                ee.printStackTrace();
+            }
+        }
+    }
+
+    private void browse(URL url) throws Exception{
+        Class<?> c = Class.forName("edu.stanford.ejalbert.BrowserLauncher");
+        Object o = c.newInstance();
+        Method m = c.getMethod("openURLinBrowser", String.class);
+        m.invoke(o, url.toString());
+    }
 }
\ No newline at end of file
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.event.ActionEvent;\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
-import java.io.OutputStream;\r
-import java.io.PrintWriter;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.JOptionPane;\r
-\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.ui.swing.UnsupportedFormatException;\r
-import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
-import jp.naist.se.stigmata.utils.BinaryDataWritable;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SaveAction extends AbstractAction{\r
-    private static final long serialVersionUID = 1427912047636729211L;\r
-\r
-    private AsciiDataWritable asciiWritable;\r
-    private BinaryDataWritable binaryWritable;\r
-    private StigmataFrame stigmata;\r
-    private String[] extensions;\r
-    private String description;\r
-\r
-    public SaveAction(StigmataFrame stigmata, AsciiDataWritable writable){\r
-        this.stigmata = stigmata;\r
-        this.asciiWritable = writable;\r
-    }\r
-\r
-    public SaveAction(StigmataFrame stigmata, BinaryDataWritable writable){\r
-        this.stigmata = stigmata;\r
-        this.binaryWritable = writable;\r
-    }\r
-\r
-    public void setExtensions(String[] extensions){\r
-        this.extensions = extensions;\r
-    }\r
-\r
-    public void setDescrpition(String description){\r
-        this.description = description;\r
-    }\r
-\r
-    public void actionPerformed(ActionEvent e){\r
-        if(extensions == null || description == null){\r
-            extensions = stigmata.getMessages().getArray("store.extensions");\r
-            description = stigmata.getMessages().get("store.description");\r
-        }\r
-        File file = stigmata.getSaveFile(extensions, description);\r
-        if(file != null){\r
-            String name = file.getName();\r
-            String format = name.substring(name.lastIndexOf('.') + 1, name.length());\r
-\r
-            OutputStream out = null;\r
-            PrintWriter writer = null;\r
-            try{\r
-                if(asciiWritable != null){\r
-                    writer = new PrintWriter(new FileWriter(file));\r
-                    asciiWritable.writeAsciiData(writer, format);\r
-                }\r
-                else{\r
-                    out = new BufferedOutputStream(new FileOutputStream(file));\r
-                    binaryWritable.writeBinaryData(out, format);\r
-                }\r
-            }catch(IOException ee){\r
-                JOptionPane.showMessageDialog(\r
-                    stigmata, ee.getMessage(), stigmata.getMessages().get("error.dialog.title"),\r
-                    JOptionPane.ERROR_MESSAGE\r
-                );\r
-            }catch(UnsupportedFormatException ee){\r
-                JOptionPane.showMessageDialog(\r
-                    stigmata, ee.getMessage(), stigmata.getMessages().get("error.dialog.title"),\r
-                    JOptionPane.ERROR_MESSAGE\r
-                );\r
-            }finally{\r
-                if(out != null){\r
-                    try{\r
-                        out.close();\r
-                    } catch(IOException ee){\r
-                        throw new InternalError(ee.getMessage());\r
-                    }\r
-                }\r
-                if(writer != null){\r
-                    writer.close();\r
-                }\r
-            }\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+/*
+ * $Id$
+ */
+
+import java.awt.event.ActionEvent;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+import javax.swing.AbstractAction;
+import javax.swing.JOptionPane;
+
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.stigmata.ui.swing.UnsupportedFormatException;
+import jp.sourceforge.stigmata.utils.AsciiDataWritable;
+import jp.sourceforge.stigmata.utils.BinaryDataWritable;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SaveAction extends AbstractAction{
+    private static final long serialVersionUID = 1427912047636729211L;
+
+    private AsciiDataWritable asciiWritable;
+    private BinaryDataWritable binaryWritable;
+    private StigmataFrame stigmata;
+    private String[] extensions;
+    private String description;
+
+    public SaveAction(StigmataFrame stigmata, AsciiDataWritable writable){
+        this.stigmata = stigmata;
+        this.asciiWritable = writable;
+    }
+
+    public SaveAction(StigmataFrame stigmata, BinaryDataWritable writable){
+        this.stigmata = stigmata;
+        this.binaryWritable = writable;
+    }
+
+    public void setExtensions(String[] extensions){
+        this.extensions = extensions;
+    }
+
+    public void setDescrpition(String description){
+        this.description = description;
+    }
+
+    public void actionPerformed(ActionEvent e){
+        if(extensions == null || description == null){
+            extensions = stigmata.getMessages().getArray("store.extensions");
+            description = stigmata.getMessages().get("store.description");
+        }
+        File file = stigmata.getSaveFile(extensions, description);
+        if(file != null){
+            String name = file.getName();
+            String format = name.substring(name.lastIndexOf('.') + 1, name.length());
+
+            OutputStream out = null;
+            PrintWriter writer = null;
+            try{
+                if(asciiWritable != null){
+                    writer = new PrintWriter(new FileWriter(file));
+                    asciiWritable.writeAsciiData(writer, format);
+                }
+                else{
+                    out = new BufferedOutputStream(new FileOutputStream(file));
+                    binaryWritable.writeBinaryData(out, format);
+                }
+            }catch(IOException ee){
+                JOptionPane.showMessageDialog(
+                    stigmata, ee.getMessage(), stigmata.getMessages().get("error.dialog.title"),
+                    JOptionPane.ERROR_MESSAGE
+                );
+            }catch(UnsupportedFormatException ee){
+                JOptionPane.showMessageDialog(
+                    stigmata, ee.getMessage(), stigmata.getMessages().get("error.dialog.title"),
+                    JOptionPane.ERROR_MESSAGE
+                );
+            }finally{
+                if(out != null){
+                    try{
+                        out.close();
+                    } catch(IOException ee){
+                        throw new InternalError(ee.getMessage());
+                    }
+                }
+                if(writer != null){
+                    writer.close();
+                }
+            }
+        }
+    }
+}
@@ -1,99 +1,99 @@
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Dimension;\r
-import java.awt.event.ActionEvent;\r
-import java.io.BufferedReader;\r
-import java.io.IOException;\r
-import java.io.InputStreamReader;\r
-import java.io.PrintWriter;\r
-import java.io.StringWriter;\r
-import java.net.URL;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.JEditorPane;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-abstract class ShowTextAction extends AbstractAction{\r
-    private StigmataFrame parent;\r
-\r
-    public ShowTextAction(StigmataFrame parent){\r
-        this.parent = parent;\r
-    }\r
-\r
-    public abstract String getMessage();\r
-\r
-    protected void updatePanel(JPanel panel){\r
-    }\r
-\r
-    public abstract String getTitle();\r
-\r
-    public boolean isHtmlDocument(){\r
-        return false;\r
-    }\r
-\r
-    public Messages getMessages(){\r
-        return parent.getMessages();\r
-    }\r
-\r
-    public void actionPerformed(ActionEvent e){\r
-        String message = getMessage();\r
-        JPanel panel = new JPanel(new BorderLayout());\r
-        JScrollPane scroll = new JScrollPane();\r
-        String mimeType = "text/plain";\r
-        if(isHtmlDocument()){\r
-            mimeType = "text/html";\r
-        }\r
-        JEditorPane text = new JEditorPane(mimeType, message);\r
-        text.addHyperlinkListener(new LinkFollower());\r
-\r
-        text.setEditable(false);\r
-        text.setCaretPosition(0);\r
-        text.setBackground(panel.getBackground());\r
-        scroll.setViewportView(text);\r
-\r
-        panel.add(scroll, BorderLayout.CENTER);\r
-        panel.setPreferredSize(new Dimension(500, 300));\r
-\r
-        updatePanel(panel);\r
-\r
-        JOptionPane.showMessageDialog(\r
-            parent, panel, getTitle(),\r
-            JOptionPane.INFORMATION_MESSAGE\r
-        );\r
-    }\r
-\r
-    protected String loadStringFromFile(URL url){\r
-        try{\r
-            String line;\r
-            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));\r
-            StringWriter writer = new StringWriter();\r
-            PrintWriter out = new PrintWriter(writer);\r
-            while((line = in.readLine()) != null){\r
-                out.print(line);\r
-                out.println();\r
-            }\r
-            out.close();\r
-            in.close();\r
-\r
-            return writer.toString();\r
-        }catch(IOException e){\r
-            e.printStackTrace();\r
-        }\r
-        return null;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+
+import javax.swing.AbstractAction;
+import javax.swing.JEditorPane;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+abstract class ShowTextAction extends AbstractAction{
+    private StigmataFrame parent;
+
+    public ShowTextAction(StigmataFrame parent){
+        this.parent = parent;
+    }
+
+    public abstract String getMessage();
+
+    protected void updatePanel(JPanel panel){
+    }
+
+    public abstract String getTitle();
+
+    public boolean isHtmlDocument(){
+        return false;
+    }
+
+    public Messages getMessages(){
+        return parent.getMessages();
+    }
+
+    public void actionPerformed(ActionEvent e){
+        String message = getMessage();
+        JPanel panel = new JPanel(new BorderLayout());
+        JScrollPane scroll = new JScrollPane();
+        String mimeType = "text/plain";
+        if(isHtmlDocument()){
+            mimeType = "text/html";
+        }
+        JEditorPane text = new JEditorPane(mimeType, message);
+        text.addHyperlinkListener(new LinkFollower());
+
+        text.setEditable(false);
+        text.setCaretPosition(0);
+        text.setBackground(panel.getBackground());
+        scroll.setViewportView(text);
+
+        panel.add(scroll, BorderLayout.CENTER);
+        panel.setPreferredSize(new Dimension(500, 300));
+
+        updatePanel(panel);
+
+        JOptionPane.showMessageDialog(
+            parent, panel, getTitle(),
+            JOptionPane.INFORMATION_MESSAGE
+        );
+    }
+
+    protected String loadStringFromFile(URL url){
+        try{
+            String line;
+            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
+            StringWriter writer = new StringWriter();
+            PrintWriter out = new PrintWriter(writer);
+            while((line = in.readLine()) != null){
+                out.print(line);
+                out.println();
+            }
+            out.close();
+            in.close();
+
+            return writer.toString();
+        }catch(IOException e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
-package jp.naist.se.stigmata.ui.swing.actions;\r
-\r
-import java.awt.Color;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JColorChooser;\r
-import javax.swing.JComponent;\r
-import javax.swing.JLabel;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-\r
-import jp.naist.se.stigmata.BirthmarkEnvironment;\r
-import jp.naist.se.stigmata.ui.swing.CompareTableCellRenderer;\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-public class UpdateBirthmarkCellColorAction extends AbstractAction{\r
-    private static final long serialVersionUID = 2390797591047570440L;\r
-\r
-    private StigmataFrame parent;\r
-    private BirthmarkEnvironment environment;\r
-    private JColorChooser chooser;\r
-\r
-    public UpdateBirthmarkCellColorAction(StigmataFrame parent, BirthmarkEnvironment environment){\r
-        this.parent = parent;\r
-        this.environment = environment;\r
-    }\r
-\r
-    public UpdateBirthmarkCellColorAction(StigmataFrame parent){\r
-        this(parent, BirthmarkEnvironment.getDefaultEnvironment());\r
-    }\r
-\r
-    public void actionPerformed(ActionEvent e){\r
-        JComponent c = createPanel();\r
-        JOptionPane.showMessageDialog(\r
-            parent, c, parent.getMessages().get("updatecellcolor.dialog.title"),\r
-            JOptionPane.INFORMATION_MESSAGE\r
-        );\r
-    }\r
-\r
-    private JComponent createPanel(){\r
-        Box panel = Box.createVerticalBox();\r
-        for(int i = 0; i <= 5; i++){\r
-            Color fore = CompareTableCellRenderer.getForegroundColor(i, environment);\r
-            Color back = CompareTableCellRenderer.getBackgroundColor(i, environment);\r
-\r
-            UpdateColorPane pane = new UpdateColorPane(i, fore, back);\r
-            panel.add(pane);\r
-        }\r
-\r
-        return panel;\r
-    }\r
-\r
-    private Color updateColor(Color c, int rank, boolean foreground){\r
-        if(chooser == null){\r
-            chooser = new JColorChooser();\r
-        }\r
-        chooser.setColor(c);\r
-        String l = parent.getMessages().get((foreground? "forecolor_": "backcolor_") + rank + ".label");\r
-        int returnValue = JOptionPane.showConfirmDialog(\r
-            parent, chooser, parent.getMessages().get("updatecell.title", l),\r
-            JOptionPane.INFORMATION_MESSAGE\r
-        );\r
-        if(returnValue == JOptionPane.OK_OPTION){\r
-            c = chooser.getColor();\r
-        }\r
-\r
-        return c;\r
-    }\r
-\r
-    private class UpdateColorPane extends JPanel{\r
-        private static final long serialVersionUID = 8271684478406307685L;\r
-\r
-        private int rank;\r
-        private JLabel label;\r
-\r
-        public UpdateColorPane(int rank, Color fore, Color back){\r
-            this.rank = rank;\r
-            initLayouts();\r
-\r
-            label.setForeground(fore);\r
-            label.setBackground(back);\r
-        }\r
-\r
-        public int getRank(){\r
-            return rank;\r
-        }\r
-\r
-        private void initLayouts(){\r
-            label = new JLabel(parent.getMessages().get("rank_" + rank + ".label"));\r
-            label.setOpaque(true);\r
-            JButton fore = GUIUtility.createButton(parent.getMessages(), "updatecellfore");\r
-            JButton back = GUIUtility.createButton(parent.getMessages(), "updatecellback");\r
-\r
-            ActionListener listener = new ActionListener(){\r
-                public void actionPerformed(ActionEvent e){\r
-                    String command = e.getActionCommand();\r
-                    boolean foreground = command.equals("updatecellfore");\r
-\r
-                    Color c = label.getBackground();\r
-                    if(foreground){\r
-                        c = label.getForeground();\r
-                    }\r
-                    c = updateColor(c, getRank(), foreground);\r
-                    if(foreground){\r
-                        label.setForeground(c);\r
-                        environment.addProperty(\r
-                            "forecolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)\r
-                        );\r
-                    }\r
-                    else{\r
-                        label.setBackground(c);\r
-                        environment.addProperty(\r
-                            "backcolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)\r
-                        );\r
-                    }\r
-                }\r
-            };\r
-            fore.addActionListener(listener);\r
-            back.addActionListener(listener);\r
-\r
-            setLayout(new GridLayout(1, 3));\r
-            add(label);\r
-            add(fore);\r
-            add(back);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.actions;
+
+import java.awt.Color;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JColorChooser;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ui.swing.CompareTableCellRenderer;
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+public class UpdateBirthmarkCellColorAction extends AbstractAction{
+    private static final long serialVersionUID = 2390797591047570440L;
+
+    private StigmataFrame parent;
+    private BirthmarkEnvironment environment;
+    private JColorChooser chooser;
+
+    public UpdateBirthmarkCellColorAction(StigmataFrame parent, BirthmarkEnvironment environment){
+        this.parent = parent;
+        this.environment = environment;
+    }
+
+    public UpdateBirthmarkCellColorAction(StigmataFrame parent){
+        this(parent, BirthmarkEnvironment.getDefaultEnvironment());
+    }
+
+    public void actionPerformed(ActionEvent e){
+        JComponent c = createPanel();
+        JOptionPane.showMessageDialog(
+            parent, c, parent.getMessages().get("updatecellcolor.dialog.title"),
+            JOptionPane.INFORMATION_MESSAGE
+        );
+    }
+
+    private JComponent createPanel(){
+        Box panel = Box.createVerticalBox();
+        for(int i = 0; i <= 5; i++){
+            Color fore = CompareTableCellRenderer.getForegroundColor(i, environment);
+            Color back = CompareTableCellRenderer.getBackgroundColor(i, environment);
+
+            UpdateColorPane pane = new UpdateColorPane(i, fore, back);
+            panel.add(pane);
+        }
+
+        return panel;
+    }
+
+    private Color updateColor(Color c, int rank, boolean foreground){
+        if(chooser == null){
+            chooser = new JColorChooser();
+        }
+        chooser.setColor(c);
+        String l = parent.getMessages().get((foreground? "forecolor_": "backcolor_") + rank + ".label");
+        int returnValue = JOptionPane.showConfirmDialog(
+            parent, chooser, parent.getMessages().get("updatecell.title", l),
+            JOptionPane.INFORMATION_MESSAGE
+        );
+        if(returnValue == JOptionPane.OK_OPTION){
+            c = chooser.getColor();
+        }
+
+        return c;
+    }
+
+    private class UpdateColorPane extends JPanel{
+        private static final long serialVersionUID = 8271684478406307685L;
+
+        private int rank;
+        private JLabel label;
+
+        public UpdateColorPane(int rank, Color fore, Color back){
+            this.rank = rank;
+            initLayouts();
+
+            label.setForeground(fore);
+            label.setBackground(back);
+        }
+
+        public int getRank(){
+            return rank;
+        }
+
+        private void initLayouts(){
+            label = new JLabel(parent.getMessages().get("rank_" + rank + ".label"));
+            label.setOpaque(true);
+            JButton fore = GUIUtility.createButton(parent.getMessages(), "updatecellfore");
+            JButton back = GUIUtility.createButton(parent.getMessages(), "updatecellback");
+
+            ActionListener listener = new ActionListener(){
+                public void actionPerformed(ActionEvent e){
+                    String command = e.getActionCommand();
+                    boolean foreground = command.equals("updatecellfore");
+
+                    Color c = label.getBackground();
+                    if(foreground){
+                        c = label.getForeground();
+                    }
+                    c = updateColor(c, getRank(), foreground);
+                    if(foreground){
+                        label.setForeground(c);
+                        environment.addProperty(
+                            "forecolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)
+                        );
+                    }
+                    else{
+                        label.setBackground(c);
+                        environment.addProperty(
+                            "backcolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)
+                        );
+                    }
+                }
+            };
+            fore.addActionListener(listener);
+            back.addActionListener(listener);
+
+            setLayout(new GridLayout(1, 3));
+            add(label);
+            add(fore);
+            add(back);
+        }
+    }
+}
@@ -1,26 +1,26 @@
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class AbstractComparisonPairFilterComponentService implements ComparisonPairFilterComponentService{\r
-    public String getDisplayFilterName(){\r
-        return getDisplayFilterName(Locale.getDefault());\r
-    }\r
-    \r
-    public String getDisplayFilterName(Locale locale){\r
-        return LocalizedDescriptionManager.getInstance().getDisplayType(\r
-            locale, getFilterName(), LocalizedDescriptionManager.ServiceCategory.filter\r
-        );\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.utils.LocalizedDescriptionManager;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractComparisonPairFilterComponentService implements ComparisonPairFilterComponentService{
+    public String getDisplayFilterName(){
+        return getDisplayFilterName(Locale.getDefault());
+    }
+    
+    public String getDisplayFilterName(Locale locale){
+        return LocalizedDescriptionManager.getInstance().getDisplayType(
+            locale, getFilterName(), LocalizedDescriptionManager.ServiceCategory.filter
+        );
+    }
+}
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Dimension;\r
-import java.awt.GridLayout;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JTextField;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.BirthmarkElementCountComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.BirthmarkElementCountComparisonPairFilterService;\r
-import jp.naist.se.stigmata.filter.FilterTarget;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-import jp.naist.se.stigmata.ui.swing.BirthmarkServiceListCellRenderer;\r
-import jp.naist.se.stigmata.ui.swing.BirthmarkServiceListener;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkElementCountComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService implements BirthmarkServiceListener{\r
-    private Pane pane;\r
-\r
-    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-        pane = new Pane(frame, service);\r
-        return pane;\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "elementcount";\r
-    }\r
-\r
-    public void serviceAdded(BirthmarkSpi service){\r
-        pane.serviceAdded(service);\r
-    }\r
-\r
-    public void serviceRemoved(BirthmarkSpi service){\r
-        pane.serviceRemoved(service);\r
-    }\r
-\r
-    public ComparisonPairFilterSpi getComparisonPairFilterService(){\r
-        return new BirthmarkElementCountComparisonPairFilterService();\r
-    }\r
-\r
-    private static class Pane extends ComparisonPairFilterPane implements BirthmarkServiceListener{\r
-        private static final long serialVersionUID = -6398073942592186671L;\r
-\r
-        private ComparisonPairFilterSpi service;\r
-        private JComboBox criterionType;\r
-        private JTextField threshold;\r
-        private JComboBox targetType;\r
-        private JComboBox birthmarks;\r
-\r
-        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-            super(frame);\r
-            this.service = service;\r
-            initLayouts();\r
-        }\r
-\r
-        public void serviceAdded(BirthmarkSpi service){\r
-            birthmarks.addItem(service);\r
-        }\r
-\r
-        public void serviceRemoved(BirthmarkSpi service){\r
-            birthmarks.removeItem(service);\r
-        }\r
-\r
-        @Override\r
-        public String[] getErrors(){\r
-            List<String> errors = new ArrayList<String>();\r
-            if(threshold.getText().trim().equals("")){\r
-                errors.add(getMessages().get("error.empty.threshold"));\r
-            }\r
-            try{\r
-                int v = Integer.parseInt(threshold.getText());\r
-                if(v < 0){\r
-                    errors.add(getMessages().format("error.negative.value", v));\r
-                }\r
-            } catch(NumberFormatException e){\r
-                errors.add(getMessages().format("error.invalid.format.integer", threshold.getText()));\r
-            }\r
-\r
-            return errors.toArray(new String[errors.size()]);\r
-        }\r
-\r
-        @Override\r
-        public ComparisonPairFilter getFilter(){\r
-            try{\r
-                BirthmarkElementCountComparisonPairFilter filter = new BirthmarkElementCountComparisonPairFilter(service);\r
-                filter.setBirthmarkType(getBirthmarkType());\r
-                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));\r
-                filter.setThreshold(Integer.parseInt(threshold.getText()));\r
-                filter.setTarget(getTarget((String)targetType.getSelectedItem()));\r
-\r
-                return filter;\r
-            } catch(Exception e){\r
-            }\r
-            return null;\r
-        }\r
-\r
-        @Override\r
-        public void resetComponents(){\r
-            threshold.setText("");\r
-            criterionType.setSelectedIndex(0);\r
-            targetType.setSelectedItem(getDisplayTarget(FilterTarget.BOTH_TARGETS));\r
-        }\r
-\r
-        @Override\r
-        public void setFilter(ComparisonPairFilter cpf){\r
-            BirthmarkElementCountComparisonPairFilter filter = (BirthmarkElementCountComparisonPairFilter)cpf;\r
-            criterionType.setSelectedItem(getDisplayCriterion(filter.getCriterion()));\r
-            threshold.setText(String.valueOf(filter.getThreshold()));\r
-            targetType.setSelectedItem(getDisplayTarget(filter.getTarget()));\r
-        }\r
-\r
-        private void initLayouts(){\r
-            JLabel label = new JLabel(getMessages().get("filter.elementcount.label"));\r
-            threshold = new JTextField();\r
-            criterionType = createCriteriaBox(BirthmarkElementCountComparisonPairFilter.getValidCriteria());\r
-            birthmarks = new JComboBox();\r
-            birthmarks.setRenderer(new BirthmarkServiceListCellRenderer(new Dimension(200, 20), 60));\r
-            JLabel label2 = new JLabel(getMessages().get("filter.elementcount.label.next"));\r
-            targetType = createTargetBox();\r
-\r
-            setLayout(new GridLayout(6, 1));\r
-            add(label);\r
-            add(birthmarks);\r
-            add(label2);\r
-            add(targetType);\r
-            add(criterionType);\r
-            add(threshold);\r
-        }\r
-\r
-        private String getBirthmarkType(){\r
-            BirthmarkSpi service = (BirthmarkSpi)birthmarks.getSelectedItem();\r
-            if(service != null){\r
-                return service.getType();\r
-            }\r
-            throw new IllegalStateException("invalid birthmarks");\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.BirthmarkElementCountComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.BirthmarkElementCountComparisonPairFilterService;
+import jp.sourceforge.stigmata.filter.FilterTarget;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.ui.swing.BirthmarkServiceListCellRenderer;
+import jp.sourceforge.stigmata.ui.swing.BirthmarkServiceListener;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkElementCountComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService implements BirthmarkServiceListener{
+    private Pane pane;
+
+    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){
+        pane = new Pane(frame, service);
+        return pane;
+    }
+
+    public String getFilterName(){
+        return "elementcount";
+    }
+
+    public void serviceAdded(BirthmarkSpi service){
+        pane.serviceAdded(service);
+    }
+
+    public void serviceRemoved(BirthmarkSpi service){
+        pane.serviceRemoved(service);
+    }
+
+    public ComparisonPairFilterSpi getComparisonPairFilterService(){
+        return new BirthmarkElementCountComparisonPairFilterService();
+    }
+
+    private static class Pane extends ComparisonPairFilterPane implements BirthmarkServiceListener{
+        private static final long serialVersionUID = -6398073942592186671L;
+
+        private ComparisonPairFilterSpi service;
+        private JComboBox criterionType;
+        private JTextField threshold;
+        private JComboBox targetType;
+        private JComboBox birthmarks;
+
+        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){
+            super(frame);
+            this.service = service;
+            initLayouts();
+        }
+
+        public void serviceAdded(BirthmarkSpi service){
+            birthmarks.addItem(service);
+        }
+
+        public void serviceRemoved(BirthmarkSpi service){
+            birthmarks.removeItem(service);
+        }
+
+        @Override
+        public String[] getErrors(){
+            List<String> errors = new ArrayList<String>();
+            if(threshold.getText().trim().equals("")){
+                errors.add(getMessages().get("error.empty.threshold"));
+            }
+            try{
+                int v = Integer.parseInt(threshold.getText());
+                if(v < 0){
+                    errors.add(getMessages().format("error.negative.value", v));
+                }
+            } catch(NumberFormatException e){
+                errors.add(getMessages().format("error.invalid.format.integer", threshold.getText()));
+            }
+
+            return errors.toArray(new String[errors.size()]);
+        }
+
+        @Override
+        public ComparisonPairFilter getFilter(){
+            try{
+                BirthmarkElementCountComparisonPairFilter filter = new BirthmarkElementCountComparisonPairFilter(service);
+                filter.setBirthmarkType(getBirthmarkType());
+                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));
+                filter.setThreshold(Integer.parseInt(threshold.getText()));
+                filter.setTarget(getTarget((String)targetType.getSelectedItem()));
+
+                return filter;
+            } catch(Exception e){
+            }
+            return null;
+        }
+
+        @Override
+        public void resetComponents(){
+            threshold.setText("");
+            criterionType.setSelectedIndex(0);
+            targetType.setSelectedItem(getDisplayTarget(FilterTarget.BOTH_TARGETS));
+        }
+
+        @Override
+        public void setFilter(ComparisonPairFilter cpf){
+            BirthmarkElementCountComparisonPairFilter filter = (BirthmarkElementCountComparisonPairFilter)cpf;
+            criterionType.setSelectedItem(getDisplayCriterion(filter.getCriterion()));
+            threshold.setText(String.valueOf(filter.getThreshold()));
+            targetType.setSelectedItem(getDisplayTarget(filter.getTarget()));
+        }
+
+        private void initLayouts(){
+            JLabel label = new JLabel(getMessages().get("filter.elementcount.label"));
+            threshold = new JTextField();
+            criterionType = createCriteriaBox(BirthmarkElementCountComparisonPairFilter.getValidCriteria());
+            birthmarks = new JComboBox();
+            birthmarks.setRenderer(new BirthmarkServiceListCellRenderer(new Dimension(200, 20), 60));
+            JLabel label2 = new JLabel(getMessages().get("filter.elementcount.label.next"));
+            targetType = createTargetBox();
+
+            setLayout(new GridLayout(6, 1));
+            add(label);
+            add(birthmarks);
+            add(label2);
+            add(targetType);
+            add(criterionType);
+            add(threshold);
+        }
+
+        private String getBirthmarkType(){
+            BirthmarkSpi service = (BirthmarkSpi)birthmarks.getSelectedItem();
+            if(service != null){
+                return service.getType();
+            }
+            throw new IllegalStateException("invalid birthmarks");
+        }
+    }
+}
@@ -1,27 +1,27 @@
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Locale;\r
-\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$\r
- */\r
-public interface ComparisonPairFilterComponentService{\r
-    public String getDisplayFilterName(Locale locale);\r
-\r
-    public String getDisplayFilterName();\r
-\r
-    public String getFilterName();\r
-\r
-    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service);\r
-\r
-    public ComparisonPairFilterSpi getComparisonPairFilterService();\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.Locale;
+
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$
+ */
+public interface ComparisonPairFilterComponentService{
+    public String getDisplayFilterName(Locale locale);
+
+    public String getDisplayFilterName();
+
+    public String getFilterName();
+
+    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service);
+
+    public ComparisonPairFilterSpi getComparisonPairFilterService();
+}
@@ -1,20 +1,20 @@
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonPairFilterListener{\r
-    public void filterAdded(ComparisonPairFilter filter);\r
-\r
-    public void filterRemoved(ComparisonPairFilter filter);\r
-\r
-    public void filterUpdated(ComparisonPairFilter oldfilter, ComparisonPairFilter newfilter);\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonPairFilterListener{
+    public void filterAdded(ComparisonPairFilter filter);
+
+    public void filterRemoved(ComparisonPairFilter filter);
+
+    public void filterUpdated(ComparisonPairFilter oldfilter, ComparisonPairFilter newfilter);
+}
@@ -1,83 +1,83 @@
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import javax.swing.JComboBox;\r
-import javax.swing.JPanel;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.Criterion;\r
-import jp.naist.se.stigmata.filter.FilterTarget;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public abstract class ComparisonPairFilterPane extends JPanel{\r
-    private jp.naist.se.stigmata.ui.swing.StigmataFrame stigmata;\r
-    private Map<String, Criterion> criterionMap = new HashMap<String, Criterion>();\r
-    private Map<String, FilterTarget> targetMap = new HashMap<String, FilterTarget>();\r
-\r
-    public ComparisonPairFilterPane(StigmataFrame frame){\r
-        this.stigmata = frame;\r
-    }\r
-\r
-    public Messages getMessages(){\r
-        return stigmata.getMessages();\r
-    }\r
-\r
-    public abstract String[] getErrors();\r
-\r
-    public abstract void setFilter(ComparisonPairFilter filter);\r
-\r
-    public abstract ComparisonPairFilter getFilter();\r
-\r
-    public abstract void resetComponents();\r
-\r
-    public JComboBox createTargetBox(){\r
-        JComboBox combo = new JComboBox();\r
-        combo.setEditable(false);\r
-        for(FilterTarget target: FilterTarget.values()){\r
-            String value = getMessages().get("target." + target.name());\r
-            combo.addItem(value);\r
-            targetMap.put(value, target);\r
-        }\r
-        return combo;\r
-    }\r
-\r
-    public FilterTarget getTarget(String value){\r
-        return targetMap.get(value);\r
-    }\r
-\r
-    public String getDisplayTarget(FilterTarget target){\r
-        return getMessages().get("target." + target.name());\r
-    }\r
-\r
-    public JComboBox createCriteriaBox(Criterion[] criteria){\r
-        JComboBox combo = new JComboBox();\r
-        combo.setEditable(false);\r
-        for(int i = 0; i < criteria.length; i++){\r
-            String value = getMessages().get("criterion." + criteria[i].name());\r
-            combo.addItem(value);\r
-            criterionMap.put(value, criteria[i]);\r
-        }\r
-\r
-        return combo;\r
-    }\r
-\r
-    public Criterion getCriterion(String value){\r
-        return criterionMap.get(value);\r
-    }\r
-\r
-    public String getDisplayCriterion(Criterion criterion){\r
-        return getMessages().get("criterion." + criterion.name());\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.Criterion;
+import jp.sourceforge.stigmata.filter.FilterTarget;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public abstract class ComparisonPairFilterPane extends JPanel{
+    private jp.sourceforge.stigmata.ui.swing.StigmataFrame stigmata;
+    private Map<String, Criterion> criterionMap = new HashMap<String, Criterion>();
+    private Map<String, FilterTarget> targetMap = new HashMap<String, FilterTarget>();
+
+    public ComparisonPairFilterPane(StigmataFrame frame){
+        this.stigmata = frame;
+    }
+
+    public Messages getMessages(){
+        return stigmata.getMessages();
+    }
+
+    public abstract String[] getErrors();
+
+    public abstract void setFilter(ComparisonPairFilter filter);
+
+    public abstract ComparisonPairFilter getFilter();
+
+    public abstract void resetComponents();
+
+    public JComboBox createTargetBox(){
+        JComboBox combo = new JComboBox();
+        combo.setEditable(false);
+        for(FilterTarget target: FilterTarget.values()){
+            String value = getMessages().get("target." + target.name());
+            combo.addItem(value);
+            targetMap.put(value, target);
+        }
+        return combo;
+    }
+
+    public FilterTarget getTarget(String value){
+        return targetMap.get(value);
+    }
+
+    public String getDisplayTarget(FilterTarget target){
+        return getMessages().get("target." + target.name());
+    }
+
+    public JComboBox createCriteriaBox(Criterion[] criteria){
+        JComboBox combo = new JComboBox();
+        combo.setEditable(false);
+        for(int i = 0; i < criteria.length; i++){
+            String value = getMessages().get("criterion." + criteria[i].name());
+            combo.addItem(value);
+            criterionMap.put(value, criteria[i]);
+        }
+
+        return combo;
+    }
+
+    public Criterion getCriterion(String value){
+        return criterionMap.get(value);
+    }
+
+    public String getDisplayCriterion(Criterion criterion){
+        return getMessages().get("criterion." + criterion.name());
+    }
+}
@@ -1,25 +1,25 @@
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface ComparisonPairFilterRetainable{\r
-    public void filterSelected(ComparisonPairFilter filter);\r
-\r
-    public void addFilterSet(ComparisonPairFilterSet filter);\r
-\r
-    public void removeFilterSet(String name);\r
-\r
-    public void updateFilterSet(String name, ComparisonPairFilterSet filter);\r
-\r
-    public ComparisonPairFilterSet getFilterSet(String name);\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface ComparisonPairFilterRetainable{
+    public void filterSelected(ComparisonPairFilter filter);
+
+    public void addFilterSet(ComparisonPairFilterSet filter);
+
+    public void removeFilterSet(String name);
+
+    public void updateFilterSet(String name, ComparisonPairFilterSet filter);
+
+    public ComparisonPairFilterSet getFilterSet(String name);
+}
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.CardLayout;\r
-import java.awt.Dimension;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.ItemEvent;\r
-import java.awt.event.ItemListener;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.JButton;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\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.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$\r
- */\r
-public class FilterEditingPane extends JPanel{\r
-    private static final long serialVersionUID = -2607954525579006086L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private ComparisonPairFilter filter;\r
-    private JPanel cardComponent;\r
-    private CardLayout card;\r
-    private JComboBox combo;\r
-    private JButton addButton;\r
-    private JButton updateButton;\r
-    private JButton removeButton;\r
-    private ComparisonPairFilterPane currentPane = null;\r
-    \r
-    private Map<String, ComparisonPairFilterPane> paneMap = new HashMap<String, ComparisonPairFilterPane>();\r
-    private List<ComparisonPairFilterListener> listeners = new ArrayList<ComparisonPairFilterListener>();\r
-\r
-    public FilterEditingPane(StigmataFrame stigmata){\r
-        this.stigmata = stigmata;\r
-\r
-        initLayouts();\r
-        initData();\r
-        updateButtonEnabled();\r
-    }\r
-\r
-    public void reset(){\r
-        initData();\r
-    }\r
-\r
-    public void addComparisonPairFilterListener(ComparisonPairFilterListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void removeComparisonPairFilterListener(ComparisonPairFilterListener listener){\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    public void setFilter(ComparisonPairFilter filter){\r
-        resetOldComponent();\r
-        this.filter = filter;\r
-        if(filter != null && filter.getService() != null){\r
-            ComparisonPairFilterSpi service = filter.getService();\r
-            String name = service.getDisplayFilterName();\r
-\r
-            combo.setSelectedItem(name);\r
-            card.show(cardComponent, name);\r
-            paneMap.get(name).setFilter(filter);\r
-        }\r
-        updateButtonEnabled();\r
-    }\r
-\r
-    private void resetOldComponent(){\r
-        if(filter != null){\r
-            paneMap.get(filter.getService().getDisplayFilterName()).resetComponents();\r
-        }\r
-    }\r
-\r
-    private void updateButtonEnabled(){\r
-        addButton.setEnabled(currentPane != null);\r
-        removeButton.setEnabled(filter != null);\r
-        updateButton.setEnabled(filter != null);\r
-    }\r
-\r
-    private void initData(){\r
-        cardComponent.removeAll();\r
-        combo.removeAllItems();\r
-        paneMap.clear();\r
-\r
-        JPanel dummyPanel = new JPanel();\r
-        card.addLayoutComponent(dummyPanel, "");\r
-        cardComponent.add(dummyPanel, "");\r
-        combo.addItem("");\r
-\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
-            ComparisonPairFilterPane pane = service.createComponent(stigmata, service.getComparisonPairFilterService());\r
-            if(pane instanceof BirthmarkServiceListener){\r
-                for(BirthmarkSpi bs: stigmata.getEnvironment().getServices()){\r
-                    ((BirthmarkServiceListener)pane).serviceAdded(bs);\r
-                }\r
-                stigmata.addBirthmarkServiceListener((BirthmarkServiceListener)pane);\r
-            }\r
-\r
-            pane.setMaximumSize(new Dimension(Integer.MAX_VALUE, 500));\r
-            Box b = Box.createVerticalBox();\r
-            b.add(pane);\r
-            b.add(Box.createVerticalGlue());\r
-\r
-            combo.addItem(name);\r
-            card.addLayoutComponent(b, name);\r
-            cardComponent.add(b, name);\r
-            paneMap.put(name, pane);\r
-        }\r
-    }\r
-\r
-    private void initLayouts(){\r
-        Messages messages = stigmata.getMessages();\r
-        cardComponent = new JPanel();\r
-        combo = new JComboBox();\r
-        addButton = GUIUtility.createButton(messages, "newfilter");\r
-        removeButton = GUIUtility.createButton(messages, "removefilter");\r
-        updateButton = GUIUtility.createButton(messages, "updatefilter");\r
-\r
-        combo.addItemListener(new ItemListener(){\r
-            public void itemStateChanged(ItemEvent e){\r
-                String item = (String)combo.getSelectedItem();\r
-                card.show(cardComponent, item);\r
-                if(paneMap.get(item) != null){\r
-                    if(filter != null){\r
-                        String oldType = filter.getService().getDisplayFilterName();\r
-                        if(item.equals(oldType)){\r
-                            paneMap.get(item).setFilter(filter);\r
-                        }\r
-                        else{\r
-                            currentPane.resetComponents();\r
-                        }\r
-                    }\r
-                    currentPane = paneMap.get(item);\r
-                }\r
-                else{\r
-                    currentPane = null;\r
-                }\r
-                updateButtonEnabled();\r
-            }\r
-        });\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                String command = e.getActionCommand();\r
-                ComparisonPairFilter newfilter = currentPane.getFilter();\r
-                if(newfilter != null){\r
-                    for(ComparisonPairFilterListener listener: listeners){\r
-                        if(command.equals("updatefilter")){\r
-                            listener.filterUpdated(filter, newfilter);\r
-                        }\r
-                        else{\r
-                            listener.filterAdded(newfilter);\r
-                        }\r
-                    }\r
-                }\r
-                else{\r
-                    showErrorMessage(currentPane.getErrors());\r
-                }\r
-            }\r
-        };\r
-        addButton.addActionListener(listener);\r
-        updateButton.addActionListener(listener);\r
-        removeButton.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                for(ComparisonPairFilterListener listener: listeners){\r
-                    listener.filterRemoved(filter);\r
-                }                \r
-            }\r
-        });\r
-\r
-        Box south = Box.createHorizontalBox();\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(addButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(updateButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(removeButton);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        cardComponent.setLayout(card = new CardLayout());\r
-        cardComponent.setMaximumSize(new Dimension(Integer.MAX_VALUE, cardComponent.getMaximumSize().height));\r
-        Box center = Box.createVerticalBox();\r
-        center.add(cardComponent);\r
-        center.add(Box.createVerticalGlue());\r
-\r
-        setLayout(new BorderLayout());\r
-        add(combo, BorderLayout.NORTH);\r
-        add(center, BorderLayout.CENTER);\r
-        add(south, BorderLayout.SOUTH);\r
-    }\r
-\r
-    private void showErrorMessage(String[] messages){\r
-        StringBuilder sb = new StringBuilder("<html><body>");\r
-        sb.append("<p>").append(stigmata.getMessages().get("error.filter.cannotcreate")).append("</p>");\r
-        sb.append("<ul>");\r
-        for(int i = 0; i < messages.length; i++){\r
-            sb.append("<li>").append(messages[i]).append("</li>");\r
-        }\r
-        sb.append("</ul></body></html>");\r
-\r
-        JOptionPane.showMessageDialog(\r
-            stigmata, new String(sb), stigmata.getMessages().get("error.dialog.title"),\r
-            JOptionPane.ERROR_MESSAGE\r
-        );\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.ui.swing.BirthmarkServiceListener;
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$
+ */
+public class FilterEditingPane extends JPanel{
+    private static final long serialVersionUID = -2607954525579006086L;
+
+    private StigmataFrame stigmata;
+    private ComparisonPairFilter filter;
+    private JPanel cardComponent;
+    private CardLayout card;
+    private JComboBox combo;
+    private JButton addButton;
+    private JButton updateButton;
+    private JButton removeButton;
+    private ComparisonPairFilterPane currentPane = null;
+    
+    private Map<String, ComparisonPairFilterPane> paneMap = new HashMap<String, ComparisonPairFilterPane>();
+    private List<ComparisonPairFilterListener> listeners = new ArrayList<ComparisonPairFilterListener>();
+
+    public FilterEditingPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+
+        initLayouts();
+        initData();
+        updateButtonEnabled();
+    }
+
+    public void reset(){
+        initData();
+    }
+
+    public void addComparisonPairFilterListener(ComparisonPairFilterListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeComparisonPairFilterListener(ComparisonPairFilterListener listener){
+        listeners.remove(listener);
+    }
+
+    public void setFilter(ComparisonPairFilter filter){
+        resetOldComponent();
+        this.filter = filter;
+        if(filter != null && filter.getService() != null){
+            ComparisonPairFilterSpi service = filter.getService();
+            String name = service.getDisplayFilterName();
+
+            combo.setSelectedItem(name);
+            card.show(cardComponent, name);
+            paneMap.get(name).setFilter(filter);
+        }
+        updateButtonEnabled();
+    }
+
+    private void resetOldComponent(){
+        if(filter != null){
+            paneMap.get(filter.getService().getDisplayFilterName()).resetComponents();
+        }
+    }
+
+    private void updateButtonEnabled(){
+        addButton.setEnabled(currentPane != null);
+        removeButton.setEnabled(filter != null);
+        updateButton.setEnabled(filter != null);
+    }
+
+    private void initData(){
+        cardComponent.removeAll();
+        combo.removeAllItems();
+        paneMap.clear();
+
+        JPanel dummyPanel = new JPanel();
+        card.addLayoutComponent(dummyPanel, "");
+        cardComponent.add(dummyPanel, "");
+        combo.addItem("");
+
+        
+        for(Iterator<ComparisonPairFilterComponentService> i = stigmata.getEnvironment().lookupProviders(ComparisonPairFilterComponentService.class); i.hasNext();){
+            ComparisonPairFilterComponentService service = i.next();
+            String name = service.getDisplayFilterName();
+
+            ComparisonPairFilterPane pane = service.createComponent(stigmata, service.getComparisonPairFilterService());
+            if(pane instanceof BirthmarkServiceListener){
+                for(BirthmarkSpi bs: stigmata.getEnvironment().getServices()){
+                    ((BirthmarkServiceListener)pane).serviceAdded(bs);
+                }
+                stigmata.addBirthmarkServiceListener((BirthmarkServiceListener)pane);
+            }
+
+            pane.setMaximumSize(new Dimension(Integer.MAX_VALUE, 500));
+            Box b = Box.createVerticalBox();
+            b.add(pane);
+            b.add(Box.createVerticalGlue());
+
+            combo.addItem(name);
+            card.addLayoutComponent(b, name);
+            cardComponent.add(b, name);
+            paneMap.put(name, pane);
+        }
+    }
+
+    private void initLayouts(){
+        Messages messages = stigmata.getMessages();
+        cardComponent = new JPanel();
+        combo = new JComboBox();
+        addButton = GUIUtility.createButton(messages, "newfilter");
+        removeButton = GUIUtility.createButton(messages, "removefilter");
+        updateButton = GUIUtility.createButton(messages, "updatefilter");
+
+        combo.addItemListener(new ItemListener(){
+            public void itemStateChanged(ItemEvent e){
+                String item = (String)combo.getSelectedItem();
+                card.show(cardComponent, item);
+                if(paneMap.get(item) != null){
+                    if(filter != null){
+                        String oldType = filter.getService().getDisplayFilterName();
+                        if(item.equals(oldType)){
+                            paneMap.get(item).setFilter(filter);
+                        }
+                        else{
+                            currentPane.resetComponents();
+                        }
+                    }
+                    currentPane = paneMap.get(item);
+                }
+                else{
+                    currentPane = null;
+                }
+                updateButtonEnabled();
+            }
+        });
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                String command = e.getActionCommand();
+                ComparisonPairFilter newfilter = currentPane.getFilter();
+                if(newfilter != null){
+                    for(ComparisonPairFilterListener listener: listeners){
+                        if(command.equals("updatefilter")){
+                            listener.filterUpdated(filter, newfilter);
+                        }
+                        else{
+                            listener.filterAdded(newfilter);
+                        }
+                    }
+                }
+                else{
+                    showErrorMessage(currentPane.getErrors());
+                }
+            }
+        };
+        addButton.addActionListener(listener);
+        updateButton.addActionListener(listener);
+        removeButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                for(ComparisonPairFilterListener listener: listeners){
+                    listener.filterRemoved(filter);
+                }                
+            }
+        });
+
+        Box south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(addButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(updateButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(removeButton);
+        south.add(Box.createHorizontalGlue());
+
+        cardComponent.setLayout(card = new CardLayout());
+        cardComponent.setMaximumSize(new Dimension(Integer.MAX_VALUE, cardComponent.getMaximumSize().height));
+        Box center = Box.createVerticalBox();
+        center.add(cardComponent);
+        center.add(Box.createVerticalGlue());
+
+        setLayout(new BorderLayout());
+        add(combo, BorderLayout.NORTH);
+        add(center, BorderLayout.CENTER);
+        add(south, BorderLayout.SOUTH);
+    }
+
+    private void showErrorMessage(String[] messages){
+        StringBuilder sb = new StringBuilder("<html><body>");
+        sb.append("<p>").append(stigmata.getMessages().get("error.filter.cannotcreate")).append("</p>");
+        sb.append("<ul>");
+        for(int i = 0; i < messages.length; i++){
+            sb.append("<li>").append(messages[i]).append("</li>");
+        }
+        sb.append("</ul></body></html>");
+
+        JOptionPane.showMessageDialog(
+            stigmata, new String(sb), stigmata.getMessages().get("error.dialog.title"),
+            JOptionPane.ERROR_MESSAGE
+        );
+    }
+}
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-\r
-import javax.swing.Box;\r
-import javax.swing.ButtonGroup;\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JButton;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.JRadioButton;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTextField;\r
-import javax.swing.ListSelectionModel;\r
-import javax.swing.event.DocumentEvent;\r
-import javax.swing.event.DocumentListener;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$\r
- */\r
-public class FilterSetDefinitionPane extends JPanel implements ComparisonPairFilterListener{\r
-    private static final long serialVersionUID = 7519306603672717119L;\r
-\r
-    private ComparisonPairFilterRetainable manager;\r
-    private StigmataFrame stigmata;\r
-\r
-    private JTextField name;\r
-    private JRadioButton matchall, matchany;\r
-    private JList list;\r
-    private DefaultListModel model;\r
-    private ComparisonPairFilterSet filterset;\r
-    private boolean buttonShown = true;\r
-\r
-    private JButton addfilter;\r
-    private JButton updatefilter;\r
-    private JButton removefilter;\r
-    private JButton upButton;\r
-    private JButton downButton;\r
-    \r
-    public FilterSetDefinitionPane(StigmataFrame frame, ComparisonPairFilterRetainable manager){\r
-        this(frame, manager, true);\r
-    }\r
-\r
-    public FilterSetDefinitionPane(StigmataFrame frame, ComparisonPairFilterRetainable manager, boolean showButtons){\r
-        this.stigmata = frame;\r
-        this.manager = manager;\r
-        \r
-        initLayouts(showButtons);\r
-    }\r
-\r
-    public void reset(){\r
-        // nothing to do...\r
-    }\r
-\r
-    public void setFilterSet(ComparisonPairFilterSet filterset){\r
-        this.filterset = filterset;\r
-        if(filterset != null){\r
-            model.removeAllElements();\r
-\r
-            name.setText(filterset.getName());\r
-            matchall.setSelected(filterset.isMatchAll());\r
-            matchany.setSelected(filterset.isMatchAny());\r
-            for(ComparisonPairFilter filter: filterset){\r
-                model.addElement(filter);\r
-            }\r
-        }\r
-    }\r
-\r
-    public void filterAdded(ComparisonPairFilter filter){\r
-        model.addElement(filter);\r
-        list.setSelectedIndex(model.getSize() - 1);\r
-        updateButtonEnabled();\r
-    }\r
-\r
-    public void filterRemoved(ComparisonPairFilter filter){\r
-        model.removeElement(filter);\r
-        list.clearSelection();\r
-        updateButtonEnabled();\r
-    }\r
-\r
-    public void filterUpdated(ComparisonPairFilter oldfilter, ComparisonPairFilter newfilter){\r
-        int index = model.indexOf(oldfilter);\r
-        if(index >= 0){\r
-            model.setElementAt(newfilter, index);\r
-        }\r
-        updateButtonEnabled();\r
-    }\r
-\r
-    public void setEnabled(boolean flag){\r
-        super.setEnabled(flag);\r
-\r
-        matchall.setEnabled(flag);\r
-        matchany.setEnabled(flag);\r
-        name.setEnabled(flag);\r
-        list.setEnabled(flag);\r
-    }\r
-\r
-    private void initLayouts(boolean showButtons){\r
-        Messages messages = stigmata.getMessages();\r
-        this.buttonShown = showButtons;\r
-\r
-        ButtonGroup group = new ButtonGroup();\r
-        matchall = new JRadioButton(messages.get("matchall.button.label"), true);\r
-        matchall.setToolTipText(messages.get("matchall.button.tooltip"));\r
-        group.add(matchall);\r
-        matchany = new JRadioButton(messages.get("matchany.button.label"), false);\r
-        matchany.setToolTipText(messages.get("matchany.button.tooltip"));\r
-        group.add(matchany);\r
-        \r
-        JPanel north = new JPanel(new GridLayout(3, 1));\r
-        north.add(name = new JTextField());\r
-        north.add(matchall);\r
-        north.add(matchany);\r
-\r
-        addfilter = GUIUtility.createButton(messages, "newfilterset");\r
-        updatefilter = GUIUtility.createButton(messages, "updatefilterset");\r
-        removefilter = GUIUtility.createButton(messages, "removefilterset");\r
-        upButton = GUIUtility.createButton(messages, "moveup");\r
-        downButton = GUIUtility.createButton(messages, "movedown");\r
-        \r
-        Box south = Box.createHorizontalBox();\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(addfilter);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(updatefilter);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(removefilter);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(upButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(downButton);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        model = new DefaultListModel();\r
-        list = new JList(model);\r
-        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
-\r
-        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
-            public void valueChanged(ListSelectionEvent e){\r
-                manager.filterSelected((ComparisonPairFilter)list.getSelectedValue());\r
-                updateButtonEnabled();\r
-            }\r
-        });\r
-\r
-        addfilter.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                ComparisonPairFilterSet current = createCurrentFilterSet();\r
-                filterset = current;\r
-                manager.addFilterSet(filterset);\r
-                list.clearSelection();\r
-                manager.filterSelected(null);\r
-\r
-                updateButtonEnabled();\r
-            }\r
-        });\r
-\r
-        removefilter.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                manager.removeFilterSet(filterset.getName());\r
-                filterset = null;\r
-                name.setText("");\r
-                matchall.setSelected(true);\r
-                matchany.setSelected(false);\r
-                model.removeAllElements();\r
-                manager.filterSelected(null);\r
-\r
-                updateButtonEnabled();\r
-            }\r
-        });\r
-\r
-        updatefilter.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                ComparisonPairFilterSet current = createCurrentFilterSet();\r
-                manager.updateFilterSet(filterset.getName(), current);\r
-                filterset = current;\r
-                list.clearSelection();\r
-                manager.filterSelected(null);\r
-                updateButtonEnabled();\r
-            }\r
-        });\r
-\r
-        ActionListener listener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                int index = list.getSelectedIndex();\r
-                int step = 1;\r
-                if(e.getActionCommand().equals("moveup")) step = -1;\r
-                Object element1 = model.get(index);\r
-                Object element2 = model.get(index + step);\r
-                model.setElementAt(element1, index + step);\r
-                model.setElementAt(element2, index);\r
-                list.setSelectedIndex(index + step);\r
-            }\r
-        };\r
-        name.getDocument().addDocumentListener(new DocumentListener(){\r
-            public void changedUpdate(DocumentEvent e){\r
-                updateButtonEnabled();\r
-            }\r
-\r
-            public void insertUpdate(DocumentEvent e){\r
-                updateButtonEnabled();\r
-            }\r
-\r
-            public void removeUpdate(DocumentEvent e){\r
-                updateButtonEnabled();\r
-            }\r
-        });\r
-        upButton.addActionListener(listener);\r
-        downButton.addActionListener(listener);\r
-\r
-        JScrollPane listpane = new JScrollPane(list);\r
-        setLayout(new BorderLayout());\r
-        add(north, BorderLayout.NORTH);\r
-        add(listpane, BorderLayout.CENTER);\r
-        if(showButtons){\r
-            add(south, BorderLayout.SOUTH);\r
-        }\r
-\r
-        GUIUtility.decorateJComponent(messages, name, "filtername");\r
-        GUIUtility.decorateJComponent(messages, listpane, "filterorder");\r
-\r
-        setEnabled(buttonShown);\r
-\r
-        updateButtonEnabled();\r
-    }\r
-\r
-    private void updateButtonEnabled(){\r
-        if(buttonShown){\r
-            int index = list.getSelectedIndex();\r
-            int size = model.getSize();\r
-\r
-            upButton.setEnabled(size > 1 && index > 0);\r
-            downButton.setEnabled(size > 1 && index < (size - 1));\r
-            updatefilter.setEnabled(filterset != null);\r
-            addfilter.setEnabled(size > 0 && name.getText().length() > 0 && manager.getFilterSet(name.getText()) == null);\r
-            removefilter.setEnabled(filterset != null);\r
-        }\r
-    }\r
-\r
-    private ComparisonPairFilterSet createCurrentFilterSet(){\r
-        ComparisonPairFilterSet current = new ComparisonPairFilterSet();\r
-        current.setName(name.getText());\r
-        if(matchall.isSelected())       current.setMatchAll();\r
-        else if(matchany.isSelected()) current.setMatchAny();\r
-        current.removeAllFilters();\r
-\r
-        for(int i = 0; i < model.getSize(); i++){\r
-            current.addFilter((ComparisonPairFilter)model.get(i));\r
-        }\r
-        return current;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.talisman.i18n.Messages;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$
+ */
+public class FilterSetDefinitionPane extends JPanel implements ComparisonPairFilterListener{
+    private static final long serialVersionUID = 7519306603672717119L;
+
+    private ComparisonPairFilterRetainable manager;
+    private StigmataFrame stigmata;
+
+    private JTextField name;
+    private JRadioButton matchall, matchany;
+    private JList list;
+    private DefaultListModel model;
+    private ComparisonPairFilterSet filterset;
+    private boolean buttonShown = true;
+
+    private JButton addfilter;
+    private JButton updatefilter;
+    private JButton removefilter;
+    private JButton upButton;
+    private JButton downButton;
+    
+    public FilterSetDefinitionPane(StigmataFrame frame, ComparisonPairFilterRetainable manager){
+        this(frame, manager, true);
+    }
+
+    public FilterSetDefinitionPane(StigmataFrame frame, ComparisonPairFilterRetainable manager, boolean showButtons){
+        this.stigmata = frame;
+        this.manager = manager;
+        
+        initLayouts(showButtons);
+    }
+
+    public void reset(){
+        // nothing to do...
+    }
+
+    public void setFilterSet(ComparisonPairFilterSet filterset){
+        this.filterset = filterset;
+        if(filterset != null){
+            model.removeAllElements();
+
+            name.setText(filterset.getName());
+            matchall.setSelected(filterset.isMatchAll());
+            matchany.setSelected(filterset.isMatchAny());
+            for(ComparisonPairFilter filter: filterset){
+                model.addElement(filter);
+            }
+        }
+    }
+
+    public void filterAdded(ComparisonPairFilter filter){
+        model.addElement(filter);
+        list.setSelectedIndex(model.getSize() - 1);
+        updateButtonEnabled();
+    }
+
+    public void filterRemoved(ComparisonPairFilter filter){
+        model.removeElement(filter);
+        list.clearSelection();
+        updateButtonEnabled();
+    }
+
+    public void filterUpdated(ComparisonPairFilter oldfilter, ComparisonPairFilter newfilter){
+        int index = model.indexOf(oldfilter);
+        if(index >= 0){
+            model.setElementAt(newfilter, index);
+        }
+        updateButtonEnabled();
+    }
+
+    public void setEnabled(boolean flag){
+        super.setEnabled(flag);
+
+        matchall.setEnabled(flag);
+        matchany.setEnabled(flag);
+        name.setEnabled(flag);
+        list.setEnabled(flag);
+    }
+
+    private void initLayouts(boolean showButtons){
+        Messages messages = stigmata.getMessages();
+        this.buttonShown = showButtons;
+
+        ButtonGroup group = new ButtonGroup();
+        matchall = new JRadioButton(messages.get("matchall.button.label"), true);
+        matchall.setToolTipText(messages.get("matchall.button.tooltip"));
+        group.add(matchall);
+        matchany = new JRadioButton(messages.get("matchany.button.label"), false);
+        matchany.setToolTipText(messages.get("matchany.button.tooltip"));
+        group.add(matchany);
+        
+        JPanel north = new JPanel(new GridLayout(3, 1));
+        north.add(name = new JTextField());
+        north.add(matchall);
+        north.add(matchany);
+
+        addfilter = GUIUtility.createButton(messages, "newfilterset");
+        updatefilter = GUIUtility.createButton(messages, "updatefilterset");
+        removefilter = GUIUtility.createButton(messages, "removefilterset");
+        upButton = GUIUtility.createButton(messages, "moveup");
+        downButton = GUIUtility.createButton(messages, "movedown");
+        
+        Box south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(addfilter);
+        south.add(Box.createHorizontalGlue());
+        south.add(updatefilter);
+        south.add(Box.createHorizontalGlue());
+        south.add(removefilter);
+        south.add(Box.createHorizontalGlue());
+        south.add(upButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(downButton);
+        south.add(Box.createHorizontalGlue());
+
+        model = new DefaultListModel();
+        list = new JList(model);
+        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent e){
+                manager.filterSelected((ComparisonPairFilter)list.getSelectedValue());
+                updateButtonEnabled();
+            }
+        });
+
+        addfilter.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                ComparisonPairFilterSet current = createCurrentFilterSet();
+                filterset = current;
+                manager.addFilterSet(filterset);
+                list.clearSelection();
+                manager.filterSelected(null);
+
+                updateButtonEnabled();
+            }
+        });
+
+        removefilter.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                manager.removeFilterSet(filterset.getName());
+                filterset = null;
+                name.setText("");
+                matchall.setSelected(true);
+                matchany.setSelected(false);
+                model.removeAllElements();
+                manager.filterSelected(null);
+
+                updateButtonEnabled();
+            }
+        });
+
+        updatefilter.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                ComparisonPairFilterSet current = createCurrentFilterSet();
+                manager.updateFilterSet(filterset.getName(), current);
+                filterset = current;
+                list.clearSelection();
+                manager.filterSelected(null);
+                updateButtonEnabled();
+            }
+        });
+
+        ActionListener listener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                int index = list.getSelectedIndex();
+                int step = 1;
+                if(e.getActionCommand().equals("moveup")) step = -1;
+                Object element1 = model.get(index);
+                Object element2 = model.get(index + step);
+                model.setElementAt(element1, index + step);
+                model.setElementAt(element2, index);
+                list.setSelectedIndex(index + step);
+            }
+        };
+        name.getDocument().addDocumentListener(new DocumentListener(){
+            public void changedUpdate(DocumentEvent e){
+                updateButtonEnabled();
+            }
+
+            public void insertUpdate(DocumentEvent e){
+                updateButtonEnabled();
+            }
+
+            public void removeUpdate(DocumentEvent e){
+                updateButtonEnabled();
+            }
+        });
+        upButton.addActionListener(listener);
+        downButton.addActionListener(listener);
+
+        JScrollPane listpane = new JScrollPane(list);
+        setLayout(new BorderLayout());
+        add(north, BorderLayout.NORTH);
+        add(listpane, BorderLayout.CENTER);
+        if(showButtons){
+            add(south, BorderLayout.SOUTH);
+        }
+
+        GUIUtility.decorateJComponent(messages, name, "filtername");
+        GUIUtility.decorateJComponent(messages, listpane, "filterorder");
+
+        setEnabled(buttonShown);
+
+        updateButtonEnabled();
+    }
+
+    private void updateButtonEnabled(){
+        if(buttonShown){
+            int index = list.getSelectedIndex();
+            int size = model.getSize();
+
+            upButton.setEnabled(size > 1 && index > 0);
+            downButton.setEnabled(size > 1 && index < (size - 1));
+            updatefilter.setEnabled(filterset != null);
+            addfilter.setEnabled(size > 0 && name.getText().length() > 0 && manager.getFilterSet(name.getText()) == null);
+            removefilter.setEnabled(filterset != null);
+        }
+    }
+
+    private ComparisonPairFilterSet createCurrentFilterSet(){
+        ComparisonPairFilterSet current = new ComparisonPairFilterSet();
+        current.setName(name.getText());
+        if(matchall.isSelected())       current.setMatchAll();
+        else if(matchany.isSelected()) current.setMatchAny();
+        current.removeAllFilters();
+
+        for(int i = 0; i < model.getSize(); i++){
+            current.addFilter((ComparisonPairFilter)model.get(i));
+        }
+        return current;
+    }
+}
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.GridLayout;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JTextField;\r
-import javax.swing.event.DocumentEvent;\r
-import javax.swing.event.DocumentListener;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.SimilarityComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.SimilarityComparisonPairFilterService;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$\r
- */\r
-public class SimilarityComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService{\r
-\r
-    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-        return new Pane(frame, service);\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "similarity";\r
-    }\r
-\r
-    public ComparisonPairFilterSpi getComparisonPairFilterService(){\r
-        return new SimilarityComparisonPairFilterService();\r
-    }\r
-\r
-    private static class Pane extends ComparisonPairFilterPane{\r
-        private static final long serialVersionUID = 8912037614500713027L;\r
-        private ComparisonPairFilterSpi service;\r
-        private JComboBox criterionType;\r
-        private JTextField threshold;\r
-\r
-        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-            super(frame);\r
-            this.service = service;\r
-            initLayouts();\r
-        }\r
-\r
-        @Override\r
-        public String[] getErrors(){\r
-            List<String> errors = new ArrayList<String>();\r
-            if(threshold.getText().trim().equals("")){\r
-                errors.add(getMessages().get("error.empty.threshold"));\r
-            }\r
-            try{\r
-                double v = Double.parseDouble(threshold.getText());\r
-                if(v < 0d){\r
-                    errors.add(getMessages().format("error.negative.value", v));\r
-                }\r
-                else if(v > 1.0d){\r
-                    errors.add(getMessages().format("error.over.range", "0-1"));\r
-                }\r
-            } catch(NumberFormatException e){\r
-                errors.add(getMessages().format("error.invalid.format.double", threshold.getText()));\r
-            }\r
-\r
-            return errors.toArray(new String[errors.size()]);\r
-        }\r
-\r
-        @Override\r
-        public ComparisonPairFilter getFilter(){\r
-            try{\r
-                SimilarityComparisonPairFilter filter = new SimilarityComparisonPairFilter(service);\r
-                filter.setThreshold(Double.parseDouble(threshold.getText()));\r
-                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));\r
-\r
-                return filter;\r
-            } catch(Exception e){\r
-            }\r
-            return null;\r
-        }\r
-\r
-        @Override\r
-        public void resetComponents(){\r
-            threshold.setText("");\r
-            criterionType.setSelectedIndex(0);\r
-        }\r
-\r
-        @Override\r
-        public void setFilter(ComparisonPairFilter filter){\r
-            if(filter != null){\r
-                SimilarityComparisonPairFilter sf = (SimilarityComparisonPairFilter)filter;\r
-                criterionType.setSelectedItem(getDisplayCriterion(sf.getCriterion()));\r
-                threshold.setText(Double.toString(sf.getThreshold()));\r
-            }\r
-            else{\r
-                resetComponents();\r
-            }\r
-        }\r
-\r
-        private void initLayouts(){\r
-            JLabel label = new JLabel(getMessages().get("filter.similarity.label"));\r
-            threshold = new JTextField();\r
-            criterionType = createCriteriaBox(SimilarityComparisonPairFilter.getValidCriteria());\r
-\r
-            setLayout(new GridLayout(3, 1));\r
-            add(label);\r
-            add(criterionType);\r
-            add(threshold);\r
-\r
-            threshold.getDocument().addDocumentListener(new DocumentListener(){\r
-                public void changedUpdate(DocumentEvent e){\r
-                }\r
-\r
-                public void insertUpdate(DocumentEvent e){\r
-                }\r
-\r
-                public void removeUpdate(DocumentEvent e){\r
-                }\r
-            });\r
-        }\r
-    };\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.awt.GridLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.SimilarityComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.SimilarityComparisonPairFilterService;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$
+ */
+public class SimilarityComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService{
+
+    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){
+        return new Pane(frame, service);
+    }
+
+    public String getFilterName(){
+        return "similarity";
+    }
+
+    public ComparisonPairFilterSpi getComparisonPairFilterService(){
+        return new SimilarityComparisonPairFilterService();
+    }
+
+    private static class Pane extends ComparisonPairFilterPane{
+        private static final long serialVersionUID = 8912037614500713027L;
+        private ComparisonPairFilterSpi service;
+        private JComboBox criterionType;
+        private JTextField threshold;
+
+        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){
+            super(frame);
+            this.service = service;
+            initLayouts();
+        }
+
+        @Override
+        public String[] getErrors(){
+            List<String> errors = new ArrayList<String>();
+            if(threshold.getText().trim().equals("")){
+                errors.add(getMessages().get("error.empty.threshold"));
+            }
+            try{
+                double v = Double.parseDouble(threshold.getText());
+                if(v < 0d){
+                    errors.add(getMessages().format("error.negative.value", v));
+                }
+                else if(v > 1.0d){
+                    errors.add(getMessages().format("error.over.range", "0-1"));
+                }
+            } catch(NumberFormatException e){
+                errors.add(getMessages().format("error.invalid.format.double", threshold.getText()));
+            }
+
+            return errors.toArray(new String[errors.size()]);
+        }
+
+        @Override
+        public ComparisonPairFilter getFilter(){
+            try{
+                SimilarityComparisonPairFilter filter = new SimilarityComparisonPairFilter(service);
+                filter.setThreshold(Double.parseDouble(threshold.getText()));
+                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));
+
+                return filter;
+            } catch(Exception e){
+            }
+            return null;
+        }
+
+        @Override
+        public void resetComponents(){
+            threshold.setText("");
+            criterionType.setSelectedIndex(0);
+        }
+
+        @Override
+        public void setFilter(ComparisonPairFilter filter){
+            if(filter != null){
+                SimilarityComparisonPairFilter sf = (SimilarityComparisonPairFilter)filter;
+                criterionType.setSelectedItem(getDisplayCriterion(sf.getCriterion()));
+                threshold.setText(Double.toString(sf.getThreshold()));
+            }
+            else{
+                resetComponents();
+            }
+        }
+
+        private void initLayouts(){
+            JLabel label = new JLabel(getMessages().get("filter.similarity.label"));
+            threshold = new JTextField();
+            criterionType = createCriteriaBox(SimilarityComparisonPairFilter.getValidCriteria());
+
+            setLayout(new GridLayout(3, 1));
+            add(label);
+            add(criterionType);
+            add(threshold);
+
+            threshold.getDocument().addDocumentListener(new DocumentListener(){
+                public void changedUpdate(DocumentEvent e){
+                }
+
+                public void insertUpdate(DocumentEvent e){
+                }
+
+                public void removeUpdate(DocumentEvent e){
+                }
+            });
+        }
+    };
+}
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.GridLayout;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JTextField;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.FilterTarget;\r
-import jp.naist.se.stigmata.filter.TargetNameComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.TargetNameComparisonPairFilterService;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TargetNameComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService{\r
-\r
-    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-        return new Pane(frame, service);\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "name";\r
-    }\r
-\r
-    public ComparisonPairFilterSpi getComparisonPairFilterService(){\r
-        return new TargetNameComparisonPairFilterService();\r
-    }\r
-\r
-    private static class Pane extends ComparisonPairFilterPane{\r
-        private static final long serialVersionUID = 8912037614500713027L;\r
-        private ComparisonPairFilterSpi service;\r
-        private JComboBox criterionType;\r
-        private JTextField value;\r
-        private JComboBox targetType;\r
-\r
-        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-            super(frame);\r
-            this.service = service;\r
-            initLayouts();\r
-        }\r
-\r
-        @Override\r
-        public String[] getErrors(){\r
-            List<String> errors = new ArrayList<String>();\r
-            if(value.getText().trim().equals("")){\r
-                errors.add(getMessages().get("error.empty.value"));\r
-            }\r
-\r
-            return errors.toArray(new String[errors.size()]);\r
-        }\r
-\r
-        @Override\r
-        public ComparisonPairFilter getFilter(){\r
-            try{\r
-                TargetNameComparisonPairFilter filter = new TargetNameComparisonPairFilter(service);\r
-                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));\r
-                filter.setValue(value.getText());\r
-                filter.setTarget(getTarget((String)targetType.getSelectedItem()));\r
-\r
-                return filter;\r
-            } catch(Exception e){\r
-            }\r
-            return null;\r
-        }\r
-\r
-        @Override\r
-        public void resetComponents(){\r
-            value.setText("");\r
-            criterionType.setSelectedIndex(0);\r
-            targetType.setSelectedItem(getDisplayTarget(FilterTarget.BOTH_TARGETS));\r
-        }\r
-\r
-        @Override\r
-        public void setFilter(ComparisonPairFilter cpf){\r
-            TargetNameComparisonPairFilter filter = (TargetNameComparisonPairFilter)cpf;\r
-            criterionType.setSelectedItem(getDisplayCriterion(filter.getCriterion()));\r
-            value.setText(filter.getValue());\r
-            targetType.setSelectedItem(getDisplayTarget(filter.getTarget()));\r
-        }\r
-\r
-        private void initLayouts(){\r
-            JLabel label = new JLabel(getMessages().get("filter.name.label"));\r
-            value = new JTextField();\r
-            criterionType = createCriteriaBox(TargetNameComparisonPairFilter.getValidCriteria());\r
-            targetType = createTargetBox();\r
-\r
-            setLayout(new GridLayout(4, 1));\r
-            add(label);\r
-            add(targetType);\r
-            add(criterionType);\r
-            add(value);\r
-        }\r
-    };\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.awt.GridLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.FilterTarget;
+import jp.sourceforge.stigmata.filter.TargetNameComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.TargetNameComparisonPairFilterService;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TargetNameComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService{
+
+    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){
+        return new Pane(frame, service);
+    }
+
+    public String getFilterName(){
+        return "name";
+    }
+
+    public ComparisonPairFilterSpi getComparisonPairFilterService(){
+        return new TargetNameComparisonPairFilterService();
+    }
+
+    private static class Pane extends ComparisonPairFilterPane{
+        private static final long serialVersionUID = 8912037614500713027L;
+        private ComparisonPairFilterSpi service;
+        private JComboBox criterionType;
+        private JTextField value;
+        private JComboBox targetType;
+
+        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){
+            super(frame);
+            this.service = service;
+            initLayouts();
+        }
+
+        @Override
+        public String[] getErrors(){
+            List<String> errors = new ArrayList<String>();
+            if(value.getText().trim().equals("")){
+                errors.add(getMessages().get("error.empty.value"));
+            }
+
+            return errors.toArray(new String[errors.size()]);
+        }
+
+        @Override
+        public ComparisonPairFilter getFilter(){
+            try{
+                TargetNameComparisonPairFilter filter = new TargetNameComparisonPairFilter(service);
+                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));
+                filter.setValue(value.getText());
+                filter.setTarget(getTarget((String)targetType.getSelectedItem()));
+
+                return filter;
+            } catch(Exception e){
+            }
+            return null;
+        }
+
+        @Override
+        public void resetComponents(){
+            value.setText("");
+            criterionType.setSelectedIndex(0);
+            targetType.setSelectedItem(getDisplayTarget(FilterTarget.BOTH_TARGETS));
+        }
+
+        @Override
+        public void setFilter(ComparisonPairFilter cpf){
+            TargetNameComparisonPairFilter filter = (TargetNameComparisonPairFilter)cpf;
+            criterionType.setSelectedItem(getDisplayCriterion(filter.getCriterion()));
+            value.setText(filter.getValue());
+            targetType.setSelectedItem(getDisplayTarget(filter.getTarget()));
+        }
+
+        private void initLayouts(){
+            JLabel label = new JLabel(getMessages().get("filter.name.label"));
+            value = new JTextField();
+            criterionType = createCriteriaBox(TargetNameComparisonPairFilter.getValidCriteria());
+            targetType = createTargetBox();
+
+            setLayout(new GridLayout(4, 1));
+            add(label);
+            add(targetType);
+            add(criterionType);
+            add(value);
+        }
+    };
+}
-package jp.naist.se.stigmata.ui.swing.filter;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.GridLayout;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JTextField;\r
-\r
-import jp.naist.se.stigmata.ComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.FilterTarget;\r
-import jp.naist.se.stigmata.filter.TotalElementCountComparisonPairFilter;\r
-import jp.naist.se.stigmata.filter.TotalElementCountComparisonPairFilterService;\r
-import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class TotalElementCountComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService{\r
-\r
-    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-        return new Pane(frame, service);\r
-    }\r
-\r
-    public String getFilterName(){\r
-        return "totalelementcount";\r
-    }\r
-\r
-    public ComparisonPairFilterSpi getComparisonPairFilterService(){\r
-        return new TotalElementCountComparisonPairFilterService();\r
-    }\r
-\r
-    private static class Pane extends ComparisonPairFilterPane{\r
-        private static final long serialVersionUID = 8912037614500713027L;\r
-        private ComparisonPairFilterSpi service;\r
-        private JComboBox criterionType;\r
-        private JTextField threshold;\r
-        private JComboBox targetType;\r
-\r
-        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){\r
-            super(frame);\r
-            this.service = service;\r
-            initLayouts();\r
-        }\r
-\r
-        @Override\r
-        public String[] getErrors(){\r
-            List<String> errors = new ArrayList<String>();\r
-            if(threshold.getText().trim().equals("")){\r
-                errors.add(getMessages().get("error.empty.threshold"));\r
-            }\r
-            try{\r
-                int v = Integer.parseInt(threshold.getText());\r
-                if(v < 0){\r
-                    errors.add(getMessages().format("error.negative.value", v));\r
-                }\r
-            } catch(NumberFormatException e){\r
-                errors.add(getMessages().format("error.invalid.format.integer", threshold.getText()));\r
-            }\r
-            return errors.toArray(new String[errors.size()]);\r
-        }\r
-\r
-        @Override\r
-        public ComparisonPairFilter getFilter(){\r
-            try{\r
-                TotalElementCountComparisonPairFilter filter = new TotalElementCountComparisonPairFilter(service);\r
-                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));\r
-                filter.setThreshold(Integer.parseInt(threshold.getText()));\r
-                filter.setTarget(getTarget((String)targetType.getSelectedItem()));\r
-\r
-                return filter;\r
-            } catch(NumberFormatException e){\r
-            }\r
-            return null;\r
-        }\r
-\r
-        @Override\r
-        public void resetComponents(){\r
-            threshold.setText("");\r
-            criterionType.setSelectedIndex(0);\r
-            targetType.setSelectedItem(getDisplayTarget(FilterTarget.BOTH_TARGETS));\r
-        }\r
-\r
-        @Override\r
-        public void setFilter(ComparisonPairFilter cpf){\r
-            TotalElementCountComparisonPairFilter filter = (TotalElementCountComparisonPairFilter)cpf;\r
-            criterionType.setSelectedItem(getDisplayCriterion(filter.getCriterion()));\r
-            threshold.setText(String.valueOf(filter.getThreshold()));\r
-            targetType.setSelectedItem(getDisplayTarget(filter.getTarget()));\r
-        }\r
-\r
-        private void initLayouts(){\r
-            JLabel label = new JLabel(getMessages().get("filter.totalelementcount.label"));\r
-            threshold = new JTextField();\r
-            criterionType = createCriteriaBox(TotalElementCountComparisonPairFilter.getValidCriteria());\r
-            targetType = createTargetBox();\r
-\r
-            setLayout(new GridLayout(4, 1));\r
-            add(label);\r
-            add(targetType);\r
-            add(criterionType);\r
-            add(threshold);\r
-        }\r
-    };\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.filter;
+
+/*
+ * $Id$
+ */
+
+import java.awt.GridLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.FilterTarget;
+import jp.sourceforge.stigmata.filter.TotalElementCountComparisonPairFilter;
+import jp.sourceforge.stigmata.filter.TotalElementCountComparisonPairFilterService;
+import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class TotalElementCountComparisonPairFilterComponentService extends AbstractComparisonPairFilterComponentService{
+
+    public ComparisonPairFilterPane createComponent(StigmataFrame frame, ComparisonPairFilterSpi service){
+        return new Pane(frame, service);
+    }
+
+    public String getFilterName(){
+        return "totalelementcount";
+    }
+
+    public ComparisonPairFilterSpi getComparisonPairFilterService(){
+        return new TotalElementCountComparisonPairFilterService();
+    }
+
+    private static class Pane extends ComparisonPairFilterPane{
+        private static final long serialVersionUID = 8912037614500713027L;
+        private ComparisonPairFilterSpi service;
+        private JComboBox criterionType;
+        private JTextField threshold;
+        private JComboBox targetType;
+
+        public Pane(StigmataFrame frame, ComparisonPairFilterSpi service){
+            super(frame);
+            this.service = service;
+            initLayouts();
+        }
+
+        @Override
+        public String[] getErrors(){
+            List<String> errors = new ArrayList<String>();
+            if(threshold.getText().trim().equals("")){
+                errors.add(getMessages().get("error.empty.threshold"));
+            }
+            try{
+                int v = Integer.parseInt(threshold.getText());
+                if(v < 0){
+                    errors.add(getMessages().format("error.negative.value", v));
+                }
+            } catch(NumberFormatException e){
+                errors.add(getMessages().format("error.invalid.format.integer", threshold.getText()));
+            }
+            return errors.toArray(new String[errors.size()]);
+        }
+
+        @Override
+        public ComparisonPairFilter getFilter(){
+            try{
+                TotalElementCountComparisonPairFilter filter = new TotalElementCountComparisonPairFilter(service);
+                filter.setCriterion(getCriterion((String)criterionType.getSelectedItem()));
+                filter.setThreshold(Integer.parseInt(threshold.getText()));
+                filter.setTarget(getTarget((String)targetType.getSelectedItem()));
+
+                return filter;
+            } catch(NumberFormatException e){
+            }
+            return null;
+        }
+
+        @Override
+        public void resetComponents(){
+            threshold.setText("");
+            criterionType.setSelectedIndex(0);
+            targetType.setSelectedItem(getDisplayTarget(FilterTarget.BOTH_TARGETS));
+        }
+
+        @Override
+        public void setFilter(ComparisonPairFilter cpf){
+            TotalElementCountComparisonPairFilter filter = (TotalElementCountComparisonPairFilter)cpf;
+            criterionType.setSelectedItem(getDisplayCriterion(filter.getCriterion()));
+            threshold.setText(String.valueOf(filter.getThreshold()));
+            targetType.setSelectedItem(getDisplayTarget(filter.getTarget()));
+        }
+
+        private void initLayouts(){
+            JLabel label = new JLabel(getMessages().get("filter.totalelementcount.label"));
+            threshold = new JTextField();
+            criterionType = createCriteriaBox(TotalElementCountComparisonPairFilter.getValidCriteria());
+            targetType = createTargetBox();
+
+            setLayout(new GridLayout(4, 1));
+            add(label);
+            add(targetType);
+            add(criterionType);
+            add(threshold);
+        }
+    };
+}
-package jp.naist.se.stigmata.ui.swing.graph;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Dimension;\r
-import java.awt.FlowLayout;\r
-import java.awt.Graphics2D;\r
-import java.awt.RenderingHints;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.geom.Line2D;\r
-import java.awt.image.BufferedImage;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.util.HashSet;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import javax.imageio.ImageIO;\r
-import javax.swing.Box;\r
-import javax.swing.ImageIcon;\r
-import javax.swing.JButton;\r
-import javax.swing.JLabel;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.ui.swing.actions.ChangeColorAction;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SimilarityDistributionGraphPane extends JPanel{\r
-    private static final long serialVersionUID = 2314463453465L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private Map<Integer, Integer> distributions;\r
-    private int totalCount = 0;\r
-    private int maxFrequency = 0;\r
-    private JLabel iconLabel;\r
-    private BufferedImage image;\r
-\r
-    public SimilarityDistributionGraphPane(StigmataFrame stigmata, Map<Integer, Integer> distributions){\r
-        this.stigmata = stigmata;\r
-\r
-        this.distributions = distributions;\r
-        initializeLayouts();\r
-        initializeData();\r
-\r
-        drawGraph(Color.RED);\r
-    }\r
-\r
-    public String[] getSupportedFormats(){\r
-        String[] formats = ImageIO.getWriterFormatNames();\r
-        Set<String> set = new HashSet<String>();\r
-        for(String f: formats){\r
-            if(f != null){\r
-                set.add(f.toLowerCase());\r
-            }\r
-        }\r
-        return set.toArray(new String[set.size()]);\r
-    }\r
-\r
-    private void drawGraph(Color color){\r
-        Graphics2D g = image.createGraphics();\r
-        g.setColor(getBackground());\r
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());\r
-\r
-        int width = image.getWidth();\r
-        int height = image.getHeight();\r
-        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
-\r
-        drawBorder(g, width, height);\r
-\r
-        g.setColor(color);\r
-        Dimension d = new Dimension(width - 20, height - 20);\r
-        double w = (d.width / 100d);\r
-\r
-        Integer v1 = distributions.get(0);\r
-        if(v1 == null) v1 = new Integer(0);\r
-        double x = 20;\r
-        for(int i = 0; i <= 100; i++){\r
-            Integer v2 = distributions.get(i);\r
-            if(v2 == null) new Integer(0);\r
-\r
-            double hh1 = v1 * ((double)height / totalCount);\r
-            double hh2 = v2 * ((double)height / totalCount);\r
-\r
-            g.draw(new Line2D.Double(x, d.height - hh1, x + w, d.height - hh2));\r
-            x += w;\r
-            v1 = v2;\r
-        }\r
-        iconLabel.setIcon(new ImageIcon(image));\r
-    }\r
-\r
-    private void drawBorder(Graphics2D g, int width, int height){\r
-        g.setColor(Color.BLACK);\r
-        g.draw(new Line2D.Double(0, height - 20, width, height - 20));\r
-        g.draw(new Line2D.Double(20, 0, 20, height));\r
-\r
-        g.setColor(Color.GRAY);\r
-        // x axis\r
-        double h = (height - 20) / 2d;\r
-        g.draw(new Line2D.Double(20, h, width, h));\r
-        h = h / 2;\r
-        g.draw(new Line2D.Double(20, h, width, h));\r
-        g.draw(new Line2D.Double(20, h * 3, width, h * 3));\r
-\r
-        // y axis\r
-        double w = (width - 20d) / 2d;\r
-        g.draw(new Line2D.Double(w + 20, 0, w + 20, height - 20));\r
-        w = w / 2;\r
-        g.draw(new Line2D.Double(w + 20, 0, w + 20, height - 20));\r
-        g.draw(new Line2D.Double(w * 3 + 20, 0, w * 3 + 20, height - 20));\r
-\r
-        g.drawString("0", 10, height - 5);\r
-        g.drawString("50%", (width - 20) / 2 + 10, height - 5);\r
-        g.drawString(stigmata.getMessages().get("similarity.label"), width - 60, height - 5);\r
-        g.drawString("50%", 0, (height - 20) / 2);\r
-    }\r
-\r
-    private void initializeData(){\r
-        maxFrequency = 0;\r
-        for(int i = 0; i <= 100; i++){\r
-            Integer frequency = distributions.get(new Integer(i));\r
-            if(frequency == null){\r
-                frequency = new Integer(0);\r
-                distributions.put(new Integer(i), frequency);\r
-            }\r
-            if(maxFrequency < frequency.intValue()){\r
-                maxFrequency = frequency.intValue();\r
-            }\r
-            totalCount += frequency.intValue();\r
-        }\r
-    }\r
-\r
-    private void initializeLayouts(){\r
-        image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);\r
-\r
-        JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
-        iconLabel = new JLabel();\r
-        Box south = Box.createHorizontalBox();\r
-        JButton storeImageButton = GUIUtility.createButton(stigmata.getMessages(), "savegraph");\r
-        JButton switchColorButton = new JButton(new ChangeColorAction(stigmata, new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                ChangeColorAction action = (ChangeColorAction)e.getSource();\r
-                if(action.isColorSelected()){\r
-                    drawGraph(action.getColor());\r
-                }\r
-            }\r
-        }));\r
-        storeImageButton.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                storeGraphImage();\r
-            }\r
-        });\r
-\r
-        setLayout(new BorderLayout());\r
-        center.add(iconLabel = new JLabel());\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(switchColorButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(storeImageButton);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        add(center, BorderLayout.CENTER);\r
-        add(south, BorderLayout.SOUTH);\r
-    }\r
-\r
-    private void storeGraphImage(){\r
-        String[] exts = getSupportedFormats();\r
-        File file = stigmata.getSaveFile(\r
-            exts, stigmata.getMessages().get("savegraph.description")\r
-        );\r
-        try{\r
-            if(file != null){\r
-                String format = file.getName();\r
-                format = format.substring(format.lastIndexOf('.') + 1);\r
-\r
-                ImageIO.write(image, format, file);\r
-            }\r
-        } catch(IOException e){\r
-            JOptionPane.showMessageDialog(\r
-                this,\r
-                stigmata.getMessages().get("error.io", e.getMessage()),\r
-                stigmata.getMessages().get("error.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.graph;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.geom.Line2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.imageio.ImageIO;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.stigmata.ui.swing.actions.ChangeColorAction;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SimilarityDistributionGraphPane extends JPanel{
+    private static final long serialVersionUID = 2314463453465L;
+
+    private StigmataFrame stigmata;
+    private Map<Integer, Integer> distributions;
+    private int totalCount = 0;
+    private int maxFrequency = 0;
+    private JLabel iconLabel;
+    private BufferedImage image;
+
+    public SimilarityDistributionGraphPane(StigmataFrame stigmata, Map<Integer, Integer> distributions){
+        this.stigmata = stigmata;
+
+        this.distributions = distributions;
+        initializeLayouts();
+        initializeData();
+
+        drawGraph(Color.RED);
+    }
+
+    public String[] getSupportedFormats(){
+        String[] formats = ImageIO.getWriterFormatNames();
+        Set<String> set = new HashSet<String>();
+        for(String f: formats){
+            if(f != null){
+                set.add(f.toLowerCase());
+            }
+        }
+        return set.toArray(new String[set.size()]);
+    }
+
+    private void drawGraph(Color color){
+        Graphics2D g = image.createGraphics();
+        g.setColor(getBackground());
+        g.fillRect(0, 0, image.getWidth(), image.getHeight());
+
+        int width = image.getWidth();
+        int height = image.getHeight();
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+        drawBorder(g, width, height);
+
+        g.setColor(color);
+        Dimension d = new Dimension(width - 20, height - 20);
+        double w = (d.width / 100d);
+
+        Integer v1 = distributions.get(0);
+        if(v1 == null) v1 = new Integer(0);
+        double x = 20;
+        for(int i = 0; i <= 100; i++){
+            Integer v2 = distributions.get(i);
+            if(v2 == null) new Integer(0);
+
+            double hh1 = v1 * ((double)height / totalCount);
+            double hh2 = v2 * ((double)height / totalCount);
+
+            g.draw(new Line2D.Double(x, d.height - hh1, x + w, d.height - hh2));
+            x += w;
+            v1 = v2;
+        }
+        iconLabel.setIcon(new ImageIcon(image));
+    }
+
+    private void drawBorder(Graphics2D g, int width, int height){
+        g.setColor(Color.BLACK);
+        g.draw(new Line2D.Double(0, height - 20, width, height - 20));
+        g.draw(new Line2D.Double(20, 0, 20, height));
+
+        g.setColor(Color.GRAY);
+        // x axis
+        double h = (height - 20) / 2d;
+        g.draw(new Line2D.Double(20, h, width, h));
+        h = h / 2;
+        g.draw(new Line2D.Double(20, h, width, h));
+        g.draw(new Line2D.Double(20, h * 3, width, h * 3));
+
+        // y axis
+        double w = (width - 20d) / 2d;
+        g.draw(new Line2D.Double(w + 20, 0, w + 20, height - 20));
+        w = w / 2;
+        g.draw(new Line2D.Double(w + 20, 0, w + 20, height - 20));
+        g.draw(new Line2D.Double(w * 3 + 20, 0, w * 3 + 20, height - 20));
+
+        g.drawString("0", 10, height - 5);
+        g.drawString("50%", (width - 20) / 2 + 10, height - 5);
+        g.drawString(stigmata.getMessages().get("similarity.label"), width - 60, height - 5);
+        g.drawString("50%", 0, (height - 20) / 2);
+    }
+
+    private void initializeData(){
+        maxFrequency = 0;
+        for(int i = 0; i <= 100; i++){
+            Integer frequency = distributions.get(new Integer(i));
+            if(frequency == null){
+                frequency = new Integer(0);
+                distributions.put(new Integer(i), frequency);
+            }
+            if(maxFrequency < frequency.intValue()){
+                maxFrequency = frequency.intValue();
+            }
+            totalCount += frequency.intValue();
+        }
+    }
+
+    private void initializeLayouts(){
+        image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
+
+        JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER));
+        iconLabel = new JLabel();
+        Box south = Box.createHorizontalBox();
+        JButton storeImageButton = GUIUtility.createButton(stigmata.getMessages(), "savegraph");
+        JButton switchColorButton = new JButton(new ChangeColorAction(stigmata, new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                ChangeColorAction action = (ChangeColorAction)e.getSource();
+                if(action.isColorSelected()){
+                    drawGraph(action.getColor());
+                }
+            }
+        }));
+        storeImageButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                storeGraphImage();
+            }
+        });
+
+        setLayout(new BorderLayout());
+        center.add(iconLabel = new JLabel());
+        south.add(Box.createHorizontalGlue());
+        south.add(switchColorButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(storeImageButton);
+        south.add(Box.createHorizontalGlue());
+
+        add(center, BorderLayout.CENTER);
+        add(south, BorderLayout.SOUTH);
+    }
+
+    private void storeGraphImage(){
+        String[] exts = getSupportedFormats();
+        File file = stigmata.getSaveFile(
+            exts, stigmata.getMessages().get("savegraph.description")
+        );
+        try{
+            if(file != null){
+                String format = file.getName();
+                format = format.substring(format.lastIndexOf('.') + 1);
+
+                ImageIO.write(image, format, file);
+            }
+        } catch(IOException e){
+            JOptionPane.showMessageDialog(
+                this,
+                stigmata.getMessages().get("error.io", e.getMessage()),
+                stigmata.getMessages().get("error.dialog.title"),
+                JOptionPane.ERROR_MESSAGE
+            );
+        }
+    }
+}
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class Coordinate{\r
-    private double x, y, z;\r
-    private String label;\r
-    private String showName;\r
-    private int groupId = 0;\r
-\r
-    public Coordinate(String label, double x, double y){\r
-        this(label, shortenLabel(label), x, y, Double.NaN);\r
-    }\r
-\r
-    public Coordinate(String label, double x, double y, double z){\r
-        this(label, shortenLabel(label), x, y, z);\r
-    }\r
-\r
-    public Coordinate(String label, String showName, double x, double y){\r
-        this(label, showName, x, y, Double.NaN);\r
-    }\r
-\r
-    public Coordinate(String label, String showName, double x, double y, double z){\r
-        this.label = label;\r
-        this.showName = showName;\r
-        this.x = x;\r
-        this.y = y;\r
-        this.z = z;\r
-    }\r
-\r
-    public String toString(){\r
-        return String.format("%s[%d] (%g, %g)", getLabel(), getGroupId(), getX(), getY());\r
-    }\r
-\r
-    public int getGroupId(){\r
-        return groupId;\r
-    }\r
-\r
-    public void setGroupId(int groupId){\r
-        this.groupId = groupId;\r
-    }\r
-\r
-    public String getLabel(){\r
-        return label;\r
-    }\r
-\r
-    public void setLabel(String label){\r
-        this.label = label;\r
-    }\r
-\r
-    public String getShowName(){\r
-        return showName;\r
-    }\r
-\r
-    public void setShowName(String showName){\r
-        this.showName = showName;\r
-    }\r
-\r
-    public double getX(){\r
-        return x;\r
-    }\r
-\r
-    public void setX(double x){\r
-        this.x = x;\r
-    }\r
-\r
-    public double getY(){\r
-        return y;\r
-    }\r
-\r
-    public void setY(double y){\r
-        this.y = y;\r
-    }\r
-\r
-    public double getZ(){\r
-        return z;\r
-    }\r
-\r
-    public void setZ(double z){\r
-        this.z = z;\r
-    }\r
-\r
-    private static String shortenLabel(String label){\r
-        int index = label.lastIndexOf('/');\r
-        if(index < 0){\r
-            index = label.lastIndexOf('\\');\r
-        }\r
-        int firstIndex = label.indexOf('.');\r
-        int lastIndex = label.lastIndexOf('.');\r
-        int length = label.length();\r
-        String returnValue = label;\r
-\r
-        if(index < 0 && (firstIndex != lastIndex && lastIndex != (length - 1))){\r
-            index = lastIndex;\r
-            returnValue = label.substring(index + 1);\r
-            if("jar".equals(returnValue)){\r
-                returnValue = label;\r
-            }\r
-        }\r
-        return returnValue;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class Coordinate{
+    private double x, y, z;
+    private String label;
+    private String showName;
+    private int groupId = 0;
+
+    public Coordinate(String label, double x, double y){
+        this(label, shortenLabel(label), x, y, Double.NaN);
+    }
+
+    public Coordinate(String label, double x, double y, double z){
+        this(label, shortenLabel(label), x, y, z);
+    }
+
+    public Coordinate(String label, String showName, double x, double y){
+        this(label, showName, x, y, Double.NaN);
+    }
+
+    public Coordinate(String label, String showName, double x, double y, double z){
+        this.label = label;
+        this.showName = showName;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+
+    public String toString(){
+        return String.format("%s[%d] (%g, %g)", getLabel(), getGroupId(), getX(), getY());
+    }
+
+    public int getGroupId(){
+        return groupId;
+    }
+
+    public void setGroupId(int groupId){
+        this.groupId = groupId;
+    }
+
+    public String getLabel(){
+        return label;
+    }
+
+    public void setLabel(String label){
+        this.label = label;
+    }
+
+    public String getShowName(){
+        return showName;
+    }
+
+    public void setShowName(String showName){
+        this.showName = showName;
+    }
+
+    public double getX(){
+        return x;
+    }
+
+    public void setX(double x){
+        this.x = x;
+    }
+
+    public double getY(){
+        return y;
+    }
+
+    public void setY(double y){
+        this.y = y;
+    }
+
+    public double getZ(){
+        return z;
+    }
+
+    public void setZ(double z){
+        this.z = z;
+    }
+
+    private static String shortenLabel(String label){
+        int index = label.lastIndexOf('/');
+        if(index < 0){
+            index = label.lastIndexOf('\\');
+        }
+        int firstIndex = label.indexOf('.');
+        int lastIndex = label.lastIndexOf('.');
+        int length = label.length();
+        String returnValue = label;
+
+        if(index < 0 && (firstIndex != lastIndex && lastIndex != (length - 1))){
+            index = lastIndex;
+            returnValue = label.substring(index + 1);
+            if("jar".equals(returnValue)){
+                returnValue = label;
+            }
+        }
+        return returnValue;
+    }
+}
@@ -1,29 +1,29 @@
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public enum GeometoryType{\r
-    RECTANGLE,\r
-    UPPER_TRIANGLE,\r
-    CIRCLE,\r
-    XMARK,\r
-    RHOMBUS,\r
-    DOWNER_TRIANGLE,\r
-    FILLED_RECTANGLE,\r
-    CROSS,\r
-    FILLED_UPPER_TRIANGLE,\r
-    FILLED_CIRCLE,\r
-    FILLED_RHOMBUS,\r
-    STAR,\r
-    FILLED_DOWNER_TRIANGLE;\r
-\r
-    public static int getMaxGroupCount(){\r
-        return FILLED_DOWNER_TRIANGLE.ordinal();\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public enum GeometoryType{
+    RECTANGLE,
+    UPPER_TRIANGLE,
+    CIRCLE,
+    XMARK,
+    RHOMBUS,
+    DOWNER_TRIANGLE,
+    FILLED_RECTANGLE,
+    CROSS,
+    FILLED_UPPER_TRIANGLE,
+    FILLED_CIRCLE,
+    FILLED_RHOMBUS,
+    STAR,
+    FILLED_DOWNER_TRIANGLE;
+
+    public static int getMaxGroupCount(){
+        return FILLED_DOWNER_TRIANGLE.ordinal();
+    }
+}
-package jp.naist.se.stigmata.ui.swing.mds;\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class LabelMap{\r
-    private List<String> labels = new ArrayList<String>();\r
-    private Map<String, String> groups = new HashMap<String, String>();\r
-    private Map<String, Integer> gids = new HashMap<String, Integer>();\r
-    private boolean groupEnabled = true;\r
-\r
-    public LabelMap(){\r
-        gids.put("", 0);\r
-    }\r
-\r
-    public LabelMap(String[] labels){\r
-        this();\r
-        for(String label: labels){\r
-            addLabel(label);\r
-        }\r
-    }\r
-\r
-    public boolean isAvailableLabel(int index){\r
-        return index >= 0 && index < labels.size();\r
-    }\r
-\r
-    public void setGroupEnabled(boolean flag){\r
-        this.groupEnabled = flag;\r
-    }\r
-\r
-    public boolean isGroupEnabled(){\r
-        return groupEnabled && getGroupCount() < GeometoryType.getMaxGroupCount();\r
-    }\r
-\r
-    public void addLabel(String label){\r
-        labels.add(label);\r
-    }\r
-\r
-    public String getLabel(int index){\r
-        return labels.get(index);\r
-    }\r
-\r
-    public void setGroup(String label, String groupLabel){\r
-        groups.put(label, groupLabel);\r
-        if(gids.get(groupLabel) == null){\r
-            gids.put(groupLabel, gids.size());\r
-        }\r
-    }\r
-\r
-    public String getGroup(String label){\r
-        String group = groups.get(label);\r
-        if(group == null){\r
-            group = "";\r
-        }\r
-        return group;\r
-    }\r
-\r
-    public int getGroupIdFromElementName(String label){\r
-        return getGroupId(groups.get(label));\r
-    }\r
-\r
-    public int getGroupId(String groupLabel){\r
-        Integer i = new Integer(0);\r
-        if(isGroupEnabled()){\r
-            i = gids.get(groupLabel);\r
-            if(i == null){\r
-                i = new Integer(0);\r
-            }\r
-        }\r
-        return i;\r
-    }\r
-\r
-    public int getGroupCount(){\r
-        return gids.size();\r
-    }\r
-\r
-    public String[] getGroupNames(){\r
-        String[] names = new String[gids.size()];\r
-        int index = 0;\r
-        for(String name: gids.keySet()){\r
-            names[index] = name;\r
-            index++;\r
-        }\r
-\r
-        return names;\r
-    }\r
-\r
-    public synchronized int getGroupElementCount(String group){\r
-        int count = 0;\r
-        for(Map.Entry<String, String> entry: groups.entrySet()){\r
-            if(group.equals(entry.getValue())){\r
-                count++;\r
-            }\r
-        }\r
-        return count;\r
-    }\r
-\r
-    public synchronized String[] getGroupElements(String group){\r
-        List<String> elements = new ArrayList<String>();\r
-        for(Map.Entry<String, String> entry: groups.entrySet()){\r
-            if(group.equals(entry.getValue())){\r
-                elements.add(entry.getKey());\r
-            }\r
-        }\r
-        return elements.toArray(new String[elements.size()]);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class LabelMap{
+    private List<String> labels = new ArrayList<String>();
+    private Map<String, String> groups = new HashMap<String, String>();
+    private Map<String, Integer> gids = new HashMap<String, Integer>();
+    private boolean groupEnabled = true;
+
+    public LabelMap(){
+        gids.put("", 0);
+    }
+
+    public LabelMap(String[] labels){
+        this();
+        for(String label: labels){
+            addLabel(label);
+        }
+    }
+
+    public boolean isAvailableLabel(int index){
+        return index >= 0 && index < labels.size();
+    }
+
+    public void setGroupEnabled(boolean flag){
+        this.groupEnabled = flag;
+    }
+
+    public boolean isGroupEnabled(){
+        return groupEnabled && getGroupCount() < GeometoryType.getMaxGroupCount();
+    }
+
+    public void addLabel(String label){
+        labels.add(label);
+    }
+
+    public String getLabel(int index){
+        return labels.get(index);
+    }
+
+    public void setGroup(String label, String groupLabel){
+        groups.put(label, groupLabel);
+        if(gids.get(groupLabel) == null){
+            gids.put(groupLabel, gids.size());
+        }
+    }
+
+    public String getGroup(String label){
+        String group = groups.get(label);
+        if(group == null){
+            group = "";
+        }
+        return group;
+    }
+
+    public int getGroupIdFromElementName(String label){
+        return getGroupId(groups.get(label));
+    }
+
+    public int getGroupId(String groupLabel){
+        Integer i = new Integer(0);
+        if(isGroupEnabled()){
+            i = gids.get(groupLabel);
+            if(i == null){
+                i = new Integer(0);
+            }
+        }
+        return i;
+    }
+
+    public int getGroupCount(){
+        return gids.size();
+    }
+
+    public String[] getGroupNames(){
+        String[] names = new String[gids.size()];
+        int index = 0;
+        for(String name: gids.keySet()){
+            names[index] = name;
+            index++;
+        }
+
+        return names;
+    }
+
+    public synchronized int getGroupElementCount(String group){
+        int count = 0;
+        for(Map.Entry<String, String> entry: groups.entrySet()){
+            if(group.equals(entry.getValue())){
+                count++;
+            }
+        }
+        return count;
+    }
+
+    public synchronized String[] getGroupElements(String group){
+        List<String> elements = new ArrayList<String>();
+        for(Map.Entry<String, String> entry: groups.entrySet()){
+            if(group.equals(entry.getValue())){
+                elements.add(entry.getKey());
+            }
+        }
+        return elements.toArray(new String[elements.size()]);
+    }
+}
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Dimension;\r
-import java.awt.FlowLayout;\r
-import java.awt.GridLayout;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.ComponentAdapter;\r
-import java.awt.event.ComponentEvent;\r
-import java.net.URL;\r
-\r
-import javax.swing.Action;\r
-import javax.swing.Box;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JPanel;\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.ComparisonPair;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.result.SingleExtractionResultSet;\r
-import jp.naist.se.stigmata.ui.swing.ClippedLRListCellRenderer;\r
-import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
-import jp.naist.se.stigmata.ui.swing.PopupButton;\r
-import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.ui.swing.actions.ChangeColorAction;\r
-import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
-import jp.naist.se.stigmata.ui.swing.mds.mark.DrawerFactory;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-import Jama.Matrix;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class MDSGraphPanel extends JPanel{\r
-    private static final long serialVersionUID = -7256554014379112897L;\r
-\r
-    private StigmataFrame stigmata;\r
-    private BirthmarkSet[] set;\r
-    private BirthmarkContext context;\r
-    private LabelMap labels;\r
-    private MDSGraphViewer viewer;\r
-\r
-    public MDSGraphPanel(StigmataFrame stigmata, BirthmarkSet[] set, BirthmarkContext context){\r
-        this.stigmata = stigmata;\r
-        this.context = context;\r
-        this.set = set;\r
-\r
-        double[][] matrix = initData(set, context);\r
-        initLayouts(matrix);\r
-    }\r
-\r
-    private double[][] initData(BirthmarkSet[] set, BirthmarkContext context){\r
-        labels = new LabelMap();\r
-        double[][] matrix = new double[set.length][set.length];\r
-\r
-        for(int i = 0; i < set.length; i++){\r
-            for(int j = 0; j <= i; j++){\r
-                ComparisonPair pair = new ComparisonPair(set[i], set[j], context);\r
-                matrix[i][j] = 1d - pair.calculateSimilarity();\r
-                if(i != j){\r
-                    matrix[j][i] = matrix[i][j];\r
-                }\r
-            }\r
-            String className = set[i].getName();\r
-            labels.addLabel(className);\r
-            String groupName = getGroupName(set[i].getLocation());\r
-            labels.setGroup(className, groupName);\r
-        }\r
-        return matrix;\r
-    }\r
-\r
-    private String getGroupName(URL location){\r
-        String url = location.toString();\r
-        if(url.startsWith("jar:")){\r
-            url = url.substring("jar:".length(), url.lastIndexOf('!'));\r
-        }\r
-        return url;\r
-    }\r
-\r
-    /**\r
-     * This method must called after\r
-     * {@link #initData(BirthmarkSet[], BirthmarkEnvironment) <code>initData</code>}.\r
-     * Because this method uses calculated value in initData method.\r
-     */\r
-    private void initLayouts(double[][] matrix){\r
-        final Messages messages = stigmata.getMessages();\r
-        viewer = new MDSGraphViewer(stigmata.getMessages(), new MDSMethod(new Matrix(matrix)), labels);\r
-        viewer.setShowLabel(true);\r
-\r
-        viewer.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                String c = e.getActionCommand();\r
-                for(int i = 0; i < set.length; i++){\r
-                    if(c.equals(set[i].getName())){\r
-                        ExtractionResultSet ers = new SingleExtractionResultSet(context, set[i]);\r
-                        stigmata.showExtractionResult(ers);\r
-                    }\r
-                }\r
-            }\r
-        });\r
-        JCheckBox check = new JCheckBox(stigmata.getMessages().get("showlabel.button.label"), true);\r
-        check.addActionListener(new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                JCheckBox c = (JCheckBox)e.getSource();\r
-                viewer.setShowLabel(c.isSelected());\r
-            }\r
-        });\r
-\r
-        Action pointColorAction = new ChangeColorAction(\r
-            "updatecolor", stigmata, Color.BLACK, new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                ChangeColorAction action = (ChangeColorAction)e.getSource();\r
-                viewer.setPointColor(action.getColor());\r
-            }\r
-        });\r
-        Action overColorAction = new ChangeColorAction(\r
-            "updateovercolor", stigmata, Color.BLUE, new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                ChangeColorAction action = (ChangeColorAction)e.getSource();\r
-                viewer.setOverColor(action.getColor());\r
-            }\r
-        });\r
-        SaveAction saveMDSAction = new SaveAction(stigmata, new MDSImageExporter(viewer));\r
-        saveMDSAction.setExtensions(stigmata.getMessages().getArray("savemds.extensions"));\r
-        saveMDSAction.setDescrpition(stigmata.getMessages().get("savemds.description"));\r
-\r
-        SaveAction saveCoordinate = new SaveAction(stigmata, new MDSPointsLocationExporter(viewer));\r
-        saveCoordinate.setExtensions(stigmata.getMessages().getArray("savelocation.extensions"));\r
-        saveCoordinate.setDescrpition(stigmata.getMessages().get("savelocation.description"));\r
-\r
-        PopupButton colorButton = new PopupButton(\r
-            GUIUtility.createButton(messages, "updatecolor", pointColorAction)\r
-        );\r
-        colorButton.addMenuItem(GUIUtility.createJMenuItem(messages, "updateovercolor", overColorAction));\r
-        PopupButton saveButton = new PopupButton(\r
-            GUIUtility.createButton(messages, "savemds", saveMDSAction)\r
-        );\r
-        saveButton.addMenuItem(GUIUtility.createJMenuItem(messages, "savelocation", saveCoordinate));\r
-\r
-        JLabel numberOfDotsLabel = new JLabel(String.valueOf(set.length));\r
-        GUIUtility.decorateJComponent(messages, numberOfDotsLabel, "mdsgraph.count");\r
-        // set the number of dots of each groups\r
-        JComboBox numberOfGroupsLabelCombo = new JComboBox();\r
-        GeometoryType[] types = GeometoryType.values();\r
-        DrawerFactory factory = DrawerFactory.getInstance();\r
-        for(String name: labels.getGroupNames()){\r
-            int count = labels.getGroupElementCount(name);\r
-            if(count != 0){\r
-                ClippedLRListCellRenderer.LRItem item = new ClippedLRListCellRenderer.LRItem(name, count);\r
-                item.setIcon(factory.createIcon(types[labels.getGroupId(name)]));\r
-                numberOfGroupsLabelCombo.addItem(item);\r
-            }\r
-        }\r
-        numberOfGroupsLabelCombo.setEditable(false);\r
-        Dimension dim = new Dimension(100, numberOfGroupsLabelCombo.getPreferredSize().height);\r
-        numberOfGroupsLabelCombo.setRenderer(new ClippedLRListCellRenderer(dim, 50));\r
-        GUIUtility.decorateJComponent(messages, numberOfGroupsLabelCombo, "mdsgraph.group");\r
-\r
-        JPanel north = new JPanel(new GridLayout(1, 2));\r
-        north.add(numberOfDotsLabel);\r
-        north.add(numberOfGroupsLabelCombo);\r
-\r
-        Box south = Box.createHorizontalBox();\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(saveButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(colorButton);\r
-        south.add(Box.createHorizontalGlue());\r
-        south.add(check);\r
-        south.add(Box.createHorizontalGlue());\r
-\r
-        JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
-        center.addComponentListener(new ComponentAdapter(){\r
-            @Override\r
-            public void componentResized(ComponentEvent e){\r
-                Dimension d = e.getComponent().getSize();\r
-                viewer.setSize(d.width - 10, d.height - 10);\r
-            }\r
-        });\r
-        setLayout(new BorderLayout());\r
-\r
-        center.add(viewer);\r
-\r
-        add(north, BorderLayout.NORTH);\r
-        add(center, BorderLayout.CENTER);\r
-        add(south, BorderLayout.SOUTH);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.net.URL;
+
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ComparisonPair;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.result.SingleExtractionResultSet;
+import jp.sourceforge.stigmata.ui.swing.ClippedLRListCellRenderer;
+import jp.sourceforge.stigmata.ui.swing.GUIUtility;
+import jp.sourceforge.stigmata.ui.swing.PopupButton;
+import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
+import jp.sourceforge.stigmata.ui.swing.actions.ChangeColorAction;
+import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
+import jp.sourceforge.stigmata.ui.swing.mds.mark.DrawerFactory;
+import jp.sourceforge.talisman.i18n.Messages;
+import Jama.Matrix;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class MDSGraphPanel extends JPanel{
+    private static final long serialVersionUID = -7256554014379112897L;
+
+    private StigmataFrame stigmata;
+    private BirthmarkSet[] set;
+    private BirthmarkContext context;
+    private LabelMap labels;
+    private MDSGraphViewer viewer;
+
+    public MDSGraphPanel(StigmataFrame stigmata, BirthmarkSet[] set, BirthmarkContext context){
+        this.stigmata = stigmata;
+        this.context = context;
+        this.set = set;
+
+        double[][] matrix = initData(set, context);
+        initLayouts(matrix);
+    }
+
+    private double[][] initData(BirthmarkSet[] set, BirthmarkContext context){
+        labels = new LabelMap();
+        double[][] matrix = new double[set.length][set.length];
+
+        for(int i = 0; i < set.length; i++){
+            for(int j = 0; j <= i; j++){
+                ComparisonPair pair = new ComparisonPair(set[i], set[j], context);
+                matrix[i][j] = 1d - pair.calculateSimilarity();
+                if(i != j){
+                    matrix[j][i] = matrix[i][j];
+                }
+            }
+            String className = set[i].getName();
+            labels.addLabel(className);
+            String groupName = getGroupName(set[i].getLocation());
+            labels.setGroup(className, groupName);
+        }
+        return matrix;
+    }
+
+    private String getGroupName(URL location){
+        String url = location.toString();
+        if(url.startsWith("jar:")){
+            url = url.substring("jar:".length(), url.lastIndexOf('!'));
+        }
+        return url;
+    }
+
+    /**
+     * This method must called after
+     * {@link #initData(BirthmarkSet[], BirthmarkEnvironment) <code>initData</code>}.
+     * Because this method uses calculated value in initData method.
+     */
+    private void initLayouts(double[][] matrix){
+        final Messages messages = stigmata.getMessages();
+        viewer = new MDSGraphViewer(stigmata.getMessages(), new MDSMethod(new Matrix(matrix)), labels);
+        viewer.setShowLabel(true);
+
+        viewer.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                String c = e.getActionCommand();
+                for(int i = 0; i < set.length; i++){
+                    if(c.equals(set[i].getName())){
+                        ExtractionResultSet ers = new SingleExtractionResultSet(context, set[i]);
+                        stigmata.showExtractionResult(ers);
+                    }
+                }
+            }
+        });
+        JCheckBox check = new JCheckBox(stigmata.getMessages().get("showlabel.button.label"), true);
+        check.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                JCheckBox c = (JCheckBox)e.getSource();
+                viewer.setShowLabel(c.isSelected());
+            }
+        });
+
+        Action pointColorAction = new ChangeColorAction(
+            "updatecolor", stigmata, Color.BLACK, new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                ChangeColorAction action = (ChangeColorAction)e.getSource();
+                viewer.setPointColor(action.getColor());
+            }
+        });
+        Action overColorAction = new ChangeColorAction(
+            "updateovercolor", stigmata, Color.BLUE, new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                ChangeColorAction action = (ChangeColorAction)e.getSource();
+                viewer.setOverColor(action.getColor());
+            }
+        });
+        SaveAction saveMDSAction = new SaveAction(stigmata, new MDSImageExporter(viewer));
+        saveMDSAction.setExtensions(stigmata.getMessages().getArray("savemds.extensions"));
+        saveMDSAction.setDescrpition(stigmata.getMessages().get("savemds.description"));
+
+        SaveAction saveCoordinate = new SaveAction(stigmata, new MDSPointsLocationExporter(viewer));
+        saveCoordinate.setExtensions(stigmata.getMessages().getArray("savelocation.extensions"));
+        saveCoordinate.setDescrpition(stigmata.getMessages().get("savelocation.description"));
+
+        PopupButton colorButton = new PopupButton(
+            GUIUtility.createButton(messages, "updatecolor", pointColorAction)
+        );
+        colorButton.addMenuItem(GUIUtility.createJMenuItem(messages, "updateovercolor", overColorAction));
+        PopupButton saveButton = new PopupButton(
+            GUIUtility.createButton(messages, "savemds", saveMDSAction)
+        );
+        saveButton.addMenuItem(GUIUtility.createJMenuItem(messages, "savelocation", saveCoordinate));
+
+        JLabel numberOfDotsLabel = new JLabel(String.valueOf(set.length));
+        GUIUtility.decorateJComponent(messages, numberOfDotsLabel, "mdsgraph.count");
+        // set the number of dots of each groups
+        JComboBox numberOfGroupsLabelCombo = new JComboBox();
+        GeometoryType[] types = GeometoryType.values();
+        DrawerFactory factory = DrawerFactory.getInstance();
+        for(String name: labels.getGroupNames()){
+            int count = labels.getGroupElementCount(name);
+            if(count != 0){
+                ClippedLRListCellRenderer.LRItem item = new ClippedLRListCellRenderer.LRItem(name, count);
+                item.setIcon(factory.createIcon(types[labels.getGroupId(name)]));
+                numberOfGroupsLabelCombo.addItem(item);
+            }
+        }
+        numberOfGroupsLabelCombo.setEditable(false);
+        Dimension dim = new Dimension(100, numberOfGroupsLabelCombo.getPreferredSize().height);
+        numberOfGroupsLabelCombo.setRenderer(new ClippedLRListCellRenderer(dim, 50));
+        GUIUtility.decorateJComponent(messages, numberOfGroupsLabelCombo, "mdsgraph.group");
+
+        JPanel north = new JPanel(new GridLayout(1, 2));
+        north.add(numberOfDotsLabel);
+        north.add(numberOfGroupsLabelCombo);
+
+        Box south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(saveButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(colorButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(check);
+        south.add(Box.createHorizontalGlue());
+
+        JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER));
+        center.addComponentListener(new ComponentAdapter(){
+            @Override
+            public void componentResized(ComponentEvent e){
+                Dimension d = e.getComponent().getSize();
+                viewer.setSize(d.width - 10, d.height - 10);
+            }
+        });
+        setLayout(new BorderLayout());
+
+        center.add(viewer);
+
+        add(north, BorderLayout.NORTH);
+        add(center, BorderLayout.CENTER);
+        add(south, BorderLayout.SOUTH);
+    }
+}
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.Dimension;\r
-import java.awt.Graphics;\r
-import java.awt.Point;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import javax.swing.JFrame;\r
-import javax.swing.JLabel;\r
-import javax.swing.JLayeredPane;\r
-\r
-import jp.naist.se.stigmata.ui.swing.mds.mark.DrawerFactory;\r
-import jp.sourceforge.talisman.i18n.Messages;\r
-import Jama.Matrix;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class MDSGraphViewer extends JLayeredPane{\r
-    private static final long serialVersionUID = -9196070059428975126L;\r
-    private static final int POINT_LAYER = DEFAULT_LAYER;\r
-    private static final int LABEL_LAYER = DEFAULT_LAYER;\r
-\r
-    private Messages messages;\r
-    private MDSMethod mds;\r
-    private List<Coordinate> plots = new ArrayList<Coordinate>();\r
-    private Color overColor = PointComponent.DEFAULT_OVER_COLOR;\r
-    private Color pointColor = getForeground();\r
-    private boolean sameAspect = false;\r
-    private boolean showLabel = false;\r
-    private List<PointComponent> points = new ArrayList<PointComponent>();\r
-    private List<ActionListener> listeners = new ArrayList<ActionListener>();\r
-\r
-    public MDSGraphViewer(Messages messages, MDSMethod mds){\r
-        this(messages, mds, null);\r
-    }\r
-\r
-    public MDSGraphViewer(Messages messages, MDSMethod mds, LabelMap labels){\r
-        this.messages = messages;\r
-        this.mds = mds;\r
-\r
-        setSize(500, 500);\r
-        setMinimumSize(getSize());\r
-        initLayouts(labels);\r
-    }\r
-\r
-    public void addActionListener(ActionListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void removeActionListener(ActionListener listener){\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    public Messages getMessages(){\r
-        return messages;\r
-    }\r
-\r
-    public void setMessages(Messages messages){\r
-        if(messages == null){\r
-            throw new NullPointerException();\r
-        }\r
-        this.messages = messages;\r
-    }\r
-\r
-    @Override\r
-    public void setSize(int width, int height){\r
-        if(width < height) height = width;\r
-        else               width = height;\r
-        super.setSize(width, height);\r
-        setPreferredSize(getSize());\r
-    }\r
-\r
-    public Iterator<Coordinate> coordinates(){\r
-        return plots.iterator();\r
-    }\r
-\r
-    public int getPointCount(){\r
-        return plots.size();\r
-    }\r
-\r
-    public Coordinate getCoordinate(int index){\r
-        return plots.get(index);\r
-    }\r
-\r
-    public boolean isShowLabel(){\r
-        return showLabel;\r
-    }\r
-\r
-    public void setShowLabel(boolean showLabel){\r
-        this.showLabel = showLabel;\r
-        repaint();\r
-    }\r
-\r
-    public boolean isSameAspect(){\r
-        return sameAspect;\r
-    }\r
-\r
-    public void setSameAspect(boolean sameAspect){\r
-        this.sameAspect = sameAspect;\r
-        repaint();\r
-    }\r
-\r
-    public Color getOverColor(){\r
-        return overColor;\r
-    }\r
-\r
-    public void setOverColor(Color color){\r
-        this.overColor = color;\r
-        for(int i = 0; i < getComponentCount(); i++){\r
-            Component c = getComponent(i);\r
-            if(c instanceof PointComponent){\r
-                ((PointComponent)c).setOverColor(color);\r
-            }\r
-        }\r
-    }\r
-\r
-    public Color getPointColor(){\r
-        return pointColor;\r
-    }\r
-\r
-    public void setPointColor(Color color){\r
-        this.pointColor = color;\r
-        for(int i = 0; i < getComponentCount(); i++){\r
-            Component c = getComponent(i);\r
-            if(c instanceof PointComponent){\r
-                ((PointComponent)c).setForeground(color);\r
-            }\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void paintComponent(Graphics g){\r
-        super.paintComponent(g);\r
-\r
-        Dimension d = getSize();\r
-\r
-        g.setColor(Color.GRAY);\r
-\r
-        g.drawLine(0, 0, d.width - 1, 0);\r
-        g.drawLine(d.width - 1, 0, d.width - 1, d.height - 1);\r
-        g.drawLine(d.width / 2, d.height, d.width / 2, 0);\r
-\r
-        g.drawLine(0, 0, 0, d.height - 1);\r
-        g.drawLine(0, d.height - 1, d.width - 1, d.height - 1);\r
-        g.drawLine(0, d.height / 2, d.width, d.height / 2);\r
-\r
-        updatePointComponents(d);\r
-    }\r
-\r
-    protected void fireEvent(PointComponent p){\r
-        ActionEvent e = new ActionEvent(this, 0, p.getLabel());\r
-        for(ActionListener l: listeners){\r
-            l.actionPerformed(e);\r
-        }\r
-    }\r
-\r
-    private void initLayouts(LabelMap labels){\r
-        double[] x = mds.getCoordinate(0);\r
-        double[] y = mds.getCoordinate(1);\r
-        double[] z = mds.getCoordinate(2);\r
-\r
-        double max = 0d;\r
-        for(int i = 0; i < x.length; i++){\r
-            if(max < Math.abs(x[i])) max = Math.abs(x[i]);\r
-        }\r
-        for(int i = 0; i < y.length; i++){\r
-            if(max < Math.abs(y[i])) max = Math.abs(y[i]);\r
-        }\r
-        for(int i = 0; i < z.length; i++){\r
-            if(max < Math.abs(z[i])) max = Math.abs(z[i]);\r
-        }\r
-\r
-        int w = getWidth();\r
-        int h = getHeight();\r
-\r
-        int ww = w - 20;\r
-        int hh = h - 20;\r
-        DrawerFactory factory = DrawerFactory.getInstance();\r
-        GeometoryType[] types = GeometoryType.values();\r
-        ActionListener clickedListener = new ActionListener(){\r
-            public void actionPerformed(ActionEvent e){\r
-                fireEvent((PointComponent)e.getSource());\r
-            }\r
-        };\r
-\r
-        for(int i = 0; i < x.length; i++){\r
-            double[] xy = new double[] { - x[i] / max, - y[i] / max, z[i] / max, };\r
-            double xx = xy[0] * ww / 2 + (w / 2);\r
-            double yy = xy[1] * hh / 2 + (h / 2);\r
-            String label = String.valueOf(i);\r
-            if(labels != null && labels.isAvailableLabel(i)){\r
-                label = labels.getLabel(i);\r
-            }\r
-            Coordinate coordinate = new Coordinate(label, xy[0], xy[1], xy[2]);\r
-            if(labels != null && labels.isGroupEnabled()){\r
-                coordinate.setGroupId(labels.getGroupIdFromElementName(coordinate.getLabel()));\r
-            }\r
-            plots.add(coordinate);\r
-\r
-            PointComponent p = new PointComponent(\r
-                label, x[i], y[i], factory.create(types[coordinate.getGroupId()])\r
-            );\r
-            p.addActionListener(clickedListener);\r
-            add(p, POINT_LAYER);\r
-            JLabel l = new JLabel(coordinate.getShowName());\r
-            add(l, LABEL_LAYER);\r
-            p.setShowLabel(l);\r
-\r
-            Dimension size = p.getSize();\r
-            p.setLocation(\r
-                new Point((int)(xx - (size.getWidth() / 2d)), (int)(yy - (size.getHeight() / 2d)))\r
-            );\r
-            points.add(p);\r
-\r
-            l.setSize(l.getPreferredSize());\r
-            Point pcp = p.getLocation();\r
-            Dimension dsize = l.getSize();\r
-            l.setLocation(new Point(pcp.x - (dsize.width / 2), pcp.y - 15));\r
-            l.setVisible(isShowLabel());\r
-        }\r
-    }\r
-\r
-    private void updatePointComponents(Dimension d){\r
-        int index = 0;\r
-        double width = d.getWidth();\r
-        double height = d.getHeight();\r
-        if(isSameAspect()){\r
-            if(width < height) height = width;\r
-            else               width  = height;\r
-        }\r
-\r
-        for(PointComponent pc: points){\r
-            updateLocation(pc, plots.get(index), width, height, d);\r
-            JLabel label = pc.getShowLabel();\r
-            Point pcp = pc.getLocation();\r
-            Dimension dsize = label.getSize();\r
-            label.setLocation(new Point(pcp.x - (dsize.width / 2), pcp.y - 15));\r
-            label.setVisible(isShowLabel());\r
-            index++;\r
-        }\r
-    }\r
-\r
-    private void updateLocation(PointComponent c, Coordinate coordinate, double width, double height, Dimension d){\r
-        double xx = coordinate.getX() * (width - 20d) / 2d + (d.getWidth() / 2d);\r
-        double yy = coordinate.getY() * (height - 20d) / 2d + (d.getHeight() / 2d);\r
-        Dimension size = c.getSize();\r
-        c.setLocation(\r
-            new Point((int)(xx - (size.getWidth() / 2d)), (int)(yy - (size.getHeight() / 2)))\r
-        );\r
-    }\r
-\r
-    public static void main(String[] args) throws Exception{\r
-        MDSMethod mds;\r
-        LabelMap labels = new LabelMap(new String[] {\r
-            "Atlanta", "Chicago", "Denver", "Houston", "Los Angeles", "Miami",\r
-            "New York", "San Francisco", "Seattle", "Washington D.C.",\r
-        });\r
-        Matrix matrix = new Matrix(new double[][]{\r
-            {    0,  587, 1212,  701, 1936,  604,  748, 2139, 2182,  543, },\r
-            {  587,    0,  920,  940, 1745, 1188,  713, 1858, 1737,  597, },\r
-            { 1212,  920,    0,  879,  831, 1726, 1631,  949, 1021, 1494, },\r
-            {  701,  940,  879,    0, 1374,  968, 1420, 1645, 1891, 1220, },\r
-            { 1936, 1745,  831, 1374,    0, 2339, 2451,  347,  959, 2300, },\r
-            {  604, 1188, 1726,  968, 2339,    0, 1092, 2592, 2734,  923, },\r
-            {  748,  713, 1631, 1420, 2451, 1092,    0, 2571, 2408,  205, },\r
-            { 2139, 1858,  949, 1645,  347, 2594, 2571,    0,  678, 2442, },\r
-            { 2182, 1737, 1021, 1891,  959, 2734, 2408,  678,    0, 2329, },\r
-            {  543,  597, 1494, 1220, 2300,  923,  205, 2442, 2329,    0, },\r
-        });\r
-        mds = new MDSMethod(matrix);\r
-\r
-        mds.getCoordinateMatrix().print(8, 4);\r
-        MDSGraphViewer viewer = new MDSGraphViewer(new Messages("resources.messages"), mds, labels);\r
-        viewer.setShowLabel(true);\r
-        JFrame f = new JFrame();\r
-        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
-        f.getContentPane().add(viewer, BorderLayout.CENTER);\r
-        f.pack();\r
-        f.setVisible(true);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JLayeredPane;
+
+import jp.sourceforge.stigmata.ui.swing.mds.mark.DrawerFactory;
+import jp.sourceforge.talisman.i18n.Messages;
+import Jama.Matrix;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class MDSGraphViewer extends JLayeredPane{
+    private static final long serialVersionUID = -9196070059428975126L;
+    private static final int POINT_LAYER = DEFAULT_LAYER;
+    private static final int LABEL_LAYER = DEFAULT_LAYER;
+
+    private Messages messages;
+    private MDSMethod mds;
+    private List<Coordinate> plots = new ArrayList<Coordinate>();
+    private Color overColor = PointComponent.DEFAULT_OVER_COLOR;
+    private Color pointColor = getForeground();
+    private boolean sameAspect = false;
+    private boolean showLabel = false;
+    private List<PointComponent> points = new ArrayList<PointComponent>();
+    private List<ActionListener> listeners = new ArrayList<ActionListener>();
+
+    public MDSGraphViewer(Messages messages, MDSMethod mds){
+        this(messages, mds, null);
+    }
+
+    public MDSGraphViewer(Messages messages, MDSMethod mds, LabelMap labels){
+        this.messages = messages;
+        this.mds = mds;
+
+        setSize(500, 500);
+        setMinimumSize(getSize());
+        initLayouts(labels);
+    }
+
+    public void addActionListener(ActionListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeActionListener(ActionListener listener){
+        listeners.remove(listener);
+    }
+
+    public Messages getMessages(){
+        return messages;
+    }
+
+    public void setMessages(Messages messages){
+        if(messages == null){
+            throw new NullPointerException();
+        }
+        this.messages = messages;
+    }
+
+    @Override
+    public void setSize(int width, int height){
+        if(width < height) height = width;
+        else               width = height;
+        super.setSize(width, height);
+        setPreferredSize(getSize());
+    }
+
+    public Iterator<Coordinate> coordinates(){
+        return plots.iterator();
+    }
+
+    public int getPointCount(){
+        return plots.size();
+    }
+
+    public Coordinate getCoordinate(int index){
+        return plots.get(index);
+    }
+
+    public boolean isShowLabel(){
+        return showLabel;
+    }
+
+    public void setShowLabel(boolean showLabel){
+        this.showLabel = showLabel;
+        repaint();
+    }
+
+    public boolean isSameAspect(){
+        return sameAspect;
+    }
+
+    public void setSameAspect(boolean sameAspect){
+        this.sameAspect = sameAspect;
+        repaint();
+    }
+
+    public Color getOverColor(){
+        return overColor;
+    }
+
+    public void setOverColor(Color color){
+        this.overColor = color;
+        for(int i = 0; i < getComponentCount(); i++){
+            Component c = getComponent(i);
+            if(c instanceof PointComponent){
+                ((PointComponent)c).setOverColor(color);
+            }
+        }
+    }
+
+    public Color getPointColor(){
+        return pointColor;
+    }
+
+    public void setPointColor(Color color){
+        this.pointColor = color;
+        for(int i = 0; i < getComponentCount(); i++){
+            Component c = getComponent(i);
+            if(c instanceof PointComponent){
+                ((PointComponent)c).setForeground(color);
+            }
+        }
+    }
+
+    @Override
+    public void paintComponent(Graphics g){
+        super.paintComponent(g);
+
+        Dimension d = getSize();
+
+        g.setColor(Color.GRAY);
+
+        g.drawLine(0, 0, d.width - 1, 0);
+        g.drawLine(d.width - 1, 0, d.width - 1, d.height - 1);
+        g.drawLine(d.width / 2, d.height, d.width / 2, 0);
+
+        g.drawLine(0, 0, 0, d.height - 1);
+        g.drawLine(0, d.height - 1, d.width - 1, d.height - 1);
+        g.drawLine(0, d.height / 2, d.width, d.height / 2);
+
+        updatePointComponents(d);
+    }
+
+    protected void fireEvent(PointComponent p){
+        ActionEvent e = new ActionEvent(this, 0, p.getLabel());
+        for(ActionListener l: listeners){
+            l.actionPerformed(e);
+        }
+    }
+
+    private void initLayouts(LabelMap labels){
+        double[] x = mds.getCoordinate(0);
+        double[] y = mds.getCoordinate(1);
+        double[] z = mds.getCoordinate(2);
+
+        double max = 0d;
+        for(int i = 0; i < x.length; i++){
+            if(max < Math.abs(x[i])) max = Math.abs(x[i]);
+        }
+        for(int i = 0; i < y.length; i++){
+            if(max < Math.abs(y[i])) max = Math.abs(y[i]);
+        }
+        for(int i = 0; i < z.length; i++){
+            if(max < Math.abs(z[i])) max = Math.abs(z[i]);
+        }
+
+        int w = getWidth();
+        int h = getHeight();
+
+        int ww = w - 20;
+        int hh = h - 20;
+        DrawerFactory factory = DrawerFactory.getInstance();
+        GeometoryType[] types = GeometoryType.values();
+        ActionListener clickedListener = new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                fireEvent((PointComponent)e.getSource());
+            }
+        };
+
+        for(int i = 0; i < x.length; i++){
+            double[] xy = new double[] { - x[i] / max, - y[i] / max, z[i] / max, };
+            double xx = xy[0] * ww / 2 + (w / 2);
+            double yy = xy[1] * hh / 2 + (h / 2);
+            String label = String.valueOf(i);
+            if(labels != null && labels.isAvailableLabel(i)){
+                label = labels.getLabel(i);
+            }
+            Coordinate coordinate = new Coordinate(label, xy[0], xy[1], xy[2]);
+            if(labels != null && labels.isGroupEnabled()){
+                coordinate.setGroupId(labels.getGroupIdFromElementName(coordinate.getLabel()));
+            }
+            plots.add(coordinate);
+
+            PointComponent p = new PointComponent(
+                label, x[i], y[i], factory.create(types[coordinate.getGroupId()])
+            );
+            p.addActionListener(clickedListener);
+            add(p, POINT_LAYER);
+            JLabel l = new JLabel(coordinate.getShowName());
+            add(l, LABEL_LAYER);
+            p.setShowLabel(l);
+
+            Dimension size = p.getSize();
+            p.setLocation(
+                new Point((int)(xx - (size.getWidth() / 2d)), (int)(yy - (size.getHeight() / 2d)))
+            );
+            points.add(p);
+
+            l.setSize(l.getPreferredSize());
+            Point pcp = p.getLocation();
+            Dimension dsize = l.getSize();
+            l.setLocation(new Point(pcp.x - (dsize.width / 2), pcp.y - 15));
+            l.setVisible(isShowLabel());
+        }
+    }
+
+    private void updatePointComponents(Dimension d){
+        int index = 0;
+        double width = d.getWidth();
+        double height = d.getHeight();
+        if(isSameAspect()){
+            if(width < height) height = width;
+            else               width  = height;
+        }
+
+        for(PointComponent pc: points){
+            updateLocation(pc, plots.get(index), width, height, d);
+            JLabel label = pc.getShowLabel();
+            Point pcp = pc.getLocation();
+            Dimension dsize = label.getSize();
+            label.setLocation(new Point(pcp.x - (dsize.width / 2), pcp.y - 15));
+            label.setVisible(isShowLabel());
+            index++;
+        }
+    }
+
+    private void updateLocation(PointComponent c, Coordinate coordinate, double width, double height, Dimension d){
+        double xx = coordinate.getX() * (width - 20d) / 2d + (d.getWidth() / 2d);
+        double yy = coordinate.getY() * (height - 20d) / 2d + (d.getHeight() / 2d);
+        Dimension size = c.getSize();
+        c.setLocation(
+            new Point((int)(xx - (size.getWidth() / 2d)), (int)(yy - (size.getHeight() / 2)))
+        );
+    }
+
+    public static void main(String[] args) throws Exception{
+        MDSMethod mds;
+        LabelMap labels = new LabelMap(new String[] {
+            "Atlanta", "Chicago", "Denver", "Houston", "Los Angeles", "Miami",
+            "New York", "San Francisco", "Seattle", "Washington D.C.",
+        });
+        Matrix matrix = new Matrix(new double[][]{
+            {    0,  587, 1212,  701, 1936,  604,  748, 2139, 2182,  543, },
+            {  587,    0,  920,  940, 1745, 1188,  713, 1858, 1737,  597, },
+            { 1212,  920,    0,  879,  831, 1726, 1631,  949, 1021, 1494, },
+            {  701,  940,  879,    0, 1374,  968, 1420, 1645, 1891, 1220, },
+            { 1936, 1745,  831, 1374,    0, 2339, 2451,  347,  959, 2300, },
+            {  604, 1188, 1726,  968, 2339,    0, 1092, 2592, 2734,  923, },
+            {  748,  713, 1631, 1420, 2451, 1092,    0, 2571, 2408,  205, },
+            { 2139, 1858,  949, 1645,  347, 2594, 2571,    0,  678, 2442, },
+            { 2182, 1737, 1021, 1891,  959, 2734, 2408,  678,    0, 2329, },
+            {  543,  597, 1494, 1220, 2300,  923,  205, 2442, 2329,    0, },
+        });
+        mds = new MDSMethod(matrix);
+
+        mds.getCoordinateMatrix().print(8, 4);
+        MDSGraphViewer viewer = new MDSGraphViewer(new Messages("resources.messages"), mds, labels);
+        viewer.setShowLabel(true);
+        JFrame f = new JFrame();
+        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        f.getContentPane().add(viewer, BorderLayout.CENTER);
+        f.pack();
+        f.setVisible(true);
+    }
+}
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Color;\r
-import java.awt.Dimension;\r
-import java.awt.Graphics2D;\r
-import java.awt.image.BufferedImage;\r
-import java.io.IOException;\r
-import java.io.OutputStream;\r
-\r
-import javax.imageio.ImageIO;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.SwingUtilities;\r
-\r
-import jp.naist.se.stigmata.ui.swing.UnsupportedFormatException;\r
-import jp.naist.se.stigmata.utils.BinaryDataWritable;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class MDSImageExporter implements BinaryDataWritable{\r
-    private MDSGraphViewer viewer;\r
-\r
-    public MDSImageExporter(MDSGraphViewer viewer){\r
-        this.viewer = viewer;\r
-    }\r
-\r
-    public void writeBinaryData(OutputStream out, String format)\r
-            throws IOException, UnsupportedFormatException{\r
-        Dimension size = viewer.getSize();\r
-        BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);\r
-        Graphics2D g = image.createGraphics();\r
-        g.setColor(Color.WHITE);\r
-        g.fillRect(0, 0, size.width, size.height);\r
-        viewer.update(g);\r
-\r
-        try{\r
-            ImageIO.write(image, format, out);\r
-            out.flush();\r
-        } catch(IOException e){\r
-            JOptionPane.showMessageDialog(\r
-                SwingUtilities.getRoot(viewer), e.getMessage(),\r
-                viewer.getMessages().get("error.dialog.title"),\r
-                JOptionPane.WARNING_MESSAGE\r
-            );\r
-        }\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.imageio.ImageIO;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+import jp.sourceforge.stigmata.ui.swing.UnsupportedFormatException;
+import jp.sourceforge.stigmata.utils.BinaryDataWritable;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class MDSImageExporter implements BinaryDataWritable{
+    private MDSGraphViewer viewer;
+
+    public MDSImageExporter(MDSGraphViewer viewer){
+        this.viewer = viewer;
+    }
+
+    public void writeBinaryData(OutputStream out, String format)
+            throws IOException, UnsupportedFormatException{
+        Dimension size = viewer.getSize();
+        BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g = image.createGraphics();
+        g.setColor(Color.WHITE);
+        g.fillRect(0, 0, size.width, size.height);
+        viewer.update(g);
+
+        try{
+            ImageIO.write(image, format, out);
+            out.flush();
+        } catch(IOException e){
+            JOptionPane.showMessageDialog(
+                SwingUtilities.getRoot(viewer), e.getMessage(),
+                viewer.getMessages().get("error.dialog.title"),
+                JOptionPane.WARNING_MESSAGE
+            );
+        }
+    }
+
+}
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import Jama.EigenvalueDecomposition;\r
-import Jama.Matrix;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class MDSMethod{\r
-    private Matrix target;\r
-    private Matrix coordinate;\r
-    private Matrix eigenValues;\r
-    private Matrix eigenVectors;\r
-    private int[] indexes;\r
-\r
-    public MDSMethod(Matrix matrix){\r
-        this.target = matrix;\r
-    }\r
-\r
-    protected Matrix getCenteredInnerProductMatrix(){\r
-        Matrix centering = getCenteringMatrix(target.getColumnDimension());\r
-        Matrix trans = centering.transpose();\r
-\r
-        return centering.times(target).times(trans).times(-1);\r
-    }\r
-\r
-    public Matrix getEigenValues(){\r
-        if(eigenValues == null){\r
-            getCoordinateMatrix();\r
-        }\r
-        return (Matrix)eigenValues.clone();\r
-    }\r
-\r
-    public Matrix getEigenVectors(){\r
-        if(eigenVectors == null){\r
-            getCoordinateMatrix();\r
-        }\r
-        return (Matrix)eigenVectors.clone();\r
-    }\r
-\r
-    public double[] getCoordinate(int axis){\r
-        if(coordinate == null){\r
-            getCoordinateMatrix();\r
-        }\r
-        double[] v = new double[coordinate.getRowDimension()];\r
-        for(int i = 0; i < v.length; i++){\r
-            v[i] = coordinate.get(i, indexes[axis]);\r
-        }\r
-        return v;\r
-    }\r
-\r
-    public Matrix getCoordinateMatrix(){\r
-        if(coordinate == null){\r
-            Matrix mat = getCenteredInnerProductMatrix();\r
-            EigenvalueDecomposition eigen = mat.eig();\r
-            Matrix eigenVectors = eigen.getV();\r
-            Matrix eigenValues  = eigen.getD();\r
-            Matrix coordinate   = (Matrix)eigenVectors.clone();\r
-\r
-            int col = mat.getColumnDimension();\r
-            int row = mat.getRowDimension();\r
-            for(int i = 0; i < row; i++){\r
-                for(int j = 0; j < col; j++){\r
-                    double v = coordinate.get(i, j);\r
-                    v = v * Math.sqrt(eigenValues.get(j, j));\r
-                    coordinate.set(i, j, v);\r
-                }\r
-            }\r
-            sortValues(eigenValues);\r
-            this.coordinate = coordinate;\r
-            this.eigenVectors = eigenVectors;\r
-            this.eigenValues  = eigenValues;\r
-        }\r
-\r
-        return coordinate;\r
-    }\r
-\r
-    protected static Matrix getCenteringMatrix(int n){\r
-        Matrix matrix = Matrix.identity(n, n);\r
-\r
-        for(int i = 0; i < n; i++){\r
-            for(int j = 0; j < n; j++){\r
-                matrix.set(i, j, matrix.get(i, j) - (1d / n));\r
-            }\r
-        }\r
-        return matrix;\r
-    }\r
-\r
-    private void sortValues(Matrix m){\r
-        double[] v = new double[m.getColumnDimension()];\r
-        int[] index = new int[v.length];\r
-        for(int i = 0; i < v.length; i++){\r
-            v[i] = m.get(i, i);\r
-            index[i] = i;\r
-        }\r
-\r
-        for(int i = 0; i < v.length; i++){\r
-            for(int j = i + 1; j < v.length; j++){\r
-                if(Math.abs(v[i]) < Math.abs(v[j])){\r
-                    double tmpValue = v[j];\r
-                    v[j] = v[i];\r
-                    v[i] = tmpValue;\r
-                    int tmpIndex = index[j];\r
-                    index[j] = index[i];\r
-                    index[i] = tmpIndex;\r
-                }\r
-            }\r
-        }\r
-\r
-        indexes = index;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import Jama.EigenvalueDecomposition;
+import Jama.Matrix;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class MDSMethod{
+    private Matrix target;
+    private Matrix coordinate;
+    private Matrix eigenValues;
+    private Matrix eigenVectors;
+    private int[] indexes;
+
+    public MDSMethod(Matrix matrix){
+        this.target = matrix;
+    }
+
+    protected Matrix getCenteredInnerProductMatrix(){
+        Matrix centering = getCenteringMatrix(target.getColumnDimension());
+        Matrix trans = centering.transpose();
+
+        return centering.times(target).times(trans).times(-1);
+    }
+
+    public Matrix getEigenValues(){
+        if(eigenValues == null){
+            getCoordinateMatrix();
+        }
+        return (Matrix)eigenValues.clone();
+    }
+
+    public Matrix getEigenVectors(){
+        if(eigenVectors == null){
+            getCoordinateMatrix();
+        }
+        return (Matrix)eigenVectors.clone();
+    }
+
+    public double[] getCoordinate(int axis){
+        if(coordinate == null){
+            getCoordinateMatrix();
+        }
+        double[] v = new double[coordinate.getRowDimension()];
+        for(int i = 0; i < v.length; i++){
+            v[i] = coordinate.get(i, indexes[axis]);
+        }
+        return v;
+    }
+
+    public Matrix getCoordinateMatrix(){
+        if(coordinate == null){
+            Matrix mat = getCenteredInnerProductMatrix();
+            EigenvalueDecomposition eigen = mat.eig();
+            Matrix eigenVectors = eigen.getV();
+            Matrix eigenValues  = eigen.getD();
+            Matrix coordinate   = (Matrix)eigenVectors.clone();
+
+            int col = mat.getColumnDimension();
+            int row = mat.getRowDimension();
+            for(int i = 0; i < row; i++){
+                for(int j = 0; j < col; j++){
+                    double v = coordinate.get(i, j);
+                    v = v * Math.sqrt(eigenValues.get(j, j));
+                    coordinate.set(i, j, v);
+                }
+            }
+            sortValues(eigenValues);
+            this.coordinate = coordinate;
+            this.eigenVectors = eigenVectors;
+            this.eigenValues  = eigenValues;
+        }
+
+        return coordinate;
+    }
+
+    protected static Matrix getCenteringMatrix(int n){
+        Matrix matrix = Matrix.identity(n, n);
+
+        for(int i = 0; i < n; i++){
+            for(int j = 0; j < n; j++){
+                matrix.set(i, j, matrix.get(i, j) - (1d / n));
+            }
+        }
+        return matrix;
+    }
+
+    private void sortValues(Matrix m){
+        double[] v = new double[m.getColumnDimension()];
+        int[] index = new int[v.length];
+        for(int i = 0; i < v.length; i++){
+            v[i] = m.get(i, i);
+            index[i] = i;
+        }
+
+        for(int i = 0; i < v.length; i++){
+            for(int j = i + 1; j < v.length; j++){
+                if(Math.abs(v[i]) < Math.abs(v[j])){
+                    double tmpValue = v[j];
+                    v[j] = v[i];
+                    v[i] = tmpValue;
+                    int tmpIndex = index[j];
+                    index[j] = index[i];
+                    index[i] = tmpIndex;
+                }
+            }
+        }
+
+        indexes = index;
+    }
+}
@@ -1,37 +1,37 @@
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.util.Iterator;\r
-\r
-import jp.naist.se.stigmata.ui.swing.UnsupportedFormatException;\r
-import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$\r
- */\r
-public class MDSPointsLocationExporter implements AsciiDataWritable{\r
-    private MDSGraphViewer viewer;\r
-\r
-    public MDSPointsLocationExporter(MDSGraphViewer viewer){\r
-        this.viewer = viewer;\r
-    }\r
-\r
-    public void writeAsciiData(PrintWriter out, String format)\r
-            throws IOException, UnsupportedFormatException{\r
-        if(!format.equals("csv")){\r
-            throw new UnsupportedFormatException(viewer.getMessages().format("error.unsupportedformat", format));\r
-        }\r
-        for(Iterator<Coordinate> i = viewer.coordinates(); i.hasNext(); ){\r
-            Coordinate c = i.next();\r
-            out.printf("%s,%s,%g,%g%n", c.getLabel(), c.getGroupId(), c.getX(), c.getY());\r
-        }\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+
+import jp.sourceforge.stigmata.ui.swing.UnsupportedFormatException;
+import jp.sourceforge.stigmata.utils.AsciiDataWritable;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$
+ */
+public class MDSPointsLocationExporter implements AsciiDataWritable{
+    private MDSGraphViewer viewer;
+
+    public MDSPointsLocationExporter(MDSGraphViewer viewer){
+        this.viewer = viewer;
+    }
+
+    public void writeAsciiData(PrintWriter out, String format)
+            throws IOException, UnsupportedFormatException{
+        if(!format.equals("csv")){
+            throw new UnsupportedFormatException(viewer.getMessages().format("error.unsupportedformat", format));
+        }
+        for(Iterator<Coordinate> i = viewer.coordinates(); i.hasNext(); ){
+            Coordinate c = i.next();
+            out.printf("%s,%s,%g,%g%n", c.getLabel(), c.getGroupId(), c.getX(), c.getY());
+        }
+    }
+
+}
@@ -1,17 +1,17 @@
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Graphics2D;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface MarkDrawer{\r
-    public void draw(Graphics2D g, int w, int h);\r
-\r
-    public void drawOver(Graphics2D g, int w, int h);\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Graphics2D;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface MarkDrawer{
+    public void draw(Graphics2D g, int w, int h);
+
+    public void drawOver(Graphics2D g, int w, int h);
+}
@@ -1,61 +1,61 @@
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-\r
-import javax.swing.Icon;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class MarkIcon implements Icon{\r
-    private static final int DEFAULT_ICON_WIDTH = 16;\r
-    private static final int DEFAULT_ICON_HEIGHT = 16;\r
-\r
-    private MarkDrawer drawer;\r
-    private int width = -1;\r
-    private int height = -1;\r
-\r
-    public MarkIcon(MarkDrawer drawer){\r
-        this.drawer = drawer;\r
-    }\r
-\r
-    public void setIconHeight(int height){\r
-        this.height = height;\r
-    }\r
-\r
-    public int getIconHeight(){\r
-        if(height < 0){\r
-            return DEFAULT_ICON_HEIGHT;\r
-        }\r
-        return height;\r
-    }\r
-\r
-    public void setIconWidth(int width){\r
-        this.width = width;\r
-    }\r
-\r
-    public int getIconWidth(){\r
-        if(width < 0){\r
-            return DEFAULT_ICON_WIDTH;\r
-        }\r
-        return width;\r
-    }\r
-\r
-    public void paintIcon(Component c, Graphics g, int x, int y){\r
-        Color initialColor = g.getColor();\r
-        g.setColor(Color.BLACK);\r
-        g.translate(x, y);\r
-        drawer.drawOver((Graphics2D)g, getIconWidth(), getIconHeight());\r
-        g.translate(-x, -y);\r
-        g.setColor(initialColor);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+
+import javax.swing.Icon;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class MarkIcon implements Icon{
+    private static final int DEFAULT_ICON_WIDTH = 16;
+    private static final int DEFAULT_ICON_HEIGHT = 16;
+
+    private MarkDrawer drawer;
+    private int width = -1;
+    private int height = -1;
+
+    public MarkIcon(MarkDrawer drawer){
+        this.drawer = drawer;
+    }
+
+    public void setIconHeight(int height){
+        this.height = height;
+    }
+
+    public int getIconHeight(){
+        if(height < 0){
+            return DEFAULT_ICON_HEIGHT;
+        }
+        return height;
+    }
+
+    public void setIconWidth(int width){
+        this.width = width;
+    }
+
+    public int getIconWidth(){
+        if(width < 0){
+            return DEFAULT_ICON_WIDTH;
+        }
+        return width;
+    }
+
+    public void paintIcon(Component c, Graphics g, int x, int y){
+        Color initialColor = g.getColor();
+        g.setColor(Color.BLACK);
+        g.translate(x, y);
+        drawer.drawOver((Graphics2D)g, getIconWidth(), getIconHeight());
+        g.translate(-x, -y);
+        g.setColor(initialColor);
+    }
+}
-package jp.naist.se.stigmata.ui.swing.mds;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Color;\r
-import java.awt.Dimension;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.Stroke;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.swing.JLabel;\r
-\r
-import jp.naist.se.stigmata.ui.swing.mds.mark.DrawerFactory;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class PointComponent extends JLabel{\r
-    private static final long serialVersionUID = 6945871049990818511L;\r
-    public static final Color DEFAULT_OVER_COLOR = Color.BLUE;\r
-\r
-    private boolean entered = false;\r
-    private Color overColor = DEFAULT_OVER_COLOR;\r
-    private String label;\r
-    private MarkDrawer drawer;\r
-    private JLabel showLabel = null;\r
-    private List<ActionListener> listeners = new ArrayList<ActionListener>();\r
-\r
-    public PointComponent(String label, double x, double y){\r
-        this(label);\r
-\r
-        setToolTipText(String.format("%s [%g, %g]", label, x, y));\r
-        drawer = DrawerFactory.getInstance().create(GeometoryType.UPPER_TRIANGLE);\r
-    }\r
-\r
-    public PointComponent(String label, double x, double y, MarkDrawer drawer){\r
-        this(label);\r
-        this.drawer = drawer;\r
-        setToolTipText(String.format("%s [%g, %g]", label, x, y));\r
-    }\r
-\r
-    public PointComponent(String label){\r
-        this.label = label;\r
-        setSize(10, 10);\r
-        setMinimumSize(getSize());\r
-        setMaximumSize(getSize());\r
-        setPreferredSize(getSize());\r
-\r
-        addMouseListener(new MouseAdapter(){\r
-            @Override\r
-            public void mouseEntered(MouseEvent e){\r
-                entered = true;\r
-                if(showLabel != null){\r
-                    showLabel.setVisible(true);\r
-                    showLabel.repaint();\r
-                }\r
-                repaint();\r
-            }\r
-\r
-            @Override\r
-            public void mouseExited(MouseEvent e){\r
-                entered = false;\r
-                if(showLabel != null){\r
-                    showLabel.setVisible(false);\r
-                    showLabel.repaint();\r
-                }\r
-                repaint();\r
-            }\r
-\r
-            @Override\r
-            public void mouseClicked(MouseEvent e){\r
-                if(e.getClickCount() >= 2){\r
-                    ActionEvent ae = new ActionEvent(PointComponent.this, 0, null);\r
-                    for(ActionListener listener: listeners){\r
-                        listener.actionPerformed(ae);\r
-                    }\r
-                }\r
-            }\r
-        });\r
-        setToolTipText(this.label);\r
-    }\r
-\r
-    public void addActionListener(ActionListener listener){\r
-        listeners.add(listener);\r
-    }\r
-\r
-    public void removeActionListener(ActionListener listener){\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    public void setShowLabel(JLabel label){\r
-        this.showLabel = label;\r
-    }\r
-\r
-    public JLabel getShowLabel(){\r
-        return showLabel;\r
-    }\r
-\r
-    public String getLabel(){\r
-        return label;\r
-    }\r
-\r
-    @Override\r
-    public void paintComponent(Graphics g){\r
-        super.paintComponent(g);\r
-        Graphics2D gg = (Graphics2D)g;\r
-        Stroke stroke = gg.getStroke();\r
-        Dimension d = getSize();\r
-\r
-        if(entered){\r
-            g.setColor(getOverColor());\r
-            drawer.drawOver(gg, d.width, d.height);\r
-        }\r
-        else{\r
-            g.setColor(getForeground());\r
-            drawer.draw(gg, d.width, d.height);\r
-        }\r
-        gg.setStroke(stroke);\r
-    }\r
-\r
-    public Color getOverColor(){\r
-        return overColor;\r
-    }\r
-\r
-    public void setOverColor(Color overColor){\r
-        this.overColor = overColor;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JLabel;
+
+import jp.sourceforge.stigmata.ui.swing.mds.mark.DrawerFactory;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class PointComponent extends JLabel{
+    private static final long serialVersionUID = 6945871049990818511L;
+    public static final Color DEFAULT_OVER_COLOR = Color.BLUE;
+
+    private boolean entered = false;
+    private Color overColor = DEFAULT_OVER_COLOR;
+    private String label;
+    private MarkDrawer drawer;
+    private JLabel showLabel = null;
+    private List<ActionListener> listeners = new ArrayList<ActionListener>();
+
+    public PointComponent(String label, double x, double y){
+        this(label);
+
+        setToolTipText(String.format("%s [%g, %g]", label, x, y));
+        drawer = DrawerFactory.getInstance().create(GeometoryType.UPPER_TRIANGLE);
+    }
+
+    public PointComponent(String label, double x, double y, MarkDrawer drawer){
+        this(label);
+        this.drawer = drawer;
+        setToolTipText(String.format("%s [%g, %g]", label, x, y));
+    }
+
+    public PointComponent(String label){
+        this.label = label;
+        setSize(10, 10);
+        setMinimumSize(getSize());
+        setMaximumSize(getSize());
+        setPreferredSize(getSize());
+
+        addMouseListener(new MouseAdapter(){
+            @Override
+            public void mouseEntered(MouseEvent e){
+                entered = true;
+                if(showLabel != null){
+                    showLabel.setVisible(true);
+                    showLabel.repaint();
+                }
+                repaint();
+            }
+
+            @Override
+            public void mouseExited(MouseEvent e){
+                entered = false;
+                if(showLabel != null){
+                    showLabel.setVisible(false);
+                    showLabel.repaint();
+                }
+                repaint();
+            }
+
+            @Override
+            public void mouseClicked(MouseEvent e){
+                if(e.getClickCount() >= 2){
+                    ActionEvent ae = new ActionEvent(PointComponent.this, 0, null);
+                    for(ActionListener listener: listeners){
+                        listener.actionPerformed(ae);
+                    }
+                }
+            }
+        });
+        setToolTipText(this.label);
+    }
+
+    public void addActionListener(ActionListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeActionListener(ActionListener listener){
+        listeners.remove(listener);
+    }
+
+    public void setShowLabel(JLabel label){
+        this.showLabel = label;
+    }
+
+    public JLabel getShowLabel(){
+        return showLabel;
+    }
+
+    public String getLabel(){
+        return label;
+    }
+
+    @Override
+    public void paintComponent(Graphics g){
+        super.paintComponent(g);
+        Graphics2D gg = (Graphics2D)g;
+        Stroke stroke = gg.getStroke();
+        Dimension d = getSize();
+
+        if(entered){
+            g.setColor(getOverColor());
+            drawer.drawOver(gg, d.width, d.height);
+        }
+        else{
+            g.setColor(getForeground());
+            drawer.draw(gg, d.width, d.height);
+        }
+        gg.setStroke(stroke);
+    }
+
+    public Color getOverColor(){
+        return overColor;
+    }
+
+    public void setOverColor(Color overColor){
+        this.overColor = overColor;
+    }
+}
@@ -1,73 +1,73 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Graphics2D;\r
-import java.awt.Shape;\r
-import java.awt.Stroke;\r
-\r
-import jp.naist.se.stigmata.ui.swing.mds.MarkDrawer;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-abstract class AbstractMarkDrawer implements MarkDrawer{\r
-    private boolean fill;\r
-\r
-    public AbstractMarkDrawer(){\r
-        this(false);\r
-    }\r
-\r
-    public AbstractMarkDrawer(boolean fill){\r
-        setFilled(fill);\r
-    }\r
-\r
-    public boolean isFilled(){\r
-        return fill;\r
-    }\r
-\r
-    public void setFilled(boolean fill){\r
-        this.fill = fill;\r
-    }\r
-\r
-    public abstract Shape getPlainShape(int w, int h);\r
-\r
-    public abstract Shape getOveredShape(int w, int h);\r
-\r
-    public Stroke getPlainStroke(){\r
-        return null;\r
-    }\r
-\r
-    public Stroke getOverStroke(){\r
-        return null;\r
-    }\r
-\r
-    public void draw(Graphics2D g, int w, int h){\r
-        Stroke s = getPlainStroke();\r
-        if(s != null){\r
-            g.setStroke(s);\r
-        }\r
-        drawImpl(g, getPlainShape(w, h));\r
-    }\r
-\r
-    public void drawOver(Graphics2D g, int w, int h){\r
-        Stroke s = getOverStroke();\r
-        if(s != null){\r
-            g.setStroke(s);\r
-        }\r
-        drawImpl(g, getOveredShape(w, h));\r
-    }\r
-\r
-    private void drawImpl(Graphics2D g, Shape s){\r
-        if(isFilled()){\r
-            g.fill(s);\r
-        }\r
-        else{\r
-            g.draw(s);\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Graphics2D;
+import java.awt.Shape;
+import java.awt.Stroke;
+
+import jp.sourceforge.stigmata.ui.swing.mds.MarkDrawer;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+abstract class AbstractMarkDrawer implements MarkDrawer{
+    private boolean fill;
+
+    public AbstractMarkDrawer(){
+        this(false);
+    }
+
+    public AbstractMarkDrawer(boolean fill){
+        setFilled(fill);
+    }
+
+    public boolean isFilled(){
+        return fill;
+    }
+
+    public void setFilled(boolean fill){
+        this.fill = fill;
+    }
+
+    public abstract Shape getPlainShape(int w, int h);
+
+    public abstract Shape getOveredShape(int w, int h);
+
+    public Stroke getPlainStroke(){
+        return null;
+    }
+
+    public Stroke getOverStroke(){
+        return null;
+    }
+
+    public void draw(Graphics2D g, int w, int h){
+        Stroke s = getPlainStroke();
+        if(s != null){
+            g.setStroke(s);
+        }
+        drawImpl(g, getPlainShape(w, h));
+    }
+
+    public void drawOver(Graphics2D g, int w, int h){
+        Stroke s = getOverStroke();
+        if(s != null){
+            g.setStroke(s);
+        }
+        drawImpl(g, getOveredShape(w, h));
+    }
+
+    private void drawImpl(Graphics2D g, Shape s){
+        if(isFilled()){
+            g.fill(s);
+        }
+        else{
+            g.draw(s);
+        }
+    }
+}
@@ -1,37 +1,37 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.Ellipse2D;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class CircleDrawer extends AbstractMarkDrawer{\r
-\r
-    public CircleDrawer(){\r
-        super();\r
-    }\r
-\r
-    public CircleDrawer(boolean fill){\r
-        super(fill);\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        double ww = (double)w / 2d;\r
-        double hh = (double)h / 2d;\r
-\r
-        return new Ellipse2D.Double(ww - 2d, hh - 2d, 4d, 4d);\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        return new Ellipse2D.Double(0, 0, w - 1d, h - 1d);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.Ellipse2D;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class CircleDrawer extends AbstractMarkDrawer{
+
+    public CircleDrawer(){
+        super();
+    }
+
+    public CircleDrawer(boolean fill){
+        super(fill);
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        double ww = (double)w / 2d;
+        double hh = (double)h / 2d;
+
+        return new Ellipse2D.Double(ww - 2d, hh - 2d, 4d, 4d);
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        return new Ellipse2D.Double(0, 0, w - 1d, h - 1d);
+    }
+}
@@ -1,37 +1,37 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.GeneralPath;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class CrossDrawer extends LineMarkDrawer{\r
-    public CrossDrawer(){\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        float ww = w / 2f;\r
-        float hh = h / 2f;\r
-\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(0, hh);\r
-        path.lineTo(w, hh);\r
-        path.moveTo(ww, 0);\r
-        path.lineTo(ww, h);\r
-\r
-        return path;\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        return getPlainShape(w, h);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.GeneralPath;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class CrossDrawer extends LineMarkDrawer{
+    public CrossDrawer(){
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        float ww = w / 2f;
+        float hh = h / 2f;
+
+        GeneralPath path = new GeneralPath();
+        path.moveTo(0, hh);
+        path.lineTo(w, hh);
+        path.moveTo(ww, 0);
+        path.lineTo(ww, h);
+
+        return path;
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        return getPlainShape(w, h);
+    }
+}
@@ -1,49 +1,49 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.GeneralPath;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class DownerTriangleDrawer extends AbstractMarkDrawer{\r
-    public DownerTriangleDrawer(){\r
-        super();\r
-    }\r
-\r
-    public DownerTriangleDrawer(boolean fill){\r
-        super(fill);\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        float ww = (float)w / 2f;\r
-        float hh = (float)h / 2f;\r
-\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(ww - 2f, hh - 2f);\r
-        path.lineTo(ww + 2f, hh - 2f);\r
-        path.lineTo(ww, hh - 2f + (float)(2 * Math.sqrt(3)));\r
-        path.lineTo(ww - 2f, hh - 2f);\r
-\r
-        return path;\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(0, 0);\r
-        path.lineTo(w, 0);\r
-        path.lineTo(w / 2f, h);\r
-        path.lineTo(0, 0);\r
-\r
-        return path;\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.GeneralPath;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class DownerTriangleDrawer extends AbstractMarkDrawer{
+    public DownerTriangleDrawer(){
+        super();
+    }
+
+    public DownerTriangleDrawer(boolean fill){
+        super(fill);
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        float ww = (float)w / 2f;
+        float hh = (float)h / 2f;
+
+        GeneralPath path = new GeneralPath();
+        path.moveTo(ww - 2f, hh - 2f);
+        path.lineTo(ww + 2f, hh - 2f);
+        path.lineTo(ww, hh - 2f + (float)(2 * Math.sqrt(3)));
+        path.lineTo(ww - 2f, hh - 2f);
+
+        return path;
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        GeneralPath path = new GeneralPath();
+        path.moveTo(0, 0);
+        path.lineTo(w, 0);
+        path.lineTo(w / 2f, h);
+        path.lineTo(0, 0);
+
+        return path;
+    }
+
+}
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import javax.swing.Icon;\r
-\r
-import jp.naist.se.stigmata.ui.swing.mds.GeometoryType;\r
-import jp.naist.se.stigmata.ui.swing.mds.MarkDrawer;\r
-import jp.naist.se.stigmata.ui.swing.mds.MarkIcon;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class DrawerFactory{\r
-    private static final DrawerFactory instance = new DrawerFactory();\r
-\r
-    private Map<GeometoryType, MarkDrawer> drawers = new HashMap<GeometoryType, MarkDrawer>();\r
-\r
-    private DrawerFactory(){\r
-        drawers.put(GeometoryType.CROSS,                  new CrossDrawer());\r
-        drawers.put(GeometoryType.XMARK,                  new XMarkDrawer());\r
-        drawers.put(GeometoryType.STAR,                   new StarDrawer());\r
-        drawers.put(GeometoryType.CIRCLE,                 new CircleDrawer());\r
-        drawers.put(GeometoryType.FILLED_CIRCLE,          new CircleDrawer(true));\r
-        drawers.put(GeometoryType.RHOMBUS,                new RhombusDrawer());\r
-        drawers.put(GeometoryType.FILLED_RHOMBUS,         new RhombusDrawer(true));\r
-        drawers.put(GeometoryType.RECTANGLE,              new RectangleDrawer());\r
-        drawers.put(GeometoryType.FILLED_RECTANGLE,       new RectangleDrawer(true));\r
-        drawers.put(GeometoryType.UPPER_TRIANGLE,         new UpperTriangleDrawer());\r
-        drawers.put(GeometoryType.FILLED_UPPER_TRIANGLE,  new UpperTriangleDrawer(true));\r
-        drawers.put(GeometoryType.DOWNER_TRIANGLE,        new DownerTriangleDrawer());\r
-        drawers.put(GeometoryType.FILLED_DOWNER_TRIANGLE, new DownerTriangleDrawer(true));\r
-    }\r
-\r
-    public static DrawerFactory getInstance(){\r
-        return instance;\r
-    }\r
-\r
-    public MarkDrawer create(GeometoryType type){\r
-        return drawers.get(type);\r
-    }\r
-\r
-    public Icon createIcon(GeometoryType type){\r
-        return new MarkIcon(create(type));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.Icon;
+
+import jp.sourceforge.stigmata.ui.swing.mds.GeometoryType;
+import jp.sourceforge.stigmata.ui.swing.mds.MarkDrawer;
+import jp.sourceforge.stigmata.ui.swing.mds.MarkIcon;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class DrawerFactory{
+    private static final DrawerFactory instance = new DrawerFactory();
+
+    private Map<GeometoryType, MarkDrawer> drawers = new HashMap<GeometoryType, MarkDrawer>();
+
+    private DrawerFactory(){
+        drawers.put(GeometoryType.CROSS,                  new CrossDrawer());
+        drawers.put(GeometoryType.XMARK,                  new XMarkDrawer());
+        drawers.put(GeometoryType.STAR,                   new StarDrawer());
+        drawers.put(GeometoryType.CIRCLE,                 new CircleDrawer());
+        drawers.put(GeometoryType.FILLED_CIRCLE,          new CircleDrawer(true));
+        drawers.put(GeometoryType.RHOMBUS,                new RhombusDrawer());
+        drawers.put(GeometoryType.FILLED_RHOMBUS,         new RhombusDrawer(true));
+        drawers.put(GeometoryType.RECTANGLE,              new RectangleDrawer());
+        drawers.put(GeometoryType.FILLED_RECTANGLE,       new RectangleDrawer(true));
+        drawers.put(GeometoryType.UPPER_TRIANGLE,         new UpperTriangleDrawer());
+        drawers.put(GeometoryType.FILLED_UPPER_TRIANGLE,  new UpperTriangleDrawer(true));
+        drawers.put(GeometoryType.DOWNER_TRIANGLE,        new DownerTriangleDrawer());
+        drawers.put(GeometoryType.FILLED_DOWNER_TRIANGLE, new DownerTriangleDrawer(true));
+    }
+
+    public static DrawerFactory getInstance(){
+        return instance;
+    }
+
+    public MarkDrawer create(GeometoryType type){
+        return drawers.get(type);
+    }
+
+    public Icon createIcon(GeometoryType type){
+        return new MarkIcon(create(type));
+    }
+}
@@ -1,34 +1,34 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.BasicStroke;\r
-import java.awt.Stroke;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-abstract class LineMarkDrawer extends AbstractMarkDrawer{\r
-    public LineMarkDrawer(){\r
-    }\r
-\r
-    @Override\r
-    public boolean isFilled(){\r
-        return false;\r
-    }\r
-\r
-    @Override\r
-    public void setFilled(boolean fill){\r
-        // nothing to to.\r
-    }\r
-\r
-    @Override\r
-    public Stroke getOverStroke(){\r
-        return new BasicStroke(3f);\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BasicStroke;
+import java.awt.Stroke;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+abstract class LineMarkDrawer extends AbstractMarkDrawer{
+    public LineMarkDrawer(){
+    }
+
+    @Override
+    public boolean isFilled(){
+        return false;
+    }
+
+    @Override
+    public void setFilled(boolean fill){
+        // nothing to to.
+    }
+
+    @Override
+    public Stroke getOverStroke(){
+        return new BasicStroke(3f);
+    }
+
+}
@@ -1,37 +1,37 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.Rectangle2D;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class RectangleDrawer extends AbstractMarkDrawer{\r
-\r
-    public RectangleDrawer(){\r
-        super();\r
-    }\r
-\r
-    public RectangleDrawer(boolean fill){\r
-        super(fill);\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        double ww = (double)w / 2d;\r
-        double hh = (double)h / 2d;\r
-\r
-        return new Rectangle2D.Double(ww - 2d, hh - 2d, 4d, 4d);\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        return new Rectangle2D.Double(0, 0, w - 1, h - 1);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class RectangleDrawer extends AbstractMarkDrawer{
+
+    public RectangleDrawer(){
+        super();
+    }
+
+    public RectangleDrawer(boolean fill){
+        super(fill);
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        double ww = (double)w / 2d;
+        double hh = (double)h / 2d;
+
+        return new Rectangle2D.Double(ww - 2d, hh - 2d, 4d, 4d);
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        return new Rectangle2D.Double(0, 0, w - 1, h - 1);
+    }
+}
@@ -1,55 +1,55 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.GeneralPath;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class RhombusDrawer extends AbstractMarkDrawer{\r
-\r
-    public RhombusDrawer(){\r
-        super();\r
-    }\r
-\r
-    public RhombusDrawer(boolean fill){\r
-        super(fill);\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        float ww = (float)w / 2f;\r
-        float hh = (float)h / 2f;\r
-\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(ww,      hh - 2f);\r
-        path.lineTo(ww + 2f, hh);\r
-        path.lineTo(ww,      hh + 2f);\r
-        path.lineTo(ww - 2f, hh);\r
-        path.lineTo(ww,      hh - 2f);\r
-\r
-        return path;\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        float ww = (float)w / 2f;\r
-        float hh = (float)h / 2f;\r
-\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(ww,     0);\r
-        path.lineTo(0,      hh);\r
-        path.lineTo(ww,     h);\r
-        path.lineTo(w,      hh);\r
-        path.lineTo(ww,     0);\r
-\r
-        return path;\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.GeneralPath;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class RhombusDrawer extends AbstractMarkDrawer{
+
+    public RhombusDrawer(){
+        super();
+    }
+
+    public RhombusDrawer(boolean fill){
+        super(fill);
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        float ww = (float)w / 2f;
+        float hh = (float)h / 2f;
+
+        GeneralPath path = new GeneralPath();
+        path.moveTo(ww,      hh - 2f);
+        path.lineTo(ww + 2f, hh);
+        path.lineTo(ww,      hh + 2f);
+        path.lineTo(ww - 2f, hh);
+        path.lineTo(ww,      hh - 2f);
+
+        return path;
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        float ww = (float)w / 2f;
+        float hh = (float)h / 2f;
+
+        GeneralPath path = new GeneralPath();
+        path.moveTo(ww,     0);
+        path.lineTo(0,      hh);
+        path.lineTo(ww,     h);
+        path.lineTo(w,      hh);
+        path.lineTo(ww,     0);
+
+        return path;
+    }
+
+}
@@ -1,37 +1,37 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.GeneralPath;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class StarDrawer extends LineMarkDrawer{\r
-    public StarDrawer(){\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        float ww = w / 2f;\r
-        float hh = h / 2f;\r
-\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(0, hh); path.lineTo(w, hh);\r
-        path.moveTo(ww, 0); path.lineTo(ww, h);\r
-        path.moveTo(0, 0);  path.lineTo(w, h);\r
-        path.moveTo(w, 0);  path.lineTo(0, h);\r
-\r
-        return path;\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        return getPlainShape(w, h);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.GeneralPath;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class StarDrawer extends LineMarkDrawer{
+    public StarDrawer(){
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        float ww = w / 2f;
+        float hh = h / 2f;
+
+        GeneralPath path = new GeneralPath();
+        path.moveTo(0, hh); path.lineTo(w, hh);
+        path.moveTo(ww, 0); path.lineTo(ww, h);
+        path.moveTo(0, 0);  path.lineTo(w, h);
+        path.moveTo(w, 0);  path.lineTo(0, h);
+
+        return path;
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        return getPlainShape(w, h);
+    }
+}
@@ -1,50 +1,50 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.GeneralPath;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class UpperTriangleDrawer extends AbstractMarkDrawer{\r
-\r
-    public UpperTriangleDrawer(){\r
-        super();\r
-    }\r
-\r
-    public UpperTriangleDrawer(boolean fill){\r
-        super(fill);\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        float ww = (float)w / 2f;\r
-        float hh = (float)h / 2f;\r
-\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(ww - 2f, hh + 2f);\r
-        path.lineTo(ww + 2f, hh + 2f);\r
-        path.lineTo(ww, hh + 2f - (float)(2 * Math.sqrt(3)));\r
-        path.lineTo(ww - 2f, hh + 2f);\r
-\r
-        return path;\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(0, h - 1f);\r
-        path.lineTo(w, h - 1f);\r
-        path.lineTo(w / 2f, 0);\r
-        path.lineTo(0, h - 1f);\r
-\r
-        return path;\r
-    }\r
-\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.GeneralPath;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class UpperTriangleDrawer extends AbstractMarkDrawer{
+
+    public UpperTriangleDrawer(){
+        super();
+    }
+
+    public UpperTriangleDrawer(boolean fill){
+        super(fill);
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        float ww = (float)w / 2f;
+        float hh = (float)h / 2f;
+
+        GeneralPath path = new GeneralPath();
+        path.moveTo(ww - 2f, hh + 2f);
+        path.lineTo(ww + 2f, hh + 2f);
+        path.lineTo(ww, hh + 2f - (float)(2 * Math.sqrt(3)));
+        path.lineTo(ww - 2f, hh + 2f);
+
+        return path;
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        GeneralPath path = new GeneralPath();
+        path.moveTo(0, h - 1f);
+        path.lineTo(w, h - 1f);
+        path.lineTo(w / 2f, 0);
+        path.lineTo(0, h - 1f);
+
+        return path;
+    }
+
+}
@@ -1,34 +1,34 @@
-package jp.naist.se.stigmata.ui.swing.mds.mark;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Shape;\r
-import java.awt.geom.GeneralPath;\r
-\r
-/**\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-class XMarkDrawer extends LineMarkDrawer{\r
-    public XMarkDrawer(){\r
-    }\r
-\r
-    @Override\r
-    public Shape getPlainShape(int w, int h){\r
-        GeneralPath path = new GeneralPath();\r
-        path.moveTo(0, 0);\r
-        path.lineTo(w, h);\r
-        path.moveTo(w, 0);\r
-        path.lineTo(0, h);\r
-\r
-        return path;\r
-    }\r
-\r
-    @Override\r
-    public Shape getOveredShape(int w, int h){\r
-        return getPlainShape(w, h);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.mds.mark;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Shape;
+import java.awt.geom.GeneralPath;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+class XMarkDrawer extends LineMarkDrawer{
+    public XMarkDrawer(){
+    }
+
+    @Override
+    public Shape getPlainShape(int w, int h){
+        GeneralPath path = new GeneralPath();
+        path.moveTo(0, 0);
+        path.lineTo(w, h);
+        path.moveTo(w, 0);
+        path.lineTo(0, h);
+
+        return path;
+    }
+
+    @Override
+    public Shape getOveredShape(int w, int h){
+        return getPlainShape(w, h);
+    }
+}
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata.ui.swing.tab;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.LayoutManager;\r
-import java.awt.Rectangle;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-\r
-import javax.swing.JPanel;\r
-\r
-/**\r
- * This program is copied from below URL.\r
- * http://terai.xrea.jp/Swing/EditTabTitle.html\r
- * \r
- * @author Haruaki Tamada\r
- * @author Terai Atsuhiro\r
- * @version $Revision$ $Date$\r
- */\r
-class EditableGlassPane extends JPanel{\r
-    private static final long serialVersionUID = 9009103705988625476L;\r
-\r
-    private EditableTabbedPane pane;\r
-    private Rectangle rect;\r
-\r
-    public EditableGlassPane(EditableTabbedPane panel){\r
-        super((LayoutManager)null);\r
-        this.pane = panel;\r
-\r
-        setOpaque(false);\r
-        addMouseListener(new MouseAdapter(){\r
-            public void mouseClicked(MouseEvent e){\r
-                if(rect == null || rect.contains(e.getPoint()))\r
-                    return;\r
-                pane.renameTab();\r
-            }\r
-        });\r
-    }\r
-\r
-    public void setRectangle(int x, int y, int w, int h){\r
-        setRectangle(new Rectangle(x, y, w, h));\r
-    }\r
-\r
-    public void setRectangle(Rectangle rect){\r
-        this.rect = rect;\r
-    }\r
-\r
-    public Rectangle getRectangle(){\r
-        return rect;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.tab;
+
+/*
+ * $Id$
+ */
+
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JPanel;
+
+/**
+ * This program is copied from below URL.
+ * http://terai.xrea.jp/Swing/EditTabTitle.html
+ * 
+ * @author Haruaki Tamada
+ * @author Terai Atsuhiro
+ * @version $Revision$ $Date$
+ */
+class EditableGlassPane extends JPanel{
+    private static final long serialVersionUID = 9009103705988625476L;
+
+    private EditableTabbedPane pane;
+    private Rectangle rect;
+
+    public EditableGlassPane(EditableTabbedPane panel){
+        super((LayoutManager)null);
+        this.pane = panel;
+
+        setOpaque(false);
+        addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent e){
+                if(rect == null || rect.contains(e.getPoint()))
+                    return;
+                pane.renameTab();
+            }
+        });
+    }
+
+    public void setRectangle(int x, int y, int w, int h){
+        setRectangle(new Rectangle(x, y, w, h));
+    }
+
+    public void setRectangle(Rectangle rect){
+        this.rect = rect;
+    }
+
+    public Rectangle getRectangle(){
+        return rect;
+    }
+}
-package jp.naist.se.stigmata.ui.swing.tab;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.FocusTraversalPolicy;\r
-import java.awt.Rectangle;\r
-import java.awt.event.FocusAdapter;\r
-import java.awt.event.FocusEvent;\r
-import java.awt.event.KeyAdapter;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-\r
-import javax.swing.BorderFactory;\r
-import javax.swing.JFrame;\r
-import javax.swing.JMenuBar;\r
-import javax.swing.JTabbedPane;\r
-import javax.swing.JTextField;\r
-\r
-/**\r
- * This program is copied from below URL.\r
- * http://terai.xrea.jp/Swing/EditTabTitle.html\r
- * \r
- * @author Haruaki Tamada\r
- * @author Terai Atsuhiro\r
- * @version $Revision$ $Date$\r
- */\r
-public class EditableTabbedPane extends JTabbedPane{\r
-    private static final long serialVersionUID = -66174062280771547L;\r
-\r
-    private final EditableGlassPane panel;\r
-    private final JTextField editor;\r
-    private final JFrame frame;\r
-    private final FocusTraversalPolicy policy;\r
-    private FocusTraversalPolicy ftp;\r
-\r
-    public EditableTabbedPane(JFrame frame){\r
-        this.frame = frame;\r
-        this.panel = new EditableGlassPane(this);\r
-        this.editor = new JTextField();\r
-\r
-        policy = new EditableTabbedPaneFocusTraversalPolicy(editor);\r
-\r
-        editor.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3));\r
-        editor.addFocusListener(new FocusAdapter(){\r
-            public void focusGained(final FocusEvent e){\r
-                ((JTextField)e.getSource()).selectAll();\r
-            }\r
-        });\r
-        editor.addKeyListener(new KeyAdapter(){\r
-            public void keyPressed(KeyEvent e){\r
-                if(e.getKeyCode() == KeyEvent.VK_ENTER){\r
-                    renameTab();\r
-                }\r
-                else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){\r
-                    cancelEditing();\r
-                }\r
-            }\r
-        });\r
-        addMouseListener(new MouseAdapter(){\r
-            public void mouseClicked(MouseEvent me){\r
-                if(me.getClickCount() == 2){\r
-                    startEditing();\r
-                }\r
-            }\r
-        });\r
-        addKeyListener(new KeyAdapter(){\r
-            public void keyPressed(KeyEvent e){\r
-                if(e.getKeyCode() == KeyEvent.VK_ENTER){\r
-                    startEditing();\r
-                }\r
-            }\r
-        });\r
-\r
-        frame.setGlassPane(panel);\r
-        panel.add(editor);\r
-        panel.setVisible(false);\r
-    }\r
-\r
-    void renameTab(){\r
-        frame.setFocusTraversalPolicy(ftp);\r
-        if(editor.getText().trim().length() > 0){\r
-            setTitleAt(getSelectedIndex(), editor.getText());\r
-        }\r
-        panel.setVisible(false);\r
-    }\r
-\r
-    private void startEditing(){\r
-        initEditor();\r
-        ftp = frame.getFocusTraversalPolicy();\r
-        panel.setVisible(true);\r
-        editor.requestFocusInWindow();\r
-        frame.setFocusTraversalPolicy(policy);\r
-    }\r
-\r
-    private void cancelEditing(){\r
-        frame.setFocusTraversalPolicy(ftp);\r
-        panel.setVisible(false);\r
-    }\r
-\r
-    private void initEditor(){\r
-        JMenuBar bar = frame.getJMenuBar();\r
-        Rectangle rect = getUI().getTabBounds(this, getSelectedIndex());\r
-        rect.setRect(rect.x + 2, rect.y + 2, rect.width - 2, rect.height - 2);\r
-        if(bar != null){\r
-            rect.y += bar.getSize().height;\r
-        }\r
-        panel.setRectangle(rect);\r
-\r
-        editor.setBounds(rect);\r
-        editor.setText(getTitleAt(getSelectedIndex()));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.tab;
+
+/*
+ * $Id$
+ */
+
+import java.awt.FocusTraversalPolicy;
+import java.awt.Rectangle;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.BorderFactory;
+import javax.swing.JFrame;
+import javax.swing.JMenuBar;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextField;
+
+/**
+ * This program is copied from below URL.
+ * http://terai.xrea.jp/Swing/EditTabTitle.html
+ * 
+ * @author Haruaki Tamada
+ * @author Terai Atsuhiro
+ * @version $Revision$ $Date$
+ */
+public class EditableTabbedPane extends JTabbedPane{
+    private static final long serialVersionUID = -66174062280771547L;
+
+    private final EditableGlassPane panel;
+    private final JTextField editor;
+    private final JFrame frame;
+    private final FocusTraversalPolicy policy;
+    private FocusTraversalPolicy ftp;
+
+    public EditableTabbedPane(JFrame frame){
+        this.frame = frame;
+        this.panel = new EditableGlassPane(this);
+        this.editor = new JTextField();
+
+        policy = new EditableTabbedPaneFocusTraversalPolicy(editor);
+
+        editor.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3));
+        editor.addFocusListener(new FocusAdapter(){
+            public void focusGained(final FocusEvent e){
+                ((JTextField)e.getSource()).selectAll();
+            }
+        });
+        editor.addKeyListener(new KeyAdapter(){
+            public void keyPressed(KeyEvent e){
+                if(e.getKeyCode() == KeyEvent.VK_ENTER){
+                    renameTab();
+                }
+                else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
+                    cancelEditing();
+                }
+            }
+        });
+        addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent me){
+                if(me.getClickCount() == 2){
+                    startEditing();
+                }
+            }
+        });
+        addKeyListener(new KeyAdapter(){
+            public void keyPressed(KeyEvent e){
+                if(e.getKeyCode() == KeyEvent.VK_ENTER){
+                    startEditing();
+                }
+            }
+        });
+
+        frame.setGlassPane(panel);
+        panel.add(editor);
+        panel.setVisible(false);
+    }
+
+    void renameTab(){
+        frame.setFocusTraversalPolicy(ftp);
+        if(editor.getText().trim().length() > 0){
+            setTitleAt(getSelectedIndex(), editor.getText());
+        }
+        panel.setVisible(false);
+    }
+
+    private void startEditing(){
+        initEditor();
+        ftp = frame.getFocusTraversalPolicy();
+        panel.setVisible(true);
+        editor.requestFocusInWindow();
+        frame.setFocusTraversalPolicy(policy);
+    }
+
+    private void cancelEditing(){
+        frame.setFocusTraversalPolicy(ftp);
+        panel.setVisible(false);
+    }
+
+    private void initEditor(){
+        JMenuBar bar = frame.getJMenuBar();
+        Rectangle rect = getUI().getTabBounds(this, getSelectedIndex());
+        rect.setRect(rect.x + 2, rect.y + 2, rect.width - 2, rect.height - 2);
+        if(bar != null){
+            rect.y += bar.getSize().height;
+        }
+        panel.setRectangle(rect);
+
+        editor.setBounds(rect);
+        editor.setText(getTitleAt(getSelectedIndex()));
+    }
+}
@@ -1,52 +1,52 @@
-package jp.naist.se.stigmata.ui.swing.tab;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.awt.Component;\r
-import java.awt.Container;\r
-import java.awt.FocusTraversalPolicy;\r
-\r
-import javax.swing.JTextField;\r
-\r
-/**\r
- * This program is copied from below URL.\r
- * http://terai.xrea.jp/Swing/EditTabTitle.html\r
- * \r
- * @author Haruaki Tamada\r
- * @author Terai Atsuhiro\r
- * @version $Revision$ $Date$\r
- */\r
-class EditableTabbedPaneFocusTraversalPolicy extends FocusTraversalPolicy{\r
-    private JTextField editor;\r
-\r
-    public EditableTabbedPaneFocusTraversalPolicy(JTextField editor){\r
-        this.editor = editor;\r
-    }\r
-\r
-    @Override\r
-    public Component getFirstComponent(Container focusCycleRoot){\r
-        return null;\r
-    }\r
-\r
-    @Override\r
-    public Component getLastComponent(Container focusCycleRoot){\r
-        return editor;\r
-    }\r
-\r
-    @Override\r
-    public Component getComponentAfter(Container focusCycleRoot, Component cmp){\r
-        return editor;\r
-    }\r
-\r
-    @Override\r
-    public Component getComponentBefore(Container focusCycleRoot, Component cmp){\r
-        return editor;\r
-    }\r
-\r
-    @Override\r
-    public Component getDefaultComponent(Container focusCycleRoot){\r
-        return editor;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.ui.swing.tab;
+
+/*
+ * $Id$
+ */
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.FocusTraversalPolicy;
+
+import javax.swing.JTextField;
+
+/**
+ * This program is copied from below URL.
+ * http://terai.xrea.jp/Swing/EditTabTitle.html
+ * 
+ * @author Haruaki Tamada
+ * @author Terai Atsuhiro
+ * @version $Revision$ $Date$
+ */
+class EditableTabbedPaneFocusTraversalPolicy extends FocusTraversalPolicy{
+    private JTextField editor;
+
+    public EditableTabbedPaneFocusTraversalPolicy(JTextField editor){
+        this.editor = editor;
+    }
+
+    @Override
+    public Component getFirstComponent(Container focusCycleRoot){
+        return null;
+    }
+
+    @Override
+    public Component getLastComponent(Container focusCycleRoot){
+        return editor;
+    }
+
+    @Override
+    public Component getComponentAfter(Container focusCycleRoot, Component cmp){
+        return editor;
+    }
+
+    @Override
+    public Component getComponentBefore(Container focusCycleRoot, Component cmp){
+        return editor;
+    }
+
+    @Override
+    public Component getDefaultComponent(Container focusCycleRoot){
+        return editor;
+    }
+}
@@ -1,41 +1,41 @@
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Iterator;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revission$ $Date$\r
- */\r
-public class ArrayIterator<T> implements Iterator<T>{\r
-    private T[] values;\r
-    private int length;\r
-    private int currentIndex = 0;\r
-\r
-    public ArrayIterator(T[] values){\r
-        this.values = values;\r
-        if(values != null){\r
-            length = values.length;\r
-        }\r
-        else{\r
-            length = 0;\r
-        }\r
-    }\r
-\r
-    public boolean hasNext(){\r
-        return currentIndex < length;\r
-    }\r
-\r
-    public T next(){\r
-        T value = values[currentIndex];\r
-        currentIndex++;\r
-        return value;\r
-    }\r
-\r
-    public void remove(){\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revission$ $Date$
+ */
+public class ArrayIterator<T> implements Iterator<T>{
+    private T[] values;
+    private int length;
+    private int currentIndex = 0;
+
+    public ArrayIterator(T[] values){
+        this.values = values;
+        if(values != null){
+            length = values.length;
+        }
+        else{
+            length = 0;
+        }
+    }
+
+    public boolean hasNext(){
+        return currentIndex < length;
+    }
+
+    public T next(){
+        T value = values[currentIndex];
+        currentIndex++;
+        return value;
+    }
+
+    public void remove(){
+    }
+}
@@ -1,19 +1,19 @@
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-\r
-import jp.naist.se.stigmata.ui.swing.UnsupportedFormatException;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public interface AsciiDataWritable{\r
-    public void writeAsciiData(PrintWriter out, String format) throws IOException, UnsupportedFormatException;\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import jp.sourceforge.stigmata.ui.swing.UnsupportedFormatException;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public interface AsciiDataWritable{
+    public void writeAsciiData(PrintWriter out, String format) throws IOException, UnsupportedFormatException;
+}
@@ -1,18 +1,18 @@
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.OutputStream;\r
-\r
-import jp.naist.se.stigmata.ui.swing.UnsupportedFormatException;\r
-\r
-/**\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public interface BinaryDataWritable{\r
-    public void writeBinaryData(OutputStream out, String format) throws IOException, UnsupportedFormatException;\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import jp.sourceforge.stigmata.ui.swing.UnsupportedFormatException;
+
+/**
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface BinaryDataWritable{
+    public void writeBinaryData(OutputStream out, String format) throws IOException, UnsupportedFormatException;
+}
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.net.URL;\r
-import java.util.Iterator;\r
-import java.util.Map;\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.birthmarks.BirthmarkService;\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-import org.apache.commons.beanutils.BeanUtils;\r
-\r
-/**\r
- * Export birthmark environment to xml file.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ConfigFileExporter{\r
-    private BirthmarkEnvironment environment;\r
-\r
-    public ConfigFileExporter(BirthmarkEnvironment environment){\r
-        this.environment = environment;\r
-    }\r
-\r
-    public void export(BirthmarkEnvironment environment, PrintWriter out) throws IOException{\r
-        new ConfigFileExporter(environment).export(out);\r
-    }\r
-\r
-    public void export(PrintWriter out) throws IOException{\r
-        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<stigmata>");\r
-\r
-        exportServices(out);\r
-        exportFilters(out);\r
-        exportWellknownClasses(out);\r
-        exportClasspath(out);\r
-        exportProperties(out);\r
-\r
-        out.println("</stigmata>");\r
-        out.flush();\r
-    }\r
-\r
-    private void exportProperties(PrintWriter out) throws IOException{\r
-        out.println("  <properties>");\r
-        for(Iterator<String> i = environment.propertyKeys(); i.hasNext(); ){\r
-            String key = i.next();\r
-            String value = environment.getProperty(key);\r
-            out.println("    <property>");\r
-            out.printf("      <name>%s</name>%n", key);\r
-            out.printf("      <value>%s</value>%n", value);\r
-            out.println("    </property>");\r
-        }\r
-        out.println("  </properties>");\r
-    }\r
-\r
-    private void exportClasspath(PrintWriter out) throws IOException{\r
-        out.println("  <classpath-list>");\r
-        for(URL location: environment.getClasspathContext()){\r
-            out.printf("    <classpath>%s</classpath>%n", location.toString());\r
-        }\r
-        out.println("  </classpath-list>");\r
-    }\r
-\r
-    private void exportWellknownClasses(PrintWriter out) throws IOException{\r
-        out.println("  <wellknown-classes>");\r
-        for(WellknownClassJudgeRule rule: environment.getWellknownClassManager()){\r
-            String value = rule.getPattern();\r
-            String tag;\r
-            String matchtag;\r
-            switch(rule.getMatchPartType()){\r
-            case CLASS_NAME:\r
-                tag = "class-name";\r
-                break;\r
-            case FULLY_NAME:\r
-                tag = "fully-name";\r
-                break;\r
-            case PACKAGE_NAME:\r
-                tag = "package-name";\r
-                break;\r
-            default:\r
-                throw new InternalError("unknown part type: " + rule.getMatchPartType());\r
-            }\r
-            switch(rule.getMatchType()){\r
-            case EXACT:\r
-                matchtag = "match";\r
-                break;\r
-            case NOT_MATCH:\r
-                matchtag = "not-match";\r
-                break;\r
-            case PREFIX:\r
-                matchtag = "prefix";\r
-                break;\r
-            case SUFFIX:\r
-                matchtag = "suffix";\r
-                break;\r
-            default:\r
-                throw new InternalError("unknown match type: " + rule.getMatchType());\r
-            }\r
-\r
-            out.print("    ");\r
-            if(rule.isExclude()) out.print("<exclude>");\r
-            out.printf("<%s><%s>%s</%s></%s>", tag, matchtag, value, matchtag, tag);\r
-            if(rule.isExclude()) out.print("</exclude>");\r
-            out.println();\r
-        }\r
-        out.println("  </wellknown-classes>");\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    private void exportFilters(PrintWriter out) throws IOException{\r
-        out.println("  <filterset-list>");\r
-        for(ComparisonPairFilterSet filterset: environment.getFilterManager().getFilterSets()){\r
-            out.println("    <filterset>");\r
-            out.printf("      <name>%s</name>%n", filterset.getName());\r
-            out.printf("      <match>%s</match>%n", filterset.isMatchAll()? "all": "any");\r
-            out.println("      <filter-list>");\r
-            for(ComparisonPairFilter filter: filterset){\r
-                out.println("        <filter>");\r
-                out.printf("          <filter-type>%s</filter-type>%n", filter.getService().getFilterName());\r
-                out.printf("          <criterion>%s</criterion>%n", filter.getCriterion());\r
-                try{\r
-                    Map props = BeanUtils.describe(filter);\r
-                    props.remove("service");\r
-                    props.remove("class");\r
-                    props.remove("criterion");\r
-                    props.remove("acceptableCriteria");\r
-                    out.println("          <attributes>");\r
-                    for(Object object: props.entrySet()){\r
-                        Map.Entry entry = (Map.Entry)object;\r
-                        Object value = entry.getValue();\r
-                        out.println("            <attribute>");\r
-                        out.printf("              <name>%s</name>%n", String.valueOf(entry.getKey()));\r
-                        if(value == null){\r
-                            out.println("              <value></value>%n");\r
-                        }\r
-                        else{\r
-                            out.printf("              <value>%s</value>%n", String.valueOf(entry.getValue()));\r
-                        }\r
-                        out.println("            </attribute>");\r
-                    }\r
-                    out.println("          </attributes>");\r
-                } catch(Exception e){\r
-                    e.printStackTrace();\r
-                }\r
-                out.println("        </filter>");\r
-            }\r
-            out.println("      </filter-list>");\r
-            out.println("    </filterset>");\r
-        }\r
-        out.println("  </filterset-list>");\r
-    }\r
-\r
-    private void exportServices(PrintWriter out) throws IOException{\r
-        out.println("  <birthmark-services>");\r
-        for(BirthmarkSpi service: environment.getServices()){\r
-            if(service.isExpert() && service instanceof BirthmarkService){\r
-                out.println("    <birthmark-service>");\r
-                out.printf("      <type>%s</type>%n", service.getType());\r
-                out.printf("      <display-name>%s</display-name>%n", service.getDisplayType());\r
-                out.printf("      <description>%s</description>%n", service.getDescription());\r
-                out.printf("      <extractor>%s</extractor>%n", service.getExtractorClassName());\r
-                out.printf("      <comparator>%s</comparator>%n", service.getComparatorClassName());\r
-                out.println("    </birthmark-service>");\r
-            }\r
-        }\r
-        out.println("  </birthmark-services>");\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkService;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+import org.apache.commons.beanutils.BeanUtils;
+
+/**
+ * Export birthmark environment to xml file.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ConfigFileExporter{
+    private BirthmarkEnvironment environment;
+
+    public ConfigFileExporter(BirthmarkEnvironment environment){
+        this.environment = environment;
+    }
+
+    public void export(BirthmarkEnvironment environment, PrintWriter out) throws IOException{
+        new ConfigFileExporter(environment).export(out);
+    }
+
+    public void export(PrintWriter out) throws IOException{
+        out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        out.println("<stigmata>");
+
+        exportServices(out);
+        exportFilters(out);
+        exportWellknownClasses(out);
+        exportClasspath(out);
+        exportProperties(out);
+
+        out.println("</stigmata>");
+        out.flush();
+    }
+
+    private void exportProperties(PrintWriter out) throws IOException{
+        out.println("  <properties>");
+        for(Iterator<String> i = environment.propertyKeys(); i.hasNext(); ){
+            String key = i.next();
+            String value = environment.getProperty(key);
+            out.println("    <property>");
+            out.printf("      <name>%s</name>%n", key);
+            out.printf("      <value>%s</value>%n", value);
+            out.println("    </property>");
+        }
+        out.println("  </properties>");
+    }
+
+    private void exportClasspath(PrintWriter out) throws IOException{
+        out.println("  <classpath-list>");
+        for(URL location: environment.getClasspathContext()){
+            out.printf("    <classpath>%s</classpath>%n", location.toString());
+        }
+        out.println("  </classpath-list>");
+    }
+
+    private void exportWellknownClasses(PrintWriter out) throws IOException{
+        out.println("  <wellknown-classes>");
+        for(WellknownClassJudgeRule rule: environment.getWellknownClassManager()){
+            String value = rule.getPattern();
+            String tag;
+            String matchtag;
+            switch(rule.getMatchPartType()){
+            case CLASS_NAME:
+                tag = "class-name";
+                break;
+            case FULLY_NAME:
+                tag = "fully-name";
+                break;
+            case PACKAGE_NAME:
+                tag = "package-name";
+                break;
+            default:
+                throw new InternalError("unknown part type: " + rule.getMatchPartType());
+            }
+            switch(rule.getMatchType()){
+            case EXACT:
+                matchtag = "match";
+                break;
+            case NOT_MATCH:
+                matchtag = "not-match";
+                break;
+            case PREFIX:
+                matchtag = "prefix";
+                break;
+            case SUFFIX:
+                matchtag = "suffix";
+                break;
+            default:
+                throw new InternalError("unknown match type: " + rule.getMatchType());
+            }
+
+            out.print("    ");
+            if(rule.isExclude()) out.print("<exclude>");
+            out.printf("<%s><%s>%s</%s></%s>", tag, matchtag, value, matchtag, tag);
+            if(rule.isExclude()) out.print("</exclude>");
+            out.println();
+        }
+        out.println("  </wellknown-classes>");
+    }
+
+    @SuppressWarnings("unchecked")
+    private void exportFilters(PrintWriter out) throws IOException{
+        out.println("  <filterset-list>");
+        for(ComparisonPairFilterSet filterset: environment.getFilterManager().getFilterSets()){
+            out.println("    <filterset>");
+            out.printf("      <name>%s</name>%n", filterset.getName());
+            out.printf("      <match>%s</match>%n", filterset.isMatchAll()? "all": "any");
+            out.println("      <filter-list>");
+            for(ComparisonPairFilter filter: filterset){
+                out.println("        <filter>");
+                out.printf("          <filter-type>%s</filter-type>%n", filter.getService().getFilterName());
+                out.printf("          <criterion>%s</criterion>%n", filter.getCriterion());
+                try{
+                    Map props = BeanUtils.describe(filter);
+                    props.remove("service");
+                    props.remove("class");
+                    props.remove("criterion");
+                    props.remove("acceptableCriteria");
+                    out.println("          <attributes>");
+                    for(Object object: props.entrySet()){
+                        Map.Entry entry = (Map.Entry)object;
+                        Object value = entry.getValue();
+                        out.println("            <attribute>");
+                        out.printf("              <name>%s</name>%n", String.valueOf(entry.getKey()));
+                        if(value == null){
+                            out.println("              <value></value>%n");
+                        }
+                        else{
+                            out.printf("              <value>%s</value>%n", String.valueOf(entry.getValue()));
+                        }
+                        out.println("            </attribute>");
+                    }
+                    out.println("          </attributes>");
+                } catch(Exception e){
+                    e.printStackTrace();
+                }
+                out.println("        </filter>");
+            }
+            out.println("      </filter-list>");
+            out.println("    </filterset>");
+        }
+        out.println("  </filterset-list>");
+    }
+
+    private void exportServices(PrintWriter out) throws IOException{
+        out.println("  <birthmark-services>");
+        for(BirthmarkSpi service: environment.getServices()){
+            if(service.isExpert() && 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());
+                out.println("    </birthmark-service>");
+            }
+        }
+        out.println("  </birthmark-services>");
+    }
+}
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import javax.xml.parsers.ParserConfigurationException;\r
-import javax.xml.parsers.SAXParser;\r
-import javax.xml.parsers.SAXParserFactory;\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.Stigmata;\r
-import jp.naist.se.stigmata.birthmarks.BirthmarkService;\r
-\r
-import org.xml.sax.Attributes;\r
-import org.xml.sax.SAXException;\r
-import org.xml.sax.helpers.DefaultHandler;\r
-\r
-/**\r
- * configuration file parser.\r
- * \r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ConfigFileImporter{\r
-    private BirthmarkEnvironment environment;\r
-\r
-    public ConfigFileImporter(BirthmarkEnvironment environment){\r
-        this.environment = environment;\r
-    }\r
-\r
-    public ConfigFileImporter(){\r
-        // generate environment.\r
-    }\r
-\r
-    public BirthmarkEnvironment parse(InputStream in) throws IOException{\r
-        try{\r
-            SAXParserFactory factory = SAXParserFactory.newInstance();\r
-            SAXParser parser = factory.newSAXParser();\r
-            Handler handler = new Handler(getEnvironment());\r
-            parser.parse(in, handler);\r
-            this.environment = handler.getEnvironment();\r
-\r
-            return environment;\r
-        }catch(ParserConfigurationException e){\r
-            throw new IOException(e.getMessage());\r
-        }catch(SAXException e){\r
-            throw new IOException(e.getMessage());\r
-        }\r
-    }\r
-\r
-    public BirthmarkEnvironment getEnvironment(){\r
-        return environment;\r
-    }\r
-\r
-    private static enum Part{\r
-        WELLKNOWN_CLASSES, PROPERTIES, CLASSPATH, SERVICES, FILTER_SET, FILTER_DEFINITION,\r
-    }\r
-\r
-    private static class Handler extends DefaultHandler{\r
-        private BirthmarkEnvironment environment;\r
-        private WellknownClassManager manager;\r
-        private BirthmarkService service;\r
-        private ComparisonPairFilterSet filter;\r
-        private Part part;\r
-        private boolean exclude;\r
-        private WellknownClassJudgeRule.MatchType matchType;\r
-        private WellknownClassJudgeRule.MatchPartType partType;\r
-        private String qname;\r
-        private String key;\r
-        private String filterType, filterCriterion, attributeName;\r
-        private Map<String, String> filterAttributes = new HashMap<String, String>();\r
-\r
-        public Handler(BirthmarkEnvironment environment){\r
-            if(environment == null){\r
-                environment = Stigmata.getInstance().createEnvironment();\r
-            }\r
-            this.environment = environment;\r
-            this.manager = environment.getWellknownClassManager();\r
-        }\r
-\r
-        public BirthmarkEnvironment getEnvironment(){\r
-            return environment;\r
-        }\r
-\r
-        @Override\r
-        public void startElement(String uri, String localName, String qname,\r
-                                 Attributes attributes) throws SAXException{\r
-            this.qname = qname;\r
-\r
-            if(qname.equals("wellknown-classes")){\r
-                part = Part.WELLKNOWN_CLASSES;\r
-            }\r
-            else if(qname.equals("property")){\r
-                part = Part.PROPERTIES;\r
-            }\r
-            else if(qname.equals("classpath-list")){\r
-                part = Part.CLASSPATH;\r
-            }\r
-            else if(qname.equals("birthmark-service")){\r
-                part = Part.SERVICES;\r
-                service = new BirthmarkService();\r
-                service.setUserDefined(false);\r
-            }\r
-            else if(qname.equals("filterset-list")){\r
-                part = Part.FILTER_SET;\r
-            }\r
-\r
-            if(part == Part.FILTER_SET){\r
-                if(qname.equals("filterset")){\r
-                    filter = new ComparisonPairFilterSet();\r
-                }\r
-                else if(qname.equals("filter")){\r
-                    part = Part.FILTER_DEFINITION;\r
-                    filterAttributes.clear();\r
-                }\r
-            }\r
-            else if(part == Part.WELLKNOWN_CLASSES){\r
-                if(qname.equals("exclude")){\r
-                    exclude = true;\r
-                }\r
-                else if(qname.equals("package-name")){\r
-                    partType = WellknownClassJudgeRule.MatchPartType.PACKAGE_NAME;\r
-                }\r
-                else if(qname.equals("class-name")){\r
-                    partType = WellknownClassJudgeRule.MatchPartType.CLASS_NAME;\r
-                }\r
-                else if(qname.equals("fully-name")){\r
-                    partType = WellknownClassJudgeRule.MatchPartType.FULLY_NAME;\r
-                }\r
-                else if(qname.equals("suffix")){\r
-                    matchType = WellknownClassJudgeRule.MatchType.SUFFIX;\r
-                }\r
-                else if(qname.equals("prefix")){\r
-                    matchType = WellknownClassJudgeRule.MatchType.PREFIX;\r
-                }\r
-                else if(qname.equals("match")){\r
-                    matchType = WellknownClassJudgeRule.MatchType.EXACT;\r
-                }\r
-                else if(qname.equals("not-match")){\r
-                    matchType = WellknownClassJudgeRule.MatchType.NOT_MATCH;\r
-                }\r
-            }\r
-        }\r
-\r
-        @Override\r
-        public void characters(char[] data, int offset, int length) throws SAXException{\r
-            String value = new String(data, offset, length).trim();\r
-\r
-            if(value.length() > 0){\r
-                if(part == Part.PROPERTIES){\r
-                    if(qname.equals("name")){\r
-                        key = value;\r
-                    }\r
-                    else if(qname.equals("value")){\r
-                        environment.addProperty(key, value);\r
-                    }\r
-                }\r
-                else if(part == Part.WELLKNOWN_CLASSES\r
-                        && (qname.equals("suffix") || qname.equals("prefix") || qname.equals("match"))){\r
-                    manager.add(new WellknownClassJudgeRule(value, matchType, partType, exclude));\r
-                    exclude = false;\r
-                }\r
-                else if(part == Part.CLASSPATH && qname.equals("classpath")){\r
-                    try{\r
-                        environment.getClasspathContext().addClasspath(\r
-                                new URL(value));\r
-                    }catch(MalformedURLException e){\r
-                        throw new SAXException(e);\r
-                    }\r
-                }\r
-                else if(part == Part.SERVICES){\r
-                    if(qname.equals("type"))\r
-                        service.setType(value);\r
-                    else if(qname.equals("display-name"))\r
-                        service.setDisplayType(value);\r
-                    else if(qname.equals("description"))\r
-                        service.setDescription(value);\r
-                    else if(qname.equals("extractor"))\r
-                        service.setExtractorClassName(value);\r
-                    else if(qname.equals("comparator"))\r
-                        service.setComparatorClassName(value);\r
-                }\r
-                else if(part == Part.FILTER_SET){\r
-                    if(qname.equals("name")){\r
-                        filter.setName(value);\r
-                    }\r
-                    else if(qname.equals("match")){\r
-                        if(value.equals("all")){\r
-                            filter.setMatchAll();\r
-                        }\r
-                        else{\r
-                            filter.setMatchAny();\r
-                        }\r
-                    }\r
-                }\r
-                else if(part == Part.FILTER_DEFINITION){\r
-                    if(qname.equals("filter-type")){\r
-                        filterType = value;\r
-                    }\r
-                    else if(qname.equals("criterion")){\r
-                        filterCriterion = value;\r
-                    }\r
-                    else if(qname.equals("name")){\r
-                        attributeName = value;\r
-                    }\r
-                    else{\r
-                        filterAttributes.put(attributeName, value);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-\r
-        @Override\r
-        public void endElement(String uri, String localname, String qname){\r
-            if(part == Part.SERVICES && qname.equals("birthmark-service")){\r
-                environment.addService(service);\r
-                service = null;\r
-            }\r
-            else if(part == Part.FILTER_DEFINITION && qname.equals("filter")){\r
-                ComparisonPairFilter f = environment.getFilterManager().buildFilter(\r
-                    filterType, filterCriterion, filterAttributes\r
-                );\r
-                filter.addFilter(f);\r
-                part = Part.FILTER_SET;\r
-            }\r
-            else if(part == Part.FILTER_SET && qname.equals("filterset")){\r
-                environment.getFilterManager().addFilterSet(filter);\r
-            }\r
-        }\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ComparisonPairFilter;
+import jp.sourceforge.stigmata.ComparisonPairFilterSet;
+import jp.sourceforge.stigmata.Stigmata;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkService;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * configuration file parser.
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ConfigFileImporter{
+    private BirthmarkEnvironment environment;
+
+    public ConfigFileImporter(BirthmarkEnvironment environment){
+        this.environment = environment;
+    }
+
+    public ConfigFileImporter(){
+        // generate environment.
+    }
+
+    public BirthmarkEnvironment parse(InputStream in) throws IOException{
+        try{
+            SAXParserFactory factory = SAXParserFactory.newInstance();
+            SAXParser parser = factory.newSAXParser();
+            Handler handler = new Handler(getEnvironment());
+            parser.parse(in, handler);
+            this.environment = handler.getEnvironment();
+
+            return environment;
+        }catch(ParserConfigurationException e){
+            throw new IOException(e.getMessage());
+        }catch(SAXException e){
+            throw new IOException(e.getMessage());
+        }
+    }
+
+    public BirthmarkEnvironment getEnvironment(){
+        return environment;
+    }
+
+    private static enum Part{
+        WELLKNOWN_CLASSES, PROPERTIES, CLASSPATH, SERVICES, FILTER_SET, FILTER_DEFINITION,
+    }
+
+    private static class Handler extends DefaultHandler{
+        private BirthmarkEnvironment environment;
+        private WellknownClassManager manager;
+        private BirthmarkService service;
+        private ComparisonPairFilterSet filter;
+        private Part part;
+        private boolean exclude;
+        private WellknownClassJudgeRule.MatchType matchType;
+        private WellknownClassJudgeRule.MatchPartType partType;
+        private String qname;
+        private String key;
+        private String filterType, filterCriterion, attributeName;
+        private Map<String, String> filterAttributes = new HashMap<String, String>();
+
+        public Handler(BirthmarkEnvironment environment){
+            if(environment == null){
+                environment = Stigmata.getInstance().createEnvironment();
+            }
+            this.environment = environment;
+            this.manager = environment.getWellknownClassManager();
+        }
+
+        public BirthmarkEnvironment getEnvironment(){
+            return environment;
+        }
+
+        @Override
+        public void startElement(String uri, String localName, String qname,
+                                 Attributes attributes) throws SAXException{
+            this.qname = qname;
+
+            if(qname.equals("wellknown-classes")){
+                part = Part.WELLKNOWN_CLASSES;
+            }
+            else if(qname.equals("property")){
+                part = Part.PROPERTIES;
+            }
+            else if(qname.equals("classpath-list")){
+                part = Part.CLASSPATH;
+            }
+            else if(qname.equals("birthmark-service")){
+                part = Part.SERVICES;
+                service = new BirthmarkService();
+                service.setUserDefined(false);
+            }
+            else if(qname.equals("filterset-list")){
+                part = Part.FILTER_SET;
+            }
+
+            if(part == Part.FILTER_SET){
+                if(qname.equals("filterset")){
+                    filter = new ComparisonPairFilterSet();
+                }
+                else if(qname.equals("filter")){
+                    part = Part.FILTER_DEFINITION;
+                    filterAttributes.clear();
+                }
+            }
+            else if(part == Part.WELLKNOWN_CLASSES){
+                if(qname.equals("exclude")){
+                    exclude = true;
+                }
+                else if(qname.equals("package-name")){
+                    partType = WellknownClassJudgeRule.MatchPartType.PACKAGE_NAME;
+                }
+                else if(qname.equals("class-name")){
+                    partType = WellknownClassJudgeRule.MatchPartType.CLASS_NAME;
+                }
+                else if(qname.equals("fully-name")){
+                    partType = WellknownClassJudgeRule.MatchPartType.FULLY_NAME;
+                }
+                else if(qname.equals("suffix")){
+                    matchType = WellknownClassJudgeRule.MatchType.SUFFIX;
+                }
+                else if(qname.equals("prefix")){
+                    matchType = WellknownClassJudgeRule.MatchType.PREFIX;
+                }
+                else if(qname.equals("match")){
+                    matchType = WellknownClassJudgeRule.MatchType.EXACT;
+                }
+                else if(qname.equals("not-match")){
+                    matchType = WellknownClassJudgeRule.MatchType.NOT_MATCH;
+                }
+            }
+        }
+
+        @Override
+        public void characters(char[] data, int offset, int length) throws SAXException{
+            String value = new String(data, offset, length).trim();
+
+            if(value.length() > 0){
+                if(part == Part.PROPERTIES){
+                    if(qname.equals("name")){
+                        key = value;
+                    }
+                    else if(qname.equals("value")){
+                        environment.addProperty(key, value);
+                    }
+                }
+                else if(part == Part.WELLKNOWN_CLASSES
+                        && (qname.equals("suffix") || qname.equals("prefix") || qname.equals("match"))){
+                    manager.add(new WellknownClassJudgeRule(value, matchType, partType, exclude));
+                    exclude = false;
+                }
+                else if(part == Part.CLASSPATH && qname.equals("classpath")){
+                    try{
+                        environment.getClasspathContext().addClasspath(
+                                new URL(value));
+                    }catch(MalformedURLException e){
+                        throw new SAXException(e);
+                    }
+                }
+                else if(part == Part.SERVICES){
+                    if(qname.equals("type"))
+                        service.setType(value);
+                    else if(qname.equals("display-name"))
+                        service.setDisplayType(value);
+                    else if(qname.equals("description"))
+                        service.setDescription(value);
+                    else if(qname.equals("extractor"))
+                        service.setExtractorClassName(value);
+                    else if(qname.equals("comparator"))
+                        service.setComparatorClassName(value);
+                }
+                else if(part == Part.FILTER_SET){
+                    if(qname.equals("name")){
+                        filter.setName(value);
+                    }
+                    else if(qname.equals("match")){
+                        if(value.equals("all")){
+                            filter.setMatchAll();
+                        }
+                        else{
+                            filter.setMatchAny();
+                        }
+                    }
+                }
+                else if(part == Part.FILTER_DEFINITION){
+                    if(qname.equals("filter-type")){
+                        filterType = value;
+                    }
+                    else if(qname.equals("criterion")){
+                        filterCriterion = value;
+                    }
+                    else if(qname.equals("name")){
+                        attributeName = value;
+                    }
+                    else{
+                        filterAttributes.put(attributeName, value);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void endElement(String uri, String localname, String qname){
+            if(part == Part.SERVICES && qname.equals("birthmark-service")){
+                environment.addService(service);
+                service = null;
+            }
+            else if(part == Part.FILTER_DEFINITION && qname.equals("filter")){
+                ComparisonPairFilter f = environment.getFilterManager().buildFilter(
+                    filterType, filterCriterion, filterAttributes
+                );
+                filter.addFilter(f);
+                part = Part.FILTER_SET;
+            }
+            else if(part == Part.FILTER_SET && qname.equals("filterset")){
+                environment.getFilterManager().addFilterSet(filter);
+            }
+        }
+    }
+}
@@ -1,67 +1,67 @@
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.HashMap;\r
-import java.util.Locale;\r
-import java.util.Map;\r
-import java.util.MissingResourceException;\r
-import java.util.ResourceBundle;\r
-\r
-/**\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class LocalizedDescriptionManager{\r
-    public static enum ServiceCategory{\r
-        comparator, extractor, birthmark, formatter, filter,\r
-    };\r
-    private Map<Locale, ResourceBundle> resources = new HashMap<Locale, ResourceBundle>();\r
-\r
-    /**\r
-     * only one instance of singleton pattern.\r
-     */\r
-    private static LocalizedDescriptionManager manager = new LocalizedDescriptionManager();\r
-\r
-    private LocalizedDescriptionManager(){\r
-    }\r
-\r
-    public String getDisplayType(Locale locale, String type){\r
-        return getDisplayType(locale, type, ServiceCategory.birthmark);\r
-    }\r
-\r
-    public String getDisplayType(Locale locale, String type, ServiceCategory category){\r
-        try{\r
-            return getBundle(locale).getString(category.name() + "." + type + ".display.type");\r
-        } catch(MissingResourceException e){\r
-            return null;\r
-        }\r
-    }\r
-\r
-    public String getDescription(Locale locale, String birthmarkType){\r
-        return getDescription(locale, birthmarkType, ServiceCategory.birthmark);\r
-    }\r
-\r
-    public String getDescription(Locale locale, String type, ServiceCategory category){\r
-        try{\r
-            return getBundle(locale).getString(category.name() + "." + type + ".description");\r
-        } catch(MissingResourceException e){\r
-            return null;\r
-        }\r
-    }\r
-\r
-    private ResourceBundle getBundle(Locale locale){\r
-        ResourceBundle bundle = resources.get(locale);\r
-        if(bundle == null){\r
-            bundle = ResourceBundle.getBundle("resources.description", locale);\r
-            resources.put(locale, bundle);\r
-        }\r
-        return bundle;\r
-    }\r
-\r
-    public static LocalizedDescriptionManager getInstance(){\r
-        return manager;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class LocalizedDescriptionManager{
+    public static enum ServiceCategory{
+        comparator, extractor, birthmark, formatter, filter,
+    };
+    private Map<Locale, ResourceBundle> resources = new HashMap<Locale, ResourceBundle>();
+
+    /**
+     * only one instance of singleton pattern.
+     */
+    private static LocalizedDescriptionManager manager = new LocalizedDescriptionManager();
+
+    private LocalizedDescriptionManager(){
+    }
+
+    public String getDisplayType(Locale locale, String type){
+        return getDisplayType(locale, type, ServiceCategory.birthmark);
+    }
+
+    public String getDisplayType(Locale locale, String type, ServiceCategory category){
+        try{
+            return getBundle(locale).getString(category.name() + "." + type + ".display.type");
+        } catch(MissingResourceException e){
+            return null;
+        }
+    }
+
+    public String getDescription(Locale locale, String birthmarkType){
+        return getDescription(locale, birthmarkType, ServiceCategory.birthmark);
+    }
+
+    public String getDescription(Locale locale, String type, ServiceCategory category){
+        try{
+            return getBundle(locale).getString(category.name() + "." + type + ".description");
+        } catch(MissingResourceException e){
+            return null;
+        }
+    }
+
+    private ResourceBundle getBundle(Locale locale){
+        ResourceBundle bundle = resources.get(locale);
+        if(bundle == null){
+            bundle = ResourceBundle.getBundle("resources.description", locale);
+            resources.put(locale, bundle);
+        }
+        return bundle;
+    }
+
+    public static LocalizedDescriptionManager getInstance(){
+        return manager;
+    }
+}
@@ -1,26 +1,26 @@
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Iterator;\r
-import java.util.NoSuchElementException;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada \r
- * @version $Revision$ $Date$\r
- */\r
-public class NullIterator<T> implements Iterator<T>{\r
-    public boolean hasNext(){\r
-        return false;\r
-    }\r
-\r
-    public T next(){\r
-        throw new NoSuchElementException("no more object");\r
-    }\r
-\r
-    public void remove(){\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * 
+ * @author Haruaki Tamada 
+ * @version $Revision$ $Date$
+ */
+public class NullIterator<T> implements Iterator<T>{
+    public boolean hasNext(){
+        return false;
+    }
+
+    public T next(){
+        throw new NoSuchElementException("no more object");
+    }
+
+    public void remove(){
+    }
+}
@@ -1,71 +1,71 @@
-package jp.naist.se.stigmata.utils;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.net.URL;\r
-import java.net.URLClassLoader;\r
-import java.net.URLStreamHandlerFactory;\r
-\r
-/**\r
- * ClassLoader for war file.\r
- * A war file layouts classes in /WEB-INF/classes directory.\r
- * Therefore, plain jar class loader cannot load classes included in war file.\r
- * Because plain jar class loader only loads classes in top directory.\r
- * Then, this class loader can load classes included in a plain jar file and a war file.\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class WarClassLoader extends URLClassLoader{\r
-    public WarClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory){\r
-        super(urls, parent, factory);\r
-    }\r
-\r
-    public WarClassLoader(URL[] urls, ClassLoader parent){\r
-        super(urls, parent);\r
-    }\r
-\r
-    public WarClassLoader(URL[] urls){\r
-        super(urls);\r
-    }\r
-\r
-    @Override\r
-    protected Class<?> findClass(String name) throws ClassNotFoundException{\r
-        Class<?> clazz = null;\r
-        try{\r
-            clazz = super.findClass(name);\r
-        } catch(ClassNotFoundException e){\r
-            String path = "WEB-INF/classes/" + name.replace('.', '/') + ".class";\r
-            for(URL url: getURLs()){\r
-                if(url.toString().endsWith(".war")){\r
-                    try{\r
-                        URL newurl = new URL("jar:" + url + "!/" + path);\r
-                        InputStream in = newurl.openStream();\r
-                        ByteArrayOutputStream out = new ByteArrayOutputStream();\r
-                        byte[] data = new byte[256];\r
-                        int read = 0;\r
-                        while((read = in.read(data, 0, data.length)) != -1){\r
-                            out.write(data, 0, read);\r
-                        }\r
-                        byte[] classdata = out.toByteArray();\r
-                        in.close();\r
-                        out.close();\r
-                    \r
-                        clazz = defineClass(name, classdata, 0, classdata.length);\r
-                        break;\r
-                    } catch(IOException exp){\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        if(clazz == null){\r
-            throw new ClassNotFoundException(name);\r
-        }\r
-        return clazz;\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLStreamHandlerFactory;
+
+/**
+ * ClassLoader for war file.
+ * A war file layouts classes in /WEB-INF/classes directory.
+ * Therefore, plain jar class loader cannot load classes included in war file.
+ * Because plain jar class loader only loads classes in top directory.
+ * Then, this class loader can load classes included in a plain jar file and a war file.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class WarClassLoader extends URLClassLoader{
+    public WarClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory){
+        super(urls, parent, factory);
+    }
+
+    public WarClassLoader(URL[] urls, ClassLoader parent){
+        super(urls, parent);
+    }
+
+    public WarClassLoader(URL[] urls){
+        super(urls);
+    }
+
+    @Override
+    protected Class<?> findClass(String name) throws ClassNotFoundException{
+        Class<?> clazz = null;
+        try{
+            clazz = super.findClass(name);
+        } catch(ClassNotFoundException e){
+            String path = "WEB-INF/classes/" + name.replace('.', '/') + ".class";
+            for(URL url: getURLs()){
+                if(url.toString().endsWith(".war")){
+                    try{
+                        URL newurl = new URL("jar:" + url + "!/" + path);
+                        InputStream in = newurl.openStream();
+                        ByteArrayOutputStream out = new ByteArrayOutputStream();
+                        byte[] data = new byte[256];
+                        int read = 0;
+                        while((read = in.read(data, 0, data.length)) != -1){
+                            out.write(data, 0, read);
+                        }
+                        byte[] classdata = out.toByteArray();
+                        in.close();
+                        out.close();
+                    
+                        clazz = defineClass(name, classdata, 0, classdata.length);
+                        break;
+                    } catch(IOException exp){
+                    }
+                }
+            }
+        }
+        if(clazz == null){
+            throw new ClassNotFoundException(name);
+        }
+        return clazz;
+    }
+}
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata.utils;
+package jp.sourceforge.stigmata.utils;
 
 /* 
  * $Id$
@@ -8,8 +8,8 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import jp.naist.se.stigmata.utils.WellknownClassJudgeRule.MatchPartType;
-import jp.naist.se.stigmata.utils.WellknownClassJudgeRule.MatchType;
+import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule.MatchPartType;
+import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule.MatchType;
 
 import org.objectweb.asm.Opcodes;
 
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkComparatorSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkComparatorSpi
deleted file mode 100755 (executable)
index faad882..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparatorService\r
-jp.naist.se.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparatorService\r
-jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparatorService\r
-jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparatorService\r
-jp.naist.se.stigmata.birthmarks.comparators.ExtendedEditDistanceBirthmarkComparatorService\r
-jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparatorService\r
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkExtractorSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkExtractorSpi
deleted file mode 100755 (executable)
index 814d715..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-jp.naist.se.stigmata.birthmarks.extractors.ConstantValueOfFieldVariableBirthmarkExtractorService\r
-jp.naist.se.stigmata.birthmarks.extractors.InheritanceStructureBirthmarkExtractorService\r
-jp.naist.se.stigmata.birthmarks.extractors.SequentialMethodCallBirthmarkExtractorService\r
-jp.naist.se.stigmata.birthmarks.extractors.UsedClassesBirthmarkExtractorService\r
-jp.naist.se.stigmata.birthmarks.extractors.KGramBasedBirthmarkExtractorService\r
-jp.naist.se.stigmata.birthmarks.extractors.FrequencyMethodCallBirthmarkExtractorService\r
-jp.naist.se.stigmata.birthmarks.extractors.FrequencyUsedClassesBirthmarkExtractorService\r
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi
deleted file mode 100755 (executable)
index 0760b1b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkService\r
-jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkService\r
-jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkService\r
-jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkService\r
-jp.naist.se.stigmata.birthmarks.kgram.KGramBasedBirthmarkService\r
-jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkService\r
-jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkService\r
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ComparisonPairFilterSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ComparisonPairFilterSpi
deleted file mode 100755 (executable)
index 8a0d755..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-jp.naist.se.stigmata.filter.BirthmarkElementCountComparisonPairFilterService\r
-jp.naist.se.stigmata.filter.SimilarityComparisonPairFilterService\r
-jp.naist.se.stigmata.filter.TargetNameComparisonPairFilterService\r
-jp.naist.se.stigmata.filter.TotalElementCountComparisonPairFilterService\r
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ExtractedBirthmarkSpi
deleted file mode 100755 (executable)
index 9697f49..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-jp.naist.se.stigmata.result.MemoryExtractedBirthmarkService\r
-jp.naist.se.stigmata.result.XmlFileExtractedBirthmarkService\r
-jp.naist.se.stigmata.result.RDBExtractedBirthmarkService\r
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ResultPrinterSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.ResultPrinterSpi
deleted file mode 100755 (executable)
index 019a10e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-jp.naist.se.stigmata.printer.xml.XmlResultPrinterService\r
-jp.naist.se.stigmata.printer.csv.CsvResultPrinterService\r
diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.ui.swing.filter.ComparisonPairFilterComponentService b/src/main/resources/META-INF/services/jp.naist.se.stigmata.ui.swing.filter.ComparisonPairFilterComponentService
deleted file mode 100755 (executable)
index 03c3a79..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-jp.naist.se.stigmata.ui.swing.filter.BirthmarkElementCountComparisonPairFilterComponentService\r
-jp.naist.se.stigmata.ui.swing.filter.SimilarityComparisonPairFilterComponentService\r
-jp.naist.se.stigmata.ui.swing.filter.TargetNameComparisonPairFilterComponentService\r
-jp.naist.se.stigmata.ui.swing.filter.TotalElementCountComparisonPairFilterComponentService\r
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkComparatorSpi b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkComparatorSpi
new file mode 100755 (executable)
index 0000000..9be018c
--- /dev/null
@@ -0,0 +1,6 @@
+jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparatorService
+jp.sourceforge.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparatorService
+jp.sourceforge.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparatorService
+jp.sourceforge.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparatorService
+jp.sourceforge.stigmata.birthmarks.comparators.ExtendedEditDistanceBirthmarkComparatorService
+jp.sourceforge.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparatorService
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkExtractorSpi b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkExtractorSpi
new file mode 100755 (executable)
index 0000000..a9dd8e0
--- /dev/null
@@ -0,0 +1,7 @@
+jp.sourceforge.stigmata.birthmarks.extractors.ConstantValueOfFieldVariableBirthmarkExtractorService
+jp.sourceforge.stigmata.birthmarks.extractors.InheritanceStructureBirthmarkExtractorService
+jp.sourceforge.stigmata.birthmarks.extractors.SequentialMethodCallBirthmarkExtractorService
+jp.sourceforge.stigmata.birthmarks.extractors.UsedClassesBirthmarkExtractorService
+jp.sourceforge.stigmata.birthmarks.extractors.KGramBasedBirthmarkExtractorService
+jp.sourceforge.stigmata.birthmarks.extractors.FrequencyMethodCallBirthmarkExtractorService
+jp.sourceforge.stigmata.birthmarks.extractors.FrequencyUsedClassesBirthmarkExtractorService
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkSpi b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.BirthmarkSpi
new file mode 100755 (executable)
index 0000000..0869b5d
--- /dev/null
@@ -0,0 +1,7 @@
+jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkService
+jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkService
+jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkService
+jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkService
+jp.sourceforge.stigmata.birthmarks.kgram.KGramBasedBirthmarkService
+jp.sourceforge.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkService
+jp.sourceforge.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkService
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi
new file mode 100755 (executable)
index 0000000..814cf3b
--- /dev/null
@@ -0,0 +1,4 @@
+jp.sourceforge.stigmata.filter.BirthmarkElementCountComparisonPairFilterService
+jp.sourceforge.stigmata.filter.SimilarityComparisonPairFilterService
+jp.sourceforge.stigmata.filter.TargetNameComparisonPairFilterService
+jp.sourceforge.stigmata.filter.TotalElementCountComparisonPairFilterService
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi
new file mode 100755 (executable)
index 0000000..e6d0b97
--- /dev/null
@@ -0,0 +1,3 @@
+jp.sourceforge.stigmata.result.MemoryExtractedBirthmarkService
+jp.sourceforge.stigmata.result.XmlFileExtractedBirthmarkService
+jp.sourceforge.stigmata.result.RDBExtractedBirthmarkService
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ResultPrinterSpi b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.spi.ResultPrinterSpi
new file mode 100755 (executable)
index 0000000..588ce8e
--- /dev/null
@@ -0,0 +1,2 @@
+jp.sourceforge.stigmata.printer.xml.XmlResultPrinterService
+jp.sourceforge.stigmata.printer.csv.CsvResultPrinterService
diff --git a/src/main/resources/META-INF/services/jp.sourceforge.stigmata.ui.swing.filter.ComparisonPairFilterComponentService b/src/main/resources/META-INF/services/jp.sourceforge.stigmata.ui.swing.filter.ComparisonPairFilterComponentService
new file mode 100755 (executable)
index 0000000..cc783f3
--- /dev/null
@@ -0,0 +1,4 @@
+jp.sourceforge.stigmata.ui.swing.filter.BirthmarkElementCountComparisonPairFilterComponentService
+jp.sourceforge.stigmata.ui.swing.filter.SimilarityComparisonPairFilterComponentService
+jp.sourceforge.stigmata.ui.swing.filter.TargetNameComparisonPairFilterComponentService
+jp.sourceforge.stigmata.ui.swing.filter.TotalElementCountComparisonPairFilterComponentService
index 2e32898..9203be5 100755 (executable)
@@ -14,7 +14,7 @@ cli.option.store-target=This option represents how to store extracted birthmarks
 cli.interface=java -jar stigmata-%s.jar <OPTIONS> <TARGETS>%nTARGETS is allowed as jar files, war files, class files, and classpath directory.
 cli.interface.birthmarks=Available birthmarks:
 cli.interface.filters=Available filters:
-cli.interface.copyright=Copyright (C) by Haruaki Tamada, Ph.D. (SE Lab., NAIST)
+cli.interface.copyright=Copyright (C) by Haruaki Tamada, Ph.D. (Kyoto Sangyo University, Japan)
 cli.interface.mailto=Please notify us some bugs and requests to <stigmata-info[ at ]list.sourceforge.jp>
 cli.interface.filter.matchall=Match all
 cli.interface.filter.matchany=Match any
index 1a03edb..7dd1d13 100755 (executable)
@@ -14,7 +14,7 @@ cli.option.store-target=
 cli.interface=java -jar stigmata-%s.jar <OPTIONS> <TARGETS>%nTARGETS\82É\82Íjar\83t\83@\83C\83\8b\81Cwar\83t\83@\83C\83\8b\81C\83N\83\89\83X\83t\83@\83C\83\8b\82â\83f\83B\83\8c\83N\83g\83\8a\82ª\8ew\92è\89Â\94\\82Å\82·\81D\r
 cli.interface.birthmarks=\8ew\92è\89Â\94\\82È\83o\81[\83X\83}\81[\83N:\r
 cli.interface.filters=\8ew\92è\89Â\94\\82È\83t\83B\83\8b\83^:\r
-cli.interface.copyright=Copyright (C) by Haruaki Tamada, Ph.D. (SE Lab., NAIST)\r
+cli.interface.copyright=Copyright (C) by Haruaki Tamada, Ph.D. (Kyoto Sangyo University)\r
 cli.interface.mailto=\83\8a\83N\83G\83X\83g\82â\83o\83O\95ñ\8d\90\82Í <stigmata-info[ at ]list.sourceforge.jp> \82Ü\82Å\82¨\8aè\82¢\82µ\82Ü\82·\81D\r
 cli.interface.filter.matchall=\91S\82Ä\82Ì\8fð\8c\8f\82É\83}\83b\83`\r
 cli.interface.filter.matchany=\82¢\82¸\82ê\82©\82Ì\8fð\8c\8f\82É\83}\83b\83`\r
index 57e1e9b..d025465 100755 (executable)
@@ -10,72 +10,72 @@ $Id$
       <type>uc_seq</type>
       <display-name>Used Classes (compare as sequence)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>uc_dp</type>
       <display-name>Used Classes (DP matching)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>uc_ed</type>
       <display-name>Used Classes (Edit distance)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>is_ed</type>
       <display-name>Inheritance Structure (Edit distance)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>is_dp</type>
       <display-name>Inheritance Structure (DP matching)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>smc_ed</type>
       <display-name>Sequence of Method Calls (Edit distance)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>smc_dp</type>
       <display-name>Sequence of Method Calls (DP matching)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>cvfv_ed</type>
       <display-name>Constant Value of Field Variable (Edit distance)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator</comparator>
     </birthmark-service>
 
     <birthmark-service>
       <type>cvfv_dp</type>
       <display-name>Constant Value of Field Variable (DP matching)</display-name>
       <description></description>
-      <extractor>jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor</extractor>
-      <comparator>jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
+      <extractor>jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor</extractor>
+      <comparator>jp.sourceforge.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator</comparator>
     </birthmark-service>
   </birthmark-services>
 
index bb40544..d07a656 100755 (executable)
@@ -117,9 +117,9 @@ Next, add dependency tag entry to dependencies tag in `pom.xml.'
   <dependencies>\r
       :\r
     <dependency>\r
-      <groupId>jp.naist.se</groupId>\r
+      <groupId>jp.sourceforge</groupId>\r
       <artifactId>stigmata</artifactId>\r
-      <version>1.0.0</version>\r
+      <version>1.2.0</version>\r
     </dependency>\r
       :\r
   </dependencies>\r
index 49506a5..eec932b 100755 (executable)
@@ -93,7 +93,7 @@ Related Tools
 \r
 Contact\r
 \r
- Contact us by emal \<harua-t[ at ]is.naist.jp\>\r
+ Contact us by emal \<tama3[ at ]users.sourceforge.jp\>\r
 \r
  *{{{http://sourceforge.jp/developer/sendmessage.php?touser=587}Email sending form}}\r
 \r
index 66e0084..9355d88 100755 (executable)
@@ -2,10 +2,9 @@
 
 <project name="Stigmata">
   <bannerLeft>
-    <name>NAIST SE Lab.</name>
-    <src>images/logos/selogo.png</src>
-    <href>http://se.naist.jp/</href>
-    <alt>se.naist.jp</alt>
+    <name>sourceforge.jp</name>
+    <href>http://sourceforge.jp/</href>
+    <alt>sourceforge.jp</alt>
   </bannerLeft>
   <bannerRight>
     <name>Stigmata</name>
@@ -57,6 +56,7 @@
 
     <menu name="Links">
       <item name="SE Lab., NAIST" href="http://se.naist.jp/" />
+      <item name="Kyoto Sangyo University" href="http://www.kyoto-su.ac.jp/" />
       <item name="DonQuixote"     href="http://donquixote.cafebabe.jp/" />
     </menu>
 
@@ -1,43 +1,43 @@
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import static org.junit.Assert.assertNotNull;\r
-\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class ServiceListTest{\r
-    private BirthmarkEnvironment env;\r
-\r
-    @Before\r
-    public void setup() throws Exception{\r
-        env = Stigmata.getInstance().createEnvironment();\r
-    }\r
-\r
-    @Test\r
-    public void testServiceList(){\r
-        assertNotNull(env.getService("cvfv"));\r
-        assertNotNull(env.getService("fmc"));\r
-        assertNotNull(env.getService("fuc"));\r
-        assertNotNull(env.getService("is"));\r
-        assertNotNull(env.getService("kgram"));\r
-        assertNotNull(env.getService("smc"));\r
-        assertNotNull(env.getService("uc"));\r
-        assertNotNull(env.getService("cvfv_dp"));\r
-        assertNotNull(env.getService("cvfv_ed"));\r
-        assertNotNull(env.getService("is_dp"));\r
-        assertNotNull(env.getService("is_ed"));\r
-        assertNotNull(env.getService("smc_dp"));\r
-        assertNotNull(env.getService("smc_ed"));\r
-        assertNotNull(env.getService("uc_dp"));\r
-        assertNotNull(env.getService("uc_ed"));\r
-        assertNotNull(env.getService("uc_seq"));\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class ServiceListTest{
+    private BirthmarkEnvironment env;
+
+    @Before
+    public void setup() throws Exception{
+        env = Stigmata.getInstance().createEnvironment();
+    }
+
+    @Test
+    public void testServiceList(){
+        assertNotNull(env.getService("cvfv"));
+        assertNotNull(env.getService("fmc"));
+        assertNotNull(env.getService("fuc"));
+        assertNotNull(env.getService("is"));
+        assertNotNull(env.getService("kgram"));
+        assertNotNull(env.getService("smc"));
+        assertNotNull(env.getService("uc"));
+        assertNotNull(env.getService("cvfv_dp"));
+        assertNotNull(env.getService("cvfv_ed"));
+        assertNotNull(env.getService("is_dp"));
+        assertNotNull(env.getService("is_ed"));
+        assertNotNull(env.getService("smc_dp"));
+        assertNotNull(env.getService("smc_ed"));
+        assertNotNull(env.getService("uc_dp"));
+        assertNotNull(env.getService("uc_ed"));
+        assertNotNull(env.getService("uc_seq"));
+    }
+}
-package jp.naist.se.stigmata;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- * test case.\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class StigmataTest{\r
-    private BirthmarkContext context;\r
-    private BirthmarkEnvironment environment;\r
-\r
-    @Before\r
-    public void prepare(){\r
-        Stigmata stigmata = Stigmata.getInstance();\r
-        context = stigmata.createContext();\r
-        environment = context.getEnvironment();\r
-    }\r
-\r
-    @Test\r
-    public void checkAvailableServices() throws Exception{\r
-        Assert.assertNotNull(environment.getService("smc"));\r
-        Assert.assertNotNull(environment.getService("cvfv"));\r
-        Assert.assertNotNull(environment.getService("is"));\r
-        Assert.assertNotNull(environment.getService("uc"));\r
-        Assert.assertNotNull(environment.getService("kgram"));\r
-    }\r
-\r
-    @Test\r
-    public void checkSmcBirthmarkService() throws Exception{\r
-        BirthmarkSpi service = environment.getService("smc");\r
-\r
-        Assert.assertNotNull(service.getComparator());\r
-        Assert.assertNotNull(service.getExtractor());\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator",\r
-            service.getComparator().getClass().getName()\r
-        );\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor",\r
-            service.getExtractor().getClass().getName()\r
-        );\r
-    }\r
-\r
-    @Test\r
-    public void checkCvfvBirthmarkService() throws Exception{\r
-        BirthmarkSpi service = environment.getService("cvfv");\r
-\r
-        Assert.assertNotNull(service.getComparator());\r
-        Assert.assertNotNull(service.getExtractor());\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator",\r
-            service.getComparator().getClass().getName()\r
-        );\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor",\r
-            service.getExtractor().getClass().getName()\r
-        );\r
-    }\r
-\r
-    @Test\r
-    public void checkIsBirthmarkService() throws Exception{\r
-        BirthmarkSpi service = environment.getService("is");\r
-\r
-        Assert.assertNotNull(service.getComparator());\r
-        Assert.assertNotNull(service.getExtractor());\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator",\r
-            service.getComparator().getClass().getName()\r
-        );\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor",\r
-            service.getExtractor().getClass().getName()\r
-        );\r
-    }\r
-\r
-    @Test\r
-    public void checkUcBirthmarkService() throws Exception{\r
-        BirthmarkSpi service = environment.getService("uc");\r
-\r
-        Assert.assertNotNull(service.getComparator());\r
-        Assert.assertNotNull(service.getExtractor());\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator",\r
-            service.getComparator().getClass().getName()\r
-        );\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor",\r
-            service.getExtractor().getClass().getName()\r
-        );\r
-    }\r
-\r
-    @Test\r
-    public void checkKgramBirthmarkService() throws Exception{\r
-        BirthmarkSpi service = environment.getService("kgram");\r
-\r
-        Assert.assertNotNull(service.getComparator());\r
-        Assert.assertNotNull(service.getExtractor());\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator",\r
-            service.getComparator().getClass().getName()\r
-        );\r
-        Assert.assertEquals(\r
-            "jp.naist.se.stigmata.birthmarks.kgram.KGramBasedBirthmarkExtractor",\r
-            service.getExtractor().getClass().getName()\r
-        );\r
-    }\r
-}\r
+package jp.sourceforge.stigmata;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * test case.
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class StigmataTest{
+    private BirthmarkContext context;
+    private BirthmarkEnvironment environment;
+
+    @Before
+    public void prepare(){
+        Stigmata stigmata = Stigmata.getInstance();
+        context = stigmata.createContext();
+        environment = context.getEnvironment();
+    }
+
+    @Test
+    public void checkAvailableServices() throws Exception{
+        Assert.assertNotNull(environment.getService("smc"));
+        Assert.assertNotNull(environment.getService("cvfv"));
+        Assert.assertNotNull(environment.getService("is"));
+        Assert.assertNotNull(environment.getService("uc"));
+        Assert.assertNotNull(environment.getService("kgram"));
+    }
+
+    @Test
+    public void checkSmcBirthmarkService() throws Exception{
+        BirthmarkSpi service = environment.getService("smc");
+
+        Assert.assertNotNull(service.getComparator());
+        Assert.assertNotNull(service.getExtractor());
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator",
+            service.getComparator().getClass().getName()
+        );
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor",
+            service.getExtractor().getClass().getName()
+        );
+    }
+
+    @Test
+    public void checkCvfvBirthmarkService() throws Exception{
+        BirthmarkSpi service = environment.getService("cvfv");
+
+        Assert.assertNotNull(service.getComparator());
+        Assert.assertNotNull(service.getExtractor());
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator",
+            service.getComparator().getClass().getName()
+        );
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor",
+            service.getExtractor().getClass().getName()
+        );
+    }
+
+    @Test
+    public void checkIsBirthmarkService() throws Exception{
+        BirthmarkSpi service = environment.getService("is");
+
+        Assert.assertNotNull(service.getComparator());
+        Assert.assertNotNull(service.getExtractor());
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.comparators.PlainBirthmarkComparator",
+            service.getComparator().getClass().getName()
+        );
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor",
+            service.getExtractor().getClass().getName()
+        );
+    }
+
+    @Test
+    public void checkUcBirthmarkService() throws Exception{
+        BirthmarkSpi service = environment.getService("uc");
+
+        Assert.assertNotNull(service.getComparator());
+        Assert.assertNotNull(service.getExtractor());
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator",
+            service.getComparator().getClass().getName()
+        );
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor",
+            service.getExtractor().getClass().getName()
+        );
+    }
+
+    @Test
+    public void checkKgramBirthmarkService() throws Exception{
+        BirthmarkSpi service = environment.getService("kgram");
+
+        Assert.assertNotNull(service.getComparator());
+        Assert.assertNotNull(service.getExtractor());
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator",
+            service.getComparator().getClass().getName()
+        );
+        Assert.assertEquals(
+            "jp.sourceforge.stigmata.birthmarks.kgram.KGramBasedBirthmarkExtractor",
+            service.getExtractor().getClass().getName()
+        );
+    }
+}
@@ -1,53 +1,53 @@
-package jp.naist.se.stigmata.birthmarks;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkEngine;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.ExtractionTarget;\r
-import jp.naist.se.stigmata.Stigmata;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class BirthmarkCompareTest{\r
-    private BirthmarkContext context;\r
-    private BirthmarkSet[] birthmarks;\r
-    private BirthmarkEngine engine;\r
-\r
-    @Before\r
-    public void readBirthmarks() throws Exception{\r
-        context = Stigmata.getInstance().createContext();\r
-        context.setBirthmarkTypes(new String[] { "cvfv", "smc", "uc", "is", "kgram", });\r
-        engine = new BirthmarkEngine(context.getEnvironment());\r
-\r
-        ExtractionResultSet ers = engine.extract(\r
-            new String[] {\r
-                "target/classes/jp/naist/se/stigmata/Stigmata.class",\r
-                "target/classes/jp/naist/se/stigmata/Main.class",\r
-                "target/classes/jp/naist/se/stigmata/BirthmarkEnvironment.class",\r
-            }, context\r
-        );\r
-        birthmarks = ers.getBirthmarkSets(ExtractionTarget.TARGET_BOTH);\r
-    }\r
-\r
-    @Test\r
-    public void equalsTest() throws Exception{\r
-        Assert.assertEquals(3, birthmarks.length);\r
-        BirthmarkEngine engine = Stigmata.getInstance().createEngine();\r
-\r
-        Assert.assertEquals(1d, engine.compareDetails(birthmarks[0], birthmarks[0], context).calculateSimilarity(), 1E-6);\r
-        Assert.assertEquals(1d, engine.compareDetails(birthmarks[1], birthmarks[1], context).calculateSimilarity(), 1E-6);\r
-        Assert.assertEquals(1d, engine.compareDetails(birthmarks[2], birthmarks[2], context).calculateSimilarity(), 1E-6);\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkEngine;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.ExtractionTarget;
+import jp.sourceforge.stigmata.Stigmata;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkCompareTest{
+    private BirthmarkContext context;
+    private BirthmarkSet[] birthmarks;
+    private BirthmarkEngine engine;
+
+    @Before
+    public void readBirthmarks() throws Exception{
+        context = Stigmata.getInstance().createContext();
+        context.setBirthmarkTypes(new String[] { "cvfv", "smc", "uc", "is", "kgram", });
+        engine = new BirthmarkEngine(context.getEnvironment());
+
+        ExtractionResultSet ers = engine.extract(
+            new String[] {
+                "target/classes/jp/sourceforge/stigmata/Stigmata.class",
+                "target/classes/jp/sourceforge/stigmata/Main.class",
+                "target/classes/jp/sourceforge/stigmata/BirthmarkEnvironment.class",
+            }, context
+        );
+        birthmarks = ers.getBirthmarkSets(ExtractionTarget.TARGET_BOTH);
+    }
+
+    @Test
+    public void equalsTest() throws Exception{
+        Assert.assertEquals(3, birthmarks.length);
+        BirthmarkEngine engine = Stigmata.getInstance().createEngine();
+
+        Assert.assertEquals(1d, engine.compareDetails(birthmarks[0], birthmarks[0], context).calculateSimilarity(), 1E-6);
+        Assert.assertEquals(1d, engine.compareDetails(birthmarks[1], birthmarks[1], context).calculateSimilarity(), 1E-6);
+        Assert.assertEquals(1d, engine.compareDetails(birthmarks[2], birthmarks[2], context).calculateSimilarity(), 1E-6);
+    }
+}
-package jp.naist.se.stigmata.birthmarks.cvfv;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.Stigmata;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class CVFVBirthmarkExtractorTest{\r
-    private Stigmata stigmata;\r
-    private BirthmarkContext context;\r
-\r
-    @Before\r
-    public void setup(){\r
-        stigmata = Stigmata.getInstance();\r
-        context = stigmata.createContext();\r
-        context.addBirthmarkType("cvfv");\r
-    }\r
-\r
-    @Test\r
-    public void checkCVFVBirthmark() throws Exception{\r
-        ExtractionResultSet ers = stigmata.createEngine().extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/Stigmata.class", },\r
-            context\r
-        );\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(1, array.length);\r
-        Assert.assertNotNull(array[0].getBirthmark("cvfv"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("cvfv");\r
-        Assert.assertEquals("cvfv", birthmark.getType());\r
-        Assert.assertEquals(3, birthmark.getElementCount());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
-                            elements[0].getClass().getName());\r
-        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
-                            elements[1].getClass().getName());\r
-        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
-                            elements[2].getClass().getName());\r
-\r
-        Assert.assertEquals("Ljp/naist/se/stigmata/Stigmata;",\r
-                            ((TypeAndValueBirthmarkElement)elements[0]).getSignature());\r
-        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[0]).getValue());\r
-\r
-        Assert.assertEquals("Ljp/naist/se/stigmata/BirthmarkEnvironment;",\r
-                            ((TypeAndValueBirthmarkElement)elements[1]).getSignature());\r
-        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[1]).getValue());\r
-\r
-        Assert.assertEquals("Ljava/util/List;",\r
-                            ((TypeAndValueBirthmarkElement)elements[2]).getSignature());\r
-        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[2]).getValue());\r
-    }\r
-\r
-    @Test\r
-    public void checkCVFVBirthmark2() throws Exception{\r
-        ExtractionResultSet ers = stigmata.createEngine().extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.class", },\r
-            context\r
-        );\r
-\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(array.length, 1);\r
-        Assert.assertNotNull(array[0].getBirthmark("cvfv"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("cvfv");\r
-        Assert.assertEquals(birthmark.getType(), "cvfv");\r
-        Assert.assertEquals(3, birthmark.getElementCount());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
-                            elements[0].getClass().getName());\r
-        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
-                            elements[1].getClass().getName());\r
-        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
-                            elements[2].getClass().getName());\r
-\r
-        Assert.assertEquals("I",   ((TypeAndValueBirthmarkElement)elements[0]).getSignature());\r
-        Assert.assertEquals(-1,    ((TypeAndValueBirthmarkElement)elements[0]).getValue());\r
-\r
-        Assert.assertEquals("Z",   ((TypeAndValueBirthmarkElement)elements[1]).getSignature());\r
-        Assert.assertEquals(null,  ((TypeAndValueBirthmarkElement)elements[1]).getValue());\r
-\r
-        Assert.assertEquals("Z",   ((TypeAndValueBirthmarkElement)elements[2]).getSignature());\r
-        Assert.assertEquals(0,     ((TypeAndValueBirthmarkElement)elements[2]).getValue());\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.cvfv;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.Stigmata;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class CVFVBirthmarkExtractorTest{
+    private Stigmata stigmata;
+    private BirthmarkContext context;
+
+    @Before
+    public void setup(){
+        stigmata = Stigmata.getInstance();
+        context = stigmata.createContext();
+        context.addBirthmarkType("cvfv");
+    }
+
+    @Test
+    public void checkCVFVBirthmark() throws Exception{
+        ExtractionResultSet ers = stigmata.createEngine().extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/Stigmata.class", },
+            context
+        );
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(1, array.length);
+        Assert.assertNotNull(array[0].getBirthmark("cvfv"));
+
+        Birthmark birthmark = array[0].getBirthmark("cvfv");
+        Assert.assertEquals("cvfv", birthmark.getType());
+        Assert.assertEquals(3, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        Assert.assertEquals("jp.sourceforge.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",
+                            elements[0].getClass().getName());
+        Assert.assertEquals("jp.sourceforge.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",
+                            elements[1].getClass().getName());
+        Assert.assertEquals("jp.sourceforge.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",
+                            elements[2].getClass().getName());
+
+        Assert.assertEquals("Ljp/sourceforge/stigmata/Stigmata;",
+                            ((TypeAndValueBirthmarkElement)elements[0]).getSignature());
+        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[0]).getValue());
+
+        Assert.assertEquals("Ljp/sourceforge/stigmata/BirthmarkEnvironment;",
+                            ((TypeAndValueBirthmarkElement)elements[1]).getSignature());
+        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[1]).getValue());
+
+        Assert.assertEquals("Ljava/util/List;",
+                            ((TypeAndValueBirthmarkElement)elements[2]).getSignature());
+        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[2]).getValue());
+    }
+
+    @Test
+    public void checkCVFVBirthmark2() throws Exception{
+        ExtractionResultSet ers = stigmata.createEngine().extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/result/RoundRobinComparisonResultSet.class", },
+            context
+        );
+
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(array.length, 1);
+        Assert.assertNotNull(array[0].getBirthmark("cvfv"));
+
+        Birthmark birthmark = array[0].getBirthmark("cvfv");
+        Assert.assertEquals(birthmark.getType(), "cvfv");
+        Assert.assertEquals(3, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        Assert.assertEquals("jp.sourceforge.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",
+                            elements[0].getClass().getName());
+        Assert.assertEquals("jp.sourceforge.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",
+                            elements[1].getClass().getName());
+        Assert.assertEquals("jp.sourceforge.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",
+                            elements[2].getClass().getName());
+
+        Assert.assertEquals("I",   ((TypeAndValueBirthmarkElement)elements[0]).getSignature());
+        Assert.assertEquals(-1,    ((TypeAndValueBirthmarkElement)elements[0]).getValue());
+
+        Assert.assertEquals("Z",   ((TypeAndValueBirthmarkElement)elements[1]).getSignature());
+        Assert.assertEquals(null,  ((TypeAndValueBirthmarkElement)elements[1]).getValue());
+
+        Assert.assertEquals("Z",   ((TypeAndValueBirthmarkElement)elements[2]).getSignature());
+        Assert.assertEquals(0,     ((TypeAndValueBirthmarkElement)elements[2]).getValue());
+    }
+}
@@ -1,76 +1,76 @@
-package jp.naist.se.stigmata.birthmarks.is;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkEngine;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.Stigmata;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class ISBirthmarkExtractorTest{\r
-    private BirthmarkEngine engine;\r
-    private BirthmarkContext context;\r
-\r
-    @Before\r
-    public void setup(){\r
-        engine = Stigmata.getInstance().createEngine();\r
-        context = Stigmata.getInstance().createContext();\r
-        context.addBirthmarkType("is");\r
-    }\r
-\r
-    @Test\r
-    public void checkISBirthmark() throws Exception{\r
-        ExtractionResultSet ers = engine.extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/Stigmata.class", },\r
-            context\r
-        );\r
-\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(1, array.length);\r
-        Assert.assertNotNull(array[0].getBirthmark("is"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("is");\r
-        Assert.assertEquals("is", birthmark.getType());\r
-        Assert.assertEquals(2, birthmark.getElementCount());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        Assert.assertNull(elements[0].getValue());\r
-        Assert.assertEquals("java.lang.Object", elements[1].getValue());\r
-    }\r
-\r
-    @Test\r
-    public void checkISBirthmark2() throws Exception{\r
-        ExtractionResultSet ers = engine.extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.class", },\r
-            context\r
-        );\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(1, array.length);\r
-        Assert.assertNotNull(array[0].getBirthmark("is"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("is");\r
-        Assert.assertEquals("is", birthmark.getType());\r
-        Assert.assertEquals(3, birthmark.getElementCount());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        Assert.assertNull(elements[0].getValue());\r
-        Assert.assertNull(elements[1].getValue());\r
-        Assert.assertEquals("java.lang.Object", elements[2].getValue());\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.is;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkEngine;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.Stigmata;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class ISBirthmarkExtractorTest{
+    private BirthmarkEngine engine;
+    private BirthmarkContext context;
+
+    @Before
+    public void setup(){
+        engine = Stigmata.getInstance().createEngine();
+        context = Stigmata.getInstance().createContext();
+        context.addBirthmarkType("is");
+    }
+
+    @Test
+    public void checkISBirthmark() throws Exception{
+        ExtractionResultSet ers = engine.extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/Stigmata.class", },
+            context
+        );
+
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(1, array.length);
+        Assert.assertNotNull(array[0].getBirthmark("is"));
+
+        Birthmark birthmark = array[0].getBirthmark("is");
+        Assert.assertEquals("is", birthmark.getType());
+        Assert.assertEquals(2, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        Assert.assertNull(elements[0].getValue());
+        Assert.assertEquals("java.lang.Object", elements[1].getValue());
+    }
+
+    @Test
+    public void checkISBirthmark2() throws Exception{
+        ExtractionResultSet ers = engine.extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/result/RoundRobinComparisonResultSet.class", },
+            context
+        );
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(1, array.length);
+        Assert.assertNotNull(array[0].getBirthmark("is"));
+
+        Birthmark birthmark = array[0].getBirthmark("is");
+        Assert.assertEquals("is", birthmark.getType());
+        Assert.assertEquals(3, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        Assert.assertNull(elements[0].getValue());
+        Assert.assertNull(elements[1].getValue());
+        Assert.assertEquals("java.lang.Object", elements[2].getValue());
+    }
+}
-package jp.naist.se.stigmata.birthmarks.smc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.Stigmata;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class SmcBirthmarkExtractorTest{\r
-    private Stigmata stigmata;\r
-    private BirthmarkContext context;\r
-\r
-    @Before\r
-    public void setup(){\r
-        stigmata = Stigmata.getInstance();\r
-        context = stigmata.createContext();\r
-        context.addBirthmarkType("smc");\r
-    }\r
-\r
-    @Test\r
-    public void checkSmcBirthmark() throws Exception{\r
-        ExtractionResultSet ers = stigmata.createEngine().extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/Stigmata.class", },\r
-            context\r
-        );\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(1, array.length);\r
-        Assert.assertNotNull(array[0].getBirthmark("smc"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("smc");\r
-        Assert.assertEquals("smc", birthmark.getType());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        for(int i = 0; i < elements.length; i++){\r
-            Assert.assertEquals(\r
-                "jp.naist.se.stigmata.birthmarks.smc.MethodCallBirthmarkElement",\r
-                elements[i].getClass().getName()\r
-            );\r
-        }\r
-        /*\r
-        Assert.assertEquals(76, birthmark.getElementCount());\r
-        int index = 0;\r
-        Assert.assertEquals("java.io.FileInputStream#<init>",       elements[index++].getValue());\r
-        Assert.assertEquals("java.io.File#<init>",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.io.File#exists",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.System#getProperty",         elements[index++].getValue());\r
-        Assert.assertEquals("java.io.File#<init>",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.io.File#exists",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.io.FileInputStream#<init>",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Object#getClass",            elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Class#getResourceAsStream",  elements[index++].getValue());\r
-        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.io.File#<init>",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.io.File#toURI",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.net.URI#toURL",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#iterator",              elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());\r
-        Assert.assertEquals("java.net.URL#openStream",              elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#size",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#toArray",               elements[index++].getValue());\r
-        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Object#getClass",            elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Class#getName",              elements[index++].getValue());\r
-        Assert.assertEquals("java.util.logging.Logger#getLogger",   elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#<init>",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#toString",     elements[index++].getValue());\r
-        Assert.assertEquals("java.util.logging.Logger#warning",     elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#size",                  elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#toArray",               elements[index++].getValue());\r
-        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Double#valueOf",             elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List#iterator",              elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Double#doubleValue",         elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.Double#doubleValue",         elements[index++].getValue());\r
-        Assert.assertEquals("org.apache.commons.beanutils.BeanUtils#describe",\r
-                            elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Map#remove",                 elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Map#remove",                 elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Map#keySet",                 elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Set#iterator",               elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#<init>",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.String#valueOf",             elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.StringBuilder#toString",     elements[index++].getValue());\r
-        Assert.assertEquals("org.apache.commons.beanutils.BeanUtils#setProperty",\r
-                            elements[index++].getValue());\r
-        Assert.assertEquals("java.io.ByteArrayInputStream#<init>",  elements[index++].getValue());\r
-        Assert.assertEquals("java.io.ByteArrayOutputStream#<init>", elements[index++].getValue());\r
-        Assert.assertEquals("java.io.InputStream#read",             elements[index++].getValue());\r
-        Assert.assertEquals("java.io.ByteArrayOutputStream#write",  elements[index++].getValue());\r
-        Assert.assertEquals("java.io.ByteArrayOutputStream#toByteArray",\r
-                            elements[index++].getValue());\r
-        Assert.assertEquals("java.io.ByteArrayOutputStream#close",  elements[index++].getValue());\r
-        Assert.assertEquals("javax.imageio.spi.ServiceRegistry#lookupProviders",\r
-                            elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());\r
-        */\r
-    }\r
-\r
-    @Test\r
-    public void checkSmcBirthmark2() throws Exception{\r
-        ExtractionResultSet ers = stigmata.createEngine().extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.class", },\r
-            context\r
-        );\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(array.length, 1);\r
-        Assert.assertNotNull(array[0].getBirthmark("smc"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("smc");\r
-        Assert.assertEquals("smc", birthmark.getType());\r
-        Assert.assertEquals(18, birthmark.getElementCount());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        for(int i = 0; i < elements.length; i++){\r
-            Assert.assertEquals(\r
-                "jp.naist.se.stigmata.birthmarks.smc.MethodCallBirthmarkElement",\r
-                elements[i].getClass().getName()\r
-            );\r
-        }\r
-        /*\r
-        int index = 0;\r
-        // <init>(ExtractionResult, BirthmarkEnvironment, boolean)\r
-        Assert.assertEquals("java.lang.Object#<init>",      elements[index++].toString());\r
-\r
-        // getComparisonSources\r
-        Assert.assertEquals("java.util.ArrayArrays#<init>", elements[index++].toString());\r
-        Assert.assertEquals("java.util.Arrays#asList",      elements[index++].toString());\r
-\r
-        // setCompareSamePair\r
-        Assert.assertEquals("java.util.List#size",          elements[index++].toString());\r
-        Assert.assertEquals("java.util.List#size",          elements[index++].toString());\r
-        Assert.assertEquals("java.util.List#size",          elements[index++].toString());\r
-        Assert.assertEquals("java.util.List#size",          elements[index++].toString());\r
-\r
-        // getComparisonSources\r
-        Assert.assertEquals("java.util.HashMap#<init>",     elements[index++].toString());\r
-        Assert.assertEquals("java.util.List#iterator",      elements[index++].toString());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",   elements[index++].toString());\r
-        Assert.assertEquals("java.util.Iterator#next",      elements[index++].toString());\r
-        Assert.assertEquals("java.util.Map#put",            elements[index++].toString());\r
-        Assert.assertEquals("java.util.List#iterator",      elements[index++].toString());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",   elements[index++].toString());\r
-        Assert.assertEquals("java.util.Iterator#next",      elements[index++].toString());\r
-        Assert.assertEquals("java.util.Map#put",            elements[index++].toString());\r
-        Assert.assertEquals("java.util.Map#size",           elements[index++].toString());\r
-        Assert.assertEquals("java.util.Map#entrySet",       elements[index++].toString());\r
-        Assert.assertEquals("java.util.Set#iterator",       elements[index++].toString());\r
-        Assert.assertEquals("java.util.Iterator#hasNext",   elements[index++].toString());\r
-        Assert.assertEquals("java.util.Iterator#next",      elements[index++].toString());\r
-        Assert.assertEquals("java.util.Map$Entry#getValue", elements[index++].toString());\r
-        */\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.smc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.Stigmata;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class SmcBirthmarkExtractorTest{
+    private Stigmata stigmata;
+    private BirthmarkContext context;
+
+    @Before
+    public void setup(){
+        stigmata = Stigmata.getInstance();
+        context = stigmata.createContext();
+        context.addBirthmarkType("smc");
+    }
+
+    @Test
+    public void checkSmcBirthmark() throws Exception{
+        ExtractionResultSet ers = stigmata.createEngine().extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/Stigmata.class", },
+            context
+        );
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(1, array.length);
+        Assert.assertNotNull(array[0].getBirthmark("smc"));
+
+        Birthmark birthmark = array[0].getBirthmark("smc");
+        Assert.assertEquals("smc", birthmark.getType());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        for(int i = 0; i < elements.length; i++){
+            Assert.assertEquals(
+                "jp.sourceforge.stigmata.birthmarks.smc.MethodCallBirthmarkElement",
+                elements[i].getClass().getName()
+            );
+        }
+        /*
+        Assert.assertEquals(76, birthmark.getElementCount());
+        int index = 0;
+        Assert.assertEquals("java.io.FileInputStream#<init>",       elements[index++].getValue());
+        Assert.assertEquals("java.io.File#<init>",                  elements[index++].getValue());
+        Assert.assertEquals("java.io.File#exists",                  elements[index++].getValue());
+        Assert.assertEquals("java.lang.System#getProperty",         elements[index++].getValue());
+        Assert.assertEquals("java.io.File#<init>",                  elements[index++].getValue());
+        Assert.assertEquals("java.io.File#exists",                  elements[index++].getValue());
+        Assert.assertEquals("java.io.FileInputStream#<init>",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.Object#getClass",            elements[index++].getValue());
+        Assert.assertEquals("java.lang.Class#getResourceAsStream",  elements[index++].getValue());
+        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());
+        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());
+        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());
+        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());
+        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());
+        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());
+        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());
+        Assert.assertEquals("java.io.File#<init>",                  elements[index++].getValue());
+        Assert.assertEquals("java.io.File#toURI",                   elements[index++].getValue());
+        Assert.assertEquals("java.net.URI#toURL",                   elements[index++].getValue());
+        Assert.assertEquals("java.lang.String#endsWith",            elements[index++].getValue());
+        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());
+        Assert.assertEquals("java.util.List#iterator",              elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());
+        Assert.assertEquals("java.net.URL#openStream",              elements[index++].getValue());
+        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());
+        Assert.assertEquals("java.util.List#size",                  elements[index++].getValue());
+        Assert.assertEquals("java.util.List#toArray",               elements[index++].getValue());
+        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());
+        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());
+        Assert.assertEquals("java.lang.Object#getClass",            elements[index++].getValue());
+        Assert.assertEquals("java.lang.Class#getName",              elements[index++].getValue());
+        Assert.assertEquals("java.util.logging.Logger#getLogger",   elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#<init>",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#toString",     elements[index++].getValue());
+        Assert.assertEquals("java.util.logging.Logger#warning",     elements[index++].getValue());
+        Assert.assertEquals("java.util.List#size",                  elements[index++].getValue());
+        Assert.assertEquals("java.util.List#toArray",               elements[index++].getValue());
+        Assert.assertEquals("java.util.ArrayList#<init>",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());
+        Assert.assertEquals("java.lang.Double#valueOf",             elements[index++].getValue());
+        Assert.assertEquals("java.util.List#add",                   elements[index++].getValue());
+        Assert.assertEquals("java.util.List#iterator",              elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());
+        Assert.assertEquals("java.lang.Double#doubleValue",         elements[index++].getValue());
+        Assert.assertEquals("java.lang.Double#doubleValue",         elements[index++].getValue());
+        Assert.assertEquals("org.apache.commons.beanutils.BeanUtils#describe",
+                            elements[index++].getValue());
+        Assert.assertEquals("java.util.Map#remove",                 elements[index++].getValue());
+        Assert.assertEquals("java.util.Map#remove",                 elements[index++].getValue());
+        Assert.assertEquals("java.util.Map#keySet",                 elements[index++].getValue());
+        Assert.assertEquals("java.util.Set#iterator",               elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#<init>",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.String#valueOf",             elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#append",       elements[index++].getValue());
+        Assert.assertEquals("java.lang.StringBuilder#toString",     elements[index++].getValue());
+        Assert.assertEquals("org.apache.commons.beanutils.BeanUtils#setProperty",
+                            elements[index++].getValue());
+        Assert.assertEquals("java.io.ByteArrayInputStream#<init>",  elements[index++].getValue());
+        Assert.assertEquals("java.io.ByteArrayOutputStream#<init>", elements[index++].getValue());
+        Assert.assertEquals("java.io.InputStream#read",             elements[index++].getValue());
+        Assert.assertEquals("java.io.ByteArrayOutputStream#write",  elements[index++].getValue());
+        Assert.assertEquals("java.io.ByteArrayOutputStream#toByteArray",
+                            elements[index++].getValue());
+        Assert.assertEquals("java.io.ByteArrayOutputStream#close",  elements[index++].getValue());
+        Assert.assertEquals("javax.imageio.spi.ServiceRegistry#lookupProviders",
+                            elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#hasNext",           elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator#next",              elements[index++].getValue());
+        */
+    }
+
+    @Test
+    public void checkSmcBirthmark2() throws Exception{
+        ExtractionResultSet ers = stigmata.createEngine().extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/result/RoundRobinComparisonResultSet.class", },
+            context
+        );
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(array.length, 1);
+        Assert.assertNotNull(array[0].getBirthmark("smc"));
+
+        Birthmark birthmark = array[0].getBirthmark("smc");
+        Assert.assertEquals("smc", birthmark.getType());
+        Assert.assertEquals(18, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        for(int i = 0; i < elements.length; i++){
+            Assert.assertEquals(
+                "jp.sourceforge.stigmata.birthmarks.smc.MethodCallBirthmarkElement",
+                elements[i].getClass().getName()
+            );
+        }
+        /*
+        int index = 0;
+        // <init>(ExtractionResult, BirthmarkEnvironment, boolean)
+        Assert.assertEquals("java.lang.Object#<init>",      elements[index++].toString());
+
+        // getComparisonSources
+        Assert.assertEquals("java.util.ArrayArrays#<init>", elements[index++].toString());
+        Assert.assertEquals("java.util.Arrays#asList",      elements[index++].toString());
+
+        // setCompareSamePair
+        Assert.assertEquals("java.util.List#size",          elements[index++].toString());
+        Assert.assertEquals("java.util.List#size",          elements[index++].toString());
+        Assert.assertEquals("java.util.List#size",          elements[index++].toString());
+        Assert.assertEquals("java.util.List#size",          elements[index++].toString());
+
+        // getComparisonSources
+        Assert.assertEquals("java.util.HashMap#<init>",     elements[index++].toString());
+        Assert.assertEquals("java.util.List#iterator",      elements[index++].toString());
+        Assert.assertEquals("java.util.Iterator#hasNext",   elements[index++].toString());
+        Assert.assertEquals("java.util.Iterator#next",      elements[index++].toString());
+        Assert.assertEquals("java.util.Map#put",            elements[index++].toString());
+        Assert.assertEquals("java.util.List#iterator",      elements[index++].toString());
+        Assert.assertEquals("java.util.Iterator#hasNext",   elements[index++].toString());
+        Assert.assertEquals("java.util.Iterator#next",      elements[index++].toString());
+        Assert.assertEquals("java.util.Map#put",            elements[index++].toString());
+        Assert.assertEquals("java.util.Map#size",           elements[index++].toString());
+        Assert.assertEquals("java.util.Map#entrySet",       elements[index++].toString());
+        Assert.assertEquals("java.util.Set#iterator",       elements[index++].toString());
+        Assert.assertEquals("java.util.Iterator#hasNext",   elements[index++].toString());
+        Assert.assertEquals("java.util.Iterator#next",      elements[index++].toString());
+        Assert.assertEquals("java.util.Map$Entry#getValue", elements[index++].toString());
+        */
+    }
+}
@@ -1,98 +1,98 @@
-package jp.naist.se.stigmata.birthmarks.uc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import jp.naist.se.stigmata.Birthmark;\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.ExtractionResultSet;\r
-import jp.naist.se.stigmata.Stigmata;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-\r
-/**\r
- *\r
- * @author Haruaki TAMADA\r
- * @version $Revision$ $Date$\r
- */\r
-public class UCBirthmarkExtractorTest{\r
-    private Stigmata stigmata;\r
-    private BirthmarkContext context;\r
-\r
-    @Before\r
-    public void setup(){\r
-        stigmata = Stigmata.getInstance();\r
-        context = stigmata.createContext();\r
-        context.addBirthmarkType("uc");\r
-    }\r
-\r
-    @Test\r
-    public void checkUCBirthmark() throws Exception{\r
-        ExtractionResultSet ers = stigmata.createEngine().extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/Stigmata.class", },\r
-            context\r
-        );\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(1, array.length);\r
-        Assert.assertNotNull(array[0].getBirthmark("uc"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("uc");\r
-        Assert.assertEquals("uc", birthmark.getType());\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
-    }\r
-\r
-    @Test\r
-    public void checkUCBirthmark2() throws Exception{\r
-        ExtractionResultSet ers = stigmata.createEngine().extract(\r
-            new String[] { "target/classes/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.class", },\r
-            context\r
-        );\r
-        BirthmarkSet[] array = ers.getBirthmarkSets();\r
-\r
-        Assert.assertEquals(1, array.length);\r
-        Assert.assertNotNull(array[0].getBirthmark("uc"));\r
-\r
-        Birthmark birthmark = array[0].getBirthmark("uc");\r
-        Assert.assertEquals("uc", birthmark.getType());\r
-        Assert.assertEquals(9, birthmark.getElementCount());\r
-\r
-        BirthmarkElement[] elements = birthmark.getElements();\r
-        int index = 0;\r
-        Assert.assertEquals("java.lang.Object",     elements[index++].getValue());\r
-        Assert.assertEquals("java.lang.String",     elements[index++].getValue());\r
-        Assert.assertEquals("java.net.URL",         elements[index++].getValue());\r
-        Assert.assertEquals("java.util.ArrayList",  elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Collection", elements[index++].getValue());\r
-        Assert.assertEquals("java.util.HashMap",    elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Iterator",   elements[index++].getValue());\r
-        Assert.assertEquals("java.util.List",       elements[index++].getValue());\r
-        Assert.assertEquals("java.util.Map",        elements[index++].getValue());\r
-    }\r
-}\r
+package jp.sourceforge.stigmata.birthmarks.uc;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkSet;
+import jp.sourceforge.stigmata.ExtractionResultSet;
+import jp.sourceforge.stigmata.Stigmata;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$ $Date$
+ */
+public class UCBirthmarkExtractorTest{
+    private Stigmata stigmata;
+    private BirthmarkContext context;
+
+    @Before
+    public void setup(){
+        stigmata = Stigmata.getInstance();
+        context = stigmata.createContext();
+        context.addBirthmarkType("uc");
+    }
+
+    @Test
+    public void checkUCBirthmark() throws Exception{
+        ExtractionResultSet ers = stigmata.createEngine().extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/Stigmata.class", },
+            context
+        );
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(1, array.length);
+        Assert.assertNotNull(array[0].getBirthmark("uc"));
+
+        Birthmark birthmark = array[0].getBirthmark("uc");
+        Assert.assertEquals("uc", birthmark.getType());
+        Assert.assertEquals(18, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        int index = 0;
+        Assert.assertEquals("java.io.File",                      elements[index++].getValue());
+        Assert.assertEquals("java.io.FileFilter",                elements[index++].getValue());
+        Assert.assertEquals("java.io.FileInputStream",           elements[index++].getValue());
+        Assert.assertEquals("java.io.FileWriter",                elements[index++].getValue());
+        Assert.assertEquals("java.io.InputStream",               elements[index++].getValue());
+        Assert.assertEquals("java.io.PrintWriter",               elements[index++].getValue());
+        Assert.assertEquals("java.io.Writer",                    elements[index++].getValue());
+        Assert.assertEquals("java.lang.Class",                   elements[index++].getValue());
+        Assert.assertEquals("java.lang.ClassLoader",             elements[index++].getValue());
+        Assert.assertEquals("java.lang.Object",                  elements[index++].getValue());
+        Assert.assertEquals("java.lang.String",                  elements[index++].getValue());
+        Assert.assertEquals("java.lang.System",                  elements[index++].getValue());
+        Assert.assertEquals("java.net.URI",                      elements[index++].getValue());
+        Assert.assertEquals("java.net.URL",                      elements[index++].getValue());
+        Assert.assertEquals("java.net.URLClassLoader",           elements[index++].getValue());
+        Assert.assertEquals("java.util.ArrayList",               elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator",                elements[index++].getValue());
+        Assert.assertEquals("java.util.List",                    elements[index++].getValue());
+    }
+
+    @Test
+    public void checkUCBirthmark2() throws Exception{
+        ExtractionResultSet ers = stigmata.createEngine().extract(
+            new String[] { "target/classes/jp/sourceforge/stigmata/result/RoundRobinComparisonResultSet.class", },
+            context
+        );
+        BirthmarkSet[] array = ers.getBirthmarkSets();
+
+        Assert.assertEquals(1, array.length);
+        Assert.assertNotNull(array[0].getBirthmark("uc"));
+
+        Birthmark birthmark = array[0].getBirthmark("uc");
+        Assert.assertEquals("uc", birthmark.getType());
+        Assert.assertEquals(9, birthmark.getElementCount());
+
+        BirthmarkElement[] elements = birthmark.getElements();
+        int index = 0;
+        Assert.assertEquals("java.lang.Object",     elements[index++].getValue());
+        Assert.assertEquals("java.lang.String",     elements[index++].getValue());
+        Assert.assertEquals("java.net.URL",         elements[index++].getValue());
+        Assert.assertEquals("java.util.ArrayList",  elements[index++].getValue());
+        Assert.assertEquals("java.util.Collection", elements[index++].getValue());
+        Assert.assertEquals("java.util.HashMap",    elements[index++].getValue());
+        Assert.assertEquals("java.util.Iterator",   elements[index++].getValue());
+        Assert.assertEquals("java.util.List",       elements[index++].getValue());
+        Assert.assertEquals("java.util.Map",        elements[index++].getValue());
+    }
+}