From 21fa8f0b4880ccea34cde790a15b52901a60623a Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Fri, 14 Sep 2012 16:28:25 +0600 Subject: [PATCH] Remove sonar-squid-java-plugin It's not used anymore. --- .../sonar-squid-java-plugin/infinitest.args | 1 - plugins/sonar-squid-java-plugin/pom.xml | 135 -- .../java/org/sonar/java/PatternUtils.java | 40 - .../java/ast/CheckstyleAuditListener.java | 73 - .../sonar/java/ast/CheckstyleSquidBridge.java | 118 - .../ast/CheckstyleSquidBridgeContext.java | 87 - .../org/sonar/java/ast/JavaAstScanner.java | 185 -- .../org/sonar/java/ast/check/BreakCheck.java | 55 - .../ast/check/CommentedOutCodeLineCheck.java | 207 -- .../sonar/java/ast/check/ContinueCheck.java | 54 - .../java/ast/check/UndocumentedApiCheck.java | 81 - .../java/ast/visitor/AccessorVisitor.java | 168 -- .../visitor/AnonymousInnerClassVisitor.java | 71 - .../org/sonar/java/ast/visitor/AstUtils.java | 119 - .../java/ast/visitor/BlankLinesVisitor.java | 50 - .../sonar/java/ast/visitor/BranchVisitor.java | 62 - .../sonar/java/ast/visitor/ClassVisitor.java | 91 - .../java/ast/visitor/CommentVisitor.java | 67 - .../java/ast/visitor/ComplexityVisitor.java | 46 - .../java/ast/visitor/EndAtLineVisitor.java | 42 - .../java/ast/visitor/FileLinesVisitor.java | 70 - .../sonar/java/ast/visitor/FileVisitor.java | 64 - .../java/ast/visitor/JavaAstVisitor.java | 115 - .../java/ast/visitor/LinesOfCodeVisitor.java | 50 - .../sonar/java/ast/visitor/LinesVisitor.java | 50 - .../sonar/java/ast/visitor/MethodVisitor.java | 170 -- .../java/ast/visitor/PackageVisitor.java | 99 - .../java/ast/visitor/PublicApiVisitor.java | 101 - .../java/ast/visitor/StatementVisitor.java | 129 - .../SuppressWarningsAnnotationUtils.java | 80 - .../sonar/java/bytecode/BytecodeScanner.java | 108 - .../bytecode/BytecodeVisitorNotifier.java | 93 - .../java/bytecode/ClassLoaderBuilder.java | 73 - .../java/bytecode/VirtualMethodsLinker.java | 47 - .../java/bytecode/asm/AsmAccessFlags.java | 61 - .../org/sonar/java/bytecode/asm/AsmClass.java | 161 -- .../java/bytecode/asm/AsmClassProvider.java | 45 - .../bytecode/asm/AsmClassProviderImpl.java | 84 - .../java/bytecode/asm/AsmClassVisitor.java | 121 - .../org/sonar/java/bytecode/asm/AsmEdge.java | 80 - .../org/sonar/java/bytecode/asm/AsmField.java | 56 - .../sonar/java/bytecode/asm/AsmMethod.java | 224 -- .../java/bytecode/asm/AsmMethodVisitor.java | 146 -- .../sonar/java/bytecode/asm/AsmResource.java | 118 - .../sonar/java/bytecode/asm/AsmSignature.java | 42 - .../bytecode/asm/AsmSignatureVisitor.java | 137 -- .../org/sonar/java/bytecode/asm/AsmType.java | 61 - .../bytecode/check/ArchitectureCheck.java | 141 -- .../check/CallToDeprecatedMethodCheck.java | 51 - .../bytecode/check/SerializableContract.java | 47 - .../check/UnusedPrivateMethodCheck.java | 53 - .../check/UnusedProtectedMethodCheck.java | 54 - .../bytecode/loader/FileSystemLoader.java | 80 - .../sonar/java/bytecode/loader/JarLoader.java | 114 - .../sonar/java/bytecode/loader/Loader.java | 55 - .../bytecode/loader/SquidClassLoader.java | 110 - .../bytecode/visitor/BytecodeVisitor.java | 76 - .../java/bytecode/visitor/DITVisitor.java | 47 - .../bytecode/visitor/DependenciesVisitor.java | 105 - .../java/bytecode/visitor/LCOM4Visitor.java | 148 -- .../java/bytecode/visitor/NOCVisitor.java | 35 - .../java/bytecode/visitor/RFCVisitor.java | 68 - .../sonar/java/recognizer/JavaFootprint.java | 44 - .../org/sonar/java/signature/JvmJavaType.java | 31 - .../sonar/java/signature/MethodSignature.java | 52 - .../signature/MethodSignaturePrinter.java | 38 - .../signature/MethodSignatureScanner.java | 47 - .../org/sonar/java/signature/Parameter.java | 80 - .../signature/ParameterSignaturePrinter.java | 41 - .../signature/ParameterSignatureScanner.java | 113 - .../java/squid/JavaSquidConfiguration.java | 80 - .../org/sonar/java/squid/SquidScanner.java | 67 - .../java/squid/SquidVisitorNotifier.java | 67 - .../squid/check/ClassComplexityCheck.java | 55 - .../check/CycleBetweenPackagesCheck.java | 52 - .../org/sonar/java/squid/check/DITCheck.java | 53 - .../java/squid/check/EmptyFileCheck.java | 41 - .../squid/check/MethodComplexityCheck.java | 55 - .../sonar/java/squid/check/NoSonarCheck.java | 41 - .../sonar/java/squid/check/SquidCheck.java | 38 - .../java/squid/visitor/SquidVisitor.java | 35 - .../plugins/squid/JavaSourceImporter.java | 111 - .../sonar/plugins/squid/SonarAccessor.java | 53 - .../sonar/plugins/squid/SonarWayProfile.java | 39 - .../squid/SonarWayWithFindbugsProfile.java | 40 - .../sonar/plugins/squid/SquidConstants.java | 32 - .../sonar/plugins/squid/SquidExecutor.java | 227 -- .../org/sonar/plugins/squid/SquidPlugin.java | 81 - .../plugins/squid/SquidPluginProperties.java | 33 - .../plugins/squid/SquidRuleRepository.java | 66 - .../org/sonar/plugins/squid/SquidSensor.java | 113 - .../sonar/plugins/squid/bridges/Bridge.java | 85 - .../plugins/squid/bridges/BridgeFactory.java | 67 - .../plugins/squid/bridges/ChecksBridge.java | 51 - .../squid/bridges/ChidamberKemererBridge.java | 47 - .../bridges/CopyBasicMeasuresBridge.java | 68 - .../squid/bridges/DependencyIndex.java | 29 - .../plugins/squid/bridges/DesignBridge.java | 208 -- .../plugins/squid/bridges/DsmSerializer.java | 96 - .../squid/bridges/Lcom4BlocksBridge.java | 142 -- .../squid/bridges/NoSonarFilterLoader.java | 81 - .../plugins/squid/bridges/PackagesBridge.java | 44 - .../bridges/PublicUndocumentedApiBridge.java | 57 - .../plugins/squid/bridges/ResourceIndex.java | 114 - .../squid/bridges/RobertCMartinBridge.java | 45 - .../squid/bridges/SquidBrigeException.java | 28 - .../ChidamberKemererDistributionBuilder.java | 98 - .../squid/decorators/ClassesDecorator.java | 45 - .../FileComplexityDistributionDecorator.java | 68 - ...FunctionComplexityDistributionBuilder.java | 75 - .../squid/decorators/FunctionsDecorator.java | 54 - .../resources/checkstyle-configuration.xml | 11 - .../java/org/sonar/java/CheckMessages.java | 97 - .../java/org/sonar/java/PatternUtilsTest.java | 51 - .../sonar/java/ast/JavaAstScannerTest.java | 188 -- .../org/sonar/java/ast/SquidTestUtils.java | 45 - .../sonar/java/ast/check/BreakCheckTest.java | 65 - .../check/CommentedOutCodeLineCheckTest.java | 69 - .../java/ast/check/ContinueCheckTest.java | 51 - .../ast/check/UndocumentedApiCheckTest.java | 62 - .../java/ast/visitor/AccessorVisitorTest.java | 72 - .../AnonymousInnerClassVisitorTest.java | 47 - .../ast/visitor/BlankLinesVisitorTest.java | 65 - .../java/ast/visitor/BrancheVisitorTest.java | 62 - .../java/ast/visitor/ClassVisitorTest.java | 149 -- .../java/ast/visitor/CommentVisitorTest.java | 121 - .../ast/visitor/ComplexityVisitorTest.java | 64 - .../ast/visitor/EndAtLineVisitorTest.java | 45 - .../ast/visitor/FileLinesVisitorTest.java | 72 - .../java/ast/visitor/FileVisitorTest.java | 86 - .../ast/visitor/HeaderCommentVisitorTest.java | 89 - .../ast/visitor/LinesOfCodeVisitorTest.java | 78 - .../java/ast/visitor/LinesVisitorTest.java | 61 - .../java/ast/visitor/MethodVisitorTest.java | 114 - .../java/ast/visitor/PackageVisitorTest.java | 65 - .../ast/visitor/PublicApiVisitorTest.java | 126 - .../ast/visitor/StatementVisitorTest.java | 50 - .../java/bytecode/BytecodeVisitorsTest.java | 228 -- .../bytecode/VirtualMethodsLinkerTest.java | 48 - .../asm/AsmClassProviderImplTest.java | 91 - .../bytecode/asm/AsmClassProviderTest.java | 36 - .../sonar/java/bytecode/asm/AsmClassTest.java | 53 - .../bytecode/asm/AsmClassVisitorTest.java | 111 - .../sonar/java/bytecode/asm/AsmFieldTest.java | 44 - .../bytecode/asm/AsmFieldVisitorTest.java | 40 - .../java/bytecode/asm/AsmMethodTest.java | 108 - .../bytecode/asm/AsmMethodVisitorTest.java | 73 - .../java/bytecode/asm/AsmSignatureTest.java | 49 - .../bytecode/asm/AsmSignatureVisitorTest.java | 85 - .../sonar/java/bytecode/asm/AsmTypeTest.java | 76 - .../bytecode/check/ArchitectureCheckTest.java | 81 - .../CallToDeprecatedMethodCheckTest.java | 50 - .../check/SerializableContractTest.java | 37 - .../check/UnusedPrivateMethodCheckTest.java | 64 - .../check/UnusedProtectedMethodCheckTest.java | 56 - .../bytecode/loader/FileSystemLoaderTest.java | 91 - .../java/bytecode/loader/JarLoaderTest.java | 102 - .../bytecode/loader/SquidClassLoaderTest.java | 127 - .../bytecode/visitor/LCOM4VisitorTest.java | 73 - .../java/recognizer/JavaFootprintTest.java | 67 - .../signature/MethodSignaturePrinterTest.java | 50 - .../signature/MethodSignatureScannerTest.java | 68 - .../ParameterSignaturePrinterTest.java | 49 - .../ParameterSignatureScannerTest.java | 140 -- .../sonar/java/signature/ParameterTest.java | 46 - .../squid/check/ClassComplexityCheckTest.java | 64 - .../sonar/java/squid/check/DITCheckTest.java | 62 - .../java/squid/check/EmptyFileCheckTest.java | 60 - .../check/MethodComplexityCheckTest.java | 55 - .../java/squid/check/NoSonarCheckTest.java | 63 - .../plugins/squid/JavaSourceImporterTest.java | 104 - .../plugins/squid/SonarWayProfileTest.java | 69 - .../plugins/squid/SquidExecutorTest.java | 123 - .../sonar/plugins/squid/SquidPluginTest.java | 31 - .../sonar/plugins/squid/SquidSensorTest.java | 67 - .../sonar/plugins/squid/SquidTestUtils.java | 57 - .../squid/bridges/BridgeFactoryTest.java | 62 - .../plugins/squid/bridges/BridgeTestCase.java | 71 - .../squid/bridges/ChecksBridgeTest.java | 34 - .../bridges/ChidamberKemererBridgeTest.java | 76 - .../bridges/CopyBasicMeasuresBridgeTest.java | 42 - .../squid/bridges/DesignBridgeTest.java | 86 - .../squid/bridges/DsmSerializerTest.java | 84 - .../squid/bridges/Lcom4BlocksBridgeTest.java | 97 - .../PublicUndocumentedApiBridgeTest.java | 36 - .../bridges/RobertCMartinBridgeTest.java | 48 - ...leComplexityDistributionDecoratorTest.java | 87 - ...tionComplexityDistributionBuilderTest.java | 55 - .../test/java/org/sonar/squid/SquidTest.java | 46 - .../org/sonar/squid/SquidUserGuideTest.java | 178 -- .../src/test/resources/logback-test.xml | 19 - .../squid/bridges/DsmSerializerTest/dsm.json | 1 - .../Lcom4BlocksBridgeTest/serialize.json | 1 - .../resources/struts-core-1.3.9-sources.jar | Bin 511448 -> 0 bytes .../src/test/resources/struts-core-1.3.9.jar | Bin 329088 -> 0 bytes .../test-resources/README.txt | 2 - .../bin/ArchitectureCheckDateForbidden.class | Bin 648 -> 0 bytes .../ArchitectureCheckOneErrorMessage.class | Bin 444 -> 0 bytes .../bin/ArchitectureCheckToSqlFromUI.class | Bin 526 -> 0 bytes .../bytecode/architecture/pom.xml | 23 - .../src/ArchitectureCheckDateForbidden.java | 11 - .../src/ArchitectureCheckOneErrorMessage.java | 8 - .../src/ArchitectureCheckToSqlFromUI.java | 7 - .../bin/properties/EmptyMethodProperty.class | Bin 503 -> 0 bytes .../properties/InheritedMethodsProperty.class | Bin 617 -> 0 bytes .../bytecode/bin/properties/JavaBean.class | Bin 3781 -> 0 bytes .../properties/MethodBodyLoadedProperty.class | Bin 434 -> 0 bytes .../properties/ResourceTouchedProperty.class | Bin 798 -> 0 bytes .../bytecode/bin/tags/Comment.class | Bin 100 -> 0 bytes .../bytecode/bin/tags/Content.class | Bin 256 -> 0 bytes .../bytecode/bin/tags/File.class | Bin 1185 -> 0 bytes .../bytecode/bin/tags/Language.class | Bin 259 -> 0 bytes .../bytecode/bin/tags/Line.class | Bin 247 -> 0 bytes .../bytecode/bin/tags/SourceFile.class | Bin 895 -> 0 bytes .../bytecode/bin/tags/Tag.class | Bin 255 -> 0 bytes .../bytecode/bin/tags/TagException.class | Bin 389 -> 0 bytes .../bytecode/bin/tags/TagName.class | Bin 516 -> 0 bytes .../bytecode/bin/tags/impl/FixMe$1.class | Bin 821 -> 0 bytes .../bytecode/bin/tags/impl/FixMe.class | Bin 1287 -> 0 bytes .../bytecode/bin/tags/impl/Todo.class | Bin 1573 -> 0 bytes .../bin/CallToDeprecatedMethod.class | Bin 467 -> 0 bytes .../bytecode/callToDeprecatedMethod/pom.xml | 23 - .../src/CallToDeprecatedMethod.java | 8 - ...sionOfFieldNamesFromLcom4Calculation.class | Bin 1182 -> 0 bytes .../bin/LCOM4AccessorMethodAndField.class | Bin 638 -> 0 bytes .../bytecode/lcom4/bin/LCOM4Exclusions.class | Bin 859 -> 0 bytes .../lcom4/bin/LCOM4WithIsolatedMethods.class | Bin 573 -> 0 bytes .../bytecode/lcom4/bin/LCOM4WithWorkers.class | Bin 991 -> 0 bytes .../test-resources/bytecode/lcom4/pom.xml | 23 - ...usionOfFieldNamesFromLcom4Calculation.java | 32 - .../src/LCOM4AccessorMethodAndField.java | 19 - .../bytecode/lcom4/src/LCOM4Exclusions.java | 27 - .../lcom4/src/LCOM4WithIsolatedMethods.java | 11 - .../bytecode/lcom4/src/LCOM4WithWorkers.java | 27 - .../test-resources/bytecode/lib/hello.jar | Bin 2150 -> 0 bytes .../test-resources/bytecode/pom.xml | 24 - .../src/properties/EmptyMethodProperty.java | 13 - .../properties/InheritedMethodsProperty.java | 15 - .../bytecode/src/properties/JavaBean.java | 136 -- .../properties/MethodBodyLoadedProperty.java | 8 - .../properties/ResourceTouchedProperty.java | 22 - .../bytecode/src/tags/Comment.java | 5 - .../bytecode/src/tags/Content.java | 6 - .../bytecode/src/tags/File.java | 26 - .../bytecode/src/tags/Language.java | 5 - .../bytecode/src/tags/Line.java | 5 - .../bytecode/src/tags/SourceFile.java | 22 - .../test-resources/bytecode/src/tags/Tag.java | 11 - .../bytecode/src/tags/TagException.java | 9 - .../bytecode/src/tags/TagName.java | 18 - .../bytecode/src/tags/impl/FixMe.java | 37 - .../bytecode/src/tags/impl/Todo.java | 44 - .../bin/UnusedGenericPrivateMethod.class | Bin 673 -> 0 bytes .../bin/UnusedPrivateConstructor.class | Bin 460 -> 0 bytes .../bin/UnusedPrivateMethod.class | Bin 1329 -> 0 bytes .../bytecode/unusedPrivateMethod/pom.xml | 23 - .../src/UnusedGenericPrivateMethod.java | 9 - .../src/UnusedPrivateConstructor.java | 14 - .../src/UnusedPrivateMethod.java | 36 - .../unusedProtectedMethod/bin/Job.class | Bin 272 -> 0 bytes .../bin/UnusedProtectedMethod.class | Bin 1039 -> 0 bytes ...usedProtectedMethodFromAbstractClass.class | Bin 632 -> 0 bytes .../bytecode/unusedProtectedMethod/pom.xml | 23 - .../unusedProtectedMethod/src/Job.java | 8 - .../src/UnusedProtectedMethod.java | 40 - ...nusedProtectedMethodFromAbstractClass.java | 12 - .../virtualMethodsLinker/bin/Animal.class | Bin 306 -> 0 bytes .../virtualMethodsLinker/bin/Dog.class | Bin 381 -> 0 bytes .../bytecode/virtualMethodsLinker/pom.xml | 23 - .../virtualMethodsLinker/src/Animal.java | 7 - .../virtualMethodsLinker/src/Dog.java | 9 - .../commons/collections/ArrayStack.class | Bin 1919 -> 0 bytes .../org/apache/commons/collections/Bag.class | Bin 480 -> 0 bytes .../apache/commons/collections/BagUtils.class | Bin 3210 -> 0 bytes .../commons/collections/BeanMap$1.class | Bin 681 -> 0 bytes .../commons/collections/BeanMap$10.class | Bin 1139 -> 0 bytes .../commons/collections/BeanMap$11.class | Bin 1343 -> 0 bytes .../commons/collections/BeanMap$2.class | Bin 694 -> 0 bytes .../commons/collections/BeanMap$3.class | Bin 675 -> 0 bytes .../commons/collections/BeanMap$4.class | Bin 677 -> 0 bytes .../commons/collections/BeanMap$5.class | Bin 681 -> 0 bytes .../commons/collections/BeanMap$6.class | Bin 675 -> 0 bytes .../commons/collections/BeanMap$7.class | Bin 677 -> 0 bytes .../commons/collections/BeanMap$8.class | Bin 679 -> 0 bytes .../commons/collections/BeanMap$9.class | Bin 860 -> 0 bytes .../collections/BeanMap$MyMapEntry.class | Bin 1101 -> 0 bytes .../apache/commons/collections/BeanMap.class | Bin 11240 -> 0 bytes .../apache/commons/collections/BidiMap.class | Bin 470 -> 0 bytes .../commons/collections/BinaryHeap$1.class | Bin 1745 -> 0 bytes .../commons/collections/BinaryHeap.class | Bin 5712 -> 0 bytes .../collections/BoundedCollection.class | Bin 221 -> 0 bytes .../collections/BoundedFifoBuffer$1.class | Bin 1970 -> 0 bytes .../collections/BoundedFifoBuffer.class | Bin 4449 -> 0 bytes .../commons/collections/BoundedMap.class | Bin 200 -> 0 bytes .../apache/commons/collections/Buffer.class | Bin 206 -> 0 bytes .../collections/BufferOverflowException.class | Bin 835 -> 0 bytes .../BufferUnderflowException.class | Bin 844 -> 0 bytes .../commons/collections/BufferUtils.class | Bin 2864 -> 0 bytes .../apache/commons/collections/Closure.class | Bin 168 -> 0 bytes .../commons/collections/ClosureUtils.class | Bin 5727 -> 0 bytes .../commons/collections/CollectionUtils.class | Bin 14452 -> 0 bytes .../commons/collections/ComparatorUtils.class | Bin 3457 -> 0 bytes .../CursorableLinkedList$Cursor.class | Bin 2972 -> 0 bytes .../CursorableLinkedList$ListIter.class | Bin 3800 -> 0 bytes .../CursorableLinkedList$Listable.class | Bin 1522 -> 0 bytes .../collections/CursorableLinkedList.class | Bin 12211 -> 0 bytes .../collections/CursorableSubList.class | Bin 6333 -> 0 bytes .../DefaultMapBag$BagIterator.class | Bin 1422 -> 0 bytes .../commons/collections/DefaultMapBag.class | Bin 6578 -> 0 bytes .../commons/collections/DefaultMapEntry.class | Bin 2001 -> 0 bytes .../collections/DoubleOrderedMap$1$1.class | Bin 1203 -> 0 bytes .../collections/DoubleOrderedMap$1.class | Bin 2390 -> 0 bytes .../collections/DoubleOrderedMap$2$1.class | Bin 1312 -> 0 bytes .../collections/DoubleOrderedMap$2.class | Bin 1620 -> 0 bytes .../collections/DoubleOrderedMap$3$1.class | Bin 1312 -> 0 bytes .../collections/DoubleOrderedMap$3.class | Bin 2034 -> 0 bytes .../collections/DoubleOrderedMap$4$1.class | Bin 1313 -> 0 bytes .../collections/DoubleOrderedMap$4.class | Bin 1621 -> 0 bytes .../collections/DoubleOrderedMap$5$1.class | Bin 1313 -> 0 bytes .../collections/DoubleOrderedMap$5.class | Bin 2035 -> 0 bytes .../collections/DoubleOrderedMap$6$1.class | Bin 1204 -> 0 bytes .../collections/DoubleOrderedMap$6.class | Bin 2393 -> 0 bytes ...eOrderedMap$DoubleOrderedMapIterator.class | Bin 2324 -> 0 bytes .../collections/DoubleOrderedMap$Node.class | Bin 5154 -> 0 bytes .../collections/DoubleOrderedMap.class | Bin 14235 -> 0 bytes .../collections/EnumerationUtils.class | Bin 706 -> 0 bytes .../ExtendedProperties$PropertiesReader.class | Bin 1249 -> 0 bytes ...tendedProperties$PropertiesTokenizer.class | Bin 1321 -> 0 bytes .../collections/ExtendedProperties.class | Bin 19188 -> 0 bytes .../apache/commons/collections/Factory.class | Bin 166 -> 0 bytes .../commons/collections/FactoryUtils.class | Bin 1573 -> 0 bytes .../collections/FastArrayList$ListIter.class | Bin 2488 -> 0 bytes .../FastArrayList$SubList$SubListIter.class | Bin 3051 -> 0 bytes .../collections/FastArrayList$SubList.class | Bin 7672 -> 0 bytes .../commons/collections/FastArrayList.class | Bin 8145 -> 0 bytes .../commons/collections/FastHashMap$1.class | Bin 236 -> 0 bytes ...ollectionView$CollectionViewIterator.class | Bin 2134 -> 0 bytes .../FastHashMap$CollectionView.class | Bin 4307 -> 0 bytes .../collections/FastHashMap$EntrySet.class | Bin 1371 -> 0 bytes .../collections/FastHashMap$KeySet.class | Bin 1410 -> 0 bytes .../collections/FastHashMap$Values.class | Bin 1398 -> 0 bytes .../commons/collections/FastHashMap.class | Bin 5263 -> 0 bytes .../commons/collections/FastTreeMap$1.class | Bin 236 -> 0 bytes ...ollectionView$CollectionViewIterator.class | Bin 2134 -> 0 bytes .../FastTreeMap$CollectionView.class | Bin 4307 -> 0 bytes .../collections/FastTreeMap$EntrySet.class | Bin 1371 -> 0 bytes .../collections/FastTreeMap$KeySet.class | Bin 1410 -> 0 bytes .../collections/FastTreeMap$Values.class | Bin 1398 -> 0 bytes .../commons/collections/FastTreeMap.class | Bin 6391 -> 0 bytes .../collections/FunctorException.class | Bin 2501 -> 0 bytes .../apache/commons/collections/HashBag.class | Bin 659 -> 0 bytes .../commons/collections/IterableMap.class | Bin 226 -> 0 bytes .../commons/collections/IteratorUtils.class | Bin 13371 -> 0 bytes .../apache/commons/collections/KeyValue.class | Bin 187 -> 0 bytes .../apache/commons/collections/LRUMap.class | Bin 2677 -> 0 bytes .../commons/collections/ListUtils.class | Bin 4405 -> 0 bytes .../commons/collections/MapIterator.class | Bin 341 -> 0 bytes .../apache/commons/collections/MapUtils.class | Bin 18066 -> 0 bytes .../commons/collections/MultiHashMap$1.class | Bin 239 -> 0 bytes .../MultiHashMap$ValueIterator.class | Bin 1730 -> 0 bytes .../collections/MultiHashMap$Values.class | Bin 1477 -> 0 bytes .../commons/collections/MultiHashMap.class | Bin 5830 -> 0 bytes .../apache/commons/collections/MultiMap.class | Bin 415 -> 0 bytes .../commons/collections/OrderedBidiMap.class | Bin 389 -> 0 bytes .../commons/collections/OrderedIterator.class | Bin 238 -> 0 bytes .../commons/collections/OrderedMap.class | Bin 408 -> 0 bytes .../collections/OrderedMapIterator.class | Bin 322 -> 0 bytes .../commons/collections/Predicate.class | Bin 173 -> 0 bytes .../commons/collections/PredicateUtils.class | Bin 5677 -> 0 bytes .../commons/collections/PriorityQueue.class | Bin 296 -> 0 bytes .../apache/commons/collections/ProxyMap.class | Bin 1953 -> 0 bytes .../commons/collections/ReferenceMap$1.class | Bin 2483 -> 0 bytes .../commons/collections/ReferenceMap$2.class | Bin 2021 -> 0 bytes .../commons/collections/ReferenceMap$3.class | Bin 1734 -> 0 bytes .../collections/ReferenceMap$Entry.class | Bin 2766 -> 0 bytes .../ReferenceMap$EntryIterator.class | Bin 2493 -> 0 bytes .../ReferenceMap$KeyIterator.class | Bin 1225 -> 0 bytes .../collections/ReferenceMap$SoftRef.class | Bin 757 -> 0 bytes .../ReferenceMap$ValueIterator.class | Bin 1233 -> 0 bytes .../collections/ReferenceMap$WeakRef.class | Bin 757 -> 0 bytes .../commons/collections/ReferenceMap.class | Bin 9118 -> 0 bytes .../collections/ResettableIterator.class | Bin 196 -> 0 bytes .../collections/ResettableListIterator.class | Bin 265 -> 0 bytes .../collections/SequencedHashMap$1.class | Bin 1671 -> 0 bytes .../collections/SequencedHashMap$2.class | Bin 2093 -> 0 bytes .../collections/SequencedHashMap$3.class | Bin 2273 -> 0 bytes .../collections/SequencedHashMap$Entry.class | Bin 1843 -> 0 bytes .../SequencedHashMap$OrderedIterator.class | Bin 2340 -> 0 bytes .../collections/SequencedHashMap.class | Bin 9003 -> 0 bytes .../apache/commons/collections/SetUtils.class | Bin 3750 -> 0 bytes .../commons/collections/SortedBag.class | Bin 274 -> 0 bytes .../commons/collections/SortedBidiMap.class | Bin 370 -> 0 bytes .../collections/StaticBucketMap$1.class | Bin 248 -> 0 bytes .../StaticBucketMap$EntryIterator.class | Bin 2573 -> 0 bytes .../StaticBucketMap$EntrySet.class | Bin 2693 -> 0 bytes .../StaticBucketMap$KeyIterator.class | Bin 1225 -> 0 bytes .../collections/StaticBucketMap$KeySet.class | Bin 2453 -> 0 bytes .../collections/StaticBucketMap$Lock.class | Bin 724 -> 0 bytes .../collections/StaticBucketMap$Node.class | Bin 1644 -> 0 bytes .../StaticBucketMap$ValueIterator.class | Bin 1233 -> 0 bytes .../collections/StaticBucketMap$Values.class | Bin 1313 -> 0 bytes .../commons/collections/StaticBucketMap.class | Bin 6457 -> 0 bytes .../SynchronizedPriorityQueue.class | Bin 1311 -> 0 bytes .../commons/collections/Transformer.class | Bin 195 -> 0 bytes .../collections/TransformerUtils.class | Bin 6276 -> 0 bytes .../apache/commons/collections/TreeBag.class | Bin 1211 -> 0 bytes .../collections/UnboundedFifoBuffer$1.class | Bin 1556 -> 0 bytes .../collections/UnboundedFifoBuffer.class | Bin 2741 -> 0 bytes .../commons/collections/Unmodifiable.class | Bin 136 -> 0 bytes .../bag/AbstractBagDecorator.class | Bin 1340 -> 0 bytes .../bag/AbstractMapBag$BagIterator.class | Bin 2130 -> 0 bytes .../bag/AbstractMapBag$MutableInteger.class | Bin 771 -> 0 bytes .../collections/bag/AbstractMapBag.class | Bin 7864 -> 0 bytes .../bag/AbstractSortedBagDecorator.class | Bin 1186 -> 0 bytes .../commons/collections/bag/HashBag.class | Bin 1407 -> 0 bytes .../collections/bag/PredicatedBag.class | Bin 1717 -> 0 bytes .../collections/bag/PredicatedSortedBag.class | Bin 1521 -> 0 bytes .../SynchronizedBag$SynchronizedBagSet.class | Bin 831 -> 0 bytes .../collections/bag/SynchronizedBag.class | Bin 2117 -> 0 bytes .../bag/SynchronizedSortedBag.class | Bin 1667 -> 0 bytes .../collections/bag/TransformedBag.class | Bin 1948 -> 0 bytes .../bag/TransformedSortedBag.class | Bin 1530 -> 0 bytes .../commons/collections/bag/TreeBag.class | Bin 2076 -> 0 bytes .../commons/collections/bag/TypedBag.class | Bin 880 -> 0 bytes .../collections/bag/TypedSortedBag.class | Bin 928 -> 0 bytes .../collections/bag/UnmodifiableBag.class | Bin 2986 -> 0 bytes .../bag/UnmodifiableSortedBag.class | Bin 3034 -> 0 bytes .../bidimap/AbstractBidiMapDecorator.class | Bin 1244 -> 0 bytes .../AbstractDualBidiMap$BidiMapIterator.class | Bin 3175 -> 0 bytes .../AbstractDualBidiMap$EntrySet.class | Bin 1708 -> 0 bytes ...AbstractDualBidiMap$EntrySetIterator.class | Bin 1753 -> 0 bytes .../bidimap/AbstractDualBidiMap$KeySet.class | Bin 1485 -> 0 bytes .../AbstractDualBidiMap$KeySetIterator.class | Bin 1486 -> 0 bytes .../AbstractDualBidiMap$MapEntry.class | Bin 1507 -> 0 bytes .../bidimap/AbstractDualBidiMap$Values.class | Bin 1492 -> 0 bytes .../AbstractDualBidiMap$ValuesIterator.class | Bin 1434 -> 0 bytes .../bidimap/AbstractDualBidiMap$View.class | Bin 1624 -> 0 bytes .../bidimap/AbstractDualBidiMap.class | Bin 5672 -> 0 bytes .../AbstractOrderedBidiMapDecorator.class | Bin 1549 -> 0 bytes .../AbstractSortedBidiMapDecorator.class | Bin 1501 -> 0 bytes .../collections/bidimap/DualHashBidiMap.class | Bin 1972 -> 0 bytes ...alTreeBidiMap$BidiOrderedMapIterator.class | Bin 3337 -> 0 bytes .../bidimap/DualTreeBidiMap$ViewMap.class | Bin 2096 -> 0 bytes .../collections/bidimap/DualTreeBidiMap.class | Bin 4848 -> 0 bytes .../bidimap/TreeBidiMap$EntryView.class | Bin 2028 -> 0 bytes .../bidimap/TreeBidiMap$Inverse.class | Bin 6127 -> 0 bytes .../bidimap/TreeBidiMap$Node.class | Bin 5157 -> 0 bytes .../bidimap/TreeBidiMap$View.class | Bin 1793 -> 0 bytes .../bidimap/TreeBidiMap$ViewIterator.class | Bin 3119 -> 0 bytes .../bidimap/TreeBidiMap$ViewMapIterator.class | Bin 1857 -> 0 bytes .../collections/bidimap/TreeBidiMap.class | Bin 19375 -> 0 bytes .../bidimap/UnmodifiableBidiMap.class | Bin 2764 -> 0 bytes .../bidimap/UnmodifiableOrderedBidiMap.class | Bin 3147 -> 0 bytes .../bidimap/UnmodifiableSortedBidiMap.class | Bin 3902 -> 0 bytes .../buffer/AbstractBufferDecorator.class | Bin 1055 -> 0 bytes .../collections/buffer/BlockingBuffer.class | Bin 3800 -> 0 bytes .../BoundedBuffer$NotifyingIterator.class | Bin 1150 -> 0 bytes .../collections/buffer/BoundedBuffer.class | Bin 4068 -> 0 bytes .../buffer/BoundedFifoBuffer$1.class | Bin 2221 -> 0 bytes .../buffer/BoundedFifoBuffer.class | Bin 5509 -> 0 bytes .../buffer/CircularFifoBuffer.class | Bin 934 -> 0 bytes .../collections/buffer/PredicatedBuffer.class | Bin 1384 -> 0 bytes .../collections/buffer/PriorityBuffer$1.class | Bin 1761 -> 0 bytes .../collections/buffer/PriorityBuffer.class | Bin 5143 -> 0 bytes .../buffer/SynchronizedBuffer.class | Bin 1502 -> 0 bytes .../buffer/TransformedBuffer.class | Bin 1393 -> 0 bytes .../collections/buffer/TypedBuffer.class | Bin 916 -> 0 bytes .../buffer/UnboundedFifoBuffer$1.class | Bin 1592 -> 0 bytes .../buffer/UnboundedFifoBuffer.class | Bin 3659 -> 0 bytes .../buffer/UnmodifiableBuffer.class | Bin 2529 -> 0 bytes .../AbstractCollectionDecorator.class | Bin 2539 -> 0 bytes ...tractSerializableCollectionDecorator.class | Bin 1327 -> 0 bytes ...ompositeCollection$CollectionMutator.class | Bin 569 -> 0 bytes .../collection/CompositeCollection.class | Bin 5693 -> 0 bytes .../collection/PredicatedCollection.class | Bin 2171 -> 0 bytes .../collection/SynchronizedCollection.class | Bin 3370 -> 0 bytes .../collection/TransformedCollection.class | Bin 2116 -> 0 bytes .../collection/TypedCollection.class | Bin 874 -> 0 bytes .../UnmodifiableBoundedCollection.class | Bin 2741 -> 0 bytes .../collection/UnmodifiableCollection.class | Bin 1720 -> 0 bytes .../comparators/BooleanComparator.class | Bin 1992 -> 0 bytes .../comparators/ComparableComparator.class | Bin 1289 -> 0 bytes .../comparators/ComparatorChain.class | Bin 4046 -> 0 bytes .../comparators/FixedOrderComparator.class | Bin 3640 -> 0 bytes .../comparators/NullComparator.class | Bin 1792 -> 0 bytes .../comparators/ReverseComparator.class | Bin 1441 -> 0 bytes .../comparators/TransformingComparator.class | Bin 1236 -> 0 bytes .../collections/functors/AllPredicate.class | Bin 1890 -> 0 bytes .../collections/functors/AndPredicate.class | Bin 1489 -> 0 bytes .../collections/functors/AnyPredicate.class | Bin 1885 -> 0 bytes .../collections/functors/ChainedClosure.class | Bin 2417 -> 0 bytes .../functors/ChainedTransformer.class | Bin 2535 -> 0 bytes .../functors/CloneTransformer.class | Bin 1138 -> 0 bytes .../functors/ClosureTransformer.class | Bin 1327 -> 0 bytes .../functors/ConstantFactory.class | Bin 1079 -> 0 bytes .../functors/ConstantTransformer.class | Bin 1165 -> 0 bytes .../collections/functors/EqualPredicate.class | Bin 1110 -> 0 bytes .../functors/ExceptionClosure.class | Bin 989 -> 0 bytes .../functors/ExceptionFactory.class | Bin 948 -> 0 bytes .../functors/ExceptionPredicate.class | Bin 1005 -> 0 bytes .../functors/ExceptionTransformer.class | Bin 1036 -> 0 bytes .../functors/FactoryTransformer.class | Bin 1319 -> 0 bytes .../collections/functors/FalsePredicate.class | Bin 866 -> 0 bytes .../collections/functors/ForClosure.class | Bin 1370 -> 0 bytes .../collections/functors/FunctorUtils.class | Bin 3015 -> 0 bytes .../functors/IdentityPredicate.class | Bin 1105 -> 0 bytes .../collections/functors/IfClosure.class | Bin 2425 -> 0 bytes .../functors/InstanceofPredicate.class | Bin 1178 -> 0 bytes .../functors/InstantiateFactory.class | Bin 2820 -> 0 bytes .../functors/InstantiateTransformer.class | Bin 3018 -> 0 bytes .../functors/InvokerTransformer.class | Bin 3081 -> 0 bytes .../collections/functors/MapTransformer.class | Bin 1173 -> 0 bytes .../collections/functors/NOPClosure.class | Bin 845 -> 0 bytes .../collections/functors/NOPTransformer.class | Bin 889 -> 0 bytes .../collections/functors/NonePredicate.class | Bin 1857 -> 0 bytes .../functors/NotNullPredicate.class | Bin 880 -> 0 bytes .../collections/functors/NotPredicate.class | Bin 1304 -> 0 bytes .../functors/NullIsExceptionPredicate.class | Bin 1447 -> 0 bytes .../functors/NullIsFalsePredicate.class | Bin 1334 -> 0 bytes .../functors/NullIsTruePredicate.class | Bin 1331 -> 0 bytes .../collections/functors/NullPredicate.class | Bin 871 -> 0 bytes .../collections/functors/OnePredicate.class | Bin 1898 -> 0 bytes .../collections/functors/OrPredicate.class | Bin 1486 -> 0 bytes .../functors/PredicateDecorator.class | Bin 277 -> 0 bytes .../functors/PredicateTransformer.class | Bin 1439 -> 0 bytes .../functors/PrototypeFactory$1.class | Bin 269 -> 0 bytes ...ototypeFactory$PrototypeCloneFactory.class | Bin 2556 -> 0 bytes ...actory$PrototypeSerializationFactory.class | Bin 2387 -> 0 bytes .../functors/PrototypeFactory.class | Bin 2106 -> 0 bytes .../functors/StringValueTransformer.class | Bin 999 -> 0 bytes .../collections/functors/SwitchClosure.class | Bin 3602 -> 0 bytes .../functors/SwitchTransformer.class | Bin 3686 -> 0 bytes .../functors/TransformedPredicate.class | Bin 1884 -> 0 bytes .../functors/TransformerClosure.class | Bin 1361 -> 0 bytes .../functors/TransformerPredicate.class | Bin 1880 -> 0 bytes .../collections/functors/TruePredicate.class | Bin 863 -> 0 bytes .../functors/UniquePredicate.class | Bin 869 -> 0 bytes .../collections/functors/WhileClosure.class | Bin 1873 -> 0 bytes .../iterators/AbstractEmptyIterator.class | Bin 1729 -> 0 bytes .../iterators/AbstractIteratorDecorator.class | Bin 1023 -> 0 bytes .../AbstractListIteratorDecorator.class | Bin 1667 -> 0 bytes .../AbstractMapIteratorDecorator.class | Bin 1472 -> 0 bytes .../AbstractOrderedMapIteratorDecorator.class | Bin 1712 -> 0 bytes .../collections/iterators/ArrayIterator.class | Bin 2663 -> 0 bytes .../iterators/ArrayListIterator.class | Bin 2283 -> 0 bytes .../iterators/CollatingIterator.class | Bin 4898 -> 0 bytes .../collections/iterators/EmptyIterator.class | Bin 674 -> 0 bytes .../iterators/EmptyListIterator.class | Bin 698 -> 0 bytes .../iterators/EmptyMapIterator.class | Bin 653 -> 0 bytes .../iterators/EmptyOrderedIterator.class | Bin 673 -> 0 bytes .../iterators/EmptyOrderedMapIterator.class | Bin 688 -> 0 bytes .../iterators/EntrySetMapIterator.class | Bin 2536 -> 0 bytes .../iterators/EnumerationIterator.class | Bin 1733 -> 0 bytes .../iterators/FilterIterator.class | Bin 2171 -> 0 bytes .../iterators/FilterListIterator.class | Bin 3648 -> 0 bytes .../collections/iterators/IteratorChain.class | Bin 3691 -> 0 bytes .../iterators/IteratorEnumeration.class | Bin 1003 -> 0 bytes .../iterators/ListIteratorWrapper.class | Bin 2337 -> 0 bytes .../iterators/LoopingIterator.class | Bin 1426 -> 0 bytes .../iterators/LoopingListIterator.class | Bin 2304 -> 0 bytes .../iterators/ObjectArrayIterator.class | Bin 2512 -> 0 bytes .../iterators/ObjectArrayListIterator.class | Bin 2197 -> 0 bytes .../iterators/ObjectGraphIterator.class | Bin 2599 -> 0 bytes .../collections/iterators/ProxyIterator.class | Bin 1044 -> 0 bytes .../iterators/ProxyListIterator.class | Bin 1686 -> 0 bytes .../iterators/ReverseListIterator.class | Bin 2142 -> 0 bytes .../iterators/SingletonIterator.class | Bin 1358 -> 0 bytes .../iterators/SingletonListIterator.class | Bin 1888 -> 0 bytes .../iterators/TransformIterator.class | Bin 1793 -> 0 bytes .../iterators/UniqueFilterIterator.class | Bin 678 -> 0 bytes .../iterators/UnmodifiableIterator.class | Bin 1174 -> 0 bytes .../iterators/UnmodifiableListIterator.class | Bin 1844 -> 0 bytes .../iterators/UnmodifiableMapIterator.class | Bin 1668 -> 0 bytes .../UnmodifiableOrderedMapIterator.class | Bin 1908 -> 0 bytes .../keyvalue/AbstractKeyValue.class | Bin 1009 -> 0 bytes .../keyvalue/AbstractMapEntry.class | Bin 1232 -> 0 bytes .../keyvalue/AbstractMapEntryDecorator.class | Bin 1537 -> 0 bytes .../keyvalue/DefaultKeyValue.class | Bin 2171 -> 0 bytes .../keyvalue/DefaultMapEntry.class | Bin 1019 -> 0 bytes .../collections/keyvalue/MultiKey.class | Bin 2737 -> 0 bytes .../collections/keyvalue/TiedMapEntry.class | Bin 2020 -> 0 bytes .../keyvalue/UnmodifiableMapEntry.class | Bin 1325 -> 0 bytes ...bstractLinkedList$LinkedListIterator.class | Bin 3442 -> 0 bytes .../AbstractLinkedList$LinkedSubList.class | Bin 3988 -> 0 bytes ...ractLinkedList$LinkedSubListIterator.class | Bin 1760 -> 0 bytes .../list/AbstractLinkedList$Node.class | Bin 1611 -> 0 bytes .../collections/list/AbstractLinkedList.class | Bin 10871 -> 0 bytes .../list/AbstractListDecorator.class | Bin 2073 -> 0 bytes .../AbstractSerializableListDecorator.class | Bin 1298 -> 0 bytes .../list/CursorableLinkedList$Cursor.class | Bin 2912 -> 0 bytes .../list/CursorableLinkedList$SubCursor.class | Bin 1770 -> 0 bytes .../list/CursorableLinkedList.class | Bin 5657 -> 0 bytes .../FixedSizeList$FixedSizeListIterator.class | Bin 941 -> 0 bytes .../collections/list/FixedSizeList.class | Bin 3348 -> 0 bytes .../commons/collections/list/GrowthList.class | Bin 1749 -> 0 bytes .../commons/collections/list/LazyList.class | Bin 1748 -> 0 bytes .../list/NodeCachingLinkedList.class | Bin 3420 -> 0 bytes ...redicatedList$PredicatedListIterator.class | Bin 1251 -> 0 bytes .../collections/list/PredicatedList.class | Bin 3213 -> 0 bytes .../list/SetUniqueList$SetListIterator.class | Bin 1025 -> 0 bytes .../SetUniqueList$SetListListIterator.class | Bin 1529 -> 0 bytes .../collections/list/SetUniqueList.class | Bin 4282 -> 0 bytes .../collections/list/SynchronizedList.class | Bin 2683 -> 0 bytes ...nsformedList$TransformedListIterator.class | Bin 1280 -> 0 bytes .../collections/list/TransformedList.class | Bin 3067 -> 0 bytes .../commons/collections/list/TreeList$1.class | Bin 237 -> 0 bytes .../collections/list/TreeList$AVLNode.class | Bin 7620 -> 0 bytes .../list/TreeList$TreeListIterator.class | Bin 3493 -> 0 bytes .../commons/collections/list/TreeList.class | Bin 4318 -> 0 bytes .../commons/collections/list/TypedList.class | Bin 808 -> 0 bytes .../collections/list/UnmodifiableList.class | Bin 2770 -> 0 bytes .../map/AbstractHashedMap$EntrySet.class | Bin 1769 -> 0 bytes .../AbstractHashedMap$EntrySetIterator.class | Bin 965 -> 0 bytes .../map/AbstractHashedMap$HashEntry.class | Bin 1926 -> 0 bytes .../map/AbstractHashedMap$HashIterator.class | Bin 2583 -> 0 bytes .../AbstractHashedMap$HashMapIterator.class | Bin 1838 -> 0 bytes .../map/AbstractHashedMap$KeySet.class | Bin 1274 -> 0 bytes .../AbstractHashedMap$KeySetIterator.class | Bin 989 -> 0 bytes .../map/AbstractHashedMap$Values.class | Bin 1108 -> 0 bytes .../AbstractHashedMap$ValuesIterator.class | Bin 983 -> 0 bytes .../collections/map/AbstractHashedMap.class | Bin 14238 -> 0 bytes ...actInputCheckedMapDecorator$EntrySet.class | Bin 2330 -> 0 bytes ...CheckedMapDecorator$EntrySetIterator.class | Bin 1349 -> 0 bytes ...actInputCheckedMapDecorator$MapEntry.class | Bin 1132 -> 0 bytes .../AbstractInputCheckedMapDecorator.class | Bin 1336 -> 0 bytes .../AbstractLinkedMap$EntrySetIterator.class | Bin 1063 -> 0 bytes .../AbstractLinkedMap$KeySetIterator.class | Bin 1090 -> 0 bytes .../map/AbstractLinkedMap$LinkEntry.class | Bin 898 -> 0 bytes .../map/AbstractLinkedMap$LinkIterator.class | Bin 2815 -> 0 bytes .../AbstractLinkedMap$LinkMapIterator.class | Bin 2097 -> 0 bytes .../AbstractLinkedMap$ValuesIterator.class | Bin 1084 -> 0 bytes .../collections/map/AbstractLinkedMap.class | Bin 6325 -> 0 bytes .../map/AbstractMapDecorator.class | Bin 2391 -> 0 bytes .../map/AbstractOrderedMapDecorator.class | Bin 1596 -> 0 bytes .../AbstractReferenceMap$ReferenceEntry.class | Bin 3521 -> 0 bytes ...stractReferenceMap$ReferenceEntrySet.class | Bin 1667 -> 0 bytes ...ferenceMap$ReferenceEntrySetIterator.class | Bin 2817 -> 0 bytes ...AbstractReferenceMap$ReferenceKeySet.class | Bin 1437 -> 0 bytes ...ReferenceMap$ReferenceKeySetIterator.class | Bin 1076 -> 0 bytes ...actReferenceMap$ReferenceMapIterator.class | Bin 2072 -> 0 bytes ...AbstractReferenceMap$ReferenceValues.class | Bin 1437 -> 0 bytes ...ReferenceMap$ReferenceValuesIterator.class | Bin 1078 -> 0 bytes .../map/AbstractReferenceMap$SoftRef.class | Bin 801 -> 0 bytes .../map/AbstractReferenceMap$WeakRef.class | Bin 801 -> 0 bytes .../map/AbstractReferenceMap.class | Bin 8859 -> 0 bytes .../map/AbstractSortedMapDecorator.class | Bin 1508 -> 0 bytes .../collections/map/CaseInsensitiveMap.class | Bin 1905 -> 0 bytes .../map/CompositeMap$MapMutator.class | Bin 623 -> 0 bytes .../collections/map/CompositeMap.class | Bin 5701 -> 0 bytes .../collections/map/DefaultedMap.class | Bin 2845 -> 0 bytes .../collections/map/FixedSizeMap.class | Bin 3177 -> 0 bytes .../collections/map/FixedSizeSortedMap.class | Bin 3898 -> 0 bytes .../collections/map/Flat3Map$EntrySet.class | Bin 1828 -> 0 bytes .../map/Flat3Map$EntrySetIterator.class | Bin 3454 -> 0 bytes .../map/Flat3Map$FlatMapIterator.class | Bin 3113 -> 0 bytes .../collections/map/Flat3Map$KeySet.class | Bin 1703 -> 0 bytes .../map/Flat3Map$KeySetIterator.class | Bin 763 -> 0 bytes .../collections/map/Flat3Map$Values.class | Bin 1551 -> 0 bytes .../map/Flat3Map$ValuesIterator.class | Bin 765 -> 0 bytes .../commons/collections/map/Flat3Map.class | Bin 10980 -> 0 bytes .../commons/collections/map/HashedMap.class | Bin 1578 -> 0 bytes .../map/IdentityMap$IdentityEntry.class | Bin 1359 -> 0 bytes .../commons/collections/map/IdentityMap.class | Bin 2744 -> 0 bytes .../commons/collections/map/LRUMap.class | Bin 7016 -> 0 bytes .../commons/collections/map/LazyMap.class | Bin 2619 -> 0 bytes .../collections/map/LazySortedMap.class | Bin 2315 -> 0 bytes .../map/LinkedMap$LinkedMapList.class | Bin 3040 -> 0 bytes .../commons/collections/map/LinkedMap.class | Bin 2835 -> 0 bytes .../map/ListOrderedMap$EntrySetView.class | Bin 2400 -> 0 bytes .../map/ListOrderedMap$KeySetView$1.class | Bin 1039 -> 0 bytes .../map/ListOrderedMap$KeySetView.class | Bin 1320 -> 0 bytes .../ListOrderedMap$ListOrderedIterator.class | Bin 1436 -> 0 bytes .../ListOrderedMap$ListOrderedMapEntry.class | Bin 1184 -> 0 bytes ...istOrderedMap$ListOrderedMapIterator.class | Bin 2974 -> 0 bytes .../map/ListOrderedMap$ValuesView$1.class | Bin 1091 -> 0 bytes .../map/ListOrderedMap$ValuesView.class | Bin 1710 -> 0 bytes .../collections/map/ListOrderedMap.class | Bin 6719 -> 0 bytes .../commons/collections/map/MultiKeyMap.class | Bin 13867 -> 0 bytes .../collections/map/MultiValueMap$1.class | Bin 250 -> 0 bytes .../map/MultiValueMap$ReflectionFactory.class | Bin 1206 -> 0 bytes .../map/MultiValueMap$Values.class | Bin 1866 -> 0 bytes .../map/MultiValueMap$ValuesIterator.class | Bin 1393 -> 0 bytes .../collections/map/MultiValueMap.class | Bin 5984 -> 0 bytes .../collections/map/PredicatedMap.class | Bin 3359 -> 0 bytes .../collections/map/PredicatedSortedMap.class | Bin 2082 -> 0 bytes .../map/ReferenceIdentityMap.class | Bin 2351 -> 0 bytes .../collections/map/ReferenceMap.class | Bin 1622 -> 0 bytes .../SingletonMap$SingletonMapIterator.class | Bin 2599 -> 0 bytes .../map/SingletonMap$SingletonValues.class | Bin 1403 -> 0 bytes .../collections/map/SingletonMap.class | Bin 5854 -> 0 bytes .../collections/map/StaticBucketMap$1.class | Bin 256 -> 0 bytes .../map/StaticBucketMap$EntryIterator.class | Bin 2637 -> 0 bytes .../map/StaticBucketMap$EntrySet.class | Bin 2761 -> 0 bytes .../map/StaticBucketMap$KeyIterator.class | Bin 1265 -> 0 bytes .../map/StaticBucketMap$KeySet.class | Bin 2527 -> 0 bytes .../map/StaticBucketMap$Lock.class | Bin 748 -> 0 bytes .../map/StaticBucketMap$Node.class | Bin 1658 -> 0 bytes .../map/StaticBucketMap$ValueIterator.class | Bin 1273 -> 0 bytes .../map/StaticBucketMap$Values.class | Bin 1353 -> 0 bytes .../collections/map/StaticBucketMap.class | Bin 6534 -> 0 bytes .../collections/map/TransformedMap.class | Bin 3575 -> 0 bytes .../map/TransformedSortedMap.class | Bin 2515 -> 0 bytes .../commons/collections/map/TypedMap.class | Bin 884 -> 0 bytes .../collections/map/TypedSortedMap.class | Bin 932 -> 0 bytes ...modifiableEntrySet$UnmodifiableEntry.class | Bin 894 -> 0 bytes ...ntrySet$UnmodifiableEntrySetIterator.class | Bin 1191 -> 0 bytes .../map/UnmodifiableEntrySet.class | Bin 2668 -> 0 bytes .../collections/map/UnmodifiableMap.class | Bin 3160 -> 0 bytes .../map/UnmodifiableOrderedMap.class | Bin 3707 -> 0 bytes .../map/UnmodifiableSortedMap.class | Bin 3550 -> 0 bytes .../AbstractSerializableSetDecorator.class | Bin 1288 -> 0 bytes .../set/AbstractSetDecorator.class | Bin 738 -> 0 bytes .../set/AbstractSortedSetDecorator.class | Bin 1502 -> 0 bytes .../set/CompositeSet$SetMutator.class | Bin 564 -> 0 bytes .../collections/set/CompositeSet.class | Bin 3656 -> 0 bytes .../collections/set/ListOrderedSet$1.class | Bin 253 -> 0 bytes .../ListOrderedSet$OrderedSetIterator.class | Bin 1458 -> 0 bytes .../collections/set/ListOrderedSet.class | Bin 4900 -> 0 bytes .../collections/set/MapBackedSet.class | Bin 3168 -> 0 bytes .../collections/set/PredicatedSet.class | Bin 1019 -> 0 bytes .../collections/set/PredicatedSortedSet.class | Bin 1925 -> 0 bytes .../collections/set/SynchronizedSet.class | Bin 1027 -> 0 bytes .../set/SynchronizedSortedSet.class | Bin 2179 -> 0 bytes .../collections/set/TransformedSet.class | Bin 887 -> 0 bytes .../set/TransformedSortedSet.class | Bin 1928 -> 0 bytes .../commons/collections/set/TypedSet.class | Bin 796 -> 0 bytes .../collections/set/TypedSortedSet.class | Bin 844 -> 0 bytes .../collections/set/UnmodifiableSet.class | Bin 1674 -> 0 bytes .../set/UnmodifiableSortedSet.class | Bin 3003 -> 0 bytes .../commons/collections/ArrayStack.java | 195 -- .../org/apache/commons/collections/Bag.java | 222 -- .../apache/commons/collections/BagUtils.java | 244 -- .../apache/commons/collections/BeanMap.java | 804 ------- .../apache/commons/collections/BidiMap.java | 146 -- .../commons/collections/BinaryHeap.java | 565 ----- .../collections/BoundedCollection.java | 53 - .../collections/BoundedFifoBuffer.java | 311 --- .../commons/collections/BoundedMap.java | 49 - .../apache/commons/collections/Buffer.java | 64 - .../collections/BufferOverflowException.java | 74 - .../collections/BufferUnderflowException.java | 77 - .../commons/collections/BufferUtils.java | 201 -- .../apache/commons/collections/Closure.java | 47 - .../commons/collections/ClosureUtils.java | 370 --- .../commons/collections/CollectionUtils.java | 1211 ---------- .../commons/collections/ComparatorUtils.java | 241 -- .../collections/CursorableLinkedList.java | 1468 ------------ .../commons/collections/DefaultMapBag.java | 455 ---- .../commons/collections/DefaultMapEntry.java | 163 -- .../commons/collections/DoubleOrderedMap.java | 1995 ---------------- .../commons/collections/EnumerationUtils.java | 54 - .../collections/ExtendedProperties.java | 1686 ------------- .../apache/commons/collections/Factory.java | 45 - .../commons/collections/FactoryUtils.java | 142 -- .../commons/collections/FastArrayList.java | 1333 ----------- .../commons/collections/FastHashMap.java | 715 ------ .../commons/collections/FastTreeMap.java | 824 ------- .../commons/collections/FunctorException.java | 144 -- .../apache/commons/collections/HashBag.java | 51 - .../commons/collections/IterableMap.java | 62 - .../commons/collections/IteratorUtils.java | 914 -------- .../apache/commons/collections/KeyValue.java | 47 - .../apache/commons/collections/LRUMap.java | 207 -- .../apache/commons/collections/ListUtils.java | 410 ---- .../commons/collections/MapIterator.java | 109 - .../apache/commons/collections/MapUtils.java | 1645 ------------- .../commons/collections/MultiHashMap.java | 493 ---- .../apache/commons/collections/MultiMap.java | 160 -- .../commons/collections/OrderedBidiMap.java | 64 - .../commons/collections/OrderedIterator.java | 48 - .../commons/collections/OrderedMap.java | 82 - .../collections/OrderedMapIterator.java | 46 - .../apache/commons/collections/Predicate.java | 50 - .../commons/collections/PredicateUtils.java | 536 ----- .../commons/collections/PriorityQueue.java | 72 - .../apache/commons/collections/ProxyMap.java | 163 -- .../commons/collections/ReferenceMap.java | 958 -------- .../collections/ResettableIterator.java | 39 - .../collections/ResettableListIterator.java | 39 - .../commons/collections/SequencedHashMap.java | 1018 -------- .../apache/commons/collections/SetUtils.java | 326 --- .../apache/commons/collections/SortedBag.java | 54 - .../commons/collections/SortedBidiMap.java | 69 - .../commons/collections/StaticBucketMap.java | 711 ------ .../SynchronizedPriorityQueue.java | 103 - .../commons/collections/Transformer.java | 51 - .../commons/collections/TransformerUtils.java | 442 ---- .../apache/commons/collections/TreeBag.java | 77 - .../collections/UnboundedFifoBuffer.java | 274 --- .../commons/collections/Unmodifiable.java | 40 - .../collections/bag/AbstractBagDecorator.java | 81 - .../collections/bag/AbstractMapBag.java | 593 ----- .../bag/AbstractSortedBagDecorator.java | 76 - .../commons/collections/bag/HashBag.java | 84 - .../collections/bag/PredicatedBag.java | 109 - .../collections/bag/PredicatedSortedBag.java | 103 - .../collections/bag/SynchronizedBag.java | 128 - .../bag/SynchronizedSortedBag.java | 105 - .../collections/bag/TransformedBag.java | 106 - .../collections/bag/TransformedSortedBag.java | 97 - .../commons/collections/bag/TreeBag.java | 115 - .../commons/collections/bag/TypedBag.java | 61 - .../collections/bag/TypedSortedBag.java | 61 - .../collections/bag/UnmodifiableBag.java | 142 -- .../bag/UnmodifiableSortedBag.java | 142 -- .../commons/collections/bag/package.html | 40 - .../bidimap/AbstractBidiMapDecorator.java | 79 - .../bidimap/AbstractDualBidiMap.java | 726 ------ .../AbstractOrderedBidiMapDecorator.java | 86 - .../AbstractSortedBidiMapDecorator.java | 84 - .../collections/bidimap/DualHashBidiMap.java | 107 - .../collections/bidimap/DualTreeBidiMap.java | 349 --- .../collections/bidimap/TreeBidiMap.java | 2085 ----------------- .../bidimap/UnmodifiableBidiMap.java | 122 - .../bidimap/UnmodifiableOrderedBidiMap.java | 133 -- .../bidimap/UnmodifiableSortedBidiMap.java | 156 -- .../commons/collections/bidimap/package.html | 48 - .../buffer/AbstractBufferDecorator.java | 70 - .../collections/buffer/BlockingBuffer.java | 236 -- .../collections/buffer/BoundedBuffer.java | 194 -- .../collections/buffer/BoundedFifoBuffer.java | 388 --- .../buffer/CircularFifoBuffer.java | 96 - .../collections/buffer/PredicatedBuffer.java | 97 - .../collections/buffer/PriorityBuffer.java | 545 ----- .../buffer/SynchronizedBuffer.java | 95 - .../collections/buffer/TransformedBuffer.java | 91 - .../collections/buffer/TypedBuffer.java | 61 - .../buffer/UnboundedFifoBuffer.java | 316 --- .../buffer/UnmodifiableBuffer.java | 132 -- .../commons/collections/buffer/package.html | 41 - .../AbstractCollectionDecorator.java | 146 -- ...stractSerializableCollectionDecorator.java | 69 - .../collection/CompositeCollection.java | 443 ---- .../collection/PredicatedCollection.java | 135 -- .../collection/SynchronizedCollection.java | 201 -- .../collection/TransformedCollection.java | 122 - .../collection/TypedCollection.java | 61 - .../UnmodifiableBoundedCollection.java | 142 -- .../collection/UnmodifiableCollection.java | 98 - .../collections/collection/package.html | 36 - .../comparators/BooleanComparator.java | 206 -- .../comparators/ComparableComparator.java | 127 - .../comparators/ComparatorChain.java | 347 --- .../comparators/FixedOrderComparator.java | 266 --- .../comparators/NullComparator.java | 176 -- .../comparators/ReverseComparator.java | 125 - .../comparators/TransformingComparator.java | 78 - .../collections/comparators/package.html | 27 - .../collections/functors/AllPredicate.java | 127 - .../collections/functors/AndPredicate.java | 89 - .../collections/functors/AnyPredicate.java | 126 - .../collections/functors/ChainedClosure.java | 132 -- .../functors/ChainedTransformer.java | 137 -- .../functors/CloneTransformer.java | 71 - .../functors/ClosureTransformer.java | 87 - .../collections/functors/ConstantFactory.java | 89 - .../functors/ConstantTransformer.java | 90 - .../collections/functors/EqualPredicate.java | 85 - .../functors/ExceptionClosure.java | 68 - .../functors/ExceptionFactory.java | 68 - .../functors/ExceptionPredicate.java | 68 - .../functors/ExceptionTransformer.java | 69 - .../functors/FactoryTransformer.java | 86 - .../collections/functors/FalsePredicate.java | 66 - .../collections/functors/ForClosure.java | 105 - .../collections/functors/FunctorUtils.java | 155 -- .../functors/IdentityPredicate.java | 87 - .../collections/functors/IfClosure.java | 154 -- .../functors/InstanceofPredicate.java | 85 - .../functors/InstantiateFactory.java | 140 -- .../functors/InstantiateTransformer.java | 119 - .../functors/InvokerTransformer.java | 137 -- .../collections/functors/MapTransformer.java | 87 - .../collections/functors/NOPClosure.java | 65 - .../collections/functors/NOPTransformer.java | 66 - .../collections/functors/NonePredicate.java | 119 - .../functors/NotNullPredicate.java | 66 - .../collections/functors/NotPredicate.java | 84 - .../functors/NullIsExceptionPredicate.java | 90 - .../functors/NullIsFalsePredicate.java | 88 - .../functors/NullIsTruePredicate.java | 88 - .../collections/functors/NullPredicate.java | 66 - .../collections/functors/OnePredicate.java | 123 - .../collections/functors/OrPredicate.java | 89 - .../functors/PredicateDecorator.java | 43 - .../functors/PredicateTransformer.java | 86 - .../functors/PrototypeFactory.java | 209 -- .../functors/StringValueTransformer.java | 67 - .../collections/functors/SwitchClosure.java | 175 -- .../functors/SwitchTransformer.java | 176 -- .../functors/TransformedPredicate.java | 104 - .../functors/TransformerClosure.java | 86 - .../functors/TransformerPredicate.java | 93 - .../collections/functors/TruePredicate.java | 66 - .../collections/functors/UniquePredicate.java | 71 - .../collections/functors/WhileClosure.java | 123 - .../commons/collections/functors/package.html | 27 - .../iterators/AbstractEmptyIterator.java | 90 - .../iterators/AbstractIteratorDecorator.java | 74 - .../AbstractListIteratorDecorator.java | 98 - .../AbstractMapIteratorDecorator.java | 85 - .../AbstractOrderedMapIteratorDecorator.java | 93 - .../collections/iterators/ArrayIterator.java | 223 -- .../iterators/ArrayListIterator.java | 214 -- .../iterators/CollatingIterator.java | 371 --- .../collections/iterators/EmptyIterator.java | 55 - .../iterators/EmptyListIterator.java | 55 - .../iterators/EmptyMapIterator.java | 45 - .../iterators/EmptyOrderedIterator.java | 45 - .../iterators/EmptyOrderedMapIterator.java | 45 - .../iterators/EntrySetMapIterator.java | 171 -- .../iterators/EnumerationIterator.java | 141 -- .../collections/iterators/FilterIterator.java | 194 -- .../iterators/FilterListIterator.java | 280 --- .../collections/iterators/IteratorChain.java | 290 --- .../iterators/IteratorEnumeration.java | 100 - .../iterators/ListIteratorWrapper.java | 196 -- .../iterators/LoopingIterator.java | 127 - .../iterators/LoopingListIterator.java | 255 -- .../iterators/ObjectArrayIterator.java | 216 -- .../iterators/ObjectArrayListIterator.java | 206 -- .../iterators/ObjectGraphIterator.java | 254 -- .../collections/iterators/ProxyIterator.java | 102 - .../iterators/ProxyListIterator.java | 163 -- .../iterators/ReverseListIterator.java | 176 -- .../iterators/SingletonIterator.java | 129 - .../iterators/SingletonListIterator.java | 176 -- .../iterators/TransformIterator.java | 149 -- .../iterators/UniqueFilterIterator.java | 46 - .../iterators/UnmodifiableIterator.java | 79 - .../iterators/UnmodifiableListIterator.java | 101 - .../iterators/UnmodifiableMapIterator.java | 88 - .../UnmodifiableOrderedMapIterator.java | 96 - .../collections/iterators/package.html | 27 - .../keyvalue/AbstractKeyValue.java | 83 - .../keyvalue/AbstractMapEntry.java | 95 - .../keyvalue/AbstractMapEntryDecorator.java | 87 - .../collections/keyvalue/DefaultKeyValue.java | 159 -- .../collections/keyvalue/DefaultMapEntry.java | 67 - .../collections/keyvalue/MultiKey.java | 258 -- .../collections/keyvalue/TiedMapEntry.java | 135 -- .../keyvalue/UnmodifiableMapEntry.java | 76 - .../commons/collections/keyvalue/package.html | 30 - .../collections/list/AbstractLinkedList.java | 1012 -------- .../list/AbstractListDecorator.java | 105 - .../AbstractSerializableListDecorator.java | 70 - .../list/CursorableLinkedList.java | 605 ----- .../collections/list/FixedSizeList.java | 163 -- .../commons/collections/list/GrowthList.java | 186 -- .../commons/collections/list/LazyList.java | 142 -- .../list/NodeCachingLinkedList.java | 247 -- .../collections/list/PredicatedList.java | 160 -- .../collections/list/SetUniqueList.java | 344 --- .../collections/list/SynchronizedList.java | 164 -- .../collections/list/TransformedList.java | 151 -- .../commons/collections/list/TreeList.java | 916 -------- .../commons/collections/list/TypedList.java | 60 - .../collections/list/UnmodifiableList.java | 128 - .../commons/collections/list/package.html | 45 - .../collections/map/AbstractHashedMap.java | 1329 ----------- .../map/AbstractInputCheckedMapDecorator.java | 197 -- .../collections/map/AbstractLinkedMap.java | 613 ----- .../collections/map/AbstractMapDecorator.java | 141 -- .../map/AbstractOrderedMapDecorator.java | 95 - .../collections/map/AbstractReferenceMap.java | 981 -------- .../map/AbstractSortedMapDecorator.java | 94 - .../collections/map/CaseInsensitiveMap.java | 153 -- .../commons/collections/map/CompositeMap.java | 538 ----- .../commons/collections/map/DefaultedMap.java | 196 -- .../commons/collections/map/FixedSizeMap.java | 162 -- .../collections/map/FixedSizeSortedMap.java | 178 -- .../commons/collections/map/Flat3Map.java | 1133 --------- .../commons/collections/map/HashedMap.java | 116 - .../commons/collections/map/IdentityMap.java | 195 -- .../commons/collections/map/LRUMap.java | 431 ---- .../commons/collections/map/LazyMap.java | 167 -- .../collections/map/LazySortedMap.java | 151 -- .../commons/collections/map/LinkedMap.java | 288 --- .../collections/map/ListOrderedMap.java | 711 ------ .../commons/collections/map/MultiKeyMap.java | 913 -------- .../collections/map/MultiValueMap.java | 440 ---- .../collections/map/PredicatedMap.java | 187 -- .../collections/map/PredicatedSortedMap.java | 122 - .../collections/map/ReferenceIdentityMap.java | 219 -- .../commons/collections/map/ReferenceMap.java | 169 -- .../commons/collections/map/SingletonMap.java | 593 ----- .../collections/map/StaticBucketMap.java | 701 ------ .../collections/map/TransformedMap.java | 229 -- .../collections/map/TransformedSortedMap.java | 147 -- .../commons/collections/map/TypedMap.java | 73 - .../collections/map/TypedSortedMap.java | 73 - .../collections/map/UnmodifiableEntrySet.java | 163 -- .../collections/map/UnmodifiableMap.java | 144 -- .../map/UnmodifiableOrderedMap.java | 145 -- .../map/UnmodifiableSortedMap.java | 160 -- .../commons/collections/map/package.html | 55 - .../apache/commons/collections/overview.html | 113 - .../apache/commons/collections/package.html | 30 - .../set/AbstractSerializableSetDecorator.java | 70 - .../collections/set/AbstractSetDecorator.java | 62 - .../set/AbstractSortedSetDecorator.java | 87 - .../commons/collections/set/CompositeSet.java | 198 -- .../collections/set/ListOrderedSet.java | 313 --- .../commons/collections/set/MapBackedSet.java | 158 -- .../collections/set/PredicatedSet.java | 88 - .../collections/set/PredicatedSortedSet.java | 116 - .../collections/set/SynchronizedSet.java | 82 - .../set/SynchronizedSortedSet.java | 129 - .../collections/set/TransformedSet.java | 73 - .../collections/set/TransformedSortedSet.java | 111 - .../commons/collections/set/TypedSet.java | 60 - .../collections/set/TypedSortedSet.java | 60 - .../collections/set/UnmodifiableSet.java | 96 - .../set/UnmodifiableSortedSet.java | 140 -- .../commons/collections/set/package.html | 43 - .../metrics/accessors/JavaBeanWithApiDoc.java | 30 - .../metrics/accessors/PureJavaBean.java | 94 - .../metrics/branches/ComplexBranches.java | 21 - .../metrics/branches/NoBranches.java | 17 - .../metrics/branches/SimpleBranches.java | 52 - .../metrics/classes/AbstractClass.java | 5 - .../metrics/classes/AnonymousInnerClass.java | 20 - .../metrics/classes/ClassCounterEnum.java | 32 - .../metrics/classes/InnerClassTests.java | 19 - .../metrics/classes/Interface.java | 2 - .../metrics/classes/Test003.java | 21 - .../metrics/commentedCode/CommentedCode.java | 25 - .../org/foo/CommentedOutFile.java | 5 - .../InstanceAndStaticInitBlocks.java | 10 - .../metrics/javadoc/ClassWithComments.java | 66 - .../ClassWithCommentsOnLineOfCode.java | 14 - .../metrics/javadoc/ClassWithHeader.java | 32 - .../javadoc/ClassWithHeaderAndBlankLines.java | 17 - .../javadoc/ClassWithHeaderAndNoPackage.java | 30 - .../ClassWithHeaderAndNoPackageNoImports.java | 23 - .../metrics/javadoc/ClassWithVars.java | 59 - .../ClassWithoutHeaderAndWithCComment.java | 16 - .../metrics/javadoc/Constants.java | 76 - .../metrics/javadoc/EmptyConstructor.java | 19 - .../javadoc/InterfaceWithComments.java | 36 - .../MethodsWithOverrideAnnotation.java | 23 - .../foo/ClassWithPackageAndJavadocHeader.java | 50 - .../test-resources/metrics/loc/Test001.java | 25 - .../test-resources/metrics/loc/Test002.java | 19 - .../ClassWithDifferentMethodSignatures.java | 26 - .../methods/ClassWithStaticMethods.java | 30 - .../MethodWithAnonymousInnerClass.java | 20 - .../metrics/ncloc/TestNcloc.java | 39 - .../ncloc/TestNclocWithClassComment.java | 46 - .../metrics/ncloc/TestNclocWithHeader.java | 59 - .../metrics/packages/org/foo/SimpleBean.java | 31 - .../metrics/statements/NoStatements.java | 32 - .../ClassWithSuppressWarningsAnnotation.java | 42 - .../test-resources/rules/CommentedCode.java | 91 - .../rules/FileWithNOSONARTags.java | 16 - .../rules/FileWithoutNOSONARTags.java | 16 - .../test-resources/rules/UndocumentedApi.java | 39 - .../annotations/AnnotationDefinition.java | 18 - .../annotations/InterfaceWithAnnotation.java | 11 - .../emptyFiles/ClassWithOnlyComment.java | 1 - .../emptyFiles/EmptyFileWithBlankLines.java | 5 - .../foo/ClassWithPackageImportsComment.java | 7 - .../encoding/CP1252Encoding.java | 21 - .../encoding/MacRomanEncoding.java | 21 - .../special_cases/encoding/Utf8Encoding.java | 21 - .../generics/Class1WithGenerics.java | 5 - .../generics/Class2WithGenerics.java | 5 - .../gwt/JavaClassWithGWTNativeCode.java | 17 - .../cxf/jaxrs/ext/logging/package-info.java | 31 - .../parsingErrors/CheckstyleBug.java | 17 - .../LineCommentAtTheEndOfFile.java | 3 - .../parsingErrors/UnicodeEscape.java | 9 - .../org/foo/CommentedOutFile.java | 7 - .../wrongPackages/org/foo/GoodPackage.java | 7 - .../wrongPackages/org/foo/WrongPackage.java | 7 - 1075 files changed, 81577 deletions(-) delete mode 100644 plugins/sonar-squid-java-plugin/infinitest.args delete mode 100644 plugins/sonar-squid-java-plugin/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleAuditListener.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridgeContext.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/CommentedOutCodeLineCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AccessorVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AstUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BlankLinesVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BranchVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ClassVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/CommentVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ComplexityVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/EndAtLineVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileLinesVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/JavaAstVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesOfCodeVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PackageVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/StatementVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/SuppressWarningsAnnotationUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeVisitorNotifier.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/ClassLoaderBuilder.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/VirtualMethodsLinker.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmAccessFlags.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClass.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProvider.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProviderImpl.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmEdge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmField.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethodVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmResource.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignature.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignatureVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmType.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/SerializableContract.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/FileSystemLoader.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/JarLoader.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/Loader.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/SquidClassLoader.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/BytecodeVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DITVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DependenciesVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/LCOM4Visitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/NOCVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/RFCVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/recognizer/JavaFootprint.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/JvmJavaType.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignature.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignaturePrinter.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignatureScanner.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/Parameter.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignaturePrinter.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignatureScanner.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/JavaSquidConfiguration.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidScanner.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidVisitorNotifier.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/CycleBetweenPackagesCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/SquidCheck.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/visitor/SquidVisitor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarAccessor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayProfile.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayWithFindbugsProfile.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidConstants.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPluginProperties.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Bridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/BridgeFactory.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DependencyIndex.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DesignBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DsmSerializer.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/NoSonarFilterLoader.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PackagesBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ResourceIndex.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/RobertCMartinBridge.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/SquidBrigeException.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ChidamberKemererDistributionBuilder.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ClassesDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilder.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionsDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/src/main/resources/checkstyle-configuration.xml delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/CheckMessages.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/JavaAstScannerTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/SquidTestUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/BreakCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/CommentedOutCodeLineCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ContinueCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/UndocumentedApiCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AccessorVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BlankLinesVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BrancheVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ClassVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/CommentVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ComplexityVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/EndAtLineVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileLinesVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/HeaderCommentVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesOfCodeVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/MethodVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PackageVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PublicApiVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/StatementVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/BytecodeVisitorsTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/VirtualMethodsLinkerTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderImplTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureVisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmTypeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/SerializableContractTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/FileSystemLoaderTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/JarLoaderTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/SquidClassLoaderTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/visitor/LCOM4VisitorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/recognizer/JavaFootprintTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignaturePrinterTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignatureScannerTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignaturePrinterTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignatureScannerTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/ClassComplexityCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/DITCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/EmptyFileCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/MethodComplexityCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/NoSonarCheckTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SonarWayProfileTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidExecutorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidPluginTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidSensorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidTestUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeFactoryTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeTestCase.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChecksBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DesignBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DsmSerializerTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/RobertCMartinBridgeTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecoratorTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilderTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidUserGuideTest.java delete mode 100644 plugins/sonar-squid-java-plugin/src/test/resources/logback-test.xml delete mode 100644 plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/DsmSerializerTest/dsm.json delete mode 100644 plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest/serialize.json delete mode 100644 plugins/sonar-squid-java-plugin/src/test/resources/struts-core-1.3.9-sources.jar delete mode 100644 plugins/sonar-squid-java-plugin/src/test/resources/struts-core-1.3.9.jar delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/README.txt delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/bin/ArchitectureCheckDateForbidden.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/bin/ArchitectureCheckOneErrorMessage.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/bin/ArchitectureCheckToSqlFromUI.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckDateForbidden.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckOneErrorMessage.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckToSqlFromUI.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/EmptyMethodProperty.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/InheritedMethodsProperty.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/MethodBodyLoadedProperty.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/ResourceTouchedProperty.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Comment.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Content.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/File.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Language.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Line.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/SourceFile.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Tag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/TagException.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/TagName.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/impl/FixMe$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/impl/FixMe.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/impl/Todo.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/bin/CallToDeprecatedMethod.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/src/CallToDeprecatedMethod.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/ExclusionOfFieldNamesFromLcom4Calculation.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4AccessorMethodAndField.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4Exclusions.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4WithIsolatedMethods.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4WithWorkers.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/ExclusionOfFieldNamesFromLcom4Calculation.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4AccessorMethodAndField.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4Exclusions.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithIsolatedMethods.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithWorkers.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/lib/hello.jar delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/EmptyMethodProperty.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/InheritedMethodsProperty.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/MethodBodyLoadedProperty.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/ResourceTouchedProperty.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Comment.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Content.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/File.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Language.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Line.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/SourceFile.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Tag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagException.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagName.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/FixMe.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/Todo.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/bin/UnusedGenericPrivateMethod.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/bin/UnusedPrivateConstructor.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/bin/UnusedPrivateMethod.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedGenericPrivateMethod.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateConstructor.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateMethod.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/Job.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/UnusedProtectedMethod.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/UnusedProtectedMethodFromAbstractClass.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/Job.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethod.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethodFromAbstractClass.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/bin/Animal.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/bin/Dog.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/pom.xml delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Animal.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Dog.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ArrayStack.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Bag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BagUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$10.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$11.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$2.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$3.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$4.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$5.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$6.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$7.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$8.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$9.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$MyMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BinaryHeap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BinaryHeap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedFifoBuffer$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedFifoBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Buffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferOverflowException.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferUnderflowException.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Closure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ClosureUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CollectionUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ComparatorUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$Cursor.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$ListIter.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$Listable.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableSubList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DefaultMapBag$BagIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DefaultMapBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DefaultMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$1$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$2$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$2.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$3$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$3.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$4$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$4.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$5$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$5.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$6$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$6.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$DoubleOrderedMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$Node.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/EnumerationUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties$PropertiesReader.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties$PropertiesTokenizer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Factory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FactoryUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastArrayList$ListIter.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastArrayList$SubList$SubListIter.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastArrayList$SubList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastArrayList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$CollectionView$CollectionViewIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$CollectionView.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$CollectionView$CollectionViewIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$CollectionView.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FunctorException.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/HashBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/IterableMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/IteratorUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/KeyValue.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/LRUMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ListUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MapUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap$ValueIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/OrderedBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/OrderedIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/OrderedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/OrderedMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Predicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/PredicateUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/PriorityQueue.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ProxyMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$2.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$3.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$Entry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$EntryIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$KeyIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$SoftRef.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$ValueIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$WeakRef.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ResettableIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ResettableListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$2.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$3.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$Entry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$OrderedIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SetUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SortedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SortedBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$EntryIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$KeyIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Lock.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Node.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$ValueIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SynchronizedPriorityQueue.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Transformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/TransformerUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/TreeBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/UnboundedFifoBuffer$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/UnboundedFifoBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Unmodifiable.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractBagDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractMapBag$BagIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractMapBag$MutableInteger.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractMapBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractSortedBagDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/HashBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/PredicatedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/PredicatedSortedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedBag$SynchronizedBagSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedSortedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TransformedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TransformedSortedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TreeBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TypedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TypedSortedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/UnmodifiableBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/UnmodifiableSortedBag.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$BidiMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$EntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$KeySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$MapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$ValuesIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$View.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/DualHashBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/DualTreeBidiMap$BidiOrderedMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/DualTreeBidiMap$ViewMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/DualTreeBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$EntryView.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$Inverse.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$Node.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$View.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$ViewIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$ViewMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/AbstractBufferDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BlockingBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedBuffer$NotifyingIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedFifoBuffer$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedFifoBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/CircularFifoBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/PredicatedBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/PriorityBuffer$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/PriorityBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/SynchronizedBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/TransformedBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/TypedBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/UnboundedFifoBuffer$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/UnboundedFifoBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/UnmodifiableBuffer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/AbstractCollectionDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/AbstractSerializableCollectionDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/CompositeCollection$CollectionMutator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/CompositeCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/PredicatedCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/SynchronizedCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/TransformedCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/TypedCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/UnmodifiableBoundedCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/UnmodifiableCollection.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/BooleanComparator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/ComparableComparator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/ComparatorChain.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/FixedOrderComparator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/NullComparator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/ReverseComparator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/TransformingComparator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AllPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AndPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AnyPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ChainedClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ChainedTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/CloneTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ClosureTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ConstantFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ConstantTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/EqualPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ExceptionClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ExceptionFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ExceptionPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ExceptionTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FactoryTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FalsePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ForClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FunctorUtils.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/IdentityPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/IfClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/InstanceofPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/InstantiateFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/InstantiateTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/InvokerTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/MapTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NOPClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NOPTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NonePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NotNullPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NotPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsExceptionPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsFalsePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsTruePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/OnePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/OrPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PredicateDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PredicateTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$PrototypeCloneFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$PrototypeSerializationFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/StringValueTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/SwitchClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/SwitchTransformer.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformedPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformerClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformerPredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TruePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/UniquePredicate.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/WhileClosure.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractEmptyIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractIteratorDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractListIteratorDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractOrderedMapIteratorDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ArrayIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ArrayListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/CollatingIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyOrderedIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EntrySetMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EnumerationIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/FilterIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/FilterListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/IteratorChain.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/IteratorEnumeration.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ListIteratorWrapper.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/LoopingIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/LoopingListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectArrayIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectArrayListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectGraphIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ProxyIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ProxyListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ReverseListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/SingletonIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/SingletonListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/TransformIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UniqueFilterIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UnmodifiableIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UnmodifiableListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UnmodifiableMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UnmodifiableOrderedMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractKeyValue.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/DefaultKeyValue.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/DefaultMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/MultiKey.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/TiedMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$LinkedListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$LinkedSubList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$LinkedSubListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$Node.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractListDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractSerializableListDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList$Cursor.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList$SubCursor.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/FixedSizeList$FixedSizeListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/FixedSizeList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/GrowthList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/LazyList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/NodeCachingLinkedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/PredicatedList$PredicatedListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/PredicatedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList$SetListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList$SetListListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SynchronizedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TransformedList$TransformedListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TransformedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList$AVLNode.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList$TreeListIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TypedList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/UnmodifiableList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$EntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$HashEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$HashIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$HashMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$KeySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$ValuesIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$EntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$MapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$EntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$KeySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$ValuesIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractOrderedMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceEntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceEntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceKeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceKeySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceValues.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceValuesIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$SoftRef.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$WeakRef.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractSortedMapDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CaseInsensitiveMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CompositeMap$MapMutator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CompositeMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/DefaultedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/FixedSizeMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/FixedSizeSortedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$EntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$FlatMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$KeySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$ValuesIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/HashedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/IdentityMap$IdentityEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/IdentityMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LRUMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LazyMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LazySortedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LinkedMap$LinkedMapList.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LinkedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$EntrySetView.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$KeySetView$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$KeySetView.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedMapEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ValuesView$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ValuesView.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiKeyMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap$ReflectionFactory.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap$ValuesIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/PredicatedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/PredicatedSortedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ReferenceIdentityMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ReferenceMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap$SingletonMapIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap$SingletonValues.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$EntryIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$EntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$KeyIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$KeySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Lock.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Node.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$ValueIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Values.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TransformedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TransformedSortedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TypedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TypedSortedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableEntrySet$UnmodifiableEntry.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableEntrySet$UnmodifiableEntrySetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableEntrySet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableOrderedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableSortedMap.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/AbstractSerializableSetDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/AbstractSetDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/AbstractSortedSetDecorator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/CompositeSet$SetMutator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/CompositeSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet$1.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet$OrderedSetIterator.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/MapBackedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/PredicatedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/PredicatedSortedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/SynchronizedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/SynchronizedSortedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/TransformedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/TransformedSortedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/TypedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/TypedSortedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/UnmodifiableSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/UnmodifiableSortedSet.class delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ArrayStack.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Bag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BagUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BeanMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BinaryHeap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedFifoBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Buffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferOverflowException.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUnderflowException.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Closure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ClosureUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CollectionUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ComparatorUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CursorableLinkedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapEntry.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DoubleOrderedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/EnumerationUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ExtendedProperties.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Factory.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FactoryUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastArrayList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastHashMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastTreeMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FunctorException.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/HashBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IterableMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IteratorUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/KeyValue.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/LRUMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ListUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiHashMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Predicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PredicateUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PriorityQueue.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ProxyMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ReferenceMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SequencedHashMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SetUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/StaticBucketMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SynchronizedPriorityQueue.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Transformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TransformerUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TreeBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/UnboundedFifoBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Unmodifiable.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractBagDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractMapBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractSortedBagDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/HashBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedSortedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedSortedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedSortedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TreeBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedSortedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableSortedBag.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractDualBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualHashBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualTreeBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/TreeBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/AbstractBufferDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BlockingBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedFifoBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/CircularFifoBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PredicatedBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PriorityBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/SynchronizedBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TransformedBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TypedBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnboundedFifoBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnmodifiableBuffer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractCollectionDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractSerializableCollectionDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/CompositeCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/PredicatedCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/SynchronizedCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TransformedCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TypedCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableBoundedCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableCollection.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/BooleanComparator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparableComparator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparatorChain.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/FixedOrderComparator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/NullComparator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ReverseComparator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/TransformingComparator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AllPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AndPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AnyPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/CloneTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ClosureTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantFactory.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/EqualPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionFactory.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FactoryTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FalsePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ForClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FunctorUtils.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IdentityPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IfClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstanceofPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateFactory.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InvokerTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/MapTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NonePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotNullPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsExceptionPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsFalsePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsTruePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OnePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OrPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PrototypeFactory.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/StringValueTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchTransformer.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformedPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerPredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TruePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/UniquePredicate.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/WhileClosure.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractEmptyIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractIteratorDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractListIteratorDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractOrderedMapIteratorDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/CollatingIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyMapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EntrySetMapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EnumerationIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorChain.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorEnumeration.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ListIteratorWrapper.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectGraphIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ReverseListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/TransformIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UniqueFilterIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableListIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableMapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableOrderedMapIterator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractKeyValue.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntry.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultKeyValue.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultMapEntry.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/MultiKey.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/TiedMapEntry.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractLinkedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractListDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractSerializableListDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/CursorableLinkedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/FixedSizeList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/GrowthList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/LazyList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/NodeCachingLinkedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/PredicatedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SetUniqueList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SynchronizedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TransformedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TreeList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TypedList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/UnmodifiableList.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractHashedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractLinkedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractOrderedMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractReferenceMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractSortedMapDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CaseInsensitiveMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CompositeMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/DefaultedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeSortedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/Flat3Map.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/HashedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/IdentityMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LRUMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazyMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazySortedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LinkedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ListOrderedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiKeyMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiValueMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedSortedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceIdentityMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/SingletonMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/StaticBucketMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedSortedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedSortedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableEntrySet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableOrderedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableSortedMap.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/overview.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSerializableSetDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSetDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSortedSetDecorator.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/CompositeSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/ListOrderedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/MapBackedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSortedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSortedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSortedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSortedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSortedSet.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/package.html delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/JavaBeanWithApiDoc.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/PureJavaBean.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/branches/ComplexBranches.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/branches/NoBranches.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/branches/SimpleBranches.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AbstractClass.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AnonymousInnerClass.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/classes/ClassCounterEnum.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/classes/InnerClassTests.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Interface.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Test003.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/CommentedCode.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/org/foo/CommentedOutFile.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/complexity/InstanceAndStaticInitBlocks.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithComments.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithCommentsOnLineOfCode.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeader.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndBlankLines.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackage.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackageNoImports.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithVars.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithoutHeaderAndWithCComment.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/Constants.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/EmptyConstructor.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/InterfaceWithComments.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/MethodsWithOverrideAnnotation.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/foo/ClassWithPackageAndJavadocHeader.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test001.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test002.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithDifferentMethodSignatures.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithStaticMethods.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/methods/MethodWithAnonymousInnerClass.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNcloc.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithClassComment.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithHeader.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/packages/org/foo/SimpleBean.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/metrics/statements/NoStatements.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/rules/ClassWithSuppressWarningsAnnotation.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/rules/CommentedCode.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/rules/FileWithNOSONARTags.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/rules/FileWithoutNOSONARTags.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/rules/UndocumentedApi.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/AnnotationDefinition.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/InterfaceWithAnnotation.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/ClassWithOnlyComment.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/EmptyFileWithBlankLines.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/foo/ClassWithPackageImportsComment.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/CP1252Encoding.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/MacRomanEncoding.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/Utf8Encoding.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class1WithGenerics.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class2WithGenerics.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/gwt/JavaClassWithGWTNativeCode.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/packageInfo/org/apache/cxf/jaxrs/ext/logging/package-info.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/CheckstyleBug.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/LineCommentAtTheEndOfFile.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/UnicodeEscape.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/CommentedOutFile.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/GoodPackage.java delete mode 100644 plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/WrongPackage.java diff --git a/plugins/sonar-squid-java-plugin/infinitest.args b/plugins/sonar-squid-java-plugin/infinitest.args deleted file mode 100644 index ed9f41dadc7..00000000000 --- a/plugins/sonar-squid-java-plugin/infinitest.args +++ /dev/null @@ -1 +0,0 @@ --Djava.awt.headless=true \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/pom.xml b/plugins/sonar-squid-java-plugin/pom.xml deleted file mode 100644 index a768978dcb0..00000000000 --- a/plugins/sonar-squid-java-plugin/pom.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - 4.0.0 - - org.codehaus.sonar - sonar - 3.3-SNAPSHOT - ../.. - - org.codehaus.sonar.plugins - sonar-squid-java-plugin - sonar-plugin - Sonar :: Plugins :: Squid Java - Squid analyzer for Java. - - - true - - - - - org.codehaus.sonar - sonar-java-api - provided - - - org.codehaus.sonar - sonar-plugin-api - provided - - - org.codehaus.sonar - sonar-squid - provided - - - org.codehaus.sonar - sonar-graph - provided - - - asm - asm-all - 3.2 - - - com.puppycrawl.tools - checkstyle - 5.5 - - - commons-logging - commons-logging - - - com.google.collections - google-collections - - - - commons-cli - commons-cli - - - - commons-beanutils - commons-beanutils-core - - - - com.sun - tools - - - - - org.apache.maven - maven-project - provided - - - org.apache.maven - maven-artifact - provided - - - commons-io - commons-io - provided - - - - org.codehaus.sonar - sonar-testing-harness - test - - - - - - - org.codehaus.sonar - sonar-packaging-maven-plugin - - Squid for Java - org.sonar.plugins.squid.SquidPlugin - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-plugin-size - - enforce - - verify - - - - 1400000 - 1300000 - - ${project.build.directory}/${project.build.finalName}.jar - - - - - - - - - - diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java deleted file mode 100644 index 9f85634e748..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java; - -import org.apache.commons.lang.StringUtils; -import org.sonar.api.utils.WildcardPattern; - -public final class PatternUtils { - - private PatternUtils() { - } - - public static WildcardPattern[] createPatterns(String patterns) { - String[] p = StringUtils.split(patterns, ','); - WildcardPattern[] result = new WildcardPattern[p.length]; - for (int i = 0; i < result.length; i++) { - result[i] = WildcardPattern.create(StringUtils.trim(StringUtils.replace(p[i], ".", "/"))); - } - return result; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleAuditListener.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleAuditListener.java deleted file mode 100644 index e5ba9773775..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleAuditListener.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast; - -import org.sonar.squid.api.AnalysisException; - -import com.puppycrawl.tools.checkstyle.api.AuditEvent; -import com.puppycrawl.tools.checkstyle.api.AuditListener; - -class CheckstyleAuditListener implements AuditListener { - - /** - * {@inheritDoc} - */ - public void addError(AuditEvent evt) { - // some projects can have file parsing errors (tapestry for example) - // currently do not throw an error. - // see - // http://sourceforge.net/tracker/?func=detail&atid=397078&aid=1667137&group_id=29721 - if (evt.getMessage().contains("expecting EOF, found")) { - return; - } - throw new AnalysisException(evt.getMessage() + ", file : " + evt.getFileName() + ", line : " + evt.getLine()); - } - - /** - * {@inheritDoc} - */ - public void addException(AuditEvent evt, Throwable throwable) { - } - - /** - * {@inheritDoc} - */ - public void auditStarted(AuditEvent evt) { - } - - /** - * {@inheritDoc} - */ - public void auditFinished(AuditEvent evt) { - } - - /** - * {@inheritDoc} - */ - public void fileStarted(AuditEvent evt) { - } - - /** - * {@inheritDoc} - */ - public void fileFinished(AuditEvent evt) { - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridge.java deleted file mode 100644 index 901753b4ebc..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridge.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast; - -import com.puppycrawl.tools.checkstyle.api.Check; -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sonar.api.resources.InputFile; -import org.sonar.java.ast.visitor.JavaAstVisitor; -import org.sonar.squid.text.Source; - -/** - * Delegate from Checkstyle {@link Check} to {@link JavaAstVisitor}s. - */ -public class CheckstyleSquidBridge extends Check { - - private static Logger logger = LoggerFactory.getLogger(CheckstyleSquidBridge.class); - - private static CheckstyleSquidBridgeContext bridgeContext; - - /** - * @see CheckstyleSquidBridgeContext - */ - static void setContext(CheckstyleSquidBridgeContext context) { - bridgeContext = context; - } - - @Override - public int[] getDefaultTokens() { - return bridgeContext.getAllTokens(); - } - - @Override - public void beginTree(DetailAST ast) { - try { - String filename = getFileContents().getFilename(); - Source source = createSource(); - InputFile inputFile = bridgeContext.getInputFile(new java.io.File(filename)); - for (JavaAstVisitor visitor : bridgeContext.getVisitors()) { - visitor.setFileContents(getFileContents()); - visitor.setSource(source); - visitor.setInputFile(inputFile); - visitor.visitFile(ast); - } - } catch (RuntimeException e) { - logAndThrowException(e); - } - } - - private Source createSource() { - return new Source(getFileContents().getLines(), bridgeContext.getCodeRecognizer()); - } - - @Override - public void visitToken(DetailAST ast) { - try { - for (JavaAstVisitor visitor : bridgeContext.getVisitors()) { - if (visitor.getWantedTokens().contains(ast.getType())) { - visitor.visitToken(ast); - } - } - } catch (RuntimeException e) { - logAndThrowException(e); - } - } - - @Override - public void leaveToken(DetailAST ast) { - JavaAstVisitor[] visitors = bridgeContext.getVisitors(); - try { - for (int i = visitors.length - 1; i >= 0; i--) { - JavaAstVisitor visitor = visitors[i]; - if (visitor.getWantedTokens().contains(ast.getType())) { - visitor.leaveToken(ast); - } - } - } catch (RuntimeException e) { - logAndThrowException(e); - } - } - - @Override - public void finishTree(DetailAST ast) { - JavaAstVisitor[] visitors = bridgeContext.getVisitors(); - try { - for (int i = visitors.length - 1; i >= 0; i--) { - JavaAstVisitor visitor = visitors[i]; - visitor.leaveFile(ast); - } - } catch (RuntimeException e) { - logAndThrowException(e); - } - } - - private void logAndThrowException(RuntimeException e) { - logger.error("Squid Error occurs when analysing :" + getFileContents().getFilename(), e); - throw e; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridgeContext.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridgeContext.java deleted file mode 100644 index b550887374d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/CheckstyleSquidBridgeContext.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast; - -import com.google.common.collect.Maps; -import org.sonar.api.resources.InputFile; -import org.sonar.java.ast.visitor.JavaAstVisitor; -import org.sonar.java.recognizer.JavaFootprint; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.recognizer.CodeRecognizer; - -import java.io.File; -import java.util.*; - -/** - * This class helps to transfer additional information into {@link CheckstyleSquidBridge}. - * We forced to use static fields in {@link CheckstyleSquidBridge}, - * because it will be instantiated by Checkstyle, so there is no other way of communication. - */ -class CheckstyleSquidBridgeContext { - - private int[] allTokens; - private JavaAstVisitor[] visitors; - private CodeRecognizer codeRecognizer; - private Map inputFilesByPath = Maps.newHashMap(); - - public CheckstyleSquidBridgeContext setASTVisitors(List visitors) { - this.visitors = visitors.toArray(new JavaAstVisitor[visitors.size()]); - SortedSet sorter = new TreeSet(); - for (JavaAstVisitor visitor : visitors) { - sorter.addAll(visitor.getWantedTokens()); - allTokens = new int[sorter.size()]; - int i = 0; - for (Integer itSorted : sorter) { - allTokens[i++] = itSorted; - } - } - return this; - } - - public CheckstyleSquidBridgeContext setSquidConfiguration(JavaSquidConfiguration conf) { - codeRecognizer = new CodeRecognizer(conf.getCommentedCodeThreshold(), new JavaFootprint()); - return this; - } - - public CheckstyleSquidBridgeContext setInputFiles(Collection inputFiles) { - inputFilesByPath.clear(); - for (InputFile inputFile : inputFiles) { - inputFilesByPath.put(inputFile.getFile().getAbsoluteFile(), inputFile); - } - return this; - } - - public int[] getAllTokens() { - return allTokens; - } - - public InputFile getInputFile(File path) { - return inputFilesByPath.get(path); - } - - public CodeRecognizer getCodeRecognizer() { - return codeRecognizer; - } - - public JavaAstVisitor[] getVisitors() { - return visitors; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java deleted file mode 100644 index 7b6a50128de..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast; - -import com.google.common.collect.Lists; -import com.google.common.io.Closeables; -import com.puppycrawl.tools.checkstyle.Checker; -import com.puppycrawl.tools.checkstyle.ConfigurationLoader; -import com.puppycrawl.tools.checkstyle.PropertiesExpander; -import com.puppycrawl.tools.checkstyle.api.Configuration; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.filefilter.FileFilterUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.InputFileUtils; -import org.sonar.java.ast.visitor.*; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.api.AnalysisException; -import org.sonar.squid.api.CodeScanner; -import org.sonar.squid.api.CodeVisitor; -import org.sonar.squid.api.SourceCode; -import org.xml.sax.InputSource; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Stack; - -/** - * Squid uses Checkstyle to get an out-of-the-box java parser with AST generation and visitor pattern support. - */ -public class JavaAstScanner extends CodeScanner { - - private static final Logger LOG = LoggerFactory.getLogger(JavaAstScanner.class); - private JavaSquidConfiguration conf; - private SourceCode project; - - public JavaAstScanner(JavaSquidConfiguration conf, SourceCode project) { - this.conf = conf; - this.project = project; - } - - public JavaAstScanner scanDirectory(File javaSourceDirectory) { - List inputFiles = Lists.newArrayList(); - Collection files = FileUtils.listFiles(javaSourceDirectory, FileFilterUtils.fileFileFilter(), FileFilterUtils.directoryFileFilter()); - for (File file : files) { - inputFiles.add(InputFileUtils.create(javaSourceDirectory, file)); - } - return scanFiles(inputFiles); - } - - public JavaAstScanner scanFile(InputFile javaFile) { - return scanFiles(Arrays.asList(javaFile)); - } - - public JavaAstScanner scanFiles(Collection inputFiles) { - if (LOG.isDebugEnabled()) { - LOG.debug("----- Java sources analyzed by Squid:"); - for (InputFile inputFile : inputFiles) { - LOG.debug(inputFile.toString()); - } - LOG.debug("-----"); - } - - Stack resourcesStack = new Stack(); - resourcesStack.add(project); - for (JavaAstVisitor visitor : getVisitors()) { - visitor.setSourceCodeStack(resourcesStack); - } - - CheckstyleSquidBridgeContext bridgeContext = new CheckstyleSquidBridgeContext() - .setASTVisitors(getVisitors()) - .setSquidConfiguration(conf) - .setInputFiles(inputFiles); - - CheckstyleSquidBridge.setContext(bridgeContext); - try { - launchCheckstyle(InputFileUtils.toFiles(inputFiles), conf.getCharset()); - } finally { - // Garbage collector should be able to do his job, so we must clean context after execution - CheckstyleSquidBridge.setContext(null); - } - return this; - } - - private void launchCheckstyle(Collection files, Charset charset) { - Checker c = createChecker(charset); - ClassLoader initialClassLoader = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); - try { - c.setClassloader(getClass().getClassLoader()); - c.setModuleClassLoader(getClass().getClassLoader()); - c.process(Lists. newArrayList(files)); - c.destroy(); - } finally { - Thread.currentThread().setContextClassLoader(initialClassLoader); - } - } - - private Checker createChecker(Charset charset) { - String checkstyleConfig = loadCheckstyleConfigToString() - .replace("${charset}", charset.toString()); - try { - Configuration config = ConfigurationLoader.loadConfiguration( - new InputSource(new ByteArrayInputStream(checkstyleConfig.getBytes())), - new PropertiesExpander(System.getProperties()), - false); - Checker checker = new Checker(); - final ClassLoader moduleClassLoader = Checker.class.getClassLoader(); - checker.setModuleClassLoader(moduleClassLoader); - checker.configure(config); - checker.addListener(new CheckstyleAuditListener()); - return checker; - } catch (Exception e) { // NOSONAR We want to be sure to catch any unexpected exception - throw new AnalysisException("Unable to create Checkstyle Checker", e); - } - } - - private static String loadCheckstyleConfigToString() { - InputStream is = null; - try { - is = JavaAstScanner.class.getClassLoader().getResourceAsStream("checkstyle-configuration.xml"); - return IOUtils.toString(is); - } catch (IOException e) { - throw new AnalysisException("Unable to load Checkstyle configuration for Java Squid", e); - } finally { - Closeables.closeQuietly(is); - } - } - - @Override - public Collection> getVisitorClasses() { - List> visitorClasses = Lists.newArrayList(); - visitorClasses.add(PackageVisitor.class); - visitorClasses.add(FileVisitor.class); - visitorClasses.add(ClassVisitor.class); - visitorClasses.add(AnonymousInnerClassVisitor.class); - visitorClasses.add(MethodVisitor.class); - visitorClasses.add(EndAtLineVisitor.class); - visitorClasses.add(LinesVisitor.class); - visitorClasses.add(BlankLinesVisitor.class); - visitorClasses.add(CommentVisitor.class); - visitorClasses.add(PublicApiVisitor.class); - visitorClasses.add(BranchVisitor.class); - visitorClasses.add(StatementVisitor.class); - if (conf.isAnalysePropertyAccessors()) { - visitorClasses.add(AccessorVisitor.class); - } - visitorClasses.add(ComplexityVisitor.class); - visitorClasses.add(LinesOfCodeVisitor.class); - visitorClasses.add(FileLinesVisitor.class); - return visitorClasses; - } - - @Override - public void accept(CodeVisitor visitor) { - if (visitor instanceof JavaAstVisitor) { - super.accept(visitor); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java deleted file mode 100644 index c7f7d2f1901..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.check; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.java.ast.visitor.AstUtils; -import org.sonar.java.ast.visitor.JavaAstVisitor; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; - -import java.util.Arrays; -import java.util.List; - -@Rule(key = "AvoidBreakOutsideSwitch", priority = Priority.MAJOR) -public class BreakCheck extends JavaAstVisitor { - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - if (AstUtils.findParent(ast, TokenTypes.LITERAL_SWITCH) == null) { - CheckMessage message = new CheckMessage(this, - "The 'break' branching statement prevents refactoring the source code to reduce the complexity."); - message.setLine(ast.getLineNo()); - SourceFile sourceFile = peekSourceCode().getParent(SourceFile.class); - sourceFile.log(message); - } - } - - private static final List WANTED_TOKENS = Arrays.asList(TokenTypes.LITERAL_BREAK); - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/CommentedOutCodeLineCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/CommentedOutCodeLineCheck.java deleted file mode 100644 index be273ded716..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/CommentedOutCodeLineCheck.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.check; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TextBlock; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; -import org.apache.commons.lang.StringUtils; -import org.sonar.check.BelongsToProfile; -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.java.ast.visitor.AstUtils; -import org.sonar.java.ast.visitor.JavaAstVisitor; -import org.sonar.java.recognizer.JavaFootprint; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.recognizer.CodeRecognizer; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -/** - * @since 2.13 - */ -@Rule(key = "CommentedOutCodeLine", priority = Priority.MAJOR) -@BelongsToProfile(title = "Sonar way", priority = Priority.MAJOR) -public class CommentedOutCodeLineCheck extends JavaAstVisitor { - - private static final double THRESHOLD = 0.9; - - /** - * This list was taken from com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocStyleCheck - */ - private static final List WANTED_TOKENS = Arrays.asList( - TokenTypes.INTERFACE_DEF, - TokenTypes.CLASS_DEF, - TokenTypes.ANNOTATION_DEF, - TokenTypes.ENUM_DEF, - TokenTypes.METHOD_DEF, - TokenTypes.CTOR_DEF, - TokenTypes.VARIABLE_DEF, - TokenTypes.ENUM_CONSTANT_DEF, - TokenTypes.ANNOTATION_FIELD_DEF, - TokenTypes.PACKAGE_DEF); - - private final CodeRecognizer codeRecognizer; - private Set comments; - - public CommentedOutCodeLineCheck() { - codeRecognizer = new CodeRecognizer(THRESHOLD, new JavaFootprint()); - } - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - /** - * Creates candidates for commented-out code - all comment blocks. - */ - @Override - public void visitFile(DetailAST ast) { - comments = Sets.newHashSet(); - for (TextBlock comment : getFileContents().getCppComments().values()) { - comments.add(comment); - } - for (List listOfComments : getFileContents().getCComments().values()) { - // This list contains not only comments in C style, but also documentation comments and JSNI comments - for (TextBlock comment : listOfComments) { - if (!isHeader(comment)) { - comments.addAll(listOfComments); - } - } - } - } - - /** - * We assume that comment on a first line - is a header with license. - * However possible to imagine corner case: file may contain commented-out code starting from first line. - * But we assume that probability of this is really low. - */ - private static boolean isHeader(TextBlock comment) { - return comment.getStartLineNo() == 1; - } - - /** - * Removes documentation comments and JSNI comments from candidates for commented-out code in order to prevent false-positives. - */ - @Override - public void visitToken(DetailAST ast) { - if (canBeDocumented(ast)) { - TextBlock javadoc = getFileContents().getJavadocBefore(ast.getLineNo()); - if (javadoc != null) { - comments.remove(javadoc); - } - } - removeJSNIComments(ast); - } - - /** - * From documentation for Javadoc-tool: - * Documentation comments should be recognized only when placed - * immediately before class, interface, constructor, method, or field declarations. - */ - private static boolean canBeDocumented(DetailAST ast) { - if (AstUtils.isType(ast, TokenTypes.VARIABLE_DEF)) { - return AstUtils.isClassVariable(ast); - } - return true; - } - - /** - * Detects commented-out code in remaining candidates. - */ - @Override - public void leaveFile(DetailAST ast) { - List commentedOutCodeLines = Lists.newArrayList(); - for (TextBlock comment : comments) { - String[] lines = comment.getText(); - for (int i = 0; i < lines.length; i++) { - if (codeRecognizer.isLineOfCode(lines[i])) { - // Mark all remaining lines from this comment as a commented out lines of code - for (int j = i; j < lines.length; j++) { - commentedOutCodeLines.add(comment.getStartLineNo() + j); - } - break; - } - } - } - - // Greedy algorithm to split lines on blocks and to report only one violation per block - SourceFile sourceFile = (SourceFile) peekSourceCode(); - Collections.sort(commentedOutCodeLines); - int prev = Integer.MIN_VALUE; - for (int i = 0; i < commentedOutCodeLines.size(); i++) { - int current = commentedOutCodeLines.get(i); - if (prev + 1 < current) { - CheckMessage message = new CheckMessage(this, "This block of commented-out lines of code should be removed."); - message.setLine(current); - sourceFile.log(message); - } - prev = current; - } - - comments = null; - } - - /** - * From GWT documentation: - * JSNI methods are declared native and contain JavaScript code in a specially formatted comment block - * between the end of the parameter list and the trailing semicolon. - * A JSNI comment block begins with the exact token {@link #START_JSNI} and ends with the exact token {@link #END_JSNI}. - */ - private void removeJSNIComments(DetailAST ast) { - if (AstUtils.isType(ast, TokenTypes.METHOD_DEF) && AstUtils.isModifier(ast, TokenTypes.LITERAL_NATIVE)) { - DetailAST endOfParameterList = ast.findFirstToken(TokenTypes.PARAMETERS).getNextSibling(); - DetailAST trailingSemicolon = ast.getLastChild(); - - for (int lineNumber = endOfParameterList.getLineNo(); lineNumber <= trailingSemicolon.getLineNo(); lineNumber++) { - List listOfComments = getFileContents().getCComments().get(lineNumber); - if (listOfComments != null) { - for (TextBlock comment : listOfComments) { - if (isJSNI(comment) && isCommentBetween(comment, endOfParameterList, trailingSemicolon)) { - comments.remove(comment); - } - } - } - } - } - } - - private static boolean isCommentBetween(TextBlock comment, DetailAST start, DetailAST end) { - return comment.intersects(start.getLineNo(), start.getColumnNo(), end.getLineNo(), end.getColumnNo()); - } - - private static final String START_JSNI = "/*-{"; - private static final String END_JSNI = "}-*/"; - - private boolean isJSNI(TextBlock comment) { - String[] lines = comment.getText(); - String firstLine = lines[0]; - String lastLine = lines[lines.length - 1]; - return StringUtils.startsWith(firstLine, START_JSNI) && StringUtils.endsWith(lastLine, END_JSNI); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java deleted file mode 100644 index ff3f888685b..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.check; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.java.ast.visitor.JavaAstVisitor; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; - -import java.util.Arrays; -import java.util.List; - -@Rule(key = "AvoidContinueStatement", priority = Priority.MAJOR) -public class ContinueCheck extends JavaAstVisitor { - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - SourceCode currentResource = peekSourceCode(); - CheckMessage message = new CheckMessage(this, - "The 'continue' branching statement prevent refactoring the source code to reduce the complexity."); - message.setLine(ast.getLineNo()); - SourceFile sourceFile = currentResource.getParent(SourceFile.class); - sourceFile.log(message); - } - - private static final List WANTED_TOKENS = Arrays.asList(TokenTypes.LITERAL_CONTINUE); - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java deleted file mode 100644 index 520d6c246f0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.check; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.utils.WildcardPattern; -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.check.RuleProperty; -import org.sonar.java.PatternUtils; -import org.sonar.java.ast.visitor.JavaAstVisitor; -import org.sonar.java.ast.visitor.PublicApiVisitor; -import org.sonar.squid.api.*; - -import java.util.List; - -@Rule(key = "UndocumentedApi", priority = Priority.MAJOR) -public class UndocumentedApiCheck extends JavaAstVisitor { - - @RuleProperty - private String forClasses = ""; - - private WildcardPattern[] patterns; - - @Override - public List getWantedTokens() { - return PublicApiVisitor.TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - SourceCode currentResource = peekSourceCode(); - SourceClass sourceClass = peekParentClass(); - if (WildcardPattern.match(getPatterns(), sourceClass.getKey())) { - if (currentResource instanceof SourceMethod && ((SourceMethod) currentResource).isAccessor()) { - return; - } - - if (PublicApiVisitor.isPublicApi(ast) && !PublicApiVisitor.isDocumentedApi(ast, getFileContents())) { - SourceFile sourceFile = currentResource.getParent(SourceFile.class); - CheckMessage message = new CheckMessage(this, "Avoid undocumented API."); - message.setLine(ast.getLineNo()); - sourceFile.log(message); - } - } - } - - private WildcardPattern[] getPatterns() { - if (patterns == null) { - patterns = PatternUtils.createPatterns(StringUtils.defaultIfEmpty(forClasses, "**")); - } - return patterns; - } - - public String getForClasses() { - return forClasses; - } - - public void setForClasses(String forClasses) { - this.forClasses = forClasses; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AccessorVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AccessorVisitor.java deleted file mode 100644 index 8509dcf3195..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AccessorVisitor.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.measures.Metric; - -import antlr.collections.AST; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.Scope; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class AccessorVisitor extends JavaAstVisitor { - - private static final List TOKENS = Arrays.asList(TokenTypes.METHOD_DEF); - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST methodAst) { - SourceCode currentMethod = peekSourceCode(); - AstUtils.ensureResourceType(currentMethod, SourceMethod.class); - Scope methodScope = AstUtils.getScope(methodAst); - if (AstUtils.isScope(methodScope, Scope.PUBLIC) && isAccessor(methodAst, currentMethod.getName())) { - currentMethod.setMeasure(Metric.ACCESSORS, 1); - } - } - - @Override - public void leaveToken(DetailAST ast) { - SourceMethod currentMethod = (SourceMethod) peekSourceCode(); - if (currentMethod.isAccessor()) { - currentMethod.setMeasure(Metric.PUBLIC_API, 0); - currentMethod.setMeasure(Metric.PUBLIC_DOC_API, 0); - currentMethod.setMeasure(Metric.METHODS, 0); - currentMethod.setMeasure(Metric.COMPLEXITY, 0); - } - } - - private boolean isAccessor(DetailAST methodAst, String methodName) { - boolean methodWithoutParams = isMethodWithoutParameters(methodAst); - return isValidGetter(methodAst, methodName, methodWithoutParams) || isValidSetter(methodAst, methodName, methodWithoutParams) - || isValidBooleanGetter(methodAst, methodName, methodWithoutParams); - } - - private boolean isMethodWithoutParameters(DetailAST methodAst) { - return methodAst.findFirstToken(TokenTypes.PARAMETERS).getChildCount() == 0; - } - - private boolean isValidBooleanGetter(DetailAST method, String methodName, boolean methodWithoutParams) { - if (methodName.startsWith("is") && methodWithoutParams) { - AST type = AstUtils.findType(method); - if (isAstType(type, TokenTypes.LITERAL_BOOLEAN)) { - return isValidGetter(method, methodName.replace("is", "get"), methodWithoutParams); - } - } - return false; - } - - private boolean isValidSetter(DetailAST method, String methodName, boolean methodWithoutParams) { - if (methodName.startsWith("set") && !methodWithoutParams) { - AST type = AstUtils.findType(method); - if (isVoidMethodReturn(type)) { - DetailAST methodParams = method.findFirstToken(TokenTypes.PARAMETERS); - if (methodParams.getChildCount(TokenTypes.PARAMETER_DEF) == 1) { - DetailAST methodBody = method.getLastChild(); - if (isAstType(methodBody, TokenTypes.SLIST) && methodBody.getChildCount() == 3) { - return inspectSetterMethodBody(method, methodParams, methodBody); - } - } - } - } - return false; - } - - private boolean isValidGetter(DetailAST method, String methodName, boolean methodWithoutParams) { - if (methodName.startsWith("get") && methodWithoutParams) { - AST type = AstUtils.findType(method); - if (!isVoidMethodReturn(type)) { - DetailAST methodBody = method.getLastChild(); - if (isAstType(methodBody, TokenTypes.SLIST) && methodBody.getChildCount() == 2) { - return inspectGetterMethodBody(method, methodBody); - } - } - } - return false; - } - - private boolean inspectGetterMethodBody(DetailAST method, DetailAST methodBody) { - AST returnAST = methodBody.getFirstChild(); - if (isAstType(returnAST, TokenTypes.LITERAL_RETURN)) { - AST expr = returnAST.getFirstChild(); - if (isAstType(expr, TokenTypes.EXPR) && isAstType(expr.getNextSibling(), TokenTypes.SEMI)) { - AST varReturned = expr.getFirstChild(); - if (isAstType(varReturned, TokenTypes.IDENT)) { - return findPrivateClassVariable(method, varReturned.getText()); - } - } - } - return false; - } - - private boolean inspectSetterMethodBody(DetailAST method, DetailAST methodParams, DetailAST methodBody) { - DetailAST expr = methodBody.getFirstChild(); - if (isAstType(expr, TokenTypes.EXPR)) { - DetailAST assignment = expr.findFirstToken(TokenTypes.ASSIGN); - if (assignment != null) { - DetailAST dotAst = assignment.findFirstToken(TokenTypes.DOT); - DetailAST varAssigned = assignment.getLastChild(); - DetailAST varAssignedMethodParam = methodParams.findFirstToken(TokenTypes.PARAMETER_DEF).findFirstToken(TokenTypes.IDENT); - // check that the var assigned is the var from the method param - if (isAstType(varAssigned, TokenTypes.IDENT) && varAssigned.getText().equals(varAssignedMethodParam.getText())) { - DetailAST varToAssign = dotAst != null ? dotAst.findFirstToken(TokenTypes.IDENT) : assignment.findFirstToken(TokenTypes.IDENT); - return findPrivateClassVariable(method, varToAssign.getText()); - } - } - } - return false; - } - - private boolean findPrivateClassVariable(DetailAST method, String varName) { - DetailAST objBlock = AstUtils.findParent(method, TokenTypes.OBJBLOCK); - for (AST i = objBlock.getFirstChild(); i != null; i = i.getNextSibling()) { - if (isAstType(i, TokenTypes.VARIABLE_DEF)) { - DetailAST varDef = (DetailAST) i; - if (AstUtils.isScope(AstUtils.getScope(varDef), Scope.PRIVATE) - && varDef.findFirstToken(TokenTypes.IDENT).getText().equals(varName)) { - return true; - } - } - } - return false; - } - - private boolean isVoidMethodReturn(AST type) { - return isAstType(type, TokenTypes.LITERAL_VOID); - } - - private boolean isAstType(AST ast, int type) { - return ast.getType() == type; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitor.java deleted file mode 100644 index a14c6b79411..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitor.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class AnonymousInnerClassVisitor extends JavaAstVisitor { - - private static final List TOKENS = Arrays.asList(TokenTypes.OBJBLOCK); - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - if (!AstUtils.isClass((ast.getParent()))) { - int anonymousInnerClassNo = determineAnonymousInnerClassNo(peekParentClass()); - String anonymousInnerClassName = peekParentClass().getName() + "$" + anonymousInnerClassNo; - String anonymousInnerClassKey = peekParentClass().getKey() + "$" + anonymousInnerClassNo; - SourceClass anonymousInnerClass = new SourceClass(anonymousInnerClassKey, anonymousInnerClassName); - anonymousInnerClass.setStartAtLine(ast.getLineNo()); - anonymousInnerClass.setMeasure(Metric.ANONYMOUS_INNER_CLASSES, 1); - addSourceCode(anonymousInnerClass); - } - - } - - private int determineAnonymousInnerClassNo(SourceClass parentClass) { - int anonymousInnerClassNo = 1; - while (true) { - SourceClass anonymousInnerClass = new SourceClass(parentClass.getKey() + "$" + anonymousInnerClassNo); - if (!parentClass.hasChild(anonymousInnerClass)) { - return anonymousInnerClassNo; - } - anonymousInnerClassNo++; - } - } - - @Override - public void leaveToken(DetailAST ast) { - if (!AstUtils.isClass(ast.getParent())) { - popSourceCode(); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AstUtils.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AstUtils.java deleted file mode 100644 index 2201ba247e0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/AstUtils.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import org.sonar.squid.api.AnalysisException; -import org.sonar.squid.api.SourceCode; - -import antlr.collections.AST; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.Scope; -import com.puppycrawl.tools.checkstyle.api.ScopeUtils; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public final class AstUtils { - - private AstUtils() { - } - - public static AST findType(DetailAST ast) { - DetailAST typeAst = ast.findFirstToken(TokenTypes.TYPE); - if (typeAst != null) { - return typeAst.getFirstChild(); - } - return null; - } - - public static boolean isClassVariable(DetailAST ast) { - return ast.getType() == TokenTypes.VARIABLE_DEF && ast.getParent().getType() == TokenTypes.OBJBLOCK - && isClass(ast.getParent().getParent()); - } - - public static boolean isClass(DetailAST ast) { - return ast.getType() == TokenTypes.CLASS_DEF || ast.getType() == TokenTypes.ENUM_DEF || ast.getType() == TokenTypes.ANNOTATION_DEF - || ast.getType() == TokenTypes.INTERFACE_DEF; - } - - public static boolean isInterfaceVariable(DetailAST ast) { - return ast.getType() == TokenTypes.VARIABLE_DEF && ast.getParent().getType() == TokenTypes.OBJBLOCK - && isInterface(ast.getParent().getParent()); - } - - public static boolean isInterface(DetailAST ast) { - return ast.getType() == TokenTypes.INTERFACE_DEF; - } - - public static boolean isFinal(DetailAST detailAst) { - return isModifier(detailAst, TokenTypes.FINAL); - } - - public static boolean isStatic(DetailAST detailAst) { - return isModifier(detailAst, TokenTypes.LITERAL_STATIC); - } - - public static boolean isModifier(DetailAST detailAst, int modifierType) { - DetailAST modifiers = detailAst.findFirstToken(TokenTypes.MODIFIERS); - if (modifiers != null) { - boolean isModifierMatching = modifiers.branchContains(modifierType); - if (!isModifierMatching && isInterfaceVariable(detailAst)) { - // by default if not specified, a var def in an interface is - // public final static - return (modifierType == TokenTypes.LITERAL_STATIC || modifierType == TokenTypes.FINAL); - } - return isModifierMatching; - } - return false; - } - - public static Scope getScope(DetailAST ast) { - DetailAST modifierAst = ast.findFirstToken(TokenTypes.MODIFIERS); - Scope found = modifierAst != null ? ScopeUtils.getScopeFromMods(modifierAst) : Scope.NOTHING; - if (found.compareTo(Scope.PACKAGE) == 0 && (ast.getType() == TokenTypes.METHOD_DEF || ast.getType() == TokenTypes.VARIABLE_DEF)) { - // check if we found a parent interface declaration - // interface methods or var defs are by default public when not - // specified - found = (isScope(Scope.PACKAGE, found) && findParent(ast, TokenTypes.INTERFACE_DEF) != null) ? Scope.PUBLIC : found; - } - return found; - } - - public static boolean isScope(Scope toCompare, Scope scope) { - return scope.compareTo(toCompare) == 0; - } - - public static boolean isType(DetailAST ast, int type) { - return ast.getType() == type; - } - - public static DetailAST findParent(DetailAST ast, int tokenType) { - DetailAST parent = ast.getParent(); - if (parent != null) { - return parent.getType() == tokenType ? parent : findParent(parent, tokenType); - } - return null; - } - - public static void ensureResourceType(SourceCode resource, Class resourceType) { - if (!resource.isType(resourceType)) { - throw new AnalysisException("Resource " + resource.getKey() + " must be of type " + resourceType.getName()); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BlankLinesVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BlankLinesVisitor.java deleted file mode 100644 index e07d94e6f0c..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BlankLinesVisitor.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class BlankLinesVisitor extends JavaAstVisitor { - - private static final List TOKENS = Arrays.asList(TokenTypes.RCURLY); - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - int blankLines = getSource().getMeasure(Metric.BLANK_LINES, peekSourceCode().getStartAtLine(), peekSourceCode().getEndAtLine()); - peekSourceCode().setMeasure(Metric.BLANK_LINES, blankLines); - } - - @Override - public void visitFile(DetailAST ast) { - int blankLines = getSource().getMeasure(Metric.BLANK_LINES); - peekSourceCode().setMeasure(Metric.BLANK_LINES, blankLines); - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BranchVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BranchVisitor.java deleted file mode 100644 index b6847f99246..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/BranchVisitor.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class BranchVisitor extends JavaAstVisitor { - - private static final List TOKENS = Arrays.asList(TokenTypes.LITERAL_WHILE, TokenTypes.LITERAL_DO, TokenTypes.LITERAL_FOR, - TokenTypes.LITERAL_IF, TokenTypes.LITERAL_CASE, TokenTypes.LITERAL_CATCH, - TokenTypes.QUESTION, TokenTypes.LAND, TokenTypes.LOR, TokenTypes.LITERAL_THROW, - TokenTypes.LITERAL_RETURN); - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - if (isLastMethodReturnStatement(ast)) { - return; - } - peekSourceCode().add(Metric.BRANCHES, 1); - } - - private boolean isLastMethodReturnStatement(DetailAST ast) { - if (ast.getType() == TokenTypes.LITERAL_RETURN) { - DetailAST parent = ast.getParent(); - if (parent.getType() == TokenTypes.SLIST) { - DetailAST method = AstUtils.findParent(ast, TokenTypes.METHOD_DEF); - if (method != null && method.findFirstToken(TokenTypes.SLIST) == parent) { - return true; - } - } - } - return false; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ClassVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ClassVisitor.java deleted file mode 100644 index db72a95698e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ClassVisitor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class ClassVisitor extends JavaAstVisitor { - - public static final List WANTED_TOKENS = Arrays.asList(TokenTypes.CLASS_DEF, TokenTypes.INTERFACE_DEF, TokenTypes.ENUM_DEF, - TokenTypes.ANNOTATION_DEF); - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - String className = ast.findFirstToken(TokenTypes.IDENT).getText(); - SourceClass unit; - if (peekSourceCode().isType(SourceClass.class)) { - unit = createSourceClass((SourceClass) peekSourceCode(), className); - } else { - unit = createSourceClass(peekParentPackage(), className); - } - addSourceCode(unit); - unit.setStartAtLine(ast.getLineNo()); - unit.setMeasure(Metric.CLASSES, 1); - if (isInterface(ast.getType())) { - unit.setMeasure(Metric.INTERFACES, 1); - } - if (isAbstract(ast)) { - unit.setMeasure(Metric.ABSTRACT_CLASSES, 1); - } - unit.setSuppressWarnings(SuppressWarningsAnnotationUtils.isSuppressAllWarnings(ast)); - } - - @Override - public void leaveToken(DetailAST ast) { - popSourceCode(); - } - - private boolean isAbstract(DetailAST ast) { - final DetailAST abstractAST = ast.findFirstToken(TokenTypes.MODIFIERS).findFirstToken(TokenTypes.ABSTRACT); - return abstractAST != null; - } - - private boolean isInterface(int type) { - return type == TokenTypes.INTERFACE_DEF; - } - - static SourceClass createSourceClass(SourcePackage parentPackage, String className) { - StringBuilder key = new StringBuilder(); - if (parentPackage != null && !"".equals(parentPackage.getKey())) { - key.append(parentPackage.getKey()); - key.append("/"); - } - key.append(className); - return new SourceClass(key.toString(), className); - } - - static SourceClass createSourceClass(SourceClass parentClass, String innerClassName) { - return new SourceClass(parentClass.getKey() + "$" + innerClassName, innerClassName); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/CommentVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/CommentVisitor.java deleted file mode 100644 index 5c6a6e75202..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/CommentVisitor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -/** - * SONAR-3093: Note that this visitor saves {@link Metric#COMMENT_LINES} into {@link org.sonar.squid.api.SourceCode} - * as sum of {@link Metric#COMMENT_LINES} and {@link Metric#COMMENTED_OUT_CODE_LINES} from {@link org.sonar.squid.test.Source}. - */ -public class CommentVisitor extends JavaAstVisitor { - - private static final List WANTED_TOKENS = Arrays.asList(TokenTypes.RCURLY); - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - int startAtLine = peekSourceCode().getStartAtLine(); - int endAtLine = peekSourceCode().getEndAtLine(); - int commentedOutCodeLines = getSource().getMeasure(Metric.COMMENTED_OUT_CODE_LINES, startAtLine, endAtLine); - int commentLines = getSource().getMeasure(Metric.COMMENT_LINES, startAtLine, endAtLine); - peekSourceCode().setMeasure(Metric.COMMENTED_OUT_CODE_LINES, commentedOutCodeLines); - peekSourceCode().setMeasure(Metric.COMMENT_LINES, commentLines + commentedOutCodeLines); - peekSourceCode().setMeasure(Metric.COMMENT_BLANK_LINES, getSource().getMeasure(Metric.COMMENT_BLANK_LINES, startAtLine, endAtLine)); - } - - @Override - public void visitFile(DetailAST ast) { - SourceFile file = (SourceFile) peekSourceCode(); - file.addNoSonarTagLines(getSource().getNoSonarTagLines()); - file.setMeasure(Metric.HEADER_COMMENT_LINES, getSource().getMeasure(Metric.HEADER_COMMENT_LINES)); - int commentedOutCodeLines = getSource().getMeasure(Metric.COMMENTED_OUT_CODE_LINES); - int commentLines = getSource().getMeasure(Metric.COMMENT_LINES); - file.setMeasure(Metric.COMMENTED_OUT_CODE_LINES, commentedOutCodeLines); - file.setMeasure(Metric.COMMENT_LINES, commentLines + commentedOutCodeLines); - file.setMeasure(Metric.COMMENT_BLANK_LINES, getSource().getMeasure(Metric.COMMENT_BLANK_LINES)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ComplexityVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ComplexityVisitor.java deleted file mode 100644 index 3797257831e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/ComplexityVisitor.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class ComplexityVisitor extends JavaAstVisitor { - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void leaveToken(DetailAST ast) { - SourceCode res = peekSourceCode(); - res.setMeasure(Metric.COMPLEXITY, res.getInt(Metric.COMPLEXITY) + res.getInt(Metric.BRANCHES) + 1); - } - - private static final List WANTED_TOKENS = Arrays.asList(TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF, TokenTypes.INSTANCE_INIT, - TokenTypes.STATIC_INIT); -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/EndAtLineVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/EndAtLineVisitor.java deleted file mode 100644 index 8c24f17b073..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/EndAtLineVisitor.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class EndAtLineVisitor extends JavaAstVisitor { - - private static final List TOKENS = Arrays.asList(TokenTypes.RCURLY); - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - peekSourceCode().setEndAtLine(ast.getLineNo()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileLinesVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileLinesVisitor.java deleted file mode 100644 index 60ace8723ea..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileLinesVisitor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.FileLinesContext; -import org.sonar.plugins.squid.SonarAccessor; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; -import org.sonar.squid.text.Source; - -/** - * Saves information about lines directly into Sonar index by using {@link FileLinesContext}. - */ -public class FileLinesVisitor extends JavaAstVisitor { - - private final SonarAccessor sonarAccessor; - - /** - * Default constructor for case when {@link SonarAccessor} not available. - */ - public FileLinesVisitor() { - this.sonarAccessor = null; - } - - public FileLinesVisitor(SonarAccessor sonarAccessor) { - this.sonarAccessor = sonarAccessor; - } - - @Override - public void visitFile(DetailAST ast) { - if (sonarAccessor != null) { - processFile(); - } - } - - private void processFile() { - SourceFile file = (SourceFile) peekSourceCode(); - FileLinesContext measures = sonarAccessor.createFileLinesContext(file); - - Source source = getSource(); - for (int line = 1; line <= source.getNumberOfLines(); line++) { - int lineOfCode = source.getMeasure(Metric.LINES_OF_CODE, line, line); - measures.setIntValue(CoreMetrics.NCLOC_DATA_KEY, line, lineOfCode); - - int comment = source.getMeasure(Metric.COMMENT_LINES, line, line); - measures.setIntValue(CoreMetrics.COMMENT_LINES_DATA_KEY, line, comment); - } - measures.save(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileVisitor.java deleted file mode 100644 index d889f0d84dd..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/FileVisitor.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; - -public class FileVisitor extends JavaAstVisitor { - - @Override - public void visitFile(DetailAST ast) { - String fileName = extractFileNameFromFilePath(getFileContents().getFilename()); - SourceFile sourceFile = createSourceFile(peekParentPackage(), fileName); - sourceFile.setMeasure(Metric.FILES, 1); - addSourceCode(sourceFile); - } - - @Override - public void leaveFile(DetailAST ast) { - popSourceCode(); - } - - static String extractFileNameFromFilePath(String filePath) { - int lastIndexOfSlashOrBackSlashChar = filePath.lastIndexOf('/'); - if (lastIndexOfSlashOrBackSlashChar != -1) { - return filePath.substring(lastIndexOfSlashOrBackSlashChar + 1); - } - lastIndexOfSlashOrBackSlashChar = filePath.lastIndexOf('\\'); - if (lastIndexOfSlashOrBackSlashChar != -1) { - return filePath.substring(lastIndexOfSlashOrBackSlashChar + 1); - } - return filePath; - } - - static SourceFile createSourceFile(SourcePackage parentPackage, String fileName) { - StringBuilder key = new StringBuilder(); - if (parentPackage != null && !"".equals(parentPackage.getKey())) { - key.append(parentPackage.getKey()); - key.append("/"); - } - key.append(fileName); - return new SourceFile(key.toString(), fileName); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/JavaAstVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/JavaAstVisitor.java deleted file mode 100644 index 043ec1eb82a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/JavaAstVisitor.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.FileContents; -import org.sonar.api.resources.InputFile; -import org.sonar.squid.api.CodeVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.text.Source; - -import java.util.Collections; -import java.util.List; -import java.util.Stack; - -public abstract class JavaAstVisitor implements CodeVisitor { - - private Stack sourceCodeStack; - - private FileContents fileContents; - - private InputFile inputFile; - - private Source source; - - public final void setFileContents(FileContents fileContents) { - this.fileContents = fileContents; - } - - public final FileContents getFileContents() { - return fileContents; - } - - public final void setSource(Source source) { - this.source = source; - } - - public final InputFile getInputFile() { - return inputFile; - } - - public final void setInputFile(InputFile inputFile) { - this.inputFile = inputFile; - } - - final Source getSource() { - return source; - } - - public List getWantedTokens() { - return Collections.emptyList(); - } - - public final void setSourceCodeStack(Stack sourceCodeStack) { - this.sourceCodeStack = sourceCodeStack; - } - - public final void addSourceCode(SourceCode child) { - peekSourceCode().addChild(child); - sourceCodeStack.add(child); - } - - public final void popSourceCode() { - sourceCodeStack.pop(); - } - - public final SourceCode peekSourceCode() { - return sourceCodeStack.peek(); - } - - public final SourcePackage peekParentPackage() { - if (peekSourceCode().getClass().equals(SourcePackage.class)) { - return (SourcePackage) peekSourceCode(); - } - return peekSourceCode().getParent(SourcePackage.class); - } - - public final SourceClass peekParentClass() { - if (peekSourceCode().getClass().equals(SourceClass.class)) { - return (SourceClass) peekSourceCode(); - } - return peekSourceCode().getParent(SourceClass.class); - } - - public void visitFile(DetailAST ast) { - } - - public void visitToken(DetailAST ast) { - } - - public void leaveToken(DetailAST ast) { - } - - public void leaveFile(DetailAST ast) { - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesOfCodeVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesOfCodeVisitor.java deleted file mode 100644 index b8d0e0a7e82..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesOfCodeVisitor.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class LinesOfCodeVisitor extends JavaAstVisitor { - - private static final List TOKENS = Arrays.asList(TokenTypes.RCURLY); - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - int linesOfCode = getSource().getMeasure(Metric.LINES_OF_CODE, peekSourceCode().getStartAtLine(), peekSourceCode().getEndAtLine()); - peekSourceCode().setMeasure(Metric.LINES_OF_CODE, linesOfCode); - } - - @Override - public void leaveFile(DetailAST ast) { - int linesOfCode = getSource().getMeasure(Metric.LINES_OF_CODE); - peekSourceCode().setMeasure(Metric.LINES_OF_CODE, linesOfCode); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesVisitor.java deleted file mode 100644 index b366bc5046b..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/LinesVisitor.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class LinesVisitor extends JavaAstVisitor { - - private static final List WANTED_TOKENS = Arrays.asList(TokenTypes.RCURLY); - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - int lines = getSource().getMeasure(Metric.LINES, peekSourceCode().getStartAtLine(), peekSourceCode().getEndAtLine()); - peekSourceCode().setMeasure(Metric.LINES, lines); - } - - @Override - public void visitFile(DetailAST ast) { - int lines = getSource().getMeasure(Metric.LINES); - peekSourceCode().setMeasure(Metric.LINES, lines); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java deleted file mode 100644 index 82abad51099..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.*; - -import org.sonar.java.signature.JvmJavaType; -import org.sonar.java.signature.MethodSignature; -import org.sonar.java.signature.MethodSignaturePrinter; -import org.sonar.java.signature.Parameter; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.measures.Metric; - -import antlr.collections.AST; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class MethodVisitor extends JavaAstVisitor { - - private static final String CONSTRUCTOR = ""; - - public static final List WANTED_TOKENS = Arrays.asList(TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF); - private static final Map TOKEN_JAVA_TYPE_MAPPING = new HashMap(); - - static { - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_BYTE, JvmJavaType.B); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_CHAR, JvmJavaType.C); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_SHORT, JvmJavaType.S); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_INT, JvmJavaType.I); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_LONG, JvmJavaType.J); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_BOOLEAN, JvmJavaType.Z); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_FLOAT, JvmJavaType.F); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_DOUBLE, JvmJavaType.D); - TOKEN_JAVA_TYPE_MAPPING.put(TokenTypes.LITERAL_VOID, JvmJavaType.V); - } - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - boolean isConstructor = isConstructor(ast); - String methodName = buildMethodSignature(ast, isConstructor); - SourceMethod sourceMethod = new SourceMethod(peekParentClass(), methodName, ast.getLineNo()); - sourceMethod.setMeasure(Metric.METHODS, 1); - if (isConstructor) { - sourceMethod.setMeasure(Metric.CONSTRUCTORS, 1); - } - sourceMethod.setSuppressWarnings(SuppressWarningsAnnotationUtils.isSuppressAllWarnings(ast)); - addSourceCode(sourceMethod); - } - - private boolean isConstructor(DetailAST ast) { - return ast.getType() == TokenTypes.CTOR_DEF; - } - - @Override - public void leaveToken(DetailAST ast) { - popSourceCode(); - } - - private String buildMethodSignature(DetailAST ast, boolean isConstructor) { - String methodName = extractMethodName(ast, isConstructor); - Parameter returnType = extractMethodReturnType(ast, isConstructor); - List argumentTypes = extractMethodArgumentTypes(ast); - MethodSignature signature = new MethodSignature(methodName, returnType, argumentTypes); - return MethodSignaturePrinter.print(signature); - } - - private List extractMethodArgumentTypes(DetailAST ast) { - List argumentTypes = new ArrayList(); - DetailAST child = ast.findFirstToken(TokenTypes.PARAMETERS).findFirstToken(TokenTypes.PARAMETER_DEF); - while (child != null) { - if (child.getType() == TokenTypes.PARAMETER_DEF) { - Parameter argumentType = extractArgumentAndReturnType(child.findFirstToken(TokenTypes.TYPE)); - argumentTypes.add(new Parameter(argumentType)); - } - child = child.getNextSibling(); - } - return argumentTypes; - } - - private String extractMethodName(DetailAST ast, boolean isConstructor) { - if (isConstructor) { - return CONSTRUCTOR; - } - return ast.findFirstToken(TokenTypes.IDENT).getText(); - } - - private Parameter extractMethodReturnType(DetailAST ast, boolean isConstructor) { - if (isConstructor) { - return new Parameter(JvmJavaType.V, false); - } - Parameter returnType = extractArgumentAndReturnType(ast.findFirstToken(TokenTypes.TYPE)); - return new Parameter(returnType); - } - - private Parameter extractArgumentAndReturnType(DetailAST ast) { - boolean isArray = isArrayType(ast); - for (Integer tokenType : TOKEN_JAVA_TYPE_MAPPING.keySet()) { - if (ast.branchContains(tokenType)) { - return new Parameter(TOKEN_JAVA_TYPE_MAPPING.get(tokenType), isArray); - } - } - if (isObjectType(ast)) { - String className; - if (isArray) { - className = extractClassName(drilldownToLastArray(ast)); - } else { - className = extractClassName(ast); - } - return new Parameter(className, isArray); - } - throw new IllegalStateException("No Known TokenType has been found at line " + ast.getLineNo() + " of file " - + getFileContents().getFilename()); - } - - private DetailAST drilldownToLastArray(DetailAST ast) { - while (ast.findFirstToken(TokenTypes.ARRAY_DECLARATOR) != null) { - ast = ast.findFirstToken(TokenTypes.ARRAY_DECLARATOR); - } - return ast; - } - - private String extractClassName(DetailAST ast) { - if (ast.findFirstToken(TokenTypes.DOT) != null) { - return findLastToken(ast.findFirstToken(TokenTypes.DOT), TokenTypes.IDENT).getText(); - } else { - return findLastToken(ast, TokenTypes.IDENT).getText(); - } - } - - private DetailAST findLastToken(DetailAST astNode, int tokenType) { - DetailAST retVal = null; - for (AST child = astNode.getFirstChild(); child != null; child = child.getNextSibling()) { - if (child.getType() == tokenType) { - retVal = (DetailAST) child; - } - } - return retVal; - } - - private boolean isObjectType(DetailAST ast) { - return ast.branchContains(TokenTypes.IDENT); - } - - private boolean isArrayType(DetailAST ast) { - return (ast.findFirstToken(TokenTypes.IDENT) == null) && (ast.branchContains(TokenTypes.ARRAY_DECLARATOR)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PackageVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PackageVisitor.java deleted file mode 100644 index 6c7e99eb9ec..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PackageVisitor.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.FullIdent; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.resources.InputFileUtils; -import org.sonar.squid.api.AnalysisException; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.indexer.SquidIndex; -import org.sonar.squid.measures.Metric; - -public class PackageVisitor extends JavaAstVisitor { - - private static final String ROOT_PACKAGE = ""; - - private SquidIndex indexer; - - public PackageVisitor(SquidIndex indexer) { - this.indexer = indexer; - } - - @Override - public void visitFile(DetailAST ast) { - SourceCode packageRes; - if (ast == null) { - // ast can be null for empty files (all the file is commented-out) - packageRes = guessPackage(); - } else { - packageRes = createSourcePackage(ast); - } - if (peekSourceCode().hasChild(packageRes)) { - packageRes = indexer.search(packageRes.getKey()); - } - packageRes.setMeasure(Metric.PACKAGES, 1); - addSourceCode(packageRes); - } - - private SourcePackage guessPackage() { - String directory = InputFileUtils.getRelativeDirectory(getInputFile()); - return new SourcePackage(directory); - } - - @Override - public void leaveFile(DetailAST ast) { - popSourceCode(); - } - - private SourcePackage createSourcePackage(DetailAST ast) { - String key = ROOT_PACKAGE; - if (ast.getType() == TokenTypes.PACKAGE_DEF) { - String packageName = FullIdent.createFullIdent(ast.getLastChild().getPreviousSibling()).getText(); - key = packageName.replace('.', '/'); - } - checkPhysicalDirectory(key); - return new SourcePackage(key); - } - - /** - * Check that package declaration is consistent with the physical location of Java file. - * It aims to detect two cases : - * - wrong package declaration : "package org.foo" stored in the directory "org/bar" - * - source directory badly configured : src/ instead of src/main/java/ - * - * @since 2.8 - */ - private void checkPhysicalDirectory(String key) { - String relativeDirectory = InputFileUtils.getRelativeDirectory(getInputFile()); - // both relativeDirectory and key use slash '/' as separator - if (!StringUtils.equals(relativeDirectory, key)) { - String packageName = StringUtils.replace(key, "/", "."); - if (StringUtils.contains(relativeDirectory, key) || StringUtils.contains(key, relativeDirectory)) { - throw new AnalysisException(String.format("The source directory does not correspond to the package declaration %s", packageName)); - } - throw new AnalysisException(String.format("The package declaration %s does not correspond to the file path %s", - packageName, getInputFile().getRelativePath())); - } - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java deleted file mode 100644 index bf2a3c5bed0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import com.puppycrawl.tools.checkstyle.api.*; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -import java.util.Arrays; -import java.util.List; - -public class PublicApiVisitor extends JavaAstVisitor { - - static final String OVERRIDE_ANNOTATION_KEYWORD = "Override"; - - public static final List TOKENS = Arrays.asList(TokenTypes.CLASS_DEF, TokenTypes.INTERFACE_DEF, TokenTypes.METHOD_DEF, - TokenTypes.CTOR_DEF, TokenTypes.ANNOTATION_DEF, TokenTypes.ANNOTATION_FIELD_DEF, TokenTypes.VARIABLE_DEF); - - public PublicApiVisitor() { - } - - @Override - public List getWantedTokens() { - return TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - SourceCode currentResource = peekSourceCode(); - if (isPublicApi(ast)) { - currentResource.add(Metric.PUBLIC_API, 1); - if (isDocumentedApi(ast)) { - currentResource.add(Metric.PUBLIC_DOC_API, 1); - } - } - } - - private static boolean isEmptyDefaultConstructor(DetailAST ast) { - return (isConstructorWithoutParameters(ast)) && (ast.getLastChild().getChildCount() == 1); - } - - private static boolean isConstructorWithoutParameters(DetailAST ast) { - return ast.getType() == TokenTypes.CTOR_DEF && ast.findFirstToken(TokenTypes.PARAMETERS).getChildCount() == 0; - } - - private static boolean isMethodWithOverrideAnnotation(DetailAST ast) { - if (isMethod(ast)) { - return AnnotationUtility.containsAnnotation(ast, OVERRIDE_ANNOTATION_KEYWORD) - || AnnotationUtility.containsAnnotation(ast, "java.lang." + OVERRIDE_ANNOTATION_KEYWORD); - } - return false; - } - - private static boolean isMethod(DetailAST ast) { - return ast.getType() == TokenTypes.METHOD_DEF; - } - - private boolean isDocumentedApi(DetailAST ast) { - return isDocumentedApi(ast, getFileContents()); - } - - private static boolean isPublic(DetailAST ast) { - return (AstUtils.isScope(AstUtils.getScope(ast), Scope.PUBLIC) || AstUtils.isType(ast, TokenTypes.ANNOTATION_FIELD_DEF)); - } - - private static boolean isStaticFinalVariable(DetailAST ast) { - return (AstUtils.isClassVariable(ast) || AstUtils.isInterfaceVariable(ast)) && AstUtils.isFinal(ast) && AstUtils.isStatic(ast); - } - - /** - * Also used by {@link org.sonar.java.ast.check.UndocumentedApiCheck} - */ - public static boolean isDocumentedApi(DetailAST ast, FileContents fileContents) { - return fileContents.getJavadocBefore(ast.getLineNo()) != null; - } - - /** - * Also used by {@link org.sonar.java.ast.check.UndocumentedApiCheck} - */ - public static boolean isPublicApi(DetailAST ast) { - return isPublic(ast) && !isStaticFinalVariable(ast) && !isMethodWithOverrideAnnotation(ast) && !isEmptyDefaultConstructor(ast); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/StatementVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/StatementVisitor.java deleted file mode 100644 index af8d99579b1..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/StatementVisitor.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.squid.measures.Metric; - -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -public class StatementVisitor extends JavaAstVisitor { - - private static final List WANTED_TOKENS = Arrays.asList(TokenTypes.VARIABLE_DEF, TokenTypes.CTOR_CALL, TokenTypes.LITERAL_IF, - TokenTypes.LITERAL_ELSE, TokenTypes.LITERAL_WHILE, TokenTypes.LITERAL_DO, - TokenTypes.LITERAL_FOR, TokenTypes.LITERAL_SWITCH, TokenTypes.LITERAL_BREAK, - TokenTypes.LITERAL_CONTINUE, TokenTypes.LITERAL_RETURN, TokenTypes.LITERAL_THROW, - TokenTypes.LITERAL_SYNCHRONIZED, TokenTypes.LITERAL_CATCH, - TokenTypes.LITERAL_FINALLY, TokenTypes.EXPR, TokenTypes.LABELED_STAT, - TokenTypes.LITERAL_CASE, TokenTypes.LITERAL_DEFAULT, TokenTypes.LITERAL_ASSERT); - - @Override - public List getWantedTokens() { - return WANTED_TOKENS; - } - - @Override - public void visitToken(DetailAST ast) { - if (isCountable(ast)) { - peekSourceCode().add(Metric.STATEMENTS, 1); - } - } - - /** - * Checks if a token is countable for the ncss metric - * - * @param ast - * the AST - * @return true if the token is countable - */ - private boolean isCountable(DetailAST ast) { - boolean countable = true; - final int tokenType = ast.getType(); - // check if an expression is countable - if (TokenTypes.EXPR == tokenType) { - countable = isExpressionCountable(ast); - } - // check if an variable definition is countable, only for non class - // variables - else if (TokenTypes.VARIABLE_DEF == tokenType) { - countable = isVariableDefCountable(ast); - } - return countable; - } - - /** - * Checks if a variable definition is countable. - * - * @param aAST - * the AST - * @return true if the variable definition is countable, false otherwise - */ - private boolean isVariableDefCountable(DetailAST aAST) { - boolean countable = false; - if (!AstUtils.isClassVariable(aAST) && !AstUtils.isInterfaceVariable(aAST)) { - // count variable defs only if they are direct child to a slist or - // object block - final int parentType = aAST.getParent().getType(); - if ((TokenTypes.SLIST == parentType) || (TokenTypes.OBJBLOCK == parentType)) { - final DetailAST prevSibling = aAST.getPreviousSibling(); - // is countable if no previous sibling is found or - // the sibling is no COMMA. - // This is done because multiple assignment on one line are - // countes as 1 - countable = (prevSibling == null) || (TokenTypes.COMMA != prevSibling.getType()); - } - } - return countable; - } - - /** - * Checks if an expression is countable for the ncss metric. - * - * @param aAST the AST - * @return true if the expression is countable, false otherwise - */ - private boolean isExpressionCountable(DetailAST aAST) { - boolean countable; - // count expressions only if they are direct child to a slist (method - // body, for loop...) - // or direct child of label,if,else,do,while,for - final int parentType = aAST.getParent().getType(); - switch (parentType) { - case TokenTypes.SLIST: - case TokenTypes.LABELED_STAT: - case TokenTypes.LITERAL_FOR: - case TokenTypes.LITERAL_DO: - case TokenTypes.LITERAL_WHILE: - case TokenTypes.LITERAL_IF: - case TokenTypes.LITERAL_ELSE: - // don't count if or loop conditions - final DetailAST prevSibling = aAST.getPreviousSibling(); - countable = (prevSibling == null) || (TokenTypes.LPAREN != prevSibling.getType()); - break; - default: - countable = false; - break; - } - return countable; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/SuppressWarningsAnnotationUtils.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/SuppressWarningsAnnotationUtils.java deleted file mode 100644 index fb2c20174de..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/SuppressWarningsAnnotationUtils.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.ast.visitor; - -import com.puppycrawl.tools.checkstyle.api.AnnotationUtility; -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; - -/** - * Inspired by {@link com.puppycrawl.tools.checkstyle.checks.annotation.SuppressWarningsCheck} - */ -public final class SuppressWarningsAnnotationUtils { - - private static final String SUPPRESS_WARNINGS_ANNOTATION_NAME = "SuppressWarnings"; - private static final String SUPPRESS_WARNINGS_ANNOTATION_FQ_NAME = "java.lang." + SUPPRESS_WARNINGS_ANNOTATION_NAME; - private static final String VALUE = "\"all\""; - - public static boolean isSuppressAllWarnings(DetailAST ast) { - DetailAST suppressWarningsAnnotation = getSuppressWarningsAnnotation(ast); - if (suppressWarningsAnnotation != null) { - DetailAST warningHolder = findWarningsHolder(suppressWarningsAnnotation); - for (DetailAST warning = warningHolder.findFirstToken(TokenTypes.EXPR); warning != null; warning = warning.getNextSibling()) { - if (warning.getType() == TokenTypes.EXPR) { - DetailAST fChild = warning.getFirstChild(); - if (fChild.getType() == TokenTypes.STRING_LITERAL) { - String text = warning.getFirstChild().getText(); - if (VALUE.equals(text)) { - return true; - } - } - } - } - } - return false; - } - - private static DetailAST findWarningsHolder(DetailAST aAnnotation) { - DetailAST annValuePair = aAnnotation.findFirstToken(TokenTypes.ANNOTATION_MEMBER_VALUE_PAIR); - DetailAST annArrayInit; - if (annValuePair != null) { - annArrayInit = annValuePair.findFirstToken(TokenTypes.ANNOTATION_ARRAY_INIT); - } else { - annArrayInit = aAnnotation.findFirstToken(TokenTypes.ANNOTATION_ARRAY_INIT); - } - if (annArrayInit != null) { - return annArrayInit; - } - return aAnnotation; - } - - private static DetailAST getSuppressWarningsAnnotation(DetailAST ast) { - DetailAST annotation = AnnotationUtility.getAnnotation(ast, SUPPRESS_WARNINGS_ANNOTATION_NAME); - if (annotation == null) { - annotation = AnnotationUtility.getAnnotation(ast, SUPPRESS_WARNINGS_ANNOTATION_FQ_NAME); - } - return annotation; - } - - private SuppressWarningsAnnotationUtils() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java deleted file mode 100644 index 60d5a7a35e3..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode; - -import org.sonar.java.bytecode.asm.*; -import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL; -import org.sonar.java.bytecode.loader.SquidClassLoader; -import org.sonar.java.bytecode.visitor.*; -import org.sonar.squid.api.CodeScanner; -import org.sonar.squid.api.CodeVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.indexer.QueryByType; -import org.sonar.squid.indexer.SquidIndex; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -public class BytecodeScanner extends CodeScanner { - - private SquidIndex indexer; - - public BytecodeScanner(SquidIndex indexer) { - this.indexer = indexer; - } - - public BytecodeScanner scan(Collection bytecodeFilesOrDirectories) { - Collection classes = indexer.search(new QueryByType(SourceClass.class)); - ClassLoader classLoader = ClassLoaderBuilder.create(bytecodeFilesOrDirectories); - scan(classes, new AsmClassProviderImpl(classLoader)); - ((SquidClassLoader) classLoader).close(); // TODO unchecked cast - return this; - } - - public BytecodeScanner scanDirectory(File bytecodeDirectory) { - return scan(Arrays.asList(bytecodeDirectory)); - } - - protected BytecodeScanner scan(Collection classes, AsmClassProvider classProvider) { - loadByteCodeInformation(classes, classProvider); - linkVirtualMethods(classes, classProvider); - notifyBytecodeVisitors(classes, classProvider); - return this; - } - - private void linkVirtualMethods(Collection classes, AsmClassProvider classProvider) { - VirtualMethodsLinker linker = new VirtualMethodsLinker(); - for (SourceCode sourceCode : classes) { - AsmClass asmClass = classProvider.getClass(sourceCode.getKey(), DETAIL_LEVEL.STRUCTURE_AND_CALLS); - for (AsmMethod method : asmClass.getMethods()) { - linker.process(method); - } - } - } - - private void notifyBytecodeVisitors(Collection classes, AsmClassProvider classProvider) { - BytecodeVisitor[] visitorArray = getVisitors().toArray(new BytecodeVisitor[getVisitors().size()]); - for (SourceCode sourceCode : classes) { - AsmClass asmClass = classProvider.getClass(sourceCode.getKey(), DETAIL_LEVEL.STRUCTURE_AND_CALLS); - BytecodeVisitorNotifier visitorNotifier = new BytecodeVisitorNotifier(asmClass, visitorArray); - visitorNotifier.notifyVisitors(indexer); - } - } - - private void loadByteCodeInformation(Collection classes, AsmClassProvider classProvider) { - for (SourceCode sourceCode : classes) { - classProvider.getClass(sourceCode.getKey(), DETAIL_LEVEL.STRUCTURE_AND_CALLS); - } - } - - @Override - public Collection> getVisitorClasses() { - List> visitorClasses = new ArrayList>(); - visitorClasses.add(DITVisitor.class); - visitorClasses.add(RFCVisitor.class); - visitorClasses.add(NOCVisitor.class); - visitorClasses.add(LCOM4Visitor.class); - visitorClasses.add(DependenciesVisitor.class); - return visitorClasses; - } - - @Override - public void accept(CodeVisitor visitor) { - if (visitor instanceof BytecodeVisitor) { - super.accept(visitor); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeVisitorNotifier.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeVisitorNotifier.java deleted file mode 100644 index 81a2a4b1358..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeVisitorNotifier.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.java.bytecode.asm.AsmField; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.asm.AsmResource; -import org.sonar.java.bytecode.visitor.BytecodeVisitor; -import org.sonar.squid.indexer.SquidIndex; - -public class BytecodeVisitorNotifier { - - private final AsmClass asmClass; - private final BytecodeVisitor[] bytecodeVisitors; - - public BytecodeVisitorNotifier(AsmClass asmClass, BytecodeVisitor[] bytecodeVisitors) { - this.asmClass = asmClass; - this.bytecodeVisitors = new BytecodeVisitor[bytecodeVisitors.length]; - System.arraycopy(bytecodeVisitors, 0, this.bytecodeVisitors, 0, bytecodeVisitors.length); - } - - public void notifyVisitors(SquidIndex indexer) { - for (BytecodeVisitor visitor : bytecodeVisitors) { - visitor.setSquidIndex(indexer); - } - callVisitClass(); - callVisitMethodAndFieldAndEdge(); - callLeaveClass(); - } - - private void callVisitMethodAndFieldAndEdge() { - callVisitEdgeForSpecificAsmResource(asmClass); - for (AsmMethod method : asmClass.getMethods()) { - callVisitMethod(method); - callVisitEdgeForSpecificAsmResource(method); - } - for (AsmField field : asmClass.getFields()) { - callVisitField(field); - callVisitEdgeForSpecificAsmResource(field); - } - } - - private void callVisitEdgeForSpecificAsmResource(AsmResource resource) { - for (AsmEdge edge : resource.getOutgoingEdges()) { - for (BytecodeVisitor visitor : bytecodeVisitors) { - visitor.visitEdge(edge); - } - } - } - - private void callVisitMethod(AsmMethod asmMethod) { - for (BytecodeVisitor visitor : bytecodeVisitors) { - visitor.visitMethod(asmMethod); - } - } - - private void callVisitField(AsmField asmField) { - for (BytecodeVisitor visitor : bytecodeVisitors) { - visitor.visitField(asmField); - } - } - - private void callVisitClass() { - for (BytecodeVisitor visitor : bytecodeVisitors) { - visitor.visitClass(asmClass); - } - } - - private void callLeaveClass() { - for (BytecodeVisitor visitor : bytecodeVisitors) { - visitor.leaveClass(asmClass); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/ClassLoaderBuilder.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/ClassLoaderBuilder.java deleted file mode 100644 index 99bbb1c74b8..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/ClassLoaderBuilder.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode; - -import java.io.File; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sonar.java.bytecode.loader.SquidClassLoader; - -import com.google.common.collect.Lists; - -public final class ClassLoaderBuilder { - - private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderBuilder.class); - - private ClassLoaderBuilder() { - // only static methods - } - - public static ClassLoader create(Collection bytecodeFilesOrDirectories) { - List files = Lists.newArrayList(); - for (File file : bytecodeFilesOrDirectories) { - if (file.isFile() && file.getPath().endsWith(".class")) { - LOG.info("Sonar Squid ClassLoader was expecting a JAR file instead of CLASS file : '" + file.getAbsolutePath() + "'"); - } else { - files.add(file); - } - } - - if (LOG.isDebugEnabled()) { - LOG.debug("----- Classpath analyzed by Squid:"); - for (File file : files) { - LOG.debug(file.getAbsolutePath()); - } - LOG.debug("-----"); - } - - try { - return new SquidClassLoader(files); - } catch (Exception e) { - throw new IllegalStateException("Can not create ClassLoader", e); - } - } - - /** - * For tests. - */ - public static ClassLoader create(File bytecodeFileOrDirectory) { - return create(Arrays.asList(bytecodeFileOrDirectory)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/VirtualMethodsLinker.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/VirtualMethodsLinker.java deleted file mode 100644 index 5137499785f..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/VirtualMethodsLinker.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmMethod; - -public class VirtualMethodsLinker { - - public void process(AsmMethod method) { - if ( !method.isBodyLoaded() && method.isUsed()) { - AsmMethod implementation = findImplementation(method.getParent(), method.getKey()); - if (implementation != null) { - implementation.setUsed(true); - method.linkTo(implementation); - } - } - } - - private AsmMethod findImplementation(AsmClass asmClass, String methodKey) { - AsmMethod method = asmClass.getMethod(methodKey); - if (method != null && method.isBodyLoaded()) { - return method; - } - if (asmClass.getSuperClass() != null) { - return findImplementation(asmClass.getSuperClass(), methodKey); - } - return null; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmAccessFlags.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmAccessFlags.java deleted file mode 100644 index e065825f8c4..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmAccessFlags.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.objectweb.asm.Opcodes; - -public final class AsmAccessFlags { - - private AsmAccessFlags() { - // utils class : only static methods - } - - public static boolean isPrivate(int accessFlags) { - return (accessFlags & Opcodes.ACC_PRIVATE) != 0; - } - - public static boolean isProtected(int accessFlags) { - return (accessFlags & Opcodes.ACC_PROTECTED) != 0; - } - - public static boolean isPublic(int accessFlags) { - return (accessFlags & Opcodes.ACC_PUBLIC) != 0; - } - - public static boolean isStatic(int accessFlags) { - return (accessFlags & Opcodes.ACC_STATIC) != 0; - } - - public static boolean isAbstract(int accessFlags) { - return (accessFlags & Opcodes.ACC_ABSTRACT) != 0; - } - - public static boolean isInterface(int accessFlags) { - return (accessFlags & Opcodes.ACC_INTERFACE) != 0; - } - - public static boolean isDeprecated(int accessFlags) { - return (accessFlags & Opcodes.ACC_DEPRECATED) != 0; - } - - public static boolean isFinal(int accessFlags) { - return (accessFlags & Opcodes.ACC_FINAL) != 0; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClass.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClass.java deleted file mode 100644 index d93c2a4fd93..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClass.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL; -import org.sonar.squid.api.SourceCodeEdgeUsage; - -public final class AsmClass extends AsmResource { - - private String internalName; - private DETAIL_LEVEL level; - private AsmClass superClass; - private Set children; - private Map methods = new HashMap(); - private Map fields = new HashMap(); - private int noc = 0; - - public AsmClass(String internalName, DETAIL_LEVEL level) { - this.internalName = internalName; - setDetailLevel(level); - } - - public AsmClass(String internalName) { - this.internalName = internalName; - } - - void setDetailLevel(DETAIL_LEVEL level) { - this.level = level; - } - - DETAIL_LEVEL getDetailLevel() { - return level; - } - - public String getInternalName() { - return internalName; - } - - void addMethod(AsmMethod asmMethod) { - methods.put(asmMethod.getKey(), asmMethod); - } - - public Collection getMethods() { - return methods.values(); - } - - public Collection getFields() { - return fields.values(); - } - - void addField(AsmField field) { - fields.put(field.getName(), field); - } - - public AsmField getField(String fieldName) { - return fields.get(fieldName); - } - - AsmField getFieldOrCreateIt(String fieldName) { - AsmField field = getField(fieldName); - if (field != null) { - return field; - } - field = new AsmField(this, fieldName); - addField(field); - return field; - } - - public AsmMethod getMethod(String key) { - return methods.get(key); - } - - AsmMethod getMethodOrCreateIt(String key) { - AsmMethod method = getMethod(key); - if (method != null) { - return method; - } - method = new AsmMethod(this, key); - method.setBodyLoaded(false); - addMethod(method); - return method; - } - - void setSuperClass(AsmClass superClass) { - this.superClass = superClass; - superClass.addChildren(this); - addEdge(new AsmEdge(this, superClass, SourceCodeEdgeUsage.EXTENDS)); - } - - private void addChildren(AsmClass asmClass) { - if ("java/lang/Object".equals(getInternalName())) { - return; - } - if (children == null) { - children = new HashSet(); - } - children.add(asmClass); - } - - public AsmClass getSuperClass() { - return superClass; - } - - void addInterface(AsmClass implementedInterface) { - implementedInterface.addChildren(this); - addEdge(new AsmEdge(this, implementedInterface, SourceCodeEdgeUsage.IMPLEMENTS)); - } - - Set getInterfaces() { - return getImplementedInterfaces(); - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof AsmClass) { - return internalName.equals(((AsmClass) object).internalName); - } - return false; - } - - @Override - public int hashCode() { - return internalName.hashCode(); - } - - public int getNumberOfChildren() { - if (children != null && noc == 0) { - for (AsmClass child : children) { - noc += child.getNumberOfChildren() + 1; - } - } - return noc; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProvider.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProvider.java deleted file mode 100644 index 5e9f9190a36..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProvider.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -public abstract class AsmClassProvider { - - public enum DETAIL_LEVEL { - NOTHING(1), // Nothing is loaded from the bytecode - STRUCTURE(2), // superclass and interfaces are loaded along with fields and methods but not types used by fields or methods - STRUCTURE_AND_CALLS(3);// calls to other methods are loaded - - private int internalLevel; - - private DETAIL_LEVEL(int level) { - this.internalLevel = level; - } - - boolean isGreaterThan(DETAIL_LEVEL level) { - return this.internalLevel > level.internalLevel; - } - } - - public abstract AsmClass getClass(String internalName, DETAIL_LEVEL level); - - public final AsmClass getClass(String internalName) { - return getClass(internalName, DETAIL_LEVEL.STRUCTURE_AND_CALLS); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProviderImpl.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProviderImpl.java deleted file mode 100644 index 58f2f26b140..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassProviderImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.objectweb.asm.ClassReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AsmClassProviderImpl extends AsmClassProvider { - - private static Logger logger = LoggerFactory.getLogger(AsmClassProviderImpl.class); - private final ClassLoader classLoader; - private Map asmClassCache = new HashMap(); - - public AsmClassProviderImpl() { - this.classLoader = Thread.currentThread().getContextClassLoader(); - } - - public AsmClassProviderImpl(ClassLoader classLoader) { - this.classLoader = classLoader; - } - - @Override - public AsmClass getClass(String internalName, DETAIL_LEVEL level) { - if (internalName == null) { - throw new IllegalStateException("You can try to load a class whose internalName = 'null'"); - } - AsmClass asmClass = getAsmClassFromCacheOrCreateIt(internalName); - if (level.isGreaterThan(asmClass.getDetailLevel())) { - decoracteAsmClassFromBytecode(asmClass, level); - } - return asmClass; - } - - private AsmClass getAsmClassFromCacheOrCreateIt(String internalName) { - AsmClass asmClass = asmClassCache.get(internalName); - if (asmClass == null) { - asmClass = new AsmClass(internalName, DETAIL_LEVEL.NOTHING); - asmClassCache.put(internalName, asmClass); - } - return asmClass; - } - - private void decoracteAsmClassFromBytecode(AsmClass asmClass, DETAIL_LEVEL level) { - InputStream input = null; - try { - AsmClassVisitor classVisitor = new AsmClassVisitor(this, asmClass, level); - input = classLoader.getResourceAsStream(asmClass.getInternalName() + ".class"); - ClassReader asmReader = new ClassReader(input); - asmReader.accept(classVisitor, 0); - - } catch (IOException e) { - logger.warn("Class '" + asmClass.getInternalName() + "' is not accessible through the ClassLoader."); - } catch (SecurityException e) { - logger.warn("Class '" + asmClass.getInternalName() - + "' is not accessible through the ClassLoader. One signed jar seems to be corrupted."); - } finally { - IOUtils.closeQuietly(input); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassVisitor.java deleted file mode 100644 index 614e5508c47..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmClassVisitor.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.commons.EmptyVisitor; -import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL; - -public class AsmClassVisitor extends EmptyVisitor { - - private AsmClassProvider asmClassProvider; - private DETAIL_LEVEL level; - private AsmClass asmClass; - - public AsmClassVisitor(AsmClassProvider asmClassProvider, AsmClass asmClass, DETAIL_LEVEL level) { - this.asmClassProvider = asmClassProvider; - this.level = level; - this.asmClass = asmClass; - } - - @Override - public void visit(int version, int accessFlags, String internalName, String signature, String superClass, String[] interfaces) { - if (asmClass.getDetailLevel() == DETAIL_LEVEL.NOTHING) { - asmClass.setAccessFlags(accessFlags); - if (asmClass.isInterface()) { - if (interfaces.length == 1) { - asmClass.setSuperClass(asmClassProvider.getClass(interfaces[0], DETAIL_LEVEL.STRUCTURE)); - } - } else { - if (superClass != null) { - asmClass.setSuperClass(asmClassProvider.getClass(superClass, DETAIL_LEVEL.STRUCTURE)); - } - for (String interfaceName : interfaces) { - asmClass.addInterface(asmClassProvider.getClass(interfaceName, DETAIL_LEVEL.STRUCTURE)); - } - } - if (signature != null) { - String[] internalNames = AsmSignature.extractInternalNames(signature); - AsmClass[] asmClasses = internalNamesToAsmClasses(internalNames, DETAIL_LEVEL.NOTHING); - asmClass.addUsesOfClasses(asmClasses); - } - } - } - - @Override - public FieldVisitor visitField(int access, String fieldName, String description, String signature, Object value) { - AsmField field = asmClass.getFieldOrCreateIt(fieldName); - field.setAccessFlags(access); - String[] internalNames = AsmSignature.extractInternalNames(description, signature); - AsmClass[] asmClasses = internalNamesToAsmClasses(internalNames, DETAIL_LEVEL.NOTHING); - field.addUsesOfClasses(asmClasses); - return null; - } - - @Override - public MethodVisitor visitMethod(int access, String methodName, String description, String signature, String[] exceptions) { - AsmMethod method = asmClass.getMethodOrCreateIt(methodName + description); - if (isInheritedMethodSignature(method.getParent(), method.getKey())) { - method.setInherited(true); - } - method.setSignature(signature); - method.setBodyLoaded(true); - method.setAccessFlags(access); - String[] internalNames = AsmSignature.extractInternalNames(description, signature); - AsmClass[] asmClasses = internalNamesToAsmClasses(internalNames, DETAIL_LEVEL.NOTHING); - method.addUsesOfClasses(asmClasses); - AsmClass[] asmExceptionClasses = internalNamesToAsmClasses(exceptions, DETAIL_LEVEL.NOTHING); - method.addUsesOfClasses(asmExceptionClasses); - if (level == DETAIL_LEVEL.STRUCTURE_AND_CALLS) { - return new AsmMethodVisitor(method, asmClassProvider); - } - return null; - } - - @Override - public void visitEnd() { - asmClass.setDetailLevel(level); - } - - private AsmClass[] internalNamesToAsmClasses(String[] internalNames, DETAIL_LEVEL level) { - if (internalNames == null) { - return new AsmClass[0]; - } - AsmClass[] asmClasses = new AsmClass[internalNames.length]; - for (int i = 0; i < internalNames.length; i++) { - asmClasses[i] = asmClassProvider.getClass(internalNames[i], level); - } - return asmClasses; - } - - private boolean isInheritedMethodSignature(AsmClass parent, String key) { - if (parent.getSuperClass() != null - && (parent.getSuperClass().getMethod(key) != null || isInheritedMethodSignature(parent.getSuperClass(), key))) { - return true; - } - for (AsmClass interfaceClass : parent.getInterfaces()) { - if (interfaceClass.getMethod(key) != null || isInheritedMethodSignature(interfaceClass, key)) { - return true; - } - } - return false; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmEdge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmEdge.java deleted file mode 100644 index 93c83fa9f71..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmEdge.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.sonar.squid.api.SourceCodeEdgeUsage; - -public class AsmEdge { - - private final AsmResource from; - private final AsmResource to; - private final SourceCodeEdgeUsage usage; - private int sourceLineNumber = 0; - - AsmEdge(AsmResource from, AsmResource to, SourceCodeEdgeUsage usage) { - this.from = from; - this.to = to; - this.usage = usage; - to.setUsed(true); - } - - AsmEdge(AsmResource from, AsmResource to, SourceCodeEdgeUsage usage, int sourceLineNumber) { - this(from, to, usage); - this.sourceLineNumber = sourceLineNumber; - } - - public int getSourceLineNumber() { - return sourceLineNumber; - } - - public AsmClass getTargetAsmClass() { - if (getTo().getParent() != null) { - return getTo().getParent(); - } else { - return (AsmClass) getTo(); - } - } - - public AsmResource getFrom() { - return from; - } - - public AsmResource getTo() { - return to; - } - - public SourceCodeEdgeUsage getUsage() { - return usage; - } - - @Override - public boolean equals(Object obj) { - if ( !(obj instanceof AsmEdge)) { - return false; - } - AsmEdge edge = (AsmEdge) obj; - return from.equals(edge.from) && to.equals(edge.to); - } - - @Override - public int hashCode() { - return from.hashCode() + to.hashCode() + usage.hashCode(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmField.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmField.java deleted file mode 100644 index 362519086e2..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmField.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -public class AsmField extends AsmResource { - - private final String name; - - public AsmField(AsmClass parent, String name) { - this.name = name; - this.parent = parent; - } - - public String getName() { - return name; - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof AsmField) { - AsmField otherField = (AsmField) object; - return parent.equals(otherField.parent) && name.equals(otherField.name); - } - return false; - } - - @Override - public int hashCode() { - return parent.hashCode() + name.hashCode(); - } - - @Override - public String toString() { - return name; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java deleted file mode 100644 index 2c9efe9f064..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import java.util.ArrayList; -import java.util.List; - -import org.sonar.squid.api.SourceCodeEdgeUsage; - -public class AsmMethod extends AsmResource { - - private String name; - private String key; - private boolean inherited = false; - private boolean empty = false; - private boolean bodyLoaded = true; - private boolean accessedFieldComputed = false; - private boolean accessedFieldBeingComputed = false; - private boolean accessedFieldIsThisMethodRecursive = false; - private AsmField accessedField = null; - private String signature; - private AsmMethod implementationLinkage = null; - - public AsmMethod(AsmClass parent, String name, String descriptor) { - this.parent = parent; - this.name = name; - key = name + descriptor; - } - - public AsmMethod(AsmClass parent, String key) { - this.parent = parent; - this.key = key; - this.name = key.substring(0, key.indexOf('(')); - } - - public String getName() { - return name; - } - - public String getKey() { - return key; - } - - public String getGenericKey() { - if (signature != null) { - return name + signature; - } - return getKey(); - } - - public void setSignature(String signature) { - this.signature = signature; - } - - public String getSignature() { - return signature; - } - - public List getCallsToField() { - List callsToField = new ArrayList(); - for (AsmEdge usage : getOutgoingEdges()) { - if (usage.getUsage() == SourceCodeEdgeUsage.CALLS_FIELD) { - callsToField.add((AsmField) usage.getTo()); - } - } - return callsToField; - } - - public List getCallsToMethod() { - List callsToMethod = new ArrayList(); - for (AsmEdge usage : getOutgoingEdges()) { - if (usage.getUsage() == SourceCodeEdgeUsage.CALLS_METHOD) { - callsToMethod.add((AsmMethod) usage.getTo()); - } - } - return callsToMethod; - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof AsmMethod) { - AsmMethod otherMethod = (AsmMethod) object; - return parent.equals(otherMethod.parent) && key.equals(otherMethod.key); - } - return false; - } - - @Override - public int hashCode() { - return parent.hashCode() + key.hashCode(); - } - - public boolean isConstructor() { - return "".equals(name) || "".equals(name); - } - - public boolean isDefaultConstructor() { - return "()V".equals(key); - } - - void setInherited(boolean inherited) { - this.inherited = inherited; - } - - public boolean isInherited() { - return inherited; - } - - public boolean isEmpty() { - return empty; - } - - public boolean isBodyLoaded() { - return bodyLoaded; - } - - void setBodyLoaded(boolean bodyLoaded) { - this.bodyLoaded = bodyLoaded; - } - - void setEmpty(boolean empty) { - this.empty = empty; - } - - public boolean isAccessor() { - return getAccessedField() != null; - } - - public AsmField getAccessedField() { - if (accessedFieldComputed) { - return accessedField; - } - if (accessedFieldBeingComputed) { - // Do not set accessedField here, because the pending computeAccessedField() will overwrite it anyway - accessedFieldIsThisMethodRecursive = true; - return null; - } else { - accessedFieldBeingComputed = true; // Prevents infinite recursion on recursive methods. - computeAccessedField(); - if (accessedFieldIsThisMethodRecursive) { - // We already returned null previously during the computation, so we must return null for consistency - accessedField = null; - } - accessedFieldComputed = true; - accessedFieldBeingComputed = false; - - return accessedField; - } - } - - private void computeAccessedField() { - if (!isConstructor()) { - for (AsmEdge edge: getOutgoingEdges()) { - if (isCallToNonStaticInternalField(edge)) { - if (isFieldAccesingDifferentField((AsmField)edge.getTo())) { - accessedField = null; - break; - } - accessedField = (AsmField)edge.getTo(); - } else if (isCallToNonStaticInternalMethod(edge)) { - AsmMethod method = (AsmMethod)edge.getTo(); - if (isMethodNotAccessorOrAccessingDifferentField(method)) { - accessedField = null; - break; - } - accessedField = method.getAccessedField(); - } - } - } - } - - private boolean isMethodNotAccessorOrAccessingDifferentField(AsmMethod method) { - return !method.isAccessor() || (accessedField != null && !accessedField.equals(method.getAccessedField())); - } - - private boolean isFieldAccesingDifferentField(AsmField field) { - return accessedField != null && accessedField != field; - } - - private boolean isCallToNonStaticInternalField(AsmEdge edge) { - return edge.getTargetAsmClass() == getParent() && edge.getUsage() == SourceCodeEdgeUsage.CALLS_FIELD && !((AsmField) edge.getTo()).isStatic(); - } - - private boolean isCallToNonStaticInternalMethod(AsmEdge edge) { - return edge.getTargetAsmClass() == getParent() && edge.getUsage() == SourceCodeEdgeUsage.CALLS_METHOD && !((AsmMethod) edge.getTo()).isStatic(); - } - - @Override - public String toString() { - return key; - } - - public boolean isStaticConstructor() { - return "".equals(name); - } - - public void linkTo(AsmMethod implementationLinkage) { - this.implementationLinkage = implementationLinkage; - } - - public AsmMethod getImplementationLinkage() { - return implementationLinkage; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethodVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethodVisitor.java deleted file mode 100644 index 48cbb17beee..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethodVisitor.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.objectweb.asm.Label; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; -import org.objectweb.asm.commons.EmptyVisitor; -import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL; -import org.sonar.squid.api.SourceCodeEdgeUsage; - -public class AsmMethodVisitor extends EmptyVisitor { - - private AsmMethod method; - private AsmClassProvider asmClassProvider; - private int lineNumber = 0; - private boolean emptyMethod = true; - - public AsmMethodVisitor(AsmMethod method, AsmClassProvider asmClassProvider) { - this.method = method; - this.asmClassProvider = asmClassProvider; - emptyMethod = true; - } - - @Override - public void visitFieldInsn(int opcode, String owner, String fieldName, String fieldDescription) { - AsmClass targetClass = asmClassProvider.getClass(owner, DETAIL_LEVEL.NOTHING); - AsmField targetField = targetClass.getFieldOrCreateIt(fieldName); - method.addEdge(new AsmEdge(method, targetField, SourceCodeEdgeUsage.CALLS_FIELD, lineNumber)); - emptyMethod = false; - } - - @Override - public void visitMethodInsn(int opcode, String owner, String methodName, String methodDescription) { - if (isNotCallToJavaArrayMethod(owner)) { - AsmClass targetClass = asmClassProvider.getClass(owner, DETAIL_LEVEL.STRUCTURE); - AsmMethod targetMethod = targetClass.getMethodOrCreateIt(methodName + methodDescription); - method.addEdge(new AsmEdge(method, targetMethod, SourceCodeEdgeUsage.CALLS_METHOD, lineNumber)); - } - emptyMethod = false; - } - - private boolean isNotCallToJavaArrayMethod(String internalName) { - return internalName.charAt(0) != '['; - } - - @Override - public void visitTryCatchBlock(Label start, Label end, Label handler, String exception) { - if (exception != null) { - AsmClass exceptionClass = asmClassProvider.getClass(exception, DETAIL_LEVEL.NOTHING); - method.addEdge(new AsmEdge(method, exceptionClass, SourceCodeEdgeUsage.USES, lineNumber)); - } - emptyMethod = false; - } - - @Override - public void visitTypeInsn(int opcode, String internalName) { - AsmClass usedClass = asmClassProvider.getClass(internalName, DETAIL_LEVEL.NOTHING); - method.addEdge(new AsmEdge(method, usedClass, SourceCodeEdgeUsage.USES, lineNumber)); - emptyMethod = false; - } - - @Override - public void visitLineNumber(final int line, final Label start) { - lineNumber = line; - } - - @Override - public void visitEnd() { - method.setEmpty(emptyMethod); - } - - @Override - public void visitIincInsn(int var, int increment) { - emptyMethod = false; - } - - @Override - public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { - emptyMethod = false; - } - - @Override - public void visitInsn(int opcode) { - if (opcode != Opcodes.RETURN) { - emptyMethod = false; - } - } - - @Override - public void visitIntInsn(int opcode, int operand) { - emptyMethod = false; - } - - @Override - public void visitJumpInsn(int opcode, Label label) { - emptyMethod = false; - } - - @Override - public void visitLdcInsn(Object cst) { - if (cst instanceof Type) { - Type type = (Type) cst; - AsmClass usedClass = asmClassProvider.getClass(type.getInternalName(), DETAIL_LEVEL.NOTHING); - method.addEdge(new AsmEdge(method, usedClass, SourceCodeEdgeUsage.USES, lineNumber)); - } - emptyMethod = false; - } - - @Override - public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { - emptyMethod = false; - } - - @Override - public void visitMultiANewArrayInsn(String desc, int dims) { - emptyMethod = false; - } - - @Override - public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) { - emptyMethod = false; - } - - @Override - public void visitVarInsn(int opcode, int var) { - emptyMethod = false; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmResource.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmResource.java deleted file mode 100644 index 2bb7c8fbe8b..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmResource.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.sonar.squid.api.SourceCodeEdgeUsage; - -public class AsmResource { - - private int accessFlags; - AsmClass parent; - boolean used = false; - private List outgoingEdges = new ArrayList(); - - void setAccessFlags(int accessFlags) { - this.accessFlags = accessFlags; - } - - void addUsesOfClasses(AsmClass[] asmClasses) { - for (AsmClass asmClass : asmClasses) { - addEdge(new AsmEdge(this, asmClass, SourceCodeEdgeUsage.USES)); - } - } - - public Set getDistinctUsedAsmClasses() { - Set distinctUsedAsmClasses = new HashSet(); - for (AsmEdge usage : getOutgoingEdges()) { - if (usage.getUsage() == SourceCodeEdgeUsage.USES) { - distinctUsedAsmClasses.add((AsmClass) usage.getTo()); - } - } - return distinctUsedAsmClasses; - } - - public Set getImplementedInterfaces() { - Set implementedInterfaces = new HashSet(); - for (AsmEdge usage : getOutgoingEdges()) { - if (usage.getUsage() == SourceCodeEdgeUsage.IMPLEMENTS) { - implementedInterfaces.add((AsmClass) usage.getTo()); - } - } - return implementedInterfaces; - } - - public void addEdge(AsmEdge edge) { - outgoingEdges.add(edge); - } - - public Collection getOutgoingEdges() { - return outgoingEdges; - } - - public AsmClass getParent() { - return parent; - } - - public boolean isAbstract() { - return AsmAccessFlags.isAbstract(accessFlags); - } - - public boolean isInterface() { - return AsmAccessFlags.isInterface(accessFlags); - } - - public boolean isStatic() { - return AsmAccessFlags.isStatic(accessFlags); - } - - boolean isPublic() { - return AsmAccessFlags.isPublic(accessFlags); - } - - public boolean isPrivate() { - return AsmAccessFlags.isPrivate(accessFlags); - } - - public boolean isProtected() { - return AsmAccessFlags.isProtected(accessFlags); - } - - boolean isFinal() { - return AsmAccessFlags.isFinal(accessFlags); - } - - public boolean isDeprecated() { - return AsmAccessFlags.isDeprecated(accessFlags); - } - - public void setUsed(boolean used) { - this.used = used; - } - - public boolean isUsed() { - return used; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignature.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignature.java deleted file mode 100644 index a21b5254ce2..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignature.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.objectweb.asm.signature.SignatureReader; - -public final class AsmSignature { - - private AsmSignature() { - } - - public static String[] extractInternalNames(String fieldOrMethodDescription, String fieldOrMethodOrClassSignature) { - String fieldOrMethodDescriptor = fieldOrMethodOrClassSignature; - if (fieldOrMethodDescriptor == null) { - fieldOrMethodDescriptor = fieldOrMethodDescription; - } - return extractInternalNames(fieldOrMethodDescriptor); - } - - public static String[] extractInternalNames(String fieldOrMethodOrClassSignature) { - AsmSignatureVisitor visitor = new AsmSignatureVisitor(); - new SignatureReader(fieldOrMethodOrClassSignature).accept(visitor); - return visitor.getInternalNames().toArray(new String[visitor.getInternalNames().size()]); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignatureVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignatureVisitor.java deleted file mode 100644 index d1ba0ec875e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmSignatureVisitor.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import java.util.HashSet; -import java.util.Set; - -import org.objectweb.asm.signature.SignatureVisitor; - -public class AsmSignatureVisitor implements SignatureVisitor { - - private Set internalNames = new HashSet(); - - public Set getInternalNames() { - return internalNames; - } - - /** - * {@inheritDoc} - */ - public void visitClassType(String name) { - internalNames.add(name); - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitArrayType() { - return this; - } - - /** - * {@inheritDoc} - */ - public void visitBaseType(char descriptor) { - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitClassBound() { - return this; - } - - public SignatureVisitor visitExceptionType() { - return this; - } - - /** - * {@inheritDoc} - */ - public void visitFormalTypeParameter(String name) { - } - - /** - * {@inheritDoc} - */ - public void visitInnerClassType(String name) { - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitInterface() { - return this; - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitInterfaceBound() { - return this; - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitParameterType() { - return this; - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitReturnType() { - return this; - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitSuperclass() { - return this; - } - - /** - * {@inheritDoc} - */ - public void visitTypeArgument() { - } - - /** - * {@inheritDoc} - */ - public SignatureVisitor visitTypeArgument(char wildcard) { - return this; - } - - /** - * {@inheritDoc} - */ - public void visitTypeVariable(String name) { - } - - /** - * {@inheritDoc} - */ - public void visitEnd() { - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmType.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmType.java deleted file mode 100644 index b81d8e6908d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmType.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.objectweb.asm.Type; - -public final class AsmType { - - private AsmType() { - // only static methods - } - - public static boolean isArray(Type type) { - return type.getSort() == Type.ARRAY; - } - - public static boolean isObject(Type type) { - return type.getSort() == Type.OBJECT; - } - - public static boolean isArrayOfObject(Type type) { - return isArray(type) && type.getElementType().getSort() == Type.OBJECT; - } - - public static boolean containsObject(Type type) { - return isObject(type) || isArrayOfObject(type); - } - - public static boolean isVoid(Type type) { - return type == Type.VOID_TYPE; - } - - public static String getObjectInternalName(Type type) { - if (isObject(type)) { - return type.getInternalName(); - } else if (isArrayOfObject(type)) { - return type.getElementType().getInternalName(); - } else { - throw new IllegalStateException("This method should not be called on a descriptor whitout Object reference : " - + type.getDescriptor()); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java deleted file mode 100644 index 9bbcd7eecce..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import java.util.Map; - -import org.apache.commons.lang.StringUtils; -import org.sonar.api.utils.WildcardPattern; -import org.sonar.check.Cardinality; -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.check.RuleProperty; -import org.sonar.java.PatternUtils; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.visitor.BytecodeVisitor; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -import com.google.common.collect.Maps; - -@Rule(key = "ArchitecturalConstraint", cardinality = Cardinality.MULTIPLE, priority = Priority.MAJOR) -public class ArchitectureCheck extends BytecodeVisitor { - - @RuleProperty - private String fromClasses = ""; - - @RuleProperty - private String toClasses = ""; - - private WildcardPattern[] fromPatterns; - private WildcardPattern[] toPatterns; - private AsmClass asmClass; - private Map internalNames; - - public String getFromClasses() { - return fromClasses; - } - - public void setFromClasses(String patterns) { - this.fromClasses = patterns; - } - - public String getToClasses() { - return toClasses; - } - - public void setToClasses(String patterns) { - this.toClasses = patterns; - } - - @Override - public void visitClass(AsmClass asmClass) { - String nameAsmClass = asmClass.getInternalName(); - if (WildcardPattern.match(getFromPatterns(), nameAsmClass)) { - this.asmClass = asmClass; - this.internalNames = Maps.newHashMap(); - } else { - this.asmClass = null; - } - } - - @Override - public void leaveClass(AsmClass asmClass) { - if (this.asmClass != null) { - for (CheckMessage message : internalNames.values()) { - SourceFile sourceFile = getSourceFile(asmClass); - sourceFile.log(message); - } - } - } - - @Override - public void visitEdge(AsmEdge edge) { - if (asmClass != null && edge != null) { - String internalNameTargetClass = edge.getTargetAsmClass().getInternalName(); - if ( !internalNames.containsKey(internalNameTargetClass)) { - if (WildcardPattern.match(getToPatterns(), internalNameTargetClass)) { - int sourceLineNumber = getSourceLineNumber(edge); - logMessage(asmClass.getInternalName(), internalNameTargetClass, sourceLineNumber); - } - } else { - int sourceLineNumber = getSourceLineNumber(edge); - // we log only first occurrence with non-zero line number if exists - if (internalNames.get(internalNameTargetClass).getLine() == 0 && sourceLineNumber != 0) { - logMessage(asmClass.getInternalName(), internalNameTargetClass, sourceLineNumber); - } - } - } - } - - private int getSourceLineNumber(AsmEdge edge) { - if ((edge.getSourceLineNumber() == 0) && (edge.getFrom() instanceof AsmMethod)) { - SourceMethod sourceMethod = getSourceMethod((AsmMethod) edge.getFrom()); - if (sourceMethod != null) { - return sourceMethod.getStartAtLine(); - } - } - return edge.getSourceLineNumber(); - } - - private void logMessage(String fromClass, String toClass, int sourceLineNumber) { - CheckMessage message = new CheckMessage(this, fromClass + " must not use " + toClass); - message.setLine(sourceLineNumber); - internalNames.put(toClass, message); - } - - private WildcardPattern[] getFromPatterns() { - if (fromPatterns == null) { - fromPatterns = PatternUtils.createPatterns(StringUtils.defaultIfEmpty(fromClasses, "**")); - } - return fromPatterns; - } - - private WildcardPattern[] getToPatterns() { - if (toPatterns == null) { - toPatterns = PatternUtils.createPatterns(toClasses); - } - return toPatterns; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java deleted file mode 100644 index 5ae79f5c386..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.visitor.BytecodeVisitor; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; - -@Rule(key = "CallToDeprecatedMethod", priority = Priority.MINOR) -public class CallToDeprecatedMethodCheck extends BytecodeVisitor { - - private AsmClass asmClass; - - @Override - public void visitClass(AsmClass asmClass) { - this.asmClass = asmClass; - } - - @Override - public void visitEdge(AsmEdge edge) { - if (edge.getTo().isDeprecated() && edge.getTo() instanceof AsmMethod) { - AsmMethod targetMethod = (AsmMethod) edge.getTo(); - SourceFile sourceFile = getSourceFile(asmClass); - CheckMessage message = new CheckMessage(this, "Method '" + targetMethod.getName() + "(...)' is deprecated."); - message.setLine(edge.getSourceLineNumber()); - sourceFile.log(message); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/SerializableContract.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/SerializableContract.java deleted file mode 100644 index 89e5569c5a0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/SerializableContract.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import java.util.HashSet; -import java.util.Set; - -import org.sonar.java.bytecode.asm.AsmMethod; - - -public final class SerializableContract { - - private static Set serializableContractMethods = new HashSet(); - - static{ - serializableContractMethods.add("writeObject"); - serializableContractMethods.add("readObject"); - serializableContractMethods.add("writeReplace"); - serializableContractMethods.add("readResolve"); - } - - private SerializableContract() { - - } - - protected static boolean methodMatch(AsmMethod method) { - return serializableContractMethods.contains(method.getName()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java deleted file mode 100644 index a2c750127b4..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.visitor.BytecodeVisitor; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -@Rule(key = "UnusedPrivateMethod", priority = Priority.MAJOR) -public class UnusedPrivateMethodCheck extends BytecodeVisitor { - - private AsmClass asmClass; - - @Override - public void visitClass(AsmClass asmClass) { - this.asmClass = asmClass; - } - - @Override - public void visitMethod(AsmMethod asmMethod) { - if ( !asmMethod.isUsed() && asmMethod.isPrivate() && !asmMethod.isDefaultConstructor() && !SerializableContract.methodMatch(asmMethod)) { - CheckMessage message = new CheckMessage(this, "Private method '" + asmMethod.getName() + "(...)' is never used."); - SourceMethod sourceMethod = getSourceMethod(asmMethod); - if (sourceMethod != null) { - message.setLine(sourceMethod.getStartAtLine()); - } - SourceFile file = getSourceFile(asmClass); - file.log(message); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java deleted file mode 100644 index 0367972a6cb..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.visitor.BytecodeVisitor; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -@Rule(key = "UnusedProtectedMethod", priority = Priority.MAJOR) -public class UnusedProtectedMethodCheck extends BytecodeVisitor { - - private AsmClass asmClass; - - @Override - public void visitClass(AsmClass asmClass) { - this.asmClass = asmClass; - } - - @Override - public void visitMethod(AsmMethod asmMethod) { - if ( !asmMethod.isUsed() && asmMethod.isProtected() && !asmClass.isAbstract() && !SerializableContract.methodMatch(asmMethod) - && !asmMethod.isInherited()) { - CheckMessage message = new CheckMessage(this, "Protected method '" + asmMethod.getName() + "(...)' is never used."); - SourceMethod sourceMethod = getSourceMethod(asmMethod); - if (sourceMethod != null) { - message.setLine(sourceMethod.getStartAtLine()); - } - SourceFile file = getSourceFile(asmClass); - file.log(message); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/FileSystemLoader.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/FileSystemLoader.java deleted file mode 100644 index 5d0baf7a3e6..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/FileSystemLoader.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; - -import org.apache.commons.io.IOUtils; - -class FileSystemLoader implements Loader { - - private File baseDir; - - public FileSystemLoader(File baseDir) { - if (baseDir == null) { - throw new IllegalArgumentException("baseDir can't be null"); - } - this.baseDir = baseDir; - } - - public URL findResource(String name) { - if (baseDir == null) { - throw new IllegalStateException("Loader closed"); - } - File file = new File(baseDir, name); - if (file.exists() && file.isFile()) { - try { - return file.toURL(); - } catch (MalformedURLException e) { - return null; - } - } - return null; - } - - public byte[] loadBytes(String name) { - if (baseDir == null) { - throw new IllegalStateException("Loader closed"); - } - File file = new File(baseDir, name); - if (!file.exists()) { - return null; - } - InputStream is = null; - try { - is = new FileInputStream(file); - return IOUtils.toByteArray(is); - } catch (IOException e) { - return null; - } finally { - IOUtils.closeQuietly(is); - } - } - - public void close() { - baseDir = null; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/JarLoader.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/JarLoader.java deleted file mode 100644 index d22e2a61583..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/JarLoader.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; - -import org.apache.commons.io.IOUtils; - -class JarLoader implements Loader { - - private final JarFile jarFile; - private final URL jarUrl; - - /** - * @throws IOException if an I/O error has occurred - */ - public JarLoader(File file) throws IOException { - if (file == null) { - throw new IllegalArgumentException("file can't be null"); - } - jarFile = new JarFile(file); - jarUrl = new URL("jar", "", -1, file.getAbsolutePath() + "!/"); - } - - public URL findResource(String name) { - ZipEntry entry = jarFile.getEntry(name); - if (entry != null) { - try { - return new URL(jarUrl, name, new JarEntryHandler(entry)); - } catch (MalformedURLException e) { - return null; - } - } - return null; - } - - public byte[] loadBytes(String name) { - InputStream is = null; - try { - ZipEntry entry = jarFile.getEntry(name); - if (entry == null) { - return null; - } - is = jarFile.getInputStream(entry); - return IOUtils.toByteArray(is); - } catch (IOException e) { - return null; - } finally { - IOUtils.closeQuietly(is); - } - } - - public void close() { - try { - jarFile.close(); - } catch (IOException e) { - // ignore - } - } - - private class JarEntryHandler extends URLStreamHandler { - - private ZipEntry entry; - - JarEntryHandler(ZipEntry entry) { - this.entry = entry; - } - - @Override - protected URLConnection openConnection(URL u) throws IOException { - return new URLConnection(u) { - @Override - public void connect() throws IOException { - } - - @Override - public int getContentLength() { - return (int) entry.getSize(); - } - - @Override - public InputStream getInputStream() throws IOException { - return jarFile.getInputStream(entry); - } - }; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/Loader.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/Loader.java deleted file mode 100644 index 160c6224aca..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/Loader.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import java.net.URL; - -/** - * Specifies resource loading behavior. - */ -interface Loader { - - /** - * Finds the resource with the given name. - * - * @param name resource name - * @return an URL object for reading the resource, or - * null if the resource could not be found - * @throws IllegalStateException if loader has been closed - */ - URL findResource(String name); - - /** - * Loads bytes of the resource with the given name. - * - * @param name resource name - * @return an array of bytes, or - * null if the resource could not be found or could not be loaded for some reason - * @throws IllegalStateException if loader has been closed - */ - byte[] loadBytes(String name); - - /** - * Closes this loader, so that it can no longer be used to load new resources. - * If loader is already closed, then invoking this method has no effect. - */ - void close(); - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/SquidClassLoader.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/SquidClassLoader.java deleted file mode 100644 index cccd4d04660..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/loader/SquidClassLoader.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.List; - -import com.google.common.collect.Iterators; - -/** - * Class loader, which is able to load classes from a list of JAR files and directories. - */ -public class SquidClassLoader extends ClassLoader implements Closeable { - - private final List loaders; - - public SquidClassLoader(Collection files) throws IOException { - super(null); - loaders = new ArrayList(); - for (File file : files) { - if (file.exists()) { - if (file.isDirectory()) { - loaders.add(new FileSystemLoader(file)); - } else { - loaders.add(new JarLoader(file)); - } - } - } - } - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - byte[] classBytes = loadClassBytes(name); - if (classBytes == null) { - throw new ClassNotFoundException(name); - } - // TODO Godin: definePackage ? - return defineClass(name, classBytes, 0, classBytes.length); - } - - private byte[] loadClassBytes(String name) { - String resourceName = name.replace('.', '/') + ".class"; - for (Loader loader : loaders) { - byte[] classBytes = loader.loadBytes(resourceName); - if (classBytes != null) { - return classBytes; - } - } - return null; - } - - @Override - public URL findResource(String name) { - for (Loader loader : loaders) { - URL url = loader.findResource(name); - if (url != null) { - return url; - } - } - return null; - } - - @Override - protected Enumeration findResources(String name) throws IOException { - List result = new ArrayList(); - for (Loader loader : loaders) { - URL url = loader.findResource(name); - if (url != null) { - result.add(url); - } - } - return Iterators.asEnumeration(result.iterator()); - } - - /** - * Closes this class loader, so that it can no longer be used to load new classes or resources. - * Any classes or resources that are already loaded, are still accessible. - * - * If class loader is already closed, then invoking this method has no effect. - */ - public void close() { - for (Loader loader : loaders) { - loader.close(); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/BytecodeVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/BytecodeVisitor.java deleted file mode 100644 index 3040bd2abc0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/BytecodeVisitor.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.java.bytecode.asm.AsmField; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.signature.MethodSignature; -import org.sonar.java.signature.MethodSignaturePrinter; -import org.sonar.java.signature.MethodSignatureScanner; -import org.sonar.squid.api.CodeVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.indexer.SquidIndex; - -public class BytecodeVisitor implements CodeVisitor { - - SquidIndex index; - - public void visitClass(AsmClass asmClass) { - } - - public void visitMethod(AsmMethod asmMethod) { - } - - public void visitField(AsmField asmField) { - } - - public void visitEdge(AsmEdge asmEdge) { - - } - - public void leaveClass(AsmClass asmClass) { - } - - protected final SourceClass getSourceClass(AsmClass asmClass) { - return (SourceClass) index.search(asmClass.getInternalName()); - } - - protected final boolean isMainPublicClassInFile(AsmClass asmClass) { - return index.search(asmClass.getInternalName() + ".java") != null; - } - - protected final SourceFile getSourceFile(AsmClass asmClass) { - return getSourceClass(asmClass).getParent(SourceFile.class); - } - - protected final SourceMethod getSourceMethod(AsmMethod asmMethod) { - MethodSignature methodSignature = MethodSignatureScanner.scan(asmMethod.getGenericKey()); - AsmClass asmClass = asmMethod.getParent(); - return (SourceMethod) index.search(asmClass.getInternalName() + "#" + MethodSignaturePrinter.print(methodSignature)); - } - - public final void setSquidIndex(SquidIndex index) { - this.index = index; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DITVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DITVisitor.java deleted file mode 100644 index bfdec1cb2bc..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DITVisitor.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.squid.measures.Metric; - -public class DITVisitor extends BytecodeVisitor { - - @Override - public void visitClass(AsmClass asmClass) { - int dit = calculateDepthOfInheritance(asmClass); - - getSourceClass(asmClass).add(Metric.DIT, dit); - - if (isMainPublicClassInFile(asmClass)) { - getSourceFile(asmClass).add(Metric.DIT, dit); - } - } - - private int calculateDepthOfInheritance(AsmClass asmClass) { - int dit = 0; - AsmClass superClass = asmClass.getSuperClass(); - while (superClass != null) { - dit++; - superClass = superClass.getSuperClass(); - } - return dit; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DependenciesVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DependenciesVisitor.java deleted file mode 100644 index 2c04f4567c6..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/DependenciesVisitor.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import org.sonar.graph.DirectedGraph; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceCodeEdge; -import org.sonar.squid.api.SourceCodeEdgeUsage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.measures.Metric; - -public class DependenciesVisitor extends BytecodeVisitor { - - private SourceClass fromSourceClass; - private final DirectedGraph graph; - - public DependenciesVisitor(DirectedGraph graph) { - this.graph = graph; - } - - @Override - public void visitClass(AsmClass asmClass) { - this.fromSourceClass = getSourceClass(asmClass); - } - - @Override - public void visitEdge(AsmEdge edge) { - AsmClass toAsmClass = edge.getTargetAsmClass(); - SourceClass toSourceClass = getSourceClass(toAsmClass); - switch (edge.getUsage()) { - case EXTENDS: - link(fromSourceClass, toSourceClass, SourceCodeEdgeUsage.EXTENDS); - break; - case IMPLEMENTS: - link(fromSourceClass, toSourceClass, SourceCodeEdgeUsage.IMPLEMENTS); - break; - default: - link(fromSourceClass, toSourceClass, SourceCodeEdgeUsage.USES); - break; - } - } - - private void link(SourceClass from, SourceClass to, SourceCodeEdgeUsage link) { - if (canWeLinkNodes(from, to) && graph.getEdge(from, to) == null) { - SourceCodeEdge edge = new SourceCodeEdge(from, to, link); - graph.addEdge(edge); - from.add(Metric.CE, 1); - to.add(Metric.CA, 1); - SourceCodeEdge fileEdge = createEdgeBetweenParents(SourceFile.class, from, to, edge); - createEdgeBetweenParents(SourcePackage.class, from, to, fileEdge); - } - } - - private SourceCodeEdge createEdgeBetweenParents(Class type, SourceClass from, SourceClass to, - SourceCodeEdge rootEdge) { - SourceCode fromParent = from.getParent(type); - SourceCode toParent = to.getParent(type); - SourceCodeEdge parentEdge = null; - if (canWeLinkNodes(fromParent, toParent) && rootEdge != null) { - if (graph.getEdge(fromParent, toParent) == null) { - parentEdge = new SourceCodeEdge(fromParent, toParent, SourceCodeEdgeUsage.USES); - parentEdge.addRootEdge(rootEdge); - graph.addEdge(parentEdge); - fromParent.add(Metric.CE, 1); - toParent.add(Metric.CA, 1); - } else { - parentEdge = graph.getEdge(fromParent, toParent); - if ( !parentEdge.hasAnEdgeFromRootNode(rootEdge.getFrom())) { - toParent.add(Metric.CA, 1); - } - if ( !parentEdge.hasAnEdgeToRootNode(rootEdge.getTo())) { - fromParent.add(Metric.CE, 1); - } - parentEdge.addRootEdge(rootEdge); - } - } - return parentEdge; - } - - private boolean canWeLinkNodes(SourceCode from, SourceCode to) { - return from != null && to != null && !from.equals(to); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/LCOM4Visitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/LCOM4Visitor.java deleted file mode 100644 index f0c5cc07fe8..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/LCOM4Visitor.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import java.util.*; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.java.bytecode.asm.AsmField; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.asm.AsmResource; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.api.SourceCodeEdgeUsage; -import org.sonar.squid.measures.Metric; - -public class LCOM4Visitor extends BytecodeVisitor { - - private AsmClass asmClass; - private List> unrelatedBlocks = null; - private final Set fieldsToExcludeFromLcom4Calculation; - - public LCOM4Visitor(JavaSquidConfiguration conf) { - this.fieldsToExcludeFromLcom4Calculation = conf.getFielsToExcludeFromLcom4Calculation(); - } - - @Override - public void visitClass(AsmClass asmClass) { - this.asmClass = asmClass; - unrelatedBlocks = new ArrayList>(); - } - - @Override - public void visitMethod(AsmMethod asmMethod) { - if (isMethodElligibleForLCOM4Computation(asmMethod)) { - ensureBlockIsCreated(asmMethod); - for (AsmEdge edge : asmMethod.getOutgoingEdges()) { - if (isCallToInternalFieldOrMethod(edge) && isNotCallToExcludedFieldFromLcom4Calculation(edge.getTo())) { - AsmResource toResource = getAccessedFieldOrMethod(edge.getTo()); - linkAsmResources(asmMethod, toResource); - } - } - } - } - - private AsmResource getAccessedFieldOrMethod(AsmResource resource) { - if (resource instanceof AsmMethod && ((AsmMethod)resource).isAccessor()) { - return ((AsmMethod)resource).getAccessedField(); - } else { - return resource; - } - } - - private boolean isNotCallToExcludedFieldFromLcom4Calculation(AsmResource to) { - if (to instanceof AsmField) { - AsmField field = (AsmField)to; - return !fieldsToExcludeFromLcom4Calculation.contains(field.getName()); - } - return true; - } - - private boolean isMethodElligibleForLCOM4Computation(AsmMethod asmMethod) { - return !asmMethod.isAbstract() && !asmMethod.isStatic() && !asmMethod.isConstructor() && !asmMethod.isEmpty() - && !asmMethod.isAccessor() && asmMethod.isBodyLoaded(); - } - - private void removeIsolatedMethodBlocks() { - Iterator> iterator = unrelatedBlocks.iterator(); - - while (iterator.hasNext()) { - Set block = iterator.next(); - if (block.size() == 1) { - iterator.remove(); - } - } - - } - - @Override - public void leaveClass(AsmClass asmClass) { - removeIsolatedMethodBlocks(); - - int lcom4 = unrelatedBlocks.size(); - if (lcom4 == 0) { - lcom4 = 1; - } - - getSourceClass(asmClass).add(Metric.LCOM4, lcom4); - getSourceClass(asmClass).addData(Metric.LCOM4_BLOCKS, unrelatedBlocks); - - if (isMainPublicClassInFile(asmClass)) { - getSourceFile(asmClass).add(Metric.LCOM4, lcom4); - getSourceFile(asmClass).addData(Metric.LCOM4_BLOCKS, unrelatedBlocks); - } - } - - private void ensureBlockIsCreated(AsmResource resource) { - getOrCreateResourceBlock(resource); - } - - private void linkAsmResources(AsmResource resourceA, AsmResource resourceB) { - Set blockA = getOrCreateResourceBlock(resourceA); - Set blockB = getOrCreateResourceBlock(resourceB); - - // getOrCreateResourceBlock() returns the same block instance if resourceA and resourceB are identical or already in the same block - // TODO: Avoid this violation by using a Disjoint Union Set which is also more efficient performance-wise - // See: http://en.wikipedia.org/wiki/Disjoint-set_data_structure - if (blockA == blockB) { // NOSONAR false-positive Compare Objects With Equals - return; - } - - blockA.addAll(blockB); - unrelatedBlocks.remove(blockB); - } - - private boolean isCallToInternalFieldOrMethod(AsmEdge edge) { - return edge.getTargetAsmClass() == asmClass && (edge.getUsage() == SourceCodeEdgeUsage.CALLS_FIELD || edge.getUsage() == SourceCodeEdgeUsage.CALLS_METHOD); - } - - private Set getOrCreateResourceBlock(AsmResource resource) { - for (Set block: unrelatedBlocks) { - if (block.contains(resource)) { - return block; - } - } - - Set block = new HashSet(); - block.add(resource); - unrelatedBlocks.add(block); - return block; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/NOCVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/NOCVisitor.java deleted file mode 100644 index fe5c8e9d762..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/NOCVisitor.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.squid.measures.Metric; - -public class NOCVisitor extends BytecodeVisitor { - - @Override - public void visitClass(AsmClass asmClass) { - getSourceClass(asmClass).add(Metric.NOC, asmClass.getNumberOfChildren()); - - if (isMainPublicClassInFile(asmClass)) { - getSourceFile(asmClass).add(Metric.NOC, asmClass.getNumberOfChildren()); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/RFCVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/RFCVisitor.java deleted file mode 100644 index f8a61feb280..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/visitor/RFCVisitor.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import java.util.HashSet; -import java.util.Set; - -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmEdge; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.squid.api.SourceCodeEdgeUsage; -import org.sonar.squid.measures.Metric; - -public class RFCVisitor extends BytecodeVisitor { - - private AsmClass asmClass; - private Set distinctCallToExternalMethods; - private int rfc = 0; - - @Override - public void visitClass(AsmClass asmClass) { - rfc = 0; - this.asmClass = asmClass; - distinctCallToExternalMethods = new HashSet(); - } - - @Override - public void visitMethod(AsmMethod asmMethod) { - if (asmMethod.isBodyLoaded() && !asmMethod.isAccessor()) { - rfc++; - } - } - - @Override - public void visitEdge(AsmEdge edge) { - if (edge.getTargetAsmClass() != asmClass && edge.getUsage() == SourceCodeEdgeUsage.CALLS_METHOD - && !((AsmMethod) edge.getTo()).isAccessor()) { - distinctCallToExternalMethods.add((AsmMethod) edge.getTo()); - } - } - - @Override - public void leaveClass(AsmClass asmClass) { - rfc += distinctCallToExternalMethods.size(); - getSourceClass(asmClass).add(Metric.RFC, rfc); - - if (isMainPublicClassInFile(asmClass)) { - getSourceFile(asmClass).add(Metric.RFC, rfc); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/recognizer/JavaFootprint.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/recognizer/JavaFootprint.java deleted file mode 100644 index ea688be36e8..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/recognizer/JavaFootprint.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.recognizer; - -import com.google.common.collect.Sets; -import org.sonar.squid.recognizer.*; - -import java.util.Set; - -public final class JavaFootprint implements LanguageFootprint { - - private final Set detectors = Sets.newHashSet(); - - public JavaFootprint() { - detectors.add(new EndWithDetector(0.95, '}', ';', '{')); // NOSONAR Magic number is suitable in that case - detectors.add(new KeywordsDetector(0.7, "||", "&&")); // NOSONAR - detectors.add(new KeywordsDetector(0.3, "public", "abstract", "class", "implements", "extends", "return", "throw",// NOSONAR - "private", "protected", "enum", "continue", "assert", "package", "synchronized", "boolean", "this", "double", "instanceof", - "final", "interface", "static", "void", "long", "int", "float", "super", "true", "case:")); - detectors.add(new ContainsDetector(0.95, "++", "for(", "if(", "while(", "catch(", "switch(", "try{", "else{"));// NOSONAR - detectors.add(new CamelCaseDetector(0.5));// NOSONAR - } - - public Set getDetectors() { - return detectors; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/JvmJavaType.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/JvmJavaType.java deleted file mode 100644 index c1910eeee55..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/JvmJavaType.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -public enum JvmJavaType { - - V("VOID"), L("OBJECT"), T("GENERIC"), S("SHORT"), I("INT"), C("CHAR"), Z("BOOLEAN"), B("BYTE"), J("LONG"), F("FLOAT"), D("DOUBLE"); - - public final String description; - - private JvmJavaType(String description) { - this.description = description; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignature.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignature.java deleted file mode 100644 index 62dedc8f969..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignature.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import java.util.Arrays; -import java.util.List; - -public class MethodSignature { - - private final String methodName; - private final Parameter returnType; - private final List argumentTypes; - - public MethodSignature(String methodName, Parameter returnType, Parameter... argumentTypes) { - this(methodName, returnType, Arrays.asList(argumentTypes)); - } - - public MethodSignature(String methodName, Parameter returnType, List argumentTypes) { - this.methodName = methodName; - this.returnType = returnType; - this.argumentTypes = argumentTypes; - } - - public String getMethodName() { - return methodName; - } - - public Parameter getReturnType() { - return returnType; - } - - public List getArgumentTypes() { - return argumentTypes; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignaturePrinter.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignaturePrinter.java deleted file mode 100644 index 33cc174ae7d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignaturePrinter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -public final class MethodSignaturePrinter { - - public static String print(MethodSignature methodSignature) { - StringBuilder builder = new StringBuilder(); - builder.append(methodSignature.getMethodName()); - builder.append("("); - for (Parameter argumentType : methodSignature.getArgumentTypes()) { - builder.append(ParameterSignaturePrinter.print(argumentType)); - } - builder.append(")"); - builder.append(ParameterSignaturePrinter.print(methodSignature.getReturnType())); - return builder.toString(); - } - - private MethodSignaturePrinter() { - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignatureScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignatureScanner.java deleted file mode 100644 index f10dd32fad2..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/MethodSignatureScanner.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import java.util.List; - -public final class MethodSignatureScanner { - - private final String bytecodeMethodSignature; - - private MethodSignatureScanner(String bytecodeMethodSignature) { - this.bytecodeMethodSignature = bytecodeMethodSignature; - } - - public static MethodSignature scan(String bytecodeMethodSignature) { - MethodSignatureScanner scanner = new MethodSignatureScanner(bytecodeMethodSignature); - return scanner.scan(); - } - - private MethodSignature scan() { - int leftBracketIndex = bytecodeMethodSignature.indexOf('('); - int rightBracketIndex = bytecodeMethodSignature.indexOf(')'); - String methodName = bytecodeMethodSignature.substring(0, leftBracketIndex); - Parameter returnType = ParameterSignatureScanner.scan(bytecodeMethodSignature.substring(rightBracketIndex + 1)); - List argumentTypes = ParameterSignatureScanner.scanArguments(bytecodeMethodSignature.substring(leftBracketIndex + 1, - rightBracketIndex)); - return new MethodSignature(methodName, returnType, argumentTypes); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/Parameter.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/Parameter.java deleted file mode 100644 index b9a36bfc587..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/Parameter.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -public class Parameter { - - private final JvmJavaType jvmJavaType; - private final String className; - private final boolean isArray; - - public Parameter(JvmJavaType jvmJavaType, boolean isArray) { - this(jvmJavaType, null, isArray); - } - - public Parameter(String classCanonicalName, boolean isArray) { - this(JvmJavaType.L, classCanonicalName, isArray); - } - - Parameter(JvmJavaType jvmJavaType, String classCanonicalName, boolean isArray) { - if (jvmJavaType == JvmJavaType.L && (classCanonicalName == null || "".equals(classCanonicalName))) { - throw new IllegalStateException("With an Object JavaType, this is mandatory to specify the canonical name of the class."); - } - this.jvmJavaType = jvmJavaType; - this.className = extractClassName(classCanonicalName); - this.isArray = isArray; - } - - public Parameter(Parameter parameter) { - this(parameter.jvmJavaType, parameter.className, parameter.isArray); - } - - public boolean isVoid() { - return jvmJavaType == JvmJavaType.V; - } - - public JvmJavaType getJvmJavaType() { - return jvmJavaType; - } - - public String getClassName() { - return className; - } - - public boolean isArray() { - return isArray; - } - - public boolean isOject() { - return jvmJavaType == JvmJavaType.L; - } - - private String extractClassName(String classCanonicalName) { - if (classCanonicalName == null) { - return null; - } - int slashIndex = classCanonicalName.lastIndexOf('/'); - int dollarIndex = classCanonicalName.lastIndexOf('$'); - if (slashIndex != -1 || dollarIndex != -1) { - return classCanonicalName.substring(Math.max(slashIndex, dollarIndex) + 1); - } - return classCanonicalName; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignaturePrinter.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignaturePrinter.java deleted file mode 100644 index bdad8c96e47..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignaturePrinter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -public final class ParameterSignaturePrinter { - - private static final char ARRAY = '['; - - public static String print(Parameter parameter) { - StringBuilder signature = new StringBuilder(); - if (parameter.isArray()) { - signature.append(ARRAY); - } - signature.append(parameter.getJvmJavaType()); - if (parameter.isOject()) { - signature.append(parameter.getClassName()); - signature.append(';'); - } - return signature.toString(); - } - - private ParameterSignaturePrinter() { - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignatureScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignatureScanner.java deleted file mode 100644 index 09fa6e259b9..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/signature/ParameterSignatureScanner.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import java.util.ArrayList; -import java.util.List; - -public final class ParameterSignatureScanner { - - private final String signature; - private int index = 0; - - private static final char ARRAY = '['; - - private ParameterSignatureScanner(String parametersSignature) { - this.signature = parametersSignature; - } - - public static Parameter scan(String parameterSignature) { - ParameterSignatureScanner scanner = new ParameterSignatureScanner(parameterSignature); - if (scanner.hasNext()) { - return scanner.next(); - } else { - return null; - } - } - - public static List scanArguments(String argumentsSignature) { - List arguments = new ArrayList(); - - ParameterSignatureScanner scanner = new ParameterSignatureScanner(argumentsSignature); - while (scanner.hasNext()) { - arguments.add(scanner.next()); - } - - return arguments; - } - - private boolean hasNext() { - if (signature.length() > index && (signature.charAt(index) == ARRAY || nextCharIsJvmJavaType())) { - return true; - } - return false; - } - - private boolean nextCharIsJvmJavaType() { - try { - JvmJavaType.valueOf(signature.substring(index, index + 1)); - return true; - } catch (IllegalArgumentException e) { - return false; - } - } - - private Parameter next() { - boolean isArray = false; - String classCanonicalName = null; - - while (signature.charAt(index) == ARRAY) { - isArray = true; - index++; - } - - JvmJavaType jvmJavaType = JvmJavaType.valueOf(signature.substring(index, index + 1)); - index = index + 1; - - if (jvmJavaType == JvmJavaType.L || jvmJavaType == JvmJavaType.T) { - int semicolonIndex = searchEndOfParameterSignature(signature, index); - int inferiorCharIndex = signature.indexOf('<', index); - if (inferiorCharIndex != -1 && inferiorCharIndex < semicolonIndex) { - classCanonicalName = signature.substring(index, signature.indexOf('<', index)); - } else { - classCanonicalName = signature.substring(index, semicolonIndex); - } - index = semicolonIndex + 1; - jvmJavaType = JvmJavaType.L; - } - return new Parameter(jvmJavaType, classCanonicalName, isArray); - } - - private int searchEndOfParameterSignature(String signature, int index) { - int genericDefinitionStack = 0; - for (; index < signature.length(); index++) { - char character = signature.charAt(index); - if (character == ';' && genericDefinitionStack == 0) { - return index; - } - if (character == '<') { - genericDefinitionStack++; - } else if (character == '>') { - genericDefinitionStack--; - } - } - throw new IllegalStateException("Unable to extract parameter signature from '" + signature + "'"); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/JavaSquidConfiguration.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/JavaSquidConfiguration.java deleted file mode 100644 index a0524df787e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/JavaSquidConfiguration.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.squid; - -import java.nio.charset.Charset; -import java.util.HashSet; -import java.util.Set; - -import org.sonar.squid.api.SquidConfiguration; - -public class JavaSquidConfiguration extends SquidConfiguration { - - private boolean analysePropertyAccessors = true; - private Set fieldsToExcludeFromLcom4Calculation = new HashSet(); - - private static final double COMMENTED_CODE_DEFAULT_THRESHOLD = 0.9; - private double commentedCodeThreshold = COMMENTED_CODE_DEFAULT_THRESHOLD; - - public JavaSquidConfiguration() { - } - - public JavaSquidConfiguration(boolean analysePropertyAccessors) { - this.analysePropertyAccessors = analysePropertyAccessors; - } - - public JavaSquidConfiguration(double commentedCodeThreshold) { - setCommentedCodeThreshold(commentedCodeThreshold); - } - - public JavaSquidConfiguration(boolean analysePropertyAccessors, Charset charset) { - super(charset); - this.analysePropertyAccessors = analysePropertyAccessors; - } - - public JavaSquidConfiguration(boolean analysePropertyAccessors, Charset charset, double commentedCodeThreshold) { - super(charset); - this.analysePropertyAccessors = analysePropertyAccessors; - setCommentedCodeThreshold(commentedCodeThreshold); - } - - public boolean isAnalysePropertyAccessors() { - return analysePropertyAccessors; - } - - public Set getFielsToExcludeFromLcom4Calculation() { - return fieldsToExcludeFromLcom4Calculation; - } - - public void addFieldToExcludeFromLcom4Calculation(String fieldName) { - fieldsToExcludeFromLcom4Calculation.add(fieldName); - } - - private void setCommentedCodeThreshold(double commentedCodeThreshold) { - if (commentedCodeThreshold < 0 || commentedCodeThreshold > 1) { - throw new IllegalArgumentException("Commented Code Threshold should be between [0...1]. Current value : " + commentedCodeThreshold); - } - this.commentedCodeThreshold = commentedCodeThreshold; - } - - public double getCommentedCodeThreshold() { - return commentedCodeThreshold; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidScanner.java deleted file mode 100644 index 803554b9810..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidScanner.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid; - -import java.util.Collection; -import java.util.Collections; - -import org.sonar.java.squid.check.SquidCheck; -import org.sonar.java.squid.visitor.SquidVisitor; -import org.sonar.squid.api.CodeScanner; -import org.sonar.squid.api.CodeVisitor; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.indexer.QueryByType; -import org.sonar.squid.indexer.SquidIndex; - -public class SquidScanner extends CodeScanner { - - private SquidIndex indexer; - - public SquidScanner(SquidIndex indexer) { - this.indexer = indexer; - } - - public void scan() { - Collection files = indexer.search(new QueryByType(SourceFile.class)); - notifySquidVisitors(files); - } - - private void notifySquidVisitors(Collection files) { - SquidVisitor[] visitorArray = getVisitors().toArray(new SquidVisitor[getVisitors().size()]); - for (SourceCode sourceFile : files) { - new SquidVisitorNotifier((SourceFile) sourceFile, visitorArray).notifyVisitors(); - } - } - - @Override - public Collection> getVisitorClasses() { - return Collections.emptyList(); - } - - @Override - public void accept(CodeVisitor visitor) { - if (visitor instanceof SquidCheck) { - super.accept(visitor); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidVisitorNotifier.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidVisitorNotifier.java deleted file mode 100644 index 46928ab1a74..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/SquidVisitorNotifier.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.squid; - -import org.sonar.java.squid.visitor.SquidVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -public class SquidVisitorNotifier { - - private final SourceFile sourceFile; - private final SquidVisitor[] squidVisitors; - - public SquidVisitorNotifier(SourceFile sourceFile, SquidVisitor... squidVisitors) { - this.sourceFile = sourceFile; - this.squidVisitors = new SquidVisitor[squidVisitors.length]; - System.arraycopy(squidVisitors, 0, this.squidVisitors, 0, squidVisitors.length); - } - - public void notifyVisitors() { - callVisitFile(); - } - - private void callVisitFile() { - for (SquidVisitor visitor : squidVisitors) { - visitor.visitFile(sourceFile); - } - visitChildren(sourceFile); - } - - private void visitChildren(SourceCode sourceCode) { - if (sourceCode instanceof SourceClass) { - for (SquidVisitor visitor : squidVisitors) { - visitor.visitClass((SourceClass) sourceCode); - } - } else if (sourceCode instanceof SourceMethod) { - for (SquidVisitor visitor : squidVisitors) { - visitor.visitMethod((SourceMethod) sourceCode); - } - } - - if (sourceCode.hasChildren()) { - for (SourceCode child : sourceCode.getChildren()) { - visitChildren(child); - } - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java deleted file mode 100644 index 278f3639b26..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.check.RuleProperty; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -@Rule(key = "ClassCyclomaticComplexity", priority = Priority.MAJOR) -public class ClassComplexityCheck extends SquidCheck { - - public static final int DEFAULT_MAX = 200; - - @RuleProperty(defaultValue = "" + DEFAULT_MAX) - private Integer max = DEFAULT_MAX; - - @Override - public void visitClass(SourceClass sourceClass) { - int complexity = sourceClass.getInt(Metric.COMPLEXITY); - if (complexity > max) { - CheckMessage message = new CheckMessage(this, "The Cyclomatic Complexity of this class is " + complexity + " which is greater than " - + max + " authorized."); - message.setLine(sourceClass.getStartAtLine()); - message.setCost(complexity - max); - sourceClass.getParent(SourceFile.class).log(message); - } - } - - public void setMax(int max) { - this.max = max; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/CycleBetweenPackagesCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/CycleBetweenPackagesCheck.java deleted file mode 100644 index 2abc22ca0e2..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/CycleBetweenPackagesCheck.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.squid.check; - -import org.sonar.api.checks.CheckFactory; -import org.sonar.api.rules.ActiveRule; -import org.sonar.check.BelongsToProfile; -import org.sonar.check.Priority; -import org.sonar.check.Rule; - -import javax.annotation.CheckForNull; - -/** - * Companion of {@link org.sonar.plugins.squid.bridges.DesignBridge} which actually does the job on finding cycles and creation of violations. - * - * @since 3.2 - */ -@Rule(key = "CycleBetweenPackages", priority = Priority.MAJOR) -@BelongsToProfile(title = "Sonar way", priority = Priority.MAJOR) -public class CycleBetweenPackagesCheck extends SquidCheck { - - /** - * @return null, if this check is inactive - */ - @CheckForNull - public static ActiveRule getActiveRule(CheckFactory checkFactory) { - for (Object check : checkFactory.getChecks()) { - if (check.getClass().getName() == CycleBetweenPackagesCheck.class.getName()) { - return checkFactory.getActiveRule(check); - } - } - return null; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java deleted file mode 100644 index 86a38e0923d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.check.RuleProperty; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -@Rule(key = "MaximumInheritanceDepth", priority = Priority.MAJOR) -public class DITCheck extends SquidCheck { - - public static final int DEFAULT_MAX = 5; - - @RuleProperty(defaultValue = "" + DEFAULT_MAX) - private Integer max = DEFAULT_MAX; - - @Override - public void visitClass(SourceClass sourceClass) { - int dit = sourceClass.getInt(Metric.DIT); - if (dit > max) { - CheckMessage message = new CheckMessage(this, "This class has " + dit + " parents which is greater than " + max + " authorized."); - message.setLine(sourceClass.getStartAtLine()); - message.setCost(dit - max); - sourceClass.getParent(SourceFile.class).log(message); - } - } - - public void setMax(int max) { - this.max = max; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java deleted file mode 100644 index 6ca159c3050..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -@Rule(key = "EmptyFile", priority = Priority.MAJOR) -public final class EmptyFileCheck extends SquidCheck { - - @Override - public void visitFile(SourceFile file) { - int loc = file.getInt(Metric.LINES_OF_CODE); - if (loc == 0) { - CheckMessage message = new CheckMessage(this, "This Java file is empty"); - file.log(message); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java deleted file mode 100644 index ceb04906a24..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.check.RuleProperty; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.measures.Metric; - -@Rule(key = "MethodCyclomaticComplexity", priority = Priority.MAJOR) -public class MethodComplexityCheck extends SquidCheck { - - public static final int DEFAULT_MAX = 10; - - @RuleProperty(defaultValue = "" + DEFAULT_MAX) - private Integer max = DEFAULT_MAX; - - @Override - public void visitMethod(SourceMethod sourceMethod) { - int complexity = sourceMethod.getInt(Metric.COMPLEXITY); - if (complexity > max) { - CheckMessage message = new CheckMessage(this, "The Cyclomatic Complexity of this method is " + complexity + " which is greater than " - + max + " authorized."); - message.setLine(sourceMethod.getStartAtLine()); - message.setCost(complexity - max); - sourceMethod.getParent(SourceFile.class).log(message); - } - } - - public void setMax(int max) { - this.max = max; - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java deleted file mode 100644 index 349cb0d1bb9..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.sonar.check.Priority; -import org.sonar.check.Rule; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; - -@Rule(key = "NoSonar", priority = Priority.INFO) -public class NoSonarCheck extends SquidCheck { - - @Override - public void visitFile(SourceFile sourceFile) { - for (Integer line : sourceFile.getNoSonarTagLines()) { - CheckMessage message = new CheckMessage(this, "Is //NOSONAR used to exclude false-positive or to hide real quality flaw ?"); - message.setBypassExclusion(true); - message.setLine(line); - sourceFile.log(message); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/SquidCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/SquidCheck.java deleted file mode 100644 index e38c7bced64..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/SquidCheck.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.squid.check; - -import org.sonar.java.squid.visitor.SquidVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -public class SquidCheck implements SquidVisitor { - - public void visitFile(SourceFile sourceFile) { - } - - public void visitClass(SourceClass sourceClass) { - } - - public void visitMethod(SourceMethod sourceMethod) { - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/visitor/SquidVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/visitor/SquidVisitor.java deleted file mode 100644 index f3105f37c6b..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/visitor/SquidVisitor.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.squid.visitor; - -import org.sonar.squid.api.CodeVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -public interface SquidVisitor extends CodeVisitor { - - void visitFile(SourceFile sourceFile); - - void visitClass(SourceClass sourceClass); - - void visitMethod(SourceMethod sourceMethod); - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java deleted file mode 100644 index 2845c2ac94d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import java.nio.charset.Charset; -import java.util.List; - -import org.apache.commons.configuration.Configuration; -import org.apache.commons.io.FileUtils; -import org.sonar.api.CoreProperties; -import org.sonar.api.batch.DependedUpon; -import org.sonar.api.batch.Phase; -import org.sonar.api.batch.Sensor; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.ProjectFileSystem; -import org.sonar.api.utils.SonarException; -import org.sonar.java.api.JavaUtils; - -@Phase(name = Phase.Name.PRE) -@DependedUpon(JavaUtils.BARRIER_BEFORE_SQUID) -public final class JavaSourceImporter implements Sensor { - - private boolean importSources = false; - - public JavaSourceImporter(Configuration conf) { - this.importSources = conf.getBoolean(CoreProperties.CORE_IMPORT_SOURCES_PROPERTY, - CoreProperties.CORE_IMPORT_SOURCES_DEFAULT_VALUE); - } - - JavaSourceImporter(boolean importSources) { - this.importSources = importSources; - } - - /** - * {@inheritDoc} - */ - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } - - /** - * {@inheritDoc} - */ - public void analyse(Project project, SensorContext context) { - analyse(project.getFileSystem(), context); - } - - void analyse(ProjectFileSystem fileSystem, SensorContext context) { - parseDirs(context, fileSystem.mainFiles(Java.KEY), false, fileSystem.getSourceCharset()); - parseDirs(context, fileSystem.testFiles(Java.KEY), true, fileSystem.getSourceCharset()); - } - - void parseDirs(SensorContext context, List inputFiles, boolean unitTest, Charset sourcesEncoding) { - for (InputFile inputFile : inputFiles) { - JavaFile javaFile = JavaFile.fromRelativePath(inputFile.getRelativePath(), unitTest); - importSource(context, javaFile, inputFile, sourcesEncoding); - } - } - - void importSource(SensorContext context, JavaFile javaFile, InputFile inputFile, Charset sourcesEncoding) { - String source = null; - if (importSources) { - source = loadSourceFromFile(inputFile, sourcesEncoding); - } - - try { - context.index(javaFile); - if (source != null) { - context.saveSource(javaFile, source); - } - } catch (SonarException e) { - throw new SonarException(e.getMessage() + ", on file: " + inputFile.getFile().getAbsolutePath(), e); - } - } - - protected String loadSourceFromFile(InputFile inputFile, Charset sourcesEncoding) { - try { - return FileUtils.readFileToString(inputFile.getFile(), sourcesEncoding.name()); - } catch (Exception e) { - throw new SonarException("Unable to read and import the source file : '" + inputFile.getFile().getAbsolutePath() + "' with the charset : '" - + sourcesEncoding.name() + "'.", e); - } - } - - @Override - public String toString() { - return getClass().getSimpleName(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarAccessor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarAccessor.java deleted file mode 100644 index 2b11eba119b..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarAccessor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.sonar.api.batch.SquidUtils; -import org.sonar.api.measures.FileLinesContext; -import org.sonar.api.measures.FileLinesContextFactory; -import org.sonar.api.resources.JavaFile; -import org.sonar.squid.api.CodeScanner; -import org.sonar.squid.api.SourceFile; - -import java.util.Collection; -import java.util.Collections; - -/** - * TODO Godin: I didn't found better way to register component in picocontainer for Squid. - */ -public class SonarAccessor extends CodeScanner { - - private FileLinesContextFactory factory; - - public void setFileLinesContextFactory(FileLinesContextFactory factory) { - this.factory = factory; - } - - @Override - public Collection getVisitorClasses() { - return Collections.emptyList(); - } - - public FileLinesContext createFileLinesContext(SourceFile file) { - JavaFile javaFile = SquidUtils.convertJavaFileKeyFromSquidFormat(file.getKey()); - return factory.createFor(javaFile); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayProfile.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayProfile.java deleted file mode 100644 index 5c0cdb89b17..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayProfile.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.sonar.api.profiles.AnnotationProfileParser; -import org.sonar.api.profiles.ProfileDefinition; -import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.resources.Java; -import org.sonar.api.utils.ValidationMessages; - -public class SonarWayProfile extends ProfileDefinition { - private final AnnotationProfileParser annotationProfileParser; - - public SonarWayProfile(AnnotationProfileParser annotationProfileParser) { - this.annotationProfileParser = annotationProfileParser; - } - - @Override - public RulesProfile createProfile(ValidationMessages messages) { - return annotationProfileParser.parse(SquidConstants.REPOSITORY_KEY, RulesProfile.SONAR_WAY_NAME, Java.KEY, SquidRuleRepository.getCheckClasses(), messages); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayWithFindbugsProfile.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayWithFindbugsProfile.java deleted file mode 100644 index 7e47af0cdae..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SonarWayWithFindbugsProfile.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.sonar.api.profiles.ProfileDefinition; -import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.utils.ValidationMessages; - -public class SonarWayWithFindbugsProfile extends ProfileDefinition { - private final SonarWayProfile sonarWay; - - public SonarWayWithFindbugsProfile(SonarWayProfile sonarWay) { - this.sonarWay = sonarWay; - } - - @Override - public RulesProfile createProfile(ValidationMessages validationMessages) { - RulesProfile profile = sonarWay.createProfile(validationMessages); - profile.setName(RulesProfile.SONAR_WAY_FINDBUGS_NAME); - return profile; - } -} - diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidConstants.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidConstants.java deleted file mode 100644 index 605c7e87061..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidConstants.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.sonar.api.CoreProperties; - -public final class SquidConstants { - - public static final String REPOSITORY_KEY = CoreProperties.SQUID_PLUGIN; - public static final String REPOSITORY_NAME = "Sonar"; - - private SquidConstants() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java deleted file mode 100644 index ae80453980a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.CoreProperties; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.checks.CheckFactory; -import org.sonar.api.checks.NoSonarFilter; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.utils.TimeProfiler; -import org.sonar.java.api.JavaClass; -import org.sonar.java.api.JavaMethod; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.plugins.squid.bridges.Bridge; -import org.sonar.plugins.squid.bridges.BridgeFactory; -import org.sonar.plugins.squid.bridges.ResourceIndex; -import org.sonar.squid.Squid; -import org.sonar.squid.api.*; -import org.sonar.squid.indexer.QueryByType; -import org.sonar.squid.measures.Metric; - -import java.io.File; -import java.nio.charset.Charset; -import java.util.Collection; -import java.util.List; - -public final class SquidExecutor { - - private Squid squid; - private boolean sourceScanned = false; - private boolean bytecodeScanned = false; - private CheckFactory checkFactory; - - public SquidExecutor(boolean analyzePropertyAccessors, String fieldNamesToExcludeFromLcom4Computation, CheckFactory checkFactory, - Charset sourcesCharset) { - JavaSquidConfiguration conf = createJavaSquidConfiguration(analyzePropertyAccessors, fieldNamesToExcludeFromLcom4Computation, - sourcesCharset); - squid = new Squid(conf); - this.checkFactory = checkFactory; - } - - private JavaSquidConfiguration createJavaSquidConfiguration(boolean analyzePropertyAccessors, - String fieldNamesToExcludeFromLcom4Computation, - Charset sourcesCharset) { - JavaSquidConfiguration conf = new JavaSquidConfiguration(analyzePropertyAccessors, sourcesCharset); - - if (!StringUtils.isBlank(fieldNamesToExcludeFromLcom4Computation)) { - for (String fieldName : fieldNamesToExcludeFromLcom4Computation.split(",")) { - if (!StringUtils.isBlank(fieldName)) { - conf.addFieldToExcludeFromLcom4Calculation(fieldName); - } - } - } - return conf; - } - - public void scan(Collection sourceFiles, Collection bytecodeFilesOrDirectories) { - for (Object checker : checkFactory.getChecks()) { - squid.registerVisitor((CodeVisitor) checker); - } - scanSources(sourceFiles); - if (sourceScanned) { - scanBytecode(bytecodeFilesOrDirectories); - } - squid.decorateSourceCodeTreeWith(Metric.values()); - scanSquidIndex(); - } - - public void save(Project project, SensorContext context, NoSonarFilter noSonarFilter) { - if (sourceScanned) { - TimeProfiler profiler = new TimeProfiler(getClass()).start("Squid extraction"); - ResourceIndex resourceIndex = new ResourceIndex().loadSquidResources(squid, context, project); - - boolean skipPackageDesignAnalysis = CoreProperties.DESIGN_SKIP_PACKAGE_DESIGN_DEFAULT_VALUE; - if (project.getConfiguration() != null) { - skipPackageDesignAnalysis = project.getConfiguration() - .getBoolean(CoreProperties.DESIGN_SKIP_PACKAGE_DESIGN_PROPERTY, CoreProperties.DESIGN_SKIP_PACKAGE_DESIGN_DEFAULT_VALUE); - } - - List bridges = BridgeFactory.create(bytecodeScanned, skipPackageDesignAnalysis, context, checkFactory, resourceIndex, squid, noSonarFilter); - saveProject(resourceIndex, bridges); - savePackages(resourceIndex, bridges); - saveFiles(resourceIndex, bridges); - saveClasses(resourceIndex, bridges); - saveMethods(resourceIndex, bridges); - profiler.stop(); - } - } - - private void saveProject(ResourceIndex resourceIndex, List bridges) { - Resource sonarResource = resourceIndex.get(squid.getProject()); - for (Bridge bridge : bridges) { - bridge.onProject(squid.getProject(), (Project) sonarResource); - } - } - - private void savePackages(ResourceIndex resourceIndex, List bridges) { - Collection packages = squid.search(new QueryByType(SourcePackage.class)); - for (SourceCode squidPackage : packages) { - Resource sonarPackage = resourceIndex.get(squidPackage); - for (Bridge bridge : bridges) { - bridge.onPackage((SourcePackage) squidPackage, sonarPackage); - } - } - } - - private void saveFiles(ResourceIndex resourceIndex, List bridges) { - Collection squidFiles = squid.search(new QueryByType(SourceFile.class)); - for (SourceCode squidFile : squidFiles) { - Resource sonarFile = resourceIndex.get(squidFile); - for (Bridge bridge : bridges) { - bridge.onFile((SourceFile) squidFile, sonarFile); - } - } - } - - private void saveClasses(ResourceIndex resourceIndex, List bridges) { - Collection squidClasses = squid.search(new QueryByType(SourceClass.class)); - for (SourceCode squidClass : squidClasses) { - Resource sonarClass = resourceIndex.get(squidClass); - // can be null with anonymous classes - if (sonarClass != null) { - for (Bridge bridge : bridges) { - bridge.onClass((SourceClass) squidClass, (JavaClass) sonarClass); - } - } - } - } - - private void saveMethods(ResourceIndex resourceIndex, List bridges) { - Collection squidMethods = squid.search(new QueryByType(SourceMethod.class)); - for (SourceCode squidMethod : squidMethods) { - JavaMethod sonarMethod = (JavaMethod) resourceIndex.get(squidMethod); - if (sonarMethod != null) { - for (Bridge bridge : bridges) { - bridge.onMethod((SourceMethod) squidMethod, sonarMethod); - } - } - } - } - - void scanSources(Collection sourceFiles) { - if (sourceFiles != null && !sourceFiles.isEmpty()) { - TimeProfiler profiler = new TimeProfiler(getClass()).start("Java AST scan"); - JavaAstScanner sourceScanner = squid.register(JavaAstScanner.class); - sourceScanner.scanFiles(sourceFiles); - sourceScanned = true; - profiler.stop(); - - } else { - sourceScanned = false; - } - } - - void scanBytecode(Collection bytecodeFilesOrDirectories) { - if (hasBytecode(bytecodeFilesOrDirectories)) { - TimeProfiler profiler = new TimeProfiler(getClass()).start("Java bytecode scan"); - BytecodeScanner bytecodeScanner = squid.register(BytecodeScanner.class); - bytecodeScanner.scan(bytecodeFilesOrDirectories); - bytecodeScanned = true; - profiler.stop(); - } else { - bytecodeScanned = false; - } - } - - static boolean hasBytecode(Collection bytecodeFilesOrDirectories) { - if (bytecodeFilesOrDirectories == null) { - return false; - } - for (File bytecodeFilesOrDirectory : bytecodeFilesOrDirectories) { - if (bytecodeFilesOrDirectory.exists() && - (bytecodeFilesOrDirectory.isFile() || - !FileUtils.listFiles(bytecodeFilesOrDirectory, new String[] { "class" }, true).isEmpty())) { - return true; - } - } - return false; - } - - void scanSquidIndex() { - TimeProfiler profiler = new TimeProfiler(getClass()).start("Java Squid scan"); - SquidScanner squidScanner = squid.register(SquidScanner.class); - squidScanner.scan(); - profiler.stop(); - } - - boolean isSourceScanned() { - return sourceScanned; - } - - boolean isBytecodeScanned() { - return bytecodeScanned; - } - - void flush() { - squid.flush(); - } - - public Squid getSquid() { - return squid; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java deleted file mode 100644 index d0c69c613bc..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import com.google.common.collect.ImmutableList; -import org.sonar.api.CoreProperties; -import org.sonar.api.Extension; -import org.sonar.api.Properties; -import org.sonar.api.Property; -import org.sonar.api.PropertyType; -import org.sonar.api.SonarPlugin; -import org.sonar.plugins.squid.decorators.ChidamberKemererDistributionBuilder; -import org.sonar.plugins.squid.decorators.ClassesDecorator; -import org.sonar.plugins.squid.decorators.FileComplexityDistributionDecorator; -import org.sonar.plugins.squid.decorators.FunctionComplexityDistributionBuilder; -import org.sonar.plugins.squid.decorators.FunctionsDecorator; - -import java.util.List; - -@Properties({ - @Property(key = SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_PROPERTY, - defaultValue = SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_DEFAULT_VALUE + "", - name = "Separate accessors", - description = "Flag whether Squid should separate accessors (getters/setters) from methods. " + - "In that case, accessors are not counted in metrics such as complexity or API documentation.", - project = true, - global = true, - category = CoreProperties.CATEGORY_JAVA, - type = PropertyType.BOOLEAN), - @Property(key = SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION, - defaultValue = SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION_DEFAULT_VALUE, - name = "List of fields to exclude from LCOM4 computation", - description = "Some fields should not be taken into account when computing LCOM4 measure as they " + - "unexpectedly and artificially decrease the LCOM4 measure. " - + "The best example is a logger used by all methods of a class. " + - "All field names to exclude from LCOM4 computation must be separated by a comma.", - project = true, - global = true, - category = CoreProperties.CATEGORY_JAVA), - @Property( - key = CoreProperties.DESIGN_SKIP_DESIGN_PROPERTY, - defaultValue = "" + CoreProperties.DESIGN_SKIP_DESIGN_DEFAULT_VALUE, - name = "Skip design analysis", - project = true, - global = true, - category = CoreProperties.CATEGORY_JAVA, - type = PropertyType.BOOLEAN) -}) -public final class SquidPlugin extends SonarPlugin { - - public List> getExtensions() { - return ImmutableList.of( - ChidamberKemererDistributionBuilder.class, - ClassesDecorator.class, - FileComplexityDistributionDecorator.class, - FunctionComplexityDistributionBuilder.class, - FunctionsDecorator.class, - JavaSourceImporter.class, - SonarWayProfile.class, - SonarWayWithFindbugsProfile.class, - SquidRuleRepository.class, - SquidSensor.class); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPluginProperties.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPluginProperties.java deleted file mode 100644 index 1bf9c39c2d9..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPluginProperties.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -public final class SquidPluginProperties { - - public static final String SQUID_ANALYSE_ACCESSORS_PROPERTY = "sonar.squid.analyse.property.accessors"; - public static final boolean SQUID_ANALYSE_ACCESSORS_DEFAULT_VALUE = true; - - public static final String FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION = "sonar.squid.fieldsToExcludeFromLcom4Computation"; - public static final String FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION_DEFAULT_VALUE = "LOG, logger"; - - private SquidPluginProperties() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java deleted file mode 100644 index 12a9dbaaa45..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.plugins.squid; - -import java.util.Arrays; -import java.util.List; - -import org.sonar.api.resources.Java; -import org.sonar.api.rules.AnnotationRuleParser; -import org.sonar.api.rules.Rule; -import org.sonar.api.rules.RuleRepository; -import org.sonar.java.ast.check.BreakCheck; -import org.sonar.java.ast.check.CommentedOutCodeLineCheck; -import org.sonar.java.ast.check.ContinueCheck; -import org.sonar.java.ast.check.UndocumentedApiCheck; -import org.sonar.java.bytecode.check.ArchitectureCheck; -import org.sonar.java.bytecode.check.CallToDeprecatedMethodCheck; -import org.sonar.java.bytecode.check.UnusedPrivateMethodCheck; -import org.sonar.java.bytecode.check.UnusedProtectedMethodCheck; -import org.sonar.java.squid.check.*; - -public final class SquidRuleRepository extends RuleRepository { - private AnnotationRuleParser ruleParser; - - public SquidRuleRepository(AnnotationRuleParser ruleParser) { - super(SquidConstants.REPOSITORY_KEY, Java.KEY); - setName(SquidConstants.REPOSITORY_NAME); - this.ruleParser = ruleParser; - } - - @Override - public List createRules() { - return ruleParser.parse(SquidConstants.REPOSITORY_KEY, getCheckClasses()); - } - - public static List getCheckClasses() { - return Arrays.asList( - // Bytecode checks - (Class) CallToDeprecatedMethodCheck.class, UnusedPrivateMethodCheck.class, UnusedProtectedMethodCheck.class, - ArchitectureCheck.class, - // AST checks - UndocumentedApiCheck.class, ContinueCheck.class, BreakCheck.class, - // Squid checks - DITCheck.class, ClassComplexityCheck.class, MethodComplexityCheck.class, NoSonarCheck.class, EmptyFileCheck.class, - CycleBetweenPackagesCheck.class, - CommentedOutCodeLineCheck.class); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java deleted file mode 100644 index 68a332285b3..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.sonar.api.CoreProperties; -import org.sonar.api.batch.*; -import org.sonar.api.checks.AnnotationCheckFactory; -import org.sonar.api.checks.NoSonarFilter; -import org.sonar.api.measures.FileLinesContextFactory; -import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.Project; -import org.sonar.java.api.JavaUtils; - -import java.io.File; -import java.nio.charset.Charset; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -@Phase(name = Phase.Name.PRE) -@DependsUpon(JavaUtils.BARRIER_BEFORE_SQUID) -@DependedUpon(value = JavaUtils.BARRIER_AFTER_SQUID) -public class SquidSensor implements Sensor { - - private NoSonarFilter noSonarFilter; - private RulesProfile profile; - private ProjectClasspath projectClasspath; - private ResourceCreationLock lock; - private FileLinesContextFactory fileLinesContextFactory; - - public SquidSensor(RulesProfile profile, NoSonarFilter noSonarFilter, ProjectClasspath projectClasspath, ResourceCreationLock lock, - FileLinesContextFactory fileLinesContextFactory) { - this.noSonarFilter = noSonarFilter; - this.profile = profile; - this.projectClasspath = projectClasspath; - this.lock = lock; - this.fileLinesContextFactory = fileLinesContextFactory; - } - - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } - - public void analyse(Project project, SensorContext context) { - analyzeMainSources(project, context); - browseTestSources(project, context); - lock.lock(); - } - - private void analyzeMainSources(Project project, SensorContext context) { - boolean analyzePropertyAccessors = project.getConfiguration().getBoolean(SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_PROPERTY, - SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_DEFAULT_VALUE); - String fieldNamesToExcludeFromLcom4Computation = project.getConfiguration().getString( - SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION, - SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION_DEFAULT_VALUE); - Charset charset = project.getFileSystem().getSourceCharset(); - - AnnotationCheckFactory factory = AnnotationCheckFactory.create(profile, SquidConstants.REPOSITORY_KEY, SquidRuleRepository.getCheckClasses()); - - SquidExecutor squidExecutor = new SquidExecutor(analyzePropertyAccessors, fieldNamesToExcludeFromLcom4Computation, factory, charset); - squidExecutor.getSquid().register(SonarAccessor.class).setFileLinesContextFactory(fileLinesContextFactory); - squidExecutor.scan(getMainSourceFiles(project), getBytecodeFiles(project)); - squidExecutor.save(project, context, noSonarFilter); - squidExecutor.flush(); - } - - private void browseTestSources(Project project, SensorContext context) { - for (InputFile testFile : project.getFileSystem().testFiles(Java.KEY)) { - context.index(JavaFile.fromRelativePath(testFile.getRelativePath(), true)); - } - } - - private List getMainSourceFiles(Project project) { - return project.getFileSystem().mainFiles(Java.KEY); - } - - /** - * Visibility has been relaxed to make the code testable. - * - * @return collection of jar-files and directories with classes for analysis - */ - protected Collection getBytecodeFiles(Project project) { - if (project.getConfiguration().getBoolean(CoreProperties.DESIGN_SKIP_DESIGN_PROPERTY, CoreProperties.DESIGN_SKIP_DESIGN_DEFAULT_VALUE)) { - return Collections.emptyList(); - } - return projectClasspath.getElements(); - } - - @Override - public String toString() { - return getClass().getSimpleName(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Bridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Bridge.java deleted file mode 100644 index c6ce50ba063..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Bridge.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.batch.SensorContext; -import org.sonar.api.checks.CheckFactory; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.java.api.JavaClass; -import org.sonar.java.api.JavaMethod; -import org.sonar.squid.Squid; -import org.sonar.squid.api.*; - -/** - * Pattern visitor : project -> packages -> files -> classes - */ -public abstract class Bridge { - - boolean needsBytecode = false; - Squid squid; - ResourceIndex resourceIndex; - SensorContext context; - CheckFactory checkFactory; - - protected Bridge(boolean needsBytecode) { - this.needsBytecode = needsBytecode; - } - - public final boolean needsBytecode() { - return needsBytecode; - } - - protected final void setSquid(Squid squid) { - this.squid = squid; - } - - protected final void setCheckFactory(CheckFactory checkFactory) { - this.checkFactory = checkFactory; - } - - protected final void setResourceIndex(ResourceIndex resourceIndex) { - this.resourceIndex = resourceIndex; - } - - protected final void setContext(SensorContext context) { - this.context = context; - } - - public void onProject(SourceProject squidProject, Project sonarProject) { - - } - - public void onPackage(SourcePackage squidPackage, Resource sonarPackage) { - - } - - public void onFile(SourceFile squidFile, Resource sonarFile) { - - } - - public void onClass(SourceClass squidClass, JavaClass sonarClass) { - - } - - public void onMethod(SourceMethod squidMethod, JavaMethod sonarMethod) { - - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/BridgeFactory.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/BridgeFactory.java deleted file mode 100644 index f1cb92ba162..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/BridgeFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import com.google.common.collect.Lists; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.checks.CheckFactory; -import org.sonar.api.checks.NoSonarFilter; -import org.sonar.squid.Squid; - -import java.util.ArrayList; -import java.util.List; - -public final class BridgeFactory { - - private BridgeFactory() { - // only static methods - } - - private static List create(NoSonarFilter noSonarFilter, boolean skipPackageDesignAnalysis) { - ArrayList result = Lists.newArrayList( - new CopyBasicMeasuresBridge(), - new PackagesBridge(), - new PublicUndocumentedApiBridge(), - new NoSonarFilterLoader(noSonarFilter), - new ChidamberKemererBridge(), - new RobertCMartinBridge(), - new Lcom4BlocksBridge(), - new ChecksBridge()); - if (!skipPackageDesignAnalysis) { - result.add(new DesignBridge()); - } - return result; - } - - public static List create(boolean bytecodeScanned, boolean skipPackageDesignAnalysis, SensorContext context, CheckFactory checkFactory, - ResourceIndex resourceIndex, Squid squid, NoSonarFilter noSonarFilter) { - List result = new ArrayList(); - for (Bridge bridge : create(noSonarFilter, skipPackageDesignAnalysis)) { - bridge.setCheckFactory(checkFactory); - if (!bridge.needsBytecode() || bytecodeScanned) { - bridge.setContext(context); - bridge.setSquid(squid); - bridge.setResourceIndex(resourceIndex); - result.add(bridge); - } - } - return result; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java deleted file mode 100644 index 65d33e11ebc..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import java.util.Locale; -import java.util.Set; - -import org.sonar.api.resources.Resource; -import org.sonar.api.rules.ActiveRule; -import org.sonar.api.rules.Violation; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; - -public class ChecksBridge extends Bridge { - - protected ChecksBridge() { - super(false); - } - - @Override - public void onFile(SourceFile squidFile, Resource sonarFile) { - Set messages = squidFile.getCheckMessages(); - if (messages != null) { - for (CheckMessage checkMessage : messages) { - ActiveRule rule = checkFactory.getActiveRule(checkMessage.getCheck()); - Violation violation = Violation.create(rule, sonarFile); - violation.setLineId(checkMessage.getLine()); - violation.setMessage(checkMessage.getText(Locale.ENGLISH)); - violation.setCost(checkMessage.getCost()); - context.saveViolation(violation, checkMessage.isBypassExclusion()); - } - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridge.java deleted file mode 100644 index ac034c26265..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridge.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Resource; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class ChidamberKemererBridge extends Bridge { - - protected ChidamberKemererBridge() { - super(true); - } - - @Override - public final void onFile(SourceFile squidFile, Resource sonarFile) { - context.saveMeasure(sonarFile, CoreMetrics.DEPTH_IN_TREE, squidFile.getDouble(Metric.DIT)); - context.saveMeasure(sonarFile, CoreMetrics.NUMBER_OF_CHILDREN, squidFile.getDouble(Metric.NOC)); - context.saveMeasure(sonarFile, CoreMetrics.RFC, squidFile.getDouble(Metric.RFC)); - context.saveMeasure(sonarFile, CoreMetrics.LCOM4, getLcom4(squidFile)); - } - - static double getLcom4(SourceFile squidFile) { - // Squid API does not support null values, so sometimes it returns LCOM4 values with value 0. It occurs - // for example with files without any classes, like package-info.java. - // Minimum value must be 1. - return Math.max(squidFile.getDouble(Metric.LCOM4), 1.0); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridge.java deleted file mode 100644 index 3fcb1b9d39e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridge.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Resource; -import org.sonar.api.utils.ParsingUtils; -import org.sonar.java.api.JavaClass; -import org.sonar.java.api.JavaMethod; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.measures.Metric; - -public final class CopyBasicMeasuresBridge extends Bridge { - - protected CopyBasicMeasuresBridge() { - super(false); - } - - @Override - public void onFile(SourceFile squidFile, Resource sonarResource) { - copyStandard(squidFile, sonarResource); - copy(squidFile, sonarResource, Metric.FILES, CoreMetrics.FILES); - context.saveMeasure(sonarResource, CoreMetrics.PUBLIC_DOCUMENTED_API_DENSITY, ParsingUtils.scaleValue(squidFile.getDouble(Metric.PUBLIC_DOCUMENTED_API_DENSITY) * 100, 2)); - } - - @Override - public void onClass(SourceClass squidClass, JavaClass sonarClass) { - copyStandard(squidClass, sonarClass); - } - - @Override - public void onMethod(SourceMethod squidMethod, JavaMethod sonarMethod) { - copyStandard(squidMethod, sonarMethod); - } - - private void copyStandard(SourceCode squidCode, Resource sonarResource) { - copy(squidCode, sonarResource, Metric.LINES_OF_CODE, CoreMetrics.NCLOC); - copy(squidCode, sonarResource, Metric.LINES, CoreMetrics.LINES); - copy(squidCode, sonarResource, Metric.COMMENT_LINES_WITHOUT_HEADER, CoreMetrics.COMMENT_LINES); - copy(squidCode, sonarResource, Metric.PUBLIC_API, CoreMetrics.PUBLIC_API); - copy(squidCode, sonarResource, Metric.COMPLEXITY, CoreMetrics.COMPLEXITY); - copy(squidCode, sonarResource, Metric.STATEMENTS, CoreMetrics.STATEMENTS); - } - - private void copy(SourceCode squidResource, Resource sonarResource, Metric squidMetric, org.sonar.api.measures.Metric sonarMetric) { - context.saveMeasure(sonarResource, sonarMetric, squidResource.getDouble(squidMetric)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DependencyIndex.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DependencyIndex.java deleted file mode 100644 index 1a446c55dba..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DependencyIndex.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.design.Dependency; -import org.sonar.graph.Edge; - -import java.util.HashMap; - -public final class DependencyIndex extends HashMap { - private static final long serialVersionUID = -3915853089587077911L; -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DesignBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DesignBridge.java deleted file mode 100644 index 19685cd04f9..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DesignBridge.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.design.Dependency; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.measures.Metric; -import org.sonar.api.measures.PersistenceMode; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.rules.ActiveRule; -import org.sonar.api.rules.Violation; -import org.sonar.api.utils.TimeProfiler; -import org.sonar.graph.*; -import org.sonar.java.squid.check.CycleBetweenPackagesCheck; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceCodeEdge; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.api.SourceProject; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -public class DesignBridge extends Bridge { - - private static final Logger LOG = LoggerFactory.getLogger(DesignBridge.class); - - /* - * This index is shared between onProject() and onPackage(). It works because onProject() is executed before onPackage(). - */ - private DependencyIndex dependencyIndex = new DependencyIndex(); - - protected DesignBridge() { - super(true); - } - - @Override - public void onProject(SourceProject squidProject, Project sonarProject) { - Set squidPackages = squidProject.getChildren(); - if (squidPackages != null && !squidPackages.isEmpty()) { - TimeProfiler profiler = new TimeProfiler(LOG).start("Package design analysis"); - LOG.debug("{} packages to analyze", squidPackages.size()); - - savePackageDependencies(squidPackages); - - IncrementalCyclesAndFESSolver cyclesAndFESSolver = new IncrementalCyclesAndFESSolver(squid, squidPackages); - LOG.debug("{} cycles", cyclesAndFESSolver.getCycles().size()); - - Set feedbackEdges = cyclesAndFESSolver.getFeedbackEdgeSet(); - LOG.debug("{} feedback edges", feedbackEdges.size()); - int tangles = cyclesAndFESSolver.getWeightOfFeedbackEdgeSet(); - - saveViolations(feedbackEdges); - savePositiveMeasure(sonarProject, CoreMetrics.PACKAGE_CYCLES, cyclesAndFESSolver.getCycles().size()); - savePositiveMeasure(sonarProject, CoreMetrics.PACKAGE_FEEDBACK_EDGES, feedbackEdges.size()); - savePositiveMeasure(sonarProject, CoreMetrics.PACKAGE_TANGLES, tangles); - savePositiveMeasure(sonarProject, CoreMetrics.PACKAGE_EDGES_WEIGHT, getEdgesWeight(squidPackages)); - - String dsmJson = serializeDsm(squid, squidPackages, feedbackEdges); - Measure dsmMeasure = new Measure(CoreMetrics.DEPENDENCY_MATRIX, dsmJson).setPersistenceMode(PersistenceMode.DATABASE); - context.saveMeasure(sonarProject, dsmMeasure); - - profiler.stop(); - } - } - - private void savePositiveMeasure(Resource sonarResource, Metric metric, double value) { - if (value >= 0.0) { - context.saveMeasure(sonarResource, metric, value); - } - } - - @Override - public void onPackage(SourcePackage squidPackage, Resource sonarPackage) { - Set squidFiles = squidPackage.getChildren(); - if (squidFiles != null && !squidFiles.isEmpty()) { - - saveFileDependencies(squidFiles); - - IncrementalCyclesAndFESSolver cycleDetector = new IncrementalCyclesAndFESSolver(squid, squidFiles); - Set cycles = cycleDetector.getCycles(); - - MinimumFeedbackEdgeSetSolver solver = new MinimumFeedbackEdgeSetSolver(cycles); - Set feedbackEdges = solver.getEdges(); - int tangles = solver.getWeightOfFeedbackEdgeSet(); - - savePositiveMeasure(sonarPackage, CoreMetrics.FILE_CYCLES, cycles.size()); - savePositiveMeasure(sonarPackage, CoreMetrics.FILE_FEEDBACK_EDGES, feedbackEdges.size()); - savePositiveMeasure(sonarPackage, CoreMetrics.FILE_TANGLES, tangles); - savePositiveMeasure(sonarPackage, CoreMetrics.FILE_EDGES_WEIGHT, getEdgesWeight(squidFiles)); - - String dsmJson = serializeDsm(squid, squidFiles, feedbackEdges); - context.saveMeasure(sonarPackage, new Measure(CoreMetrics.DEPENDENCY_MATRIX, dsmJson)); - } - } - - private double getEdgesWeight(Collection sourceCodes) { - List edges = squid.getEdges(sourceCodes); - double total = 0.0; - for (SourceCodeEdge edge : edges) { - total += edge.getWeight(); - } - return total; - } - - private String serializeDsm(Squid squid, Set squidSources, Set feedbackEdges) { - Dsm dsm = new Dsm(squid, squidSources, feedbackEdges); - DsmTopologicalSorter.sort(dsm); - return DsmSerializer.serialize(dsm, dependencyIndex, resourceIndex); - } - - /** - * Save package dependencies, including root file dependencies - */ - public void savePackageDependencies(Set squidPackages) { - for (SourceCode squidPackage : squidPackages) { - for (SourceCodeEdge edge : squid.getOutgoingEdges(squidPackage)) { - Dependency dependency = saveEdge(edge, context, null); - if (dependency != null) { - // save file dependencies - for (SourceCodeEdge subEdge : edge.getRootEdges()) { - saveEdge(subEdge, context, dependency); - } - } - } - } - } - - private void saveViolations(Set feedbackEdges) { - ActiveRule rule = CycleBetweenPackagesCheck.getActiveRule(checkFactory); - if (rule == null) { - // Rule inactive - return; - } - for (Edge feedbackEdge : feedbackEdges) { - SourceCode fromPackage = (SourcePackage) feedbackEdge.getFrom(); - SourceCode toPackage = (SourcePackage) feedbackEdge.getTo(); - SourceCodeEdge edge = squid.getEdge(fromPackage, toPackage); - for (SourceCodeEdge subEdge : edge.getRootEdges()) { - Resource fromFile = resourceIndex.get(subEdge.getFrom()); - Resource toFile = resourceIndex.get(subEdge.getTo()); - // If resource cannot be obtained, then silently ignore, because anyway warning will be printed by method saveEdge - if ((fromFile != null) && (toFile != null)) { - Violation violation = Violation.create(rule, fromFile) - .setMessage("Remove the dependency on the source file \"" + toFile.getLongName() + "\" to break a package cycle.") - .setCost((double) subEdge.getWeight()); - context.saveViolation(violation); - } - } - } - } - - /** - * Save file dependencies - */ - public void saveFileDependencies(Set squidFiles) { - for (SourceCode squidFile : squidFiles) { - for (SourceCodeEdge edge : squid.getOutgoingEdges(squidFile)) { - saveEdge(edge, context, null); - } - } - } - - private Dependency saveEdge(SourceCodeEdge edge, SensorContext context, Dependency parentDependency) { - Dependency dependency = dependencyIndex.get(edge); - if (dependency == null) { - Resource from = resourceIndex.get(edge.getFrom()); - Resource to = resourceIndex.get(edge.getTo()); - if (from != null && to != null) { - dependency = new Dependency(from, to).setUsage(edge.getUsage().name()).setWeight(edge.getWeight()).setParent(parentDependency); - context.saveDependency(dependency); - dependencyIndex.put(edge, dependency); - } else { - if (from == null) { - LOG.warn("Unable to find resource '" + edge.getFrom() + "' to create a dependency with '" + edge.getTo() + "'"); - } - if (to == null) { - LOG.warn("Unable to find resource '" + edge.getTo() + "' to create a dependency with '" + edge.getFrom() + "'"); - } - return null; - } - } - return dependency; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DsmSerializer.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DsmSerializer.java deleted file mode 100644 index 6815b5951f5..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/DsmSerializer.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.resources.Resource; -import org.sonar.graph.Dsm; -import org.sonar.graph.DsmCell; -import org.sonar.squid.api.SourceCode; - -public final class DsmSerializer { - - private Dsm dsm; - private StringBuilder json; - private DependencyIndex dependencyIndex; - private ResourceIndex resourceIndex; - - private DsmSerializer(Dsm dsm, DependencyIndex dependencyIndex, ResourceIndex resourceIndex) { - this.dsm = dsm; - this.json = new StringBuilder(); - this.dependencyIndex = dependencyIndex; - this.resourceIndex = resourceIndex; - } - - private String serialize() { - json.append('['); - serializeRows(); - json.append(']'); - return json.toString(); - } - - private void serializeRows() { - for (int y = 0; y < dsm.getDimension(); y++) { - if (y > 0) { - json.append(','); - } - serializeRow(y); - } - } - - private void serializeRow(int y) { - SourceCode squidResource = (SourceCode) dsm.getVertex(y); - Resource sonarResource = resourceIndex.get(squidResource); - - json.append("{"); - if (sonarResource != null) { - json.append("\"i\":"); - json.append(sonarResource.getId()); - json.append(",\"n\":\""); - json.append(sonarResource.getName()); - json.append("\",\"q\":\""); - json.append(sonarResource.getQualifier()); - json.append("\",\"v\":["); - for (int x = 0; x < dsm.getDimension(); x++) { - if (x > 0) { - json.append(','); - } - serializeCell(y, x); - } - json.append("]"); - } - json.append("}"); - } - - private void serializeCell(int y, int x) { - DsmCell cell = dsm.getCell(x, y); - json.append('{'); - if (cell.getEdge() != null && cell.getWeight() > 0) { - json.append("\"i\":"); - json.append(dependencyIndex.get(cell.getEdge()).getId()); - json.append(",\"w\":"); - json.append(cell.getWeight()); - } - json.append('}'); - } - - public static String serialize(Dsm dsm, DependencyIndex dependencyIndex, ResourceIndex resourceIndex) { - return new DsmSerializer(dsm, dependencyIndex, resourceIndex).serialize(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java deleted file mode 100644 index 7aa9bf27c38..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import com.google.common.collect.Lists; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.measures.PersistenceMode; -import org.sonar.api.resources.Qualifiers; -import org.sonar.api.resources.Resource; -import org.sonar.java.bytecode.asm.AsmField; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.asm.AsmResource; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Set; - -public class Lcom4BlocksBridge extends Bridge { - - protected Lcom4BlocksBridge() { - super(true); - } - - @Override - public void onFile(SourceFile squidFile, Resource sonarFile) { - List> blocks = (List>) squidFile.getData(Metric.LCOM4_BLOCKS); - - // This measure includes AsmResource objects and it is used only by this bridge, so - // it can be removed from memory. - squidFile.removeMeasure(Metric.LCOM4_BLOCKS); - - if (blocks != null && !blocks.isEmpty()) { - Measure measure = new Measure(CoreMetrics.LCOM4_BLOCKS, serialize(blocks)); - measure.setPersistenceMode(PersistenceMode.DATABASE); - context.saveMeasure(sonarFile, measure); - } - } - - protected void sortBlocks(List> blocks) { - Collections.sort(blocks, new Comparator() { - public int compare(Set set1, Set set2) { - return set1.size() - set2.size(); - } - }); - } - - protected String serialize(List> blocks) { - sortBlocks(blocks); - - StringBuilder sb = new StringBuilder(); - sb.append('['); - - for (int indexBlock = 0; indexBlock < blocks.size(); indexBlock++) { - blocks.get(indexBlock); - Set block = blocks.get(indexBlock); - if (!block.isEmpty()) { - if (indexBlock > 0) { - sb.append(','); - } - sb.append('['); - serializeBlock(block, sb); - sb.append(']'); - } - } - sb.append(']'); - return sb.toString(); - } - - private void serializeBlock(Set block, StringBuilder sb) { - List sortedResources = sortResourcesInBlock(block); - int indexResource = 0; - for (AsmResource resource : sortedResources) { - if (indexResource++ > 0) { - sb.append(','); - } - serializeResource(resource, sb); - } - } - - private void serializeResource(AsmResource resource, StringBuilder sb) { - sb.append("{\"q\":\""); - sb.append(toQualifier(resource)); - sb.append("\",\"n\":\""); - sb.append(resource.toString()); - sb.append("\"}"); - } - - protected List sortResourcesInBlock(Set block) { - List result = Lists.newArrayList(); - result.addAll(block); - - Collections.sort(result, new Comparator() { - public int compare(AsmResource asmResource1, AsmResource asmResource2) { - int result = compareType(asmResource1, asmResource2); - if (result == 0) { - result = asmResource1.toString().compareTo(asmResource2.toString()); - } - return result; - } - - private int compareType(AsmResource asmResource1, AsmResource asmResource2) { - if (asmResource1 instanceof AsmField) { - return (asmResource2 instanceof AsmField) ? 0 : -1; - } - return (asmResource2 instanceof AsmMethod) ? 0 : 1; - } - }); - - return result; - } - - private static String toQualifier(AsmResource asmResource) { - if (asmResource instanceof AsmField) { - return Qualifiers.FIELD; - } - if (asmResource instanceof AsmMethod) { - return Qualifiers.METHOD; - } - throw new IllegalArgumentException("Wrong ASM resource: " + asmResource.getClass()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/NoSonarFilterLoader.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/NoSonarFilterLoader.java deleted file mode 100644 index c53d6b65e32..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/NoSonarFilterLoader.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.checks.NoSonarFilter; -import org.sonar.api.resources.Resource; -import org.sonar.java.squid.SquidVisitorNotifier; -import org.sonar.java.squid.visitor.SquidVisitor; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; - -import java.util.HashSet; -import java.util.Set; - -public class NoSonarFilterLoader extends Bridge { - private NoSonarFilter noSonarFilter; - - protected NoSonarFilterLoader(NoSonarFilter noSonarFilter) { - super(false); - this.noSonarFilter = noSonarFilter; - } - - @Override - public void onFile(SourceFile squidFile, Resource sonarFile) { - if (noSonarFilter != null) { - Set ignoredLines = new HashSet(squidFile.getNoSonarTagLines()); - new SquidVisitorNotifier(squidFile, new SuppressWarningsVisitor(ignoredLines)).notifyVisitors(); - - noSonarFilter.addResource(sonarFile, ignoredLines); - } - } - - private static class SuppressWarningsVisitor implements SquidVisitor { - private Set ignoredLines; - - public SuppressWarningsVisitor(Set ignoredLines) { - this.ignoredLines = ignoredLines; - } - - public void visitFile(SourceFile sourceFile) { - } - - public void visitClass(SourceClass sourceClass) { - if (sourceClass.isSuppressWarnings()) { - visitLines(sourceClass); - } - } - - public void visitMethod(SourceMethod sourceMethod) { - if (sourceMethod.isSuppressWarnings()) { - visitLines(sourceMethod); - } - } - - private void visitLines(SourceCode sourceCode) { - for (int line = sourceCode.getStartAtLine(); line <= sourceCode.getEndAtLine(); line++) { - ignoredLines.add(line); - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PackagesBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PackagesBridge.java deleted file mode 100644 index 5ab9a3fffd7..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PackagesBridge.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.api.SourceProject; -import org.sonar.squid.measures.Metric; - -public class PackagesBridge extends Bridge { - - protected PackagesBridge() { - super(false); - } - - @Override - public void onProject(SourceProject squidProject, Project sonarProject) { - context.saveMeasure(sonarProject, CoreMetrics.PACKAGES, squidProject.getDouble(Metric.PACKAGES)); - } - - @Override - public void onPackage(SourcePackage squidPackage, Resource sonarPackage) { - context.saveMeasure(sonarPackage, CoreMetrics.PACKAGES, squidPackage.getDouble(Metric.PACKAGES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridge.java deleted file mode 100644 index ec0c75d868d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridge.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Resource; -import org.sonar.java.api.JavaClass; -import org.sonar.java.api.JavaMethod; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.measures.Metric; - -public final class PublicUndocumentedApiBridge extends Bridge { - - protected PublicUndocumentedApiBridge() { - super(false); - } - - @Override - public void onFile(SourceFile squidFile, Resource sonarFile) { - copyValue(squidFile, sonarFile); - } - - @Override - public void onClass(SourceClass squidClass, JavaClass sonarClass) { - copyValue(squidClass, sonarClass); - } - - @Override - public void onMethod(SourceMethod squidMethod, JavaMethod sonarMethod) { - copyValue(squidMethod, sonarMethod); - } - - private void copyValue(SourceCode squidResource, Resource sonarResource) { - double undocumentedApi = squidResource.getDouble(Metric.PUBLIC_API) - squidResource.getInt(Metric.PUBLIC_DOC_API); - context.saveMeasure(sonarResource, CoreMetrics.PUBLIC_UNDOCUMENTED_API, undocumentedApi); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ResourceIndex.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ResourceIndex.java deleted file mode 100644 index c03b619a0a9..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ResourceIndex.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.apache.commons.lang.StringUtils; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.batch.SquidUtils; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.java.api.JavaClass; -import org.sonar.java.api.JavaMethod; -import org.sonar.squid.Squid; -import org.sonar.squid.api.*; -import org.sonar.squid.indexer.QueryByMeasure; -import org.sonar.squid.indexer.QueryByType; -import org.sonar.squid.measures.Metric; - -import java.util.Collection; -import java.util.HashMap; - -public final class ResourceIndex extends HashMap { - - private static final long serialVersionUID = -918346378374943773L; - - public ResourceIndex loadSquidResources(Squid squid, SensorContext context, Project project) { - loadSquidProject(squid, project); - loadSquidPackages(squid, context); - loadSquidFiles(squid, context); - loadSquidClasses(squid, context); - loadSquidMethods(squid, context); - return this; - } - - private void loadSquidProject(Squid squid, Project project) { - put(squid.getProject(), project); - } - - private void loadSquidPackages(Squid squid, SensorContext context) { - Collection packages = squid.search(new QueryByType(SourcePackage.class)); - for (SourceCode squidPackage : packages) { - JavaPackage sonarPackage = SquidUtils.convertJavaPackageKeyFromSquidFormat(squidPackage.getKey()); - context.index(sonarPackage); - put(squidPackage, context.getResource(sonarPackage)); // resource is reloaded to get the id - } - } - - private void loadSquidFiles(Squid squid, SensorContext context) { - Collection files = squid.search(new QueryByType(SourceFile.class)); - for (SourceCode squidFile : files) { - JavaFile sonarFile = SquidUtils.convertJavaFileKeyFromSquidFormat(squidFile.getKey()); - JavaPackage sonarPackage = (JavaPackage) get(squidFile.getParent(SourcePackage.class)); - context.index(sonarFile, sonarPackage); - put(squidFile, context.getResource(sonarFile)); // resource is reloaded to get the id - } - } - - private void loadSquidClasses(Squid squid, SensorContext context) { - Collection classes = squid.search(new QueryByType(SourceClass.class), new QueryByMeasure(Metric.CLASSES, QueryByMeasure.Operator.GREATER_THAN_EQUALS, 1)); - for (SourceCode squidClass : classes) { - JavaFile sonarFile = (JavaFile) get(squidClass.getParent(SourceFile.class)); - JavaClass sonarClass = new JavaClass.Builder() - .setName(convertClassKey(squidClass.getKey())) - .setFromLine(squidClass.getStartAtLine()) - .setToLine(squidClass.getEndAtLine()) - .create(); - context.index(sonarClass, sonarFile); - put(squidClass, sonarClass); - } - } - - private void loadSquidMethods(Squid squid, SensorContext context) { - Collection methods = squid.search(new QueryByType(SourceMethod.class)); - for (SourceCode squidMethod : methods) { - SourceClass squidClass = squidMethod.getParent(SourceClass.class); - JavaClass sonarClass = (JavaClass) get(squidClass); - if (sonarClass != null) { - JavaMethod sonarMethod = new JavaMethod.Builder() - .setClass(sonarClass) - .setSignature(squidMethod.getName()) - .setFromLine(squidMethod.getStartAtLine()) - .setToLine(squidMethod.getEndAtLine()) - .setAccessor(squidMethod.getInt(Metric.ACCESSORS) > 0) - .create(); - - context.index(sonarMethod, sonarClass); - put(squidMethod, sonarMethod); - } - } - } - - static String convertClassKey(String squidClassKey) { - return StringUtils.replace(squidClassKey, "/", "."); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/RobertCMartinBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/RobertCMartinBridge.java deleted file mode 100644 index ca2333ff815..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/RobertCMartinBridge.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Resource; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.measures.Metric; - -public class RobertCMartinBridge extends Bridge { - - protected RobertCMartinBridge() { - super(true); - } - - @Override - public void onPackage(SourcePackage squidPackage, Resource sonarPackage) { - context.saveMeasure(sonarPackage, CoreMetrics.AFFERENT_COUPLINGS, squidPackage.getDouble(Metric.CA)); - context.saveMeasure(sonarPackage, CoreMetrics.EFFERENT_COUPLINGS, squidPackage.getDouble(Metric.CE)); - } - - @Override - public void onFile(SourceFile squidFile, Resource sonarFile) { - context.saveMeasure(sonarFile, CoreMetrics.AFFERENT_COUPLINGS, squidFile.getDouble(Metric.CA)); - context.saveMeasure(sonarFile, CoreMetrics.EFFERENT_COUPLINGS, squidFile.getDouble(Metric.CE)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/SquidBrigeException.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/SquidBrigeException.java deleted file mode 100644 index f3e87cda567..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/SquidBrigeException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -public class SquidBrigeException extends RuntimeException { - - public SquidBrigeException(String s, Throwable throwable) { - super(s, throwable); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ChidamberKemererDistributionBuilder.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ChidamberKemererDistributionBuilder.java deleted file mode 100644 index 4e3c042f183..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ChidamberKemererDistributionBuilder.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.sonar.api.batch.Decorator; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.batch.DependedUpon; -import org.sonar.api.batch.DependsUpon; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.measures.Metric; -import org.sonar.api.measures.RangeDistributionBuilder; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.resources.Scopes; - -public final class ChidamberKemererDistributionBuilder implements Decorator { - - private static final Integer[] LCOM4_LIMITS = { 2, 3, 4, 5, 10 }; // 1 is excluded - private static final Integer[] RFC_LIMITS = { 0, 5, 10, 20, 30, 50, 90, 150 }; - - @DependedUpon - public Metric generatesLcom4Distribution() { - return CoreMetrics.LCOM4_DISTRIBUTION; - } - - @DependsUpon - public Metric dependsInLcom4() { - return CoreMetrics.LCOM4; - } - - @DependedUpon - public Metric generatesRfcDistribution() { - return CoreMetrics.RFC_DISTRIBUTION; - } - - @DependsUpon - public Metric dependsInRfc() { - return CoreMetrics.RFC; - } - - public void decorate(Resource resource, DecoratorContext context) { - if (shouldExecuteOn(resource)) { - RangeDistributionBuilder lcom4Distribution = new RangeDistributionBuilder(CoreMetrics.LCOM4_DISTRIBUTION, LCOM4_LIMITS); - RangeDistributionBuilder rfcDistribution = new RangeDistributionBuilder(CoreMetrics.RFC_DISTRIBUTION, RFC_LIMITS); - - for (DecoratorContext childContext : context.getChildren()) { - if (Scopes.isFile(childContext.getResource())) { - addMeasureToDistribution(childContext, lcom4Distribution, CoreMetrics.LCOM4); - addMeasureToDistribution(childContext, rfcDistribution, CoreMetrics.RFC); - } - } - - saveDistribution(context, lcom4Distribution); - saveDistribution(context, rfcDistribution); - } - } - - private void addMeasureToDistribution(DecoratorContext childContext, RangeDistributionBuilder distribution, Metric metric) { - Measure measure = childContext.getMeasure(metric); - if (measure != null) { - distribution.add(measure.getIntValue()); - } - } - - private void saveDistribution(DecoratorContext context, RangeDistributionBuilder distribution) { - Measure measure = distribution.build(false); - if (measure != null) { - context.saveMeasure(measure); - } - } - - boolean shouldExecuteOn(Resource resource) { - return Scopes.isDirectory(resource); - } - - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ClassesDecorator.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ClassesDecorator.java deleted file mode 100644 index 581ad599b50..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/ClassesDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.sonar.api.batch.Decorator; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.resources.*; - -public final class ClassesDecorator implements Decorator { - - public void decorate(Resource resource, DecoratorContext context) { - if (Scopes.isFile(resource) && !Qualifiers.UNIT_TEST_FILE.equals(resource.getQualifier())) { - int classes = 0; - for (DecoratorContext child : context.getChildren()) { - if (Scopes.isProgramUnit(child.getResource())) { - classes++; - } - } - context.saveMeasure(new Measure(CoreMetrics.CLASSES, (double) classes)); - } - } - - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecorator.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecorator.java deleted file mode 100644 index 1f9f5130df6..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecorator.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.sonar.api.batch.Decorator; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.batch.DependedUpon; -import org.sonar.api.batch.DependsUpon; -import org.sonar.api.measures.*; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.resources.Scopes; - -/** - * @since 3.0 - */ -public class FileComplexityDistributionDecorator implements Decorator { - - private static final Number[] LIMITS = {0, 5, 10, 20, 30, 60, 90}; - - @DependsUpon - public Metric dependOnComplexity() { - return CoreMetrics.COMPLEXITY; - } - - @DependedUpon - public Metric generatesComplexityDistribution() { - return CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION; - } - - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } - - private static boolean shouldExecuteOn(Resource resource, DecoratorContext context) { - return Scopes.isFile(resource) && context.getMeasure(CoreMetrics.COMPLEXITY) != null; - } - - public void decorate(Resource resource, DecoratorContext context) { - if (shouldExecuteOn(resource, context)) { - RangeDistributionBuilder builder = new RangeDistributionBuilder(CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION, LIMITS); - Measure complexity = context.getMeasure(CoreMetrics.COMPLEXITY); - builder.add(complexity.getValue()); - Measure measure = builder.build(true); - measure.setPersistenceMode(PersistenceMode.MEMORY); - context.saveMeasure(measure); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilder.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilder.java deleted file mode 100644 index 2ad3208e65a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilder.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.sonar.api.batch.Decorator; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.batch.DependedUpon; -import org.sonar.api.batch.DependsUpon; -import org.sonar.api.measures.*; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.resources.Scopes; -import org.sonar.java.api.JavaMethod; - -/** - * @since 2.6 - */ -public final class FunctionComplexityDistributionBuilder implements Decorator { - - private static final Number[] LIMITS = { 1, 2, 4, 6, 8, 10, 12 }; - - @DependsUpon - public Metric dependOnComplexity() { - return CoreMetrics.COMPLEXITY; - } - - @DependedUpon - public Metric generatesFunctionComplexityDistribution() { - return CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION; - } - - public void decorate(Resource resource, DecoratorContext context) { - if (shouldExecuteOn(resource, context)) { - RangeDistributionBuilder builder = new RangeDistributionBuilder(CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION, LIMITS); - for (DecoratorContext childContext : context.getChildren()) { - if (childContext.getResource() instanceof JavaMethod) { - JavaMethod javaMethod = (JavaMethod) childContext.getResource(); - Measure complexity = childContext.getMeasure(CoreMetrics.COMPLEXITY); - if (!javaMethod.isAccessor() && complexity != null) { - builder.add(complexity.getValue()); - } - } - } - Measure measure = builder.build(true); - measure.setPersistenceMode(PersistenceMode.MEMORY); - context.saveMeasure(measure); - } - } - - boolean shouldExecuteOn(Resource resource, DecoratorContext context) { - return Scopes.isProgramUnit(resource) && context.getMeasure(CoreMetrics.COMPLEXITY) != null; - } - - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionsDecorator.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionsDecorator.java deleted file mode 100644 index f8471b18867..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/decorators/FunctionsDecorator.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.sonar.api.batch.Decorator; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.resources.Scopes; -import org.sonar.java.api.JavaMethod; - -public final class FunctionsDecorator implements Decorator { - - public void decorate(Resource resource, DecoratorContext context) { - if (Scopes.isProgramUnit(resource)) { - int methods=0, accessors=0; - for (DecoratorContext child : context.getChildren()) { - if (child.getResource() instanceof JavaMethod) { - if (((JavaMethod)child.getResource()).isAccessor()) { - accessors++; - } else { - methods++; - } - } - } - context.saveMeasure(new Measure(CoreMetrics.FUNCTIONS, (double)methods)); - context.saveMeasure(new Measure(CoreMetrics.ACCESSORS, (double)accessors)); - } - } - - public boolean shouldExecuteOnProject(Project project) { - return Java.KEY.equals(project.getLanguageKey()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/main/resources/checkstyle-configuration.xml b/plugins/sonar-squid-java-plugin/src/main/resources/checkstyle-configuration.xml deleted file mode 100644 index 0fb9996169c..00000000000 --- a/plugins/sonar-squid-java-plugin/src/main/resources/checkstyle-configuration.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/CheckMessages.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/CheckMessages.java deleted file mode 100644 index 98743dbd554..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/CheckMessages.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - -import org.apache.commons.lang.ObjectUtils; -import org.sonar.squid.api.CheckMessage; -import org.sonar.squid.api.SourceFile; - -import com.google.common.collect.Ordering; - -/** - * Utility class to simplify assertions in tests for checks. - * It can be used as following: - *
- * CheckMessages = new CheckMessages(SourceFile);
- * checkMessages.assertNext().atLine(1).withMessage("Message").withCost(1.0);
- * checkMessages.assertNoMore();
- * 
- * TODO Godin: I think that this class can be reused by consumers of sonar-squid, thus can be moved to test-library for sonar-squid. - */ -public class CheckMessages { - - private final List findings; - private final Iterator findingsIterator; - - public CheckMessages(SourceFile file) { - findings = CHECK_MESSAGE_ORDERING.immutableSortedCopy(file.getCheckMessages()); - findingsIterator = findings.iterator(); - } - - private static final Ordering CHECK_MESSAGE_ORDERING = new Ordering() { - @Override - public int compare(CheckMessage o1, CheckMessage o2) { - return ObjectUtils.compare(o1.getLine(), o2.getLine()); - } - }; - - public Next assertNext() { - assertTrue("There is no more violations", findingsIterator.hasNext()); - return new Next(findingsIterator.next()); - } - - public void assertNoMore() { - assertFalse(findingsIterator.hasNext()); - } - - public static final class Next { - private final CheckMessage checkMessage; - - private Next(CheckMessage checkMessage) { - this.checkMessage = checkMessage; - } - - public Next atLine(Integer expected) { - assertThat(checkMessage.getLine(), is(expected)); - return this; - } - - public Next withMessage(String expected) { - assertThat(checkMessage.getText(Locale.getDefault()), equalTo(expected)); - return this; - } - - public Next withCost(double expected) { - assertThat(checkMessage.getCost(), is(expected)); - return this; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java deleted file mode 100644 index b12f0591b89..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -import org.junit.Test; -import org.sonar.api.utils.WildcardPattern; - -public class PatternUtilsTest { - - @Test - public void shouldConvertJavaPackagesToPatterns() { - WildcardPattern[] patterns = PatternUtils.createPatterns("org.sonar.Foo,javax.**"); - - assertThat(patterns.length, is(2)); - assertThat(patterns[0].match("org/sonar/Foo"), is(true)); - assertThat(patterns[1].match("javax/Bar"), is(true)); - } - - /** - * See http://jira.codehaus.org/browse/SONAR-2303 - */ - @Test - public void shouldTrim() { - WildcardPattern[] patterns = PatternUtils.createPatterns("org.foo.*,\n org.bar.*"); - - assertThat(patterns[0].match("org/foo/Foo"), is(true)); - assertThat(patterns[1].match("org/bar/Bar"), is(true)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/JavaAstScannerTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/JavaAstScannerTest.java deleted file mode 100644 index 4acbe703fe6..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/JavaAstScannerTest.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast; - -import com.google.common.base.Charsets; -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.AnalysisException; -import org.sonar.squid.api.SourceProject; -import org.sonar.squid.measures.Metric; - -import java.nio.charset.Charset; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -public class JavaAstScannerTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration(false, Charset.defaultCharset(), 0.9)); - } - - @Test - public void testMacRomanEncoding() { - squid = new Squid(new JavaSquidConfiguration(false, Charset.forName("MacRoman"))); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/encoding/MacRomanEncoding.java")); - SourceProject prj = squid.aggregate(); - assertEquals(4, prj.getInt(Metric.METHODS)); - } - - @Test(expected = AnalysisException.class) - public void testCP1252EncodingWithWrongDefined() { - squid = new Squid(new JavaSquidConfiguration(true, Charset.forName("MacRoman"))); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/encoding/CP1252Encoding.java")); - } - - @Test - public void testCheckstyleParsingBug() { - // see - // http://sourceforge.net/tracker/?func=detail&atid=397078&aid=1667137&group_id=29721 - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/parsingErrors/CheckstyleBug.java")); - SourceProject prj = squid.aggregate(); - assertEquals(0, prj.getInt(Metric.CLASSES)); - } - - /** - * SONAR-1908 - */ - @Test - public void testUnicodeEscape() { - // see - // https://sourceforge.net/tracker/?func=detail&aid=3296452&group_id=29721&atid=397078 - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/parsingErrors/UnicodeEscape.java")); - } - - /** - * SONAR-1836: bug in Checkstyle 5.2 - 5.4 - */ - @Test - public void testLineCommentAtTheEndOfFile() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/parsingErrors/LineCommentAtTheEndOfFile.java")); - SourceProject prj = squid.aggregate(); - assertEquals(1, prj.getInt(Metric.CLASSES)); - } - - @Test - public void testEmptyClassWithComment() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/emptyFiles/ClassWithOnlyComment.java")); - SourceProject prj = squid.aggregate(); - assertEquals(0, prj.getInt(Metric.CLASSES)); - assertEquals(1, prj.getInt(Metric.PACKAGES)); - assertEquals(1, prj.getInt(Metric.FILES)); - assertEquals(1, prj.getInt(Metric.COMMENT_LINES)); - - assertNotNull(squid.search("ClassWithOnlyComment.java"));// file - assertNull(squid.search("ClassWithOnlyComment"));// class - } - - @Test - public void testEmptyFileWithBlankLines() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/emptyFiles/EmptyFileWithBlankLines.java")); - SourceProject prj = squid.aggregate(); - assertEquals(0, prj.getDouble(Metric.COMMENT_LINES_DENSITY), 0.01); - } - - @Test - public void testClassWithPackageImportsComment() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/emptyFiles", "foo/ClassWithPackageImportsComment.java")); - SourceProject prj = squid.aggregate(); - assertEquals(0, prj.getInt(Metric.CLASSES)); - assertEquals(1, prj.getInt(Metric.PACKAGES)); - assertEquals(2, prj.getInt(Metric.COMMENT_LINES)); - } - - @Test - public void testEncodingWithSystemSetting() { - SourceProject macRoman; - SourceProject cp1252; - String currentEncoding = System.getProperty("file.encoding"); - // changing the system encoding can have no effects - try { - System.setProperty("file.encoding", "UTF-16"); - Charset defaultEncoding = Charset.defaultCharset(); - if (!defaultEncoding.displayName().equals("UTF-16")) { - return; - } - System.setProperty("file.encoding", "MacRoman"); - squid = new Squid(new JavaSquidConfiguration(false)); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/encoding/MacRomanEncoding.java")); - macRoman = squid.aggregate(); - System.setProperty("file.encoding", "CP1252"); - squid = new Squid(new JavaSquidConfiguration(false)); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/encoding/CP1252Encoding.java")); - cp1252 = squid.aggregate(); - } finally { - System.setProperty("file.encoding", currentEncoding); - } - assertEquals(4, macRoman.getInt(Metric.METHODS)); - assertEquals(4, cp1252.getInt(Metric.METHODS)); - } - - @Test - public void testCP1252Encoding() { - squid = new Squid(new JavaSquidConfiguration(false, Charset.forName("CP1252"))); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/encoding/CP1252Encoding.java")); - SourceProject prj = squid.aggregate(); - assertEquals(4, prj.getInt(Metric.METHODS)); - } - - @Test - public void testUTF8Encoding() { - squid = new Squid(new JavaSquidConfiguration(false, Charsets.UTF_8)); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/encoding/Utf8Encoding.java")); - SourceProject prj = squid.aggregate(); - assertEquals(4, prj.getInt(Metric.METHODS)); - } - - @Test - public void testInterfaceWithAnnotations() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/annotations/InterfaceWithAnnotation.java")); - SourceProject prj = squid.aggregate(); - assertEquals(11, prj.getInt(Metric.LINES)); - assertEquals(6, prj.getInt(Metric.LINES_OF_CODE)); - assertEquals(0, prj.getInt(Metric.STATEMENTS)); - assertEquals(2, prj.getInt(Metric.METHODS)); - assertEquals(2, prj.getInt(Metric.COMPLEXITY)); - } - - @Test - public void testClassesWithGenerics() { - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/special_cases/generics")); - SourceProject prj = squid.aggregate(); - assertEquals(2, prj.getInt(Metric.FILES)); - assertEquals(3, prj.getInt(Metric.METHODS)); - } - - @Test - public void testPackageInfo() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/packageInfo", "org/apache/cxf/jaxrs/ext/logging/package-info.java")); - SourceProject prj = squid.aggregate(); - assertEquals(1, prj.getInt(Metric.FILES)); - assertEquals(4, prj.getInt(Metric.LINES_OF_CODE)); - assertEquals(29, prj.getInt(Metric.LINES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/SquidTestUtils.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/SquidTestUtils.java deleted file mode 100644 index 83a63e1d2d0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/SquidTestUtils.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast; - -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.InputFileUtils; - -import java.io.File; - -public final class SquidTestUtils { - - /** - * Assumes that the Java file has no package. It's declared in the root directory. - */ - public static InputFile getInputFile(String relativePath) { - File file = getFile(relativePath); - return InputFileUtils.create(file.getParentFile(), file); - } - - public static InputFile getInputFile(String basedir, String relativePath) { - File file = getFile(basedir + "/" + relativePath); - return InputFileUtils.create(getFile(basedir), file); - } - - public static File getFile(String relativePath) { - return new File("test-resources" + relativePath); - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/BreakCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/BreakCheckTest.java deleted file mode 100644 index 5c404dd60fa..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/BreakCheckTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.ast.check; - -import java.io.File; -import java.util.Collection; - -import org.apache.commons.io.FileUtils; -import org.junit.Before; -import org.junit.Test; -import org.sonar.api.resources.InputFileUtils; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class BreakCheckTest { - - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - squid.registerVisitor(BreakCheck.class); - - File basedir = SquidTestUtils.getFile("/commons-collections-3.2.1/src"); - Collection files = FileUtils.listFiles(new File(basedir, "org/apache/commons/collections/map"), new String[]{"java"}, true); - - squid.register(JavaAstScanner.class).scanFiles(InputFileUtils.create(basedir, files)); - } - - @Test - public void testAvoidUsageOfBreakOutsideSwitch() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/apache/commons/collections/map/LRUMap.java")); - checkMessages.assertNext().atLine(244); - checkMessages.assertNoMore(); - } - - @Test - public void testAlowUsageOfBreakInsideSwitch() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/apache/commons/collections/map/Flat3Map.java")); - checkMessages.assertNoMore(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/CommentedOutCodeLineCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/CommentedOutCodeLineCheckTest.java deleted file mode 100644 index d75ba9c1602..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/CommentedOutCodeLineCheckTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.check; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -public class CommentedOutCodeLineCheckTest { - - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - CommentedOutCodeLineCheck check = new CommentedOutCodeLineCheck(); - squid.registerVisitor(check); - JavaAstScanner scanner = squid.register(JavaAstScanner.class); - scanner.scanFile(SquidTestUtils.getInputFile("/rules/CommentedCode.java")); - squid.decorateSourceCodeTreeWith(Metric.values()); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void testDetection() { - SourceFile sourceFile = (SourceFile) squid.search("CommentedCode.java"); - CheckMessages checkMessages = new CheckMessages(sourceFile); - - checkMessages.assertNext().atLine(32).withMessage("This block of commented-out lines of code should be removed."); - checkMessages.assertNext().atLine(38); - checkMessages.assertNext().atLine(44); - checkMessages.assertNext().atLine(50); - checkMessages.assertNext().atLine(66); - checkMessages.assertNext().atLine(75); - - checkMessages.assertNoMore(); - - assertThat(sourceFile.getInt(Metric.COMMENT_LINES), is(44)); // TODO but in fact 50, so without fake-JSNI - assertThat(sourceFile.getInt(Metric.COMMENT_BLANK_LINES), is(17)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ContinueCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ContinueCheckTest.java deleted file mode 100644 index 6ef91383522..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ContinueCheckTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.ast.check; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class ContinueCheckTest { - - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - squid.registerVisitor(ContinueCheck.class); - squid.register(JavaAstScanner.class).scanFile( - SquidTestUtils.getInputFile("/commons-collections-3.2.1/src", "org/apache/commons/collections/ExtendedProperties.java")); - } - - @Test - public void testAvoidUsageOfContinue() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/apache/commons/collections/ExtendedProperties.java")); - checkMessages.assertNext().atLine(566); - checkMessages.assertNoMore(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/UndocumentedApiCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/UndocumentedApiCheckTest.java deleted file mode 100644 index 467c36e0245..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/UndocumentedApiCheckTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.ast.check; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class UndocumentedApiCheckTest { - - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - squid.registerVisitor(UndocumentedApiCheck.class); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/rules/UndocumentedApi.java")); - squid.decorateSourceCodeTreeWith(Metric.values()); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void testUndocumentedApi() { - SourceFile file = (SourceFile) squid.search("UndocumentedApi.java"); - - assertThat(file.getInt(Metric.PUBLIC_API) - file.getInt(Metric.PUBLIC_DOC_API), is(3)); - - CheckMessages checkMessages = new CheckMessages(file); - checkMessages.assertNext().atLine(10); - checkMessages.assertNext().atLine(14); - checkMessages.assertNext().atLine(17); - checkMessages.assertNoMore(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AccessorVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AccessorVisitorTest.java deleted file mode 100644 index 73fb0798135..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AccessorVisitorTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -import static org.junit.Assert.assertEquals; - -public class AccessorVisitorTest { - - private Squid squid; - - @Test - public void analyzePureJavaBean() { - squid = new Squid(new JavaSquidConfiguration(true)); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/accessors/PureJavaBean.java")); - SourceCode res = squid.aggregate(); - assertEquals(54, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(94, res.getInt(Metric.LINES)); - assertEquals(6, res.getInt(Metric.ACCESSORS)); - assertEquals(10, res.getInt(Metric.METHODS)); - } - - @Test - public void considerAccessorAsMethod() { - squid = new Squid(new JavaSquidConfiguration(false)); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/accessors/JavaBeanWithApiDoc.java")); - SourceCode res = squid.aggregate(); - assertEquals(10, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(30, res.getInt(Metric.LINES)); - assertEquals(2, res.getInt(Metric.METHODS)); - assertEquals(0, res.getInt(Metric.ACCESSORS)); - assertEquals(4, res.getInt(Metric.PUBLIC_API)); - assertEquals(2, res.getInt(Metric.COMPLEXITY)); - } - - @Test - public void analyseVarAccessorsImpactOnOtherMeasures() { - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/accessors/JavaBeanWithApiDoc.java")); - SourceCode res = squid.aggregate(); - assertEquals(10, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(30, res.getInt(Metric.LINES)); - assertEquals(1, res.getInt(Metric.METHODS)); - assertEquals(1, res.getInt(Metric.ACCESSORS)); - assertEquals(3, res.getInt(Metric.PUBLIC_API)); - assertEquals(1, res.getInt(Metric.COMPLEXITY)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitorTest.java deleted file mode 100644 index 43ceac6abb1..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/AnonymousInnerClassVisitorTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; - -public class AnonymousInnerClassVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void testCreateInnerSquidClass() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/AnonymousInnerClass.java")); - squid.aggregate(); - assertNotNull(squid.search("AnonymousInnerClass$1")); - assertNotNull(squid.search("AnonymousInnerClass$2")); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BlankLinesVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BlankLinesVisitorTest.java deleted file mode 100644 index fa21537af58..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BlankLinesVisitorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class BlankLinesVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseTest002() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/loc/Test002.java")); - assertEquals(5, squid.aggregate().getInt(Metric.BLANK_LINES)); - } - - @Test - public void analyseTest001() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/loc/Test001.java")); - assertEquals(4, squid.aggregate().getInt(Metric.BLANK_LINES)); - - SourceCode classSource = squid.search("Something"); - assertEquals(2, classSource.getInt(Metric.BLANK_LINES)); - } - - @Test - public void analyseClassWithHeaderAndBlankLines() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithHeaderAndBlankLines.java")); - SourceCode sources = squid.aggregate(); - assertEquals(3, sources.getInt(Metric.LINES_OF_CODE)); - assertEquals(4, sources.getInt(Metric.BLANK_LINES)); - assertEquals(6, sources.getInt(Metric.COMMENT_BLANK_LINES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BrancheVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BrancheVisitorTest.java deleted file mode 100644 index df618e696ba..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/BrancheVisitorTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class BrancheVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void testNoBranches() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/branches/NoBranches.java")); - SourceCode res = squid.aggregate(); - assertEquals(0, res.getInt(Metric.BRANCHES)); - } - - @Test - public void testSimpleBranches() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/branches/SimpleBranches.java")); - SourceCode res = squid.aggregate(); - assertEquals(8, res.getInt(Metric.BRANCHES)); - } - - @Test - public void testComplexBranches() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/branches/ComplexBranches.java")); - SourceCode res = squid.aggregate(); - assertEquals(6, res.getInt(Metric.BRANCHES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ClassVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ClassVisitorTest.java deleted file mode 100644 index 4a0544c2766..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ClassVisitorTest.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.util.Iterator; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceClass; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.measures.Metric; - -public class ClassVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseTest003() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/Test003.java")); - SourceCode project = squid.aggregate(); - SourceCode defaultPackage = project.getFirstChild(); - SourceCode file = defaultPackage.getFirstChild(); - assertEquals(3, file.getInt(Metric.CLASSES)); - Iterator classes = file.getChildren().iterator(); - SourceCode anotherClass = classes.next(); - assertEquals("AnotherCar", anotherClass.getKey()); - assertTrue(anotherClass.isType(SourceClass.class)); - SourceCode carClass = classes.next(); - assertEquals("Car", carClass.getKey()); - assertTrue(carClass.isType(SourceClass.class)); - SourceCode wheelClass = squid.search("Car$Wheel"); - assertNotNull(wheelClass); - assertEquals(wheelClass.getParent(), carClass); - } - - @Test - public void analyseClassCounterEnum() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/ClassCounterEnum.java")); - SourceCode project = squid.aggregate(); - SourceCode defaultPackage = project.getFirstChild(); - assertEquals(1, defaultPackage.getInt(Metric.CLASSES)); - } - - @Test - public void analyseAnnotationDefinition() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/annotations/AnnotationDefinition.java")); - SourceCode project = squid.aggregate(); - SourceCode annotation = project.getFirstChild(); - assertEquals(1, annotation.getInt(Metric.CLASSES)); - assertNotNull(squid.search("AnnotationDefinition")); - } - - @Test - public void analyseInterface() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/Interface.java")); - SourceCode project = squid.aggregate(); - assertEquals(1, project.getInt(Metric.INTERFACES)); - } - - @Test - public void analyseAbstractClass() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/AbstractClass.java")); - SourceCode project = squid.aggregate(); - assertEquals(1, project.getInt(Metric.ABSTRACT_CLASSES)); - } - - @Test - public void testStartAtLine() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/AbstractClass.java")); - SourceCode classTest = squid.search("AbstractClass"); - assertEquals(2, classTest.getStartAtLine()); - } - - @Test - public void analysePrivateInnerClass() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/classes/InnerClassTests.java")); - SourceCode project = squid.aggregate(); - SourceCode defaultPackage = project.getFirstChild(); - SourceCode defaultClassFile = defaultPackage.getFirstChild(); - SourceCode innerClassTests = defaultClassFile.getFirstChild(); - assertEquals(3, innerClassTests.getInt(Metric.CLASSES)); - SourceCode privateInnerClass = squid.search("InnerClassTests$TestPrivateInnerClass"); - assertEquals(1, privateInnerClass.getInt(Metric.PUBLIC_API)); - assertEquals(0, privateInnerClass.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(1, privateInnerClass.getInt(Metric.CLASSES)); - SourceCode publicInnerClass = squid.search("InnerClassTests$TestPublicInnerClass"); - assertEquals(2, publicInnerClass.getInt(Metric.PUBLIC_API)); - assertEquals(0, privateInnerClass.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(1, publicInnerClass.getInt(Metric.CLASSES)); - } - - @Test - public void detectSuppressWarningsAnnotation() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/rules/ClassWithSuppressWarningsAnnotation.java")); - SourceClass sourceClass = (SourceClass) squid.search("ClassWithSuppressWarningsAnnotation"); - assertThat(sourceClass.isSuppressWarnings(), is(true)); - } - - @Test - public void testCreateSquidClassFromPackage() { - SourceClass squidClass = ClassVisitor.createSourceClass(new SourcePackage("org/sonar"), "Squid"); - assertEquals("org/sonar/Squid", squidClass.getKey()); - } - - @Test - public void testCreateSquidClassFromEmptyPackage() { - SourceClass squidClass = ClassVisitor.createSourceClass(new SourcePackage(""), "Squid"); - assertEquals("Squid", squidClass.getKey()); - } - - @Test - public void testCreateInnerSquidClass() { - SourceClass squidClass = ClassVisitor.createSourceClass(new SourceClass("org/sonar/Squid"), "Key"); - assertEquals("org/sonar/Squid$Key", squidClass.getKey()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/CommentVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/CommentVisitorTest.java deleted file mode 100644 index 949b7748588..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/CommentVisitorTest.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.api.resources.InputFile; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceProject; -import org.sonar.squid.measures.Metric; - -import static org.hamcrest.number.OrderingComparisons.greaterThan; -import static org.junit.Assert.*; - -public class CommentVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseTest002() { - String path = "/metrics/loc/Test002.java"; - SourceProject prj = scan(path); - assertEquals(1, prj.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(1, prj.getInt(Metric.COMMENT_LINES)); - assertEquals(0, prj.getInt(Metric.HEADER_COMMENT_LINES)); - } - - @Test - public void analyseTest001() { - SourceProject res = scan("/metrics/loc/Test001.java"); - assertEquals(4, res.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(5, res.getInt(Metric.COMMENT_LINES)); - assertEquals(1, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(6, res.getInt(Metric.COMMENT_BLANK_LINES)); - } - - @Test - public void testCommentedCode() { - SourceProject res = scan("/metrics/commentedCode/CommentedCode.java"); - assertEquals(8, res.getInt(Metric.COMMENT_LINES)); - assertEquals(4, res.getInt(Metric.COMMENTED_OUT_CODE_LINES)); - assertEquals(25, res.getInt(Metric.LINES)); - assertEquals(7, res.getInt(Metric.LINES_OF_CODE)); - - SourceCode method = squid.search("CommentedCode#analyse()V"); - assertEquals(3, method.getInt(Metric.COMMENTED_OUT_CODE_LINES)); - assertEquals(2, method.getInt(Metric.COMMENT_BLANK_LINES)); - } - - @Test - public void shouldGetCommentedOutLinesOfEmptyFiles() { - scan("/metrics/commentedCode", "org/foo/CommentedOutFile.java"); - SourceCode file = squid.search("org/foo/CommentedOutFile.java"); - assertThat(file.getInt(Metric.COMMENTED_OUT_CODE_LINES), greaterThan(1)); - } - - @Test - public void testNoSonarTagDetection() { - scan("/rules/FileWithNOSONARTags.java"); - SourceFile file = (SourceFile) squid.search("FileWithNOSONARTags.java"); - assertEquals(2, file.getNoSonarTagLines().size()); - assertTrue(file.hasNoSonarTagAtLine(5)); - assertFalse(file.hasNoSonarTagAtLine(6)); - assertTrue(file.hasNoSonarTagAtLine(10)); - } - - @Test - public void testNoSonarTagDetectionWhenNoTag() { - scan("/rules/FileWithoutNOSONARTags.java"); - SourceFile file = (SourceFile) squid.search("FileWithoutNOSONARTags.java"); - assertEquals(0, file.getNoSonarTagLines().size()); - assertFalse(file.hasNoSonarTagAtLine(6)); - } - - @Test - public void testJavaClassWithGWTNativeCode() { - SourceProject project = scan("/special_cases/gwt/JavaClassWithGWTNativeCode.java"); - assertEquals(17, project.getInt(Metric.LINES)); - assertEquals(4, project.getInt(Metric.COMMENT_LINES)); - assertEquals(6, project.getInt(Metric.LINES_OF_CODE)); - assertEquals(0, project.getInt(Metric.COMMENTED_OUT_CODE_LINES)); - } - - private SourceProject scan(String filePath) { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile(filePath)); - return squid.aggregate(); - } - - private SourceProject scan(String basedir, String filePath) { - InputFile inputFile = SquidTestUtils.getInputFile(basedir, filePath); - squid.register(JavaAstScanner.class).scanFile(inputFile); - return squid.aggregate(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ComplexityVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ComplexityVisitorTest.java deleted file mode 100644 index 07a406614f7..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/ComplexityVisitorTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class ComplexityVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration(false)); - } - - @Test - public void testNoBranches() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/branches/NoBranches.java")); - SourceCode res = squid.aggregate(); - assertEquals(3, res.getInt(Metric.COMPLEXITY)); - } - - @Test - public void testSimpleBranches() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/branches/SimpleBranches.java")); - SourceCode res = squid.aggregate(); - assertEquals(15, res.getInt(Metric.COMPLEXITY)); - SourceCode simpleSwitch = squid.search("SimpleBranches#simpleSwitch()V"); - assertEquals(3, simpleSwitch.getInt(Metric.COMPLEXITY)); - } - - @Test - public void testInstanceAndStaticInitBlocks() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/complexity/InstanceAndStaticInitBlocks.java")); - SourceCode res = squid.aggregate(); - assertEquals(2, res.getInt(Metric.COMPLEXITY)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/EndAtLineVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/EndAtLineVisitorTest.java deleted file mode 100644 index 0bfddfc22d2..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/EndAtLineVisitorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; - -public class EndAtLineVisitorTest { - - @Test - public void testEndAtLineForMethod() { - Squid squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/ClassWithStaticMethods.java")); - assertEquals(17, squid.search("ClassWithStaticMethods#doJob2()V").getEndAtLine()); - } - - @Test - public void testEndAtLineForClass() { - Squid squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/ClassWithStaticMethods.java")); - assertEquals(30, squid.search("ClassWithStaticMethods").getEndAtLine()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileLinesVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileLinesVisitorTest.java deleted file mode 100644 index b92e56890ef..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileLinesVisitorTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.FileLinesContext; -import org.sonar.api.measures.FileLinesContextFactory; -import org.sonar.api.resources.Resource; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.plugins.squid.SonarAccessor; -import org.sonar.squid.Squid; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.*; - -public class FileLinesVisitorTest { - - private Squid squid; - private FileLinesContextFactory factory; - private FileLinesContext measures; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - factory = mock(FileLinesContextFactory.class); - measures = mock(FileLinesContext.class); - } - - @Test - public void analyseTestNcloc() { - ArgumentCaptor resourceCaptor = ArgumentCaptor.forClass(Resource.class); - when(factory.createFor(resourceCaptor.capture())) - .thenReturn(measures); - - squid.register(SonarAccessor.class).setFileLinesContextFactory(factory); - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/ncloc/TestNcloc.java")); - - assertThat(resourceCaptor.getValue().getKey(), is("[default].TestNcloc")); - verify(measures).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 1, 1); - verify(measures).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 2, 0); - verify(measures).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 3, 1); - - verify(measures).setIntValue(CoreMetrics.COMMENT_LINES_DATA_KEY, 1, 0); - verify(measures).setIntValue(CoreMetrics.COMMENT_LINES_DATA_KEY, 18, 1); - - verify(measures).save(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileVisitorTest.java deleted file mode 100644 index 3ae79a74757..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/FileVisitorTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import com.google.common.collect.Lists; -import org.junit.Before; -import org.junit.Test; -import org.sonar.api.resources.InputFile; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.measures.Metric; - -public class FileVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void testExtractFileNameFromFilePath() { - String filename = "/toto/tata/org/codehaus/sonar/MyClass.java"; - assertEquals("MyClass.java", FileVisitor.extractFileNameFromFilePath(filename)); - } - - @Test - public void analyseTest003() { - List files = Lists.newArrayList(); - files.add(SquidTestUtils.getInputFile("/metrics/loc/Test002.java")); - files.add(SquidTestUtils.getInputFile("/metrics/classes/Test003.java")); - squid.register(JavaAstScanner.class).scanFiles(files); - SourceCode project = squid.aggregate(); - assertEquals(2, project.getInt(Metric.FILES)); - SourceCode defaultPackage = project.getFirstChild(); - SourceCode file = defaultPackage.getFirstChild(); - assertEquals("Test002.java", file.getKey()); - assertTrue(file.isType(SourceFile.class)); - } - - @Test - public void createSourceFile() { - SourceFile squidFile = FileVisitor.createSourceFile(new SourcePackage("org/sonar"), "Squid.java"); - assertEquals("org/sonar/Squid.java", squidFile.getKey()); - } - - @Test - public void createSourceFileWithDefaultPackage() { - SourceFile squidFile = FileVisitor.createSourceFile(new SourcePackage(""), "Squid.java"); - assertEquals("Squid.java", squidFile.getKey()); - } - - @Test - public void createSourceFileWithNoPackage() { - SourceFile squidFile = FileVisitor.createSourceFile(null, "Squid.java"); - assertEquals("Squid.java", squidFile.getKey()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/HeaderCommentVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/HeaderCommentVisitorTest.java deleted file mode 100644 index bc7d0fc1802..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/HeaderCommentVisitorTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class HeaderCommentVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseHeaderCommentsStandard() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithHeader.java")); - SourceCode res = squid.aggregate(); - assertEquals(7, res.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(32, res.getInt(Metric.LINES)); - assertEquals(10, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(2, res.getInt(Metric.HEADER_COMMENT_LINES)); - } - - @Test - public void analyseHeaderCommentsAndNoPackage() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithHeaderAndNoPackage.java")); - SourceCode res = squid.aggregate(); - assertEquals(7, res.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(30, res.getInt(Metric.LINES)); - assertEquals(10, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(2, res.getInt(Metric.HEADER_COMMENT_LINES)); - } - - @Test - public void analyseHeaderCommentsAndNoPackageNoImports() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithHeaderAndNoPackageNoImports.java")); - SourceCode res = squid.aggregate(); - assertEquals(3, res.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(23, res.getInt(Metric.LINES)); - assertEquals(2, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(9, res.getInt(Metric.LINES_OF_CODE)); - } - - @Test - public void analyseJavadocHeaderAndPackage() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/", "foo/ClassWithPackageAndJavadocHeader.java")); - SourceCode res = squid.aggregate(); - assertEquals(2, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(3, res.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(50, res.getInt(Metric.LINES)); - assertEquals(27, res.getInt(Metric.LINES_OF_CODE)); - } - - @Test - public void analyseCCommentWithoutHeader() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithoutHeaderAndWithCComment.java")); - SourceCode res = squid.aggregate(); - assertEquals(3, res.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(0, res.getInt(Metric.HEADER_COMMENT_LINES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesOfCodeVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesOfCodeVisitorTest.java deleted file mode 100644 index b8209c3c483..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesOfCodeVisitorTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class LinesOfCodeVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseTestNcloc() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/ncloc/TestNcloc.java")); - SourceCode res = squid.aggregate(); - assertEquals(39, res.getInt(Metric.LINES)); - assertEquals(9, res.getInt(Metric.BLANK_LINES)); - assertEquals(26, res.getInt(Metric.LINES_OF_CODE)); - - SourceCode classSource = squid.search("ClassWithStaticMethods"); - assertEquals(26, classSource.getInt(Metric.LINES_OF_CODE)); - - SourceCode methodSource = squid.search("ClassWithStaticMethods#doJob2()V"); - assertEquals(8, methodSource.getInt(Metric.LINES_OF_CODE)); - } - - @Test - public void analyseTestNclocWithClassComment() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/ncloc/TestNclocWithClassComment.java")); - SourceCode res = squid.aggregate(); - assertEquals(46, res.getInt(Metric.LINES)); - assertEquals(9, res.getInt(Metric.BLANK_LINES)); - assertEquals(4, res.getInt(Metric.COMMENT_LINES)); - assertEquals(7, res.getInt(Metric.COMMENT_BLANK_LINES)); - assertEquals(26, res.getInt(Metric.LINES_OF_CODE)); - } - - @Test - public void analyseTestNclocWithHeader() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/ncloc/TestNclocWithHeader.java")); - SourceCode res = squid.aggregate(); - assertEquals(59, res.getInt(Metric.LINES)); - assertEquals(12, res.getInt(Metric.BLANK_LINES)); - assertEquals(4, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(12, res.getInt(Metric.COMMENT_BLANK_LINES)); - assertEquals(26, res.getInt(Metric.LINES_OF_CODE)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesVisitorTest.java deleted file mode 100644 index bf424b73766..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/LinesVisitorTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class LinesVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseTest001() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/loc/Test001.java")); - SourceCode res = squid.aggregate(); - assertEquals(25, res.getInt(Metric.LINES)); - - SourceCode classSource = squid.search("Something"); - assertEquals(14, classSource.getInt(Metric.LINES)); - - SourceCode methodSource = squid.search("Something#run()V"); - assertEquals(3, methodSource.getInt(Metric.LINES)); - } - - @Test - public void analyseTest002() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/loc/Test002.java")); - SourceCode res = squid.aggregate(); - assertEquals(19, res.getInt(Metric.LINES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/MethodVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/MethodVisitorTest.java deleted file mode 100644 index 480602f3097..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/MethodVisitorTest.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.indexer.QueryByType; -import org.sonar.squid.measures.Metric; - -public class MethodVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseClassWithStaticMethods() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/ClassWithStaticMethods.java")); - SourceCode prj = squid.decorateSourceCodeTreeWith(Metric.values()); - assertEquals(3, prj.getInt(Metric.METHODS)); - assertEquals(8, prj.getInt(Metric.COMPLEXITY)); - } - - @Test - public void methodWithAnonymousInnerClass() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/MethodWithAnonymousInnerClass.java")); - SourceCode prj = squid.decorateSourceCodeTreeWith(Metric.values()); - assertEquals(4, prj.getInt(Metric.METHODS)); - assertEquals(4, squid.search(new QueryByType(SourceMethod.class)).size()); - assertEquals(4, prj.getInt(Metric.COMPLEXITY)); - } - - @Test - public void testStartAtLine() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/ClassWithStaticMethods.java")); - SourceCode doJob2Method = squid.search("ClassWithStaticMethods#doJob1()V"); - assertEquals(3, doJob2Method.getStartAtLine()); - } - - @Test - public void testMethodSignature() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/ClassWithDifferentMethodSignatures.java")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#()V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#(LList;)V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method()V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(I)[D")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(I)LString;")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(I[D)[LSquid;")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(LString;)V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method([LString;)V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(LArrayList;)V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(LEntry;)V")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#method(LMap;)[LSquid;")); - assertNotNull(squid.search("ClassWithDifferentMethodSignatures#unusedPrivateMethod(LList;[I)V")); - } - - @Test - public void testConstructorsMetric() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/methods/ClassWithDifferentMethodSignatures.java")); - SourceCode source = squid.decorateSourceCodeTreeWith(Metric.values()); - assertEquals(2, source.getInt(Metric.CONSTRUCTORS)); - } - - @Test - public void detectSuppressWarningsAnnotation() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/rules/ClassWithSuppressWarningsAnnotation.java")); - - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#fullyQualifiedName()V").isSuppressWarnings(), is(true)); - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#singleValue()V").isSuppressWarnings(), is(true)); - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#arrayWithSingleValue()V").isSuppressWarnings(), is(true)); - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#arrayWithMultipleValues()V").isSuppressWarnings(), is(true)); - assertThat(getMethod("ClassWithSuppressWarningsAnnotation$1#methodInAnonymousInnerClass()V").isSuppressWarnings(), is(true)); - - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#notHandled()V").isSuppressWarnings(), is(false)); - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#notHandled2()V").isSuppressWarnings(), is(false)); - assertThat(getMethod("ClassWithSuppressWarningsAnnotation#notHandled3()V").isSuppressWarnings(), is(false)); - } - - private SourceMethod getMethod(String key) { - return (SourceMethod) squid.search(key); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PackageVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PackageVisitorTest.java deleted file mode 100644 index f6c156a508d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PackageVisitorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.AnalysisException; -import org.sonar.squid.api.SourceProject; -import org.sonar.squid.measures.Metric; - -import static org.junit.Assert.*; - -public class PackageVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test(expected = AnalysisException.class) - public void shouldFailIfPackageDifferentThanPhysicalDirectory() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/wrongPackages/", "org/foo/WrongPackage.java")); - squid.aggregate(); - } - - @Test(expected = AnalysisException.class) - public void shouldFailIfBadSourceDirectory() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/wrongPackages/org", "foo/GoodPackage.java")); - squid.aggregate(); - } - - @Test - public void shouldGuessPackageWhenCommentedOutFile() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/wrongPackages", "org/foo/CommentedOutFile.java")); - SourceProject project = squid.aggregate(); - - assertNull(squid.search("CommentedOutFile.java")); - assertNotNull(squid.search("org/foo/CommentedOutFile.java")); - assertNotNull(squid.search("org/foo")); - assertEquals(1, project.getInt(Metric.PACKAGES)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PublicApiVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PublicApiVisitorTest.java deleted file mode 100644 index 7e55f5e7828..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/PublicApiVisitorTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class PublicApiVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void analyseClassWithCommentsOnLineOfCode() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithCommentsOnLineOfCode.java")); - SourceCode res = squid.aggregate(); - assertEquals(7, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(4, res.getInt(Metric.COMMENT_LINES)); - assertEquals(2, res.getInt(Metric.PUBLIC_API)); - } - - @Test - public void analyseVars() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithVars.java")); - SourceCode res = squid.aggregate(); - assertEquals(15, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(59, res.getInt(Metric.LINES)); - assertEquals(10, res.getInt(Metric.BLANK_LINES)); - assertEquals(21, res.getInt(Metric.COMMENT_BLANK_LINES)); - assertEquals(5, res.getInt(Metric.PUBLIC_API)); - assertEquals(1, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(3, res.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(13, res.getInt(Metric.COMMENT_LINES)); - assertEquals(0.6, res.getDouble(Metric.PUBLIC_DOCUMENTED_API_DENSITY), 0.01); - } - - @Test - public void analyseConstants() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/Constants.java")); - SourceCode res = squid.aggregate(); - assertEquals(9, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(76, res.getInt(Metric.LINES)); - assertEquals(11, res.getInt(Metric.BLANK_LINES)); - assertEquals(21, res.getInt(Metric.COMMENT_BLANK_LINES)); - assertEquals(1, res.getInt(Metric.PUBLIC_API)); - assertEquals(15, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(1, res.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(35, res.getInt(Metric.COMMENT_LINES)); - } - - @Test - public void analyseApiDocCounter() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/ClassWithComments.java")); - SourceCode res = squid.aggregate(); - assertEquals(7, res.getInt(Metric.PUBLIC_API)); - assertEquals(4, res.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(66, res.getInt(Metric.LINES)); - assertEquals(18, res.getInt(Metric.LINES_OF_CODE)); - assertEquals(0.47, res.getDouble(Metric.COMMENT_LINES_DENSITY), 0.01); - } - - @Test - public void analyseJavaDocCounterOnAnnotation() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/special_cases/annotations/AnnotationDefinition.java")); - SourceCode res = squid.aggregate(); - assertEquals(3, res.getInt(Metric.PUBLIC_API)); - assertEquals(2, res.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(18, res.getInt(Metric.LINES)); - assertEquals(0.36, res.getDouble(Metric.COMMENT_LINES_DENSITY), 0.01); - } - - @Test - public void analyseInterfaceComments() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/InterfaceWithComments.java")); - SourceCode res = squid.aggregate(); - assertEquals(6, res.getInt(Metric.PUBLIC_API)); - assertEquals(2, res.getInt(Metric.PUBLIC_DOC_API)); - assertEquals(1, res.getInt(Metric.HEADER_COMMENT_LINES)); - assertEquals(0.33, res.getDouble(Metric.PUBLIC_DOCUMENTED_API_DENSITY), 0.01); - } - - @Test - public void excludeMethodWithOverrideAnnotation() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/MethodsWithOverrideAnnotation.java")); - SourceCode res = squid.aggregate(); - assertEquals(2, res.getInt(Metric.PUBLIC_API)); - assertEquals(0, res.getInt(Metric.PUBLIC_DOC_API)); - } - - @Test - public void excludeEmptyConstructor() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/javadoc/EmptyConstructor.java")); - SourceCode res = squid.aggregate(); - assertEquals(3, res.getInt(Metric.PUBLIC_API)); - assertEquals(0, res.getInt(Metric.PUBLIC_DOC_API)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/StatementVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/StatementVisitorTest.java deleted file mode 100644 index bb4b84294bd..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/visitor/StatementVisitorTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.ast.visitor; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.measures.Metric; - -public class StatementVisitorTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration()); - } - - @Test - public void testNoStatements() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/statements/NoStatements.java")); - SourceCode res = squid.aggregate(); - assertEquals(12, res.getInt(Metric.STATEMENTS)); - SourceCode simpleIf = squid.search("Car#simpleIf(LString;)V"); - assertEquals(6, simpleIf.getInt(Metric.STATEMENTS)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/BytecodeVisitorsTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/BytecodeVisitorsTest.java deleted file mode 100644 index 4f80e079d3c..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/BytecodeVisitorsTest.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.asm.AsmResource; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceCodeEdgeUsage; -import org.sonar.squid.measures.Metric; - -import java.util.List; -import java.util.Set; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -public class BytecodeVisitorsTest { - - static Squid squid; - static SourceCode todo; - static SourceCode fixme; - static SourceCode file; - static SourceCode tag; - static SourceCode tagFile; - static SourceCode line; - static SourceCode sourceFile; - static SourceCode language; - static SourceCode tagName; - static SourceCode tagException; - static SourceCode pacTag; - static SourceCode pacImpl; - - @BeforeClass - public static void setup() { - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/src")); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/bin")); - squid.decorateSourceCodeTreeWith(Metric.values()); - tag = squid.search("tags/Tag"); - tagFile = squid.search("tags/Tag.java"); - file = squid.search("tags/File"); - line = squid.search("tags/Line"); - tagName = squid.search("tags/TagName"); - tagException = squid.search("tags/TagException"); - language = squid.search("tags/Language"); - sourceFile = squid.search("tags/SourceFile"); - todo = squid.search("tags/impl/Todo"); - fixme = squid.search("tags/impl/FixMe"); - pacTag = squid.search("tags"); - pacImpl = squid.search("tags/impl"); - } - - @Test - public void testLCOM4Visitor() { - assertEquals(1, squid.search("tags/impl/Todo").getInt(Metric.LCOM4)); - assertEquals(1, squid.search("tags/impl/Todo.java").getInt(Metric.LCOM4)); - - List> lcom4Blocks = (List>) squid.search("tags/impl/Todo.java").getData(Metric.LCOM4_BLOCKS); - assertEquals(0, lcom4Blocks.size()); - - assertEquals(1, squid.search("tags/Tag").getInt(Metric.LCOM4)); - assertEquals(1, squid.search("tags/TagName").getInt(Metric.LCOM4)); - } - - @Test - public void testRFCVisitor() { - assertEquals(8, todo.getInt(Metric.RFC)); - assertEquals(8, squid.search("tags/impl/Todo.java").getInt(Metric.RFC)); - assertEquals(5, sourceFile.getInt(Metric.RFC)); - } - - @Test - public void testNOCVisitor() { - assertEquals(1, squid.search("tags/File").getInt(Metric.NOC)); - assertEquals(2, squid.search("tags/Tag").getInt(Metric.NOC)); // Tag is an interface - assertEquals(0, squid.search("tags/SourceFile").getInt(Metric.NOC)); - assertEquals(2, squid.search("tags/Content").getInt(Metric.NOC)); // Content has only one direct child - } - - @Test - public void testDITVisitor() { - assertEquals(3, squid.search("tags/SourceFile").getInt(Metric.DIT)); - assertEquals(2, squid.search("tags/File").getInt(Metric.DIT)); - assertEquals(1, squid.search("tags/Content").getInt(Metric.DIT)); - assertEquals(3, squid.search("tags/TagException").getInt(Metric.DIT)); - } - - @Test - public void testDITVisitorOnInterfaces() { - assertEquals(0, squid.search("tags/Comment").getInt(Metric.DIT)); - assertEquals(1, squid.search("tags/Tag").getInt(Metric.DIT)); - } - - @Test - public void testExtendsRelationShips() { - assertEquals(SourceCodeEdgeUsage.EXTENDS, squid.getEdge(sourceFile, file).getUsage()); - } - - @Test - public void testClassDefinitionWithGenerics() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(todo, language).getUsage()); - } - - @Test - public void testImplementsRelationShips() { - assertEquals(SourceCodeEdgeUsage.IMPLEMENTS, squid.getEdge(todo, tag).getUsage()); - } - - @Test - public void testLdcRelationShips() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(tagName, tagException).getUsage()); - } - - @Test - public void testFieldRelationShip() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(todo, file).getUsage()); - } - - @Test - public void testFieldRelationShipWithGenerics() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(todo, line).getUsage()); - } - - @Test - public void testMethodReturnType() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(todo, tagName).getUsage()); - } - - @Test - public void testMethodArgs() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(todo, sourceFile).getUsage()); - } - - @Test - public void testMethodException() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(todo, tagException).getUsage()); - } - - @Test - public void testAccessFieldOfAnObject() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(fixme, sourceFile).getUsage()); - } - - @Test - public void testTypeInsn() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(fixme, file).getUsage()); - } - - @Test - public void testAccessMethodOfAnObject() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(fixme, tagException).getUsage()); - } - - @Test - public void testTryCatchBlock() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(sourceFile, tagException).getUsage()); - } - - @Test - public void testPackageDependencies() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(pacImpl, pacTag).getUsage()); - assertEquals(13, squid.getEdge(pacImpl, pacTag).getWeight()); - } - - @Test - public void noDependencyFromOneSquidUnitToItself() { - assertNull(squid.getEdge(pacTag, pacTag)); - assertNull(squid.getEdge(fixme, fixme)); - } - - @Test - public void testFileDependencies() { - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(sourceFile.getParent(), tagException.getParent()).getUsage()); - } - - @Test - public void testAfferentCouplingAtClassLevel() { - assertEquals(2, tag.getInt(Metric.CA)); - } - - @Test - public void testEfferentCouplingAtClassLevel() { - assertEquals(3, tag.getInt(Metric.CE)); - } - - @Test - public void testAfferentCouplingAtFileLevel() { - assertEquals(2, tagFile.getInt(Metric.CA)); - } - - @Test - public void testEfferentCouplingAtFileLevel() { - assertEquals(3, tagFile.getInt(Metric.CE)); - } - - @Test - public void testAfferentCouplingAtPackageLevel() { - assertEquals(2, pacTag.getInt(Metric.CA)); - assertEquals(0, pacImpl.getInt(Metric.CA)); - } - - @Test - public void testEfferentCouplingAtPackageLevel() { - assertEquals(0, pacTag.getInt(Metric.CE)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/VirtualMethodsLinkerTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/VirtualMethodsLinkerTest.java deleted file mode 100644 index ae1dd534088..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/VirtualMethodsLinkerTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.check.UnusedProtectedMethodCheck; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class VirtualMethodsLinkerTest { - - @Test - public void testLinkingRunMethodVirtualMethodToItsImplementation() { - Squid squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/virtualMethodsLinker/src")); - squid.registerVisitor(UnusedProtectedMethodCheck.class); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/virtualMethodsLinker/bin")); - squid.decorateSourceCodeTreeWith(Metric.values()); - - SourceFile file = (SourceFile) squid.search("Animal.java"); - assertThat(file.getCheckMessages().size(), is(0)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderImplTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderImplTest.java deleted file mode 100644 index 30414e5792a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderImplTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.ClassLoaderBuilder; -import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; - -public class AsmClassProviderImplTest { - - private AsmClassProviderImpl asmClassProviderImpl = new AsmClassProviderImpl(); - - @Test - public void testReadClass() { - AsmClass asmClass = asmClassProviderImpl.getClass("java/lang/Object"); - assertNotNull(asmClass); - assertEquals("java/lang/Object", asmClass.getInternalName()); - assertNotNull(asmClassProviderImpl.getClass("bytecode/bin/tags/File")); - } - - @Test - public void testCacheMechanism() { - AsmClass asmClass = asmClassProviderImpl.getClass("java/lang/Object"); - AsmClass asmClass2 = asmClassProviderImpl.getClass("java/lang/Object"); - assertEquals(asmClass, asmClass2); - } - - @Test - public void testGetUnknownClass() { - AsmClass unknownClass = asmClassProviderImpl.getClass("java/lang/UnknownClass"); - assertNotNull(unknownClass); - assertNull(unknownClass.getSuperClass()); - } - - @Test - public void testloadSuperClass() { - AsmClass doubleClass = asmClassProviderImpl.getClass("java/lang/Double"); - assertEquals("java/lang/Number", doubleClass.getSuperClass().getInternalName()); - assertEquals("java/lang/Object", doubleClass.getSuperClass().getSuperClass().getInternalName()); - assertNull(doubleClass.getSuperClass().getSuperClass().getSuperClass()); - } - - @Test - public void testloadInterfaces() { - AsmClass characterClass = asmClassProviderImpl.getClass("java/lang/Character"); - assertEquals(2, characterClass.getInterfaces().size()); - } - - @Test - public void getSeveralTimesTheSameClassButWithHigherDetailLevel() { - AsmClass integerClass = asmClassProviderImpl.getClass("java/lang/Integer", DETAIL_LEVEL.NOTHING); - assertEquals("java/lang/Integer", integerClass.getInternalName()); - assertEquals(DETAIL_LEVEL.NOTHING, integerClass.getDetailLevel()); - assertEquals(0, integerClass.getMethods().size()); - assertNull(integerClass.getSuperClass()); - - AsmClass integerClassWithHigherDetailLevel = asmClassProviderImpl.getClass("java/lang/Integer", DETAIL_LEVEL.STRUCTURE_AND_CALLS); - assertEquals(DETAIL_LEVEL.STRUCTURE_AND_CALLS, integerClassWithHigherDetailLevel.getDetailLevel()); - assertSame(integerClass, integerClassWithHigherDetailLevel); - assertEquals("java/lang/Number", integerClass.getSuperClass().getInternalName()); - } - - @Test - public void testPersonalClassLoader() { - asmClassProviderImpl = new AsmClassProviderImpl(ClassLoaderBuilder.create(SquidTestUtils.getFile("/bytecode/bin/"))); - assertEquals(DETAIL_LEVEL.STRUCTURE_AND_CALLS, asmClassProviderImpl.getClass("tags/Line", DETAIL_LEVEL.STRUCTURE_AND_CALLS).getDetailLevel()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderTest.java deleted file mode 100644 index 32d54115955..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassProviderTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; -import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class AsmClassProviderTest { - - @Test - public void testIsGreaterThan() { - assertTrue(DETAIL_LEVEL.STRUCTURE_AND_CALLS.isGreaterThan(DETAIL_LEVEL.STRUCTURE)); - assertFalse(DETAIL_LEVEL.STRUCTURE.isGreaterThan(DETAIL_LEVEL.STRUCTURE_AND_CALLS)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassTest.java deleted file mode 100644 index 4c6599e4ea6..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; - -import static org.fest.assertions.Assertions.assertThat; - -public class AsmClassTest { - - @Test - public void testGetFieldOrCreateIt() { - AsmClass asmClass = new AsmClass("java/lang/String"); - - assertThat(asmClass.getField("internalString")).isNull(); - assertThat(asmClass.getFieldOrCreateIt("internalString")).isNotNull(); - assertThat(asmClass.getField("internalString")).isNotNull(); - } - - @Test - public void testGetMethoddOrCreateIt() { - AsmClass asmClass = new AsmClass("java/lang/String"); - - assertThat(asmClass.getMethod("toString()Ljava/lang/String;")).isNull(); - assertThat(asmClass.getMethodOrCreateIt("toString()Ljava/lang/String;")).isNotNull(); - assertThat(asmClass.getMethod("toString()Ljava/lang/String;")).isNotNull(); - } - - @Test - public void testEqualsAndHashcode() { - assertThat(new AsmClass("java/lang/String")).isEqualTo(new AsmClass("java/lang/String")); - assertThat(new AsmClass("java/lang/String").hashCode()).isEqualTo(new AsmClass("java/lang/String").hashCode()); - assertThat(new AsmClass("java/lang/String")).isNotEqualTo(new AsmClass("java/lang/Number")); - assertThat(new AsmClass("java/lang/String").hashCode()).isNotEqualTo(new AsmClass("java/lang/Number").hashCode()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassVisitorTest.java deleted file mode 100644 index d42d3b66020..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmClassVisitorTest.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.ClassLoaderBuilder; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -public class AsmClassVisitorTest { - - private static AsmClassProvider asmClassProvider = new AsmClassProviderImpl(ClassLoaderBuilder.create(SquidTestUtils.getFile("/bytecode/bin/"))); - - @Test - public void testVisit() { - AsmClass asmClass = asmClassProvider.getClass("java/lang/String"); - assertEquals("java/lang/String", asmClass.getInternalName()); - assertFalse(asmClass.isAbstract()); - assertFalse(asmClass.isInterface()); - } - - @Test - public void testVisitMethod() { - AsmClass asmClass = asmClassProvider.getClass("java/lang/String"); - assertNotNull(asmClass.getMethod("charAt(I)C")); - assertTrue(asmClass.getMethod("charAt(I)C").isPublic()); - assertFalse(asmClass.getMethod("charAt(I)C").isDeprecated()); - assertFalse(asmClass.getMethod("charAt(I)C").isStatic()); - assertTrue(asmClass.getMethod("valueOf(C)Ljava/lang/String;").isStatic()); - - asmClass = asmClassProvider.getClass("tags/File"); - AsmMethod getLines = asmClass.getMethod("read(Ljava/util/Collection;Ljava/lang/String;)Ljava/lang/String;"); - assertTrue(getLines.getDistinctUsedAsmClasses().contains(new AsmClass("java/util/Collection"))); - assertTrue(getLines.getDistinctUsedAsmClasses().contains(new AsmClass("tags/File"))); - assertTrue(getLines.getDistinctUsedAsmClasses().contains(new AsmClass("java/lang/String"))); - assertTrue(getLines.getDistinctUsedAsmClasses().contains(new AsmClass("java/lang/RuntimeException"))); - } - - @Test - public void testVisitMehtodAccessFlags() { - AsmClass fileClass = asmClassProvider.getClass("tags/File"); - assertTrue(fileClass.getMethod("read()V").isPublic()); - AsmClass stringClass = asmClassProvider.getClass("java/lang/String"); - assertFalse(stringClass.getMethod("toString()Ljava/lang/String;").isDeprecated()); - } - - @Test - public void testInheritedMethodProperty() { - AsmClass asmClass = asmClassProvider.getClass("properties/InheritedMethodsProperty"); - assertTrue(asmClass.getMethod("equals(Ljava/lang/Object;)Z").isInherited()); - assertFalse(asmClass.getMethod("notInheritedMethod()V").isInherited()); - assertTrue(asmClass.getMethod("run()V").isInherited()); - } - - @Test - public void testMethodBodyLoadedProperty() { - AsmClass asmClass = asmClassProvider.getClass("properties/MethodBodyLoadedProperty"); - assertTrue(asmClass.getMethod("doJob()V").isBodyLoaded()); - assertFalse(asmClass.getMethod("run()V").isBodyLoaded()); - } - - @Test - public void testResourceTouchedProperty() { - AsmClass asmClass = asmClassProvider.getClass("properties/ResourceTouchedProperty"); - assertFalse(asmClass.getField("unusedField").isUsed()); - assertTrue(asmClass.getField("usedField").isUsed()); - assertTrue(asmClass.getMethod("doPrivateJob()V").isUsed()); - assertFalse(asmClass.getMethod("run()V").isUsed()); - assertFalse(asmClass.isUsed()); - assertTrue(asmClassProvider.getClass("java/lang/Runnable").isUsed()); - } - - @Test - public void testVisitFieldAccessFlags() { - AsmClass asmClass = asmClassProvider.getClass("java/lang/String"); - assertNotNull(asmClass.getField("CASE_INSENSITIVE_ORDER")); - assertTrue(asmClass.getField("CASE_INSENSITIVE_ORDER").isStatic()); - assertTrue(asmClass.getField("CASE_INSENSITIVE_ORDER").isPublic()); - assertTrue(asmClass.getField("CASE_INSENSITIVE_ORDER").isFinal()); - assertFalse(asmClass.getField("CASE_INSENSITIVE_ORDER").isDeprecated()); - } - - @Test - public void testVisitObjectField() { - AsmClass asmClass = asmClassProvider.getClass("tags/SourceFile"); - AsmEdge pathAsmEdge = asmClass.getField("path").getOutgoingEdges().iterator().next(); - assertEquals("java/lang/String", pathAsmEdge.getTargetAsmClass().getInternalName()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldTest.java deleted file mode 100644 index 36586f6dd28..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; - -import static org.fest.assertions.Assertions.assertThat; - -public class AsmFieldTest { - - private AsmClass stringClass = new AsmClass("java/lang/String"); - private AsmClass numberClass = new AsmClass("java/lang/Number"); - - @Test - public void testEquals() { - assertThat(new AsmField(stringClass, "firstField")).isEqualTo(new AsmField(stringClass, "firstField")); - assertThat(new AsmField(stringClass, "firstField")).isNotEqualTo(new AsmField(stringClass, "secondField")); - assertThat(new AsmField(stringClass, "firstField")).isNotEqualTo(new AsmField(numberClass, "firstField")); - } - - @Test - public void testHashCode() { - assertThat(new AsmField(stringClass, "firstField").hashCode()).isEqualTo(new AsmField(stringClass, "firstField").hashCode()); - assertThat(new AsmField(stringClass, "firstField").hashCode()).isNotEqualTo(new AsmField(stringClass, "secondField").hashCode()); - assertThat(new AsmField(stringClass, "firstField").hashCode()).isNotEqualTo(new AsmField(numberClass, "firstField").hashCode()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldVisitorTest.java deleted file mode 100644 index 723a4d26ebd..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmFieldVisitorTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.ClassLoaderBuilder; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class AsmFieldVisitorTest { - - @Test - public void testVisitStringField() { - AsmClassProviderImpl classProvider = new AsmClassProviderImpl(ClassLoaderBuilder.create(SquidTestUtils.getFile("/bytecode/bin/"))); - AsmClass fileClass = classProvider.getClass("tags/SourceFile"); - assertEquals(5, fileClass.getFields().size()); - AsmField field = fileClass.getField("path"); - assertTrue(field.isStatic()); - assertTrue(field.isPublic()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java deleted file mode 100644 index e35bd1d409f..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.ClassLoaderBuilder; - -import static org.fest.assertions.Assertions.assertThat; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -public class AsmMethodTest { - - private static AsmClass javaBean; - private AsmClass stringClass = new AsmClass("java/lang/String"); - private AsmClass numberClass = new AsmClass("java/lang/Number"); - - @BeforeClass - public static void init() { - AsmClassProvider asmClassProvider = new AsmClassProviderImpl(ClassLoaderBuilder.create(SquidTestUtils.getFile("/bytecode/bin/"))); - javaBean = asmClassProvider.getClass("properties/JavaBean"); - } - - @Test - public void testAsmMethod() { - AsmMethod method = new AsmMethod(new AsmClass("java/lang/String"), "toString()Ljava/lang/String;"); - assertEquals("toString", method.getName()); - } - - @Test - public void testEquals() { - assertThat(new AsmMethod(stringClass, "firstMethod()V")).isEqualTo(new AsmMethod(stringClass, "firstMethod()V")); - assertThat(new AsmMethod(stringClass, "firstMethod()V")).isNotEqualTo(new AsmMethod(stringClass, "secondMethod()V")); - assertThat(new AsmMethod(stringClass, "firstMethod()V")).isNotEqualTo(new AsmMethod(numberClass, "firstMethod()V")); - } - - @Test - public void testHashCode() { - assertThat(new AsmMethod(stringClass, "firstMethod()V").hashCode()).isEqualTo(new AsmMethod(stringClass, "firstMethod()V").hashCode()); - assertThat(new AsmMethod(stringClass, "firstMethod()V").hashCode()).isNotEqualTo(new AsmMethod(stringClass, "secondMethod()V").hashCode()); - assertThat(new AsmMethod(stringClass, "firstMethod()V").hashCode()).isNotEqualTo(new AsmMethod(numberClass, "firstMethod()V").hashCode()); - } - - @Test - public void testIsAccessor() { - assertTrue(javaBean.getMethod("getName()Ljava/lang/String;").isAccessor()); - assertTrue(javaBean.getMethod("getNameIndirect()Ljava/lang/String;").isAccessor()); - assertTrue(javaBean.getMethod("getNameOrEmpty()Ljava/lang/String;").isAccessor()); - assertTrue(javaBean.getMethod("setName(Ljava/lang/String;)V").isAccessor()); - assertTrue(javaBean.getMethod("setFrench(Z)V").isAccessor()); - assertTrue(javaBean.getMethod("isFrench()Z").isAccessor()); - assertFalse(javaBean.getMethod("anotherMethod()V").isAccessor()); - assertTrue(javaBean.getMethod("addFirstName(Ljava/lang/String;)V").isAccessor()); - assertTrue(javaBean.getMethod("getNameOrDefault()Ljava/lang/String;").isAccessor()); - assertTrue(javaBean.getMethod("accessorWithABunchOfCalls()V").isAccessor()); - assertFalse(javaBean.getMethod("accessNameAndDumpStuffSoNotAccessor()V").isAccessor()); - assertFalse(javaBean.getMethod("iShouldBeAStaticSetter()V").isAccessor()); - assertTrue(javaBean.getMethod("getFirstName()Ljava/lang/String;").isAccessor()); - assertTrue(javaBean.getMethod("getFirstNameAndOneArgument(Ljava/lang/String;)Ljava/lang/String;").isAccessor()); - assertFalse(javaBean.getMethod("recursiveAbs(I)I").isAccessor()); - assertFalse(javaBean.getMethod("recursiveAbsNotAccessor(I)I").isAccessor()); - assertFalse(javaBean.getMethod("recursiveAbsSameIncrementA(I)I").isAccessor()); - assertFalse(javaBean.getMethod("recursiveAbsDifferentIncrementA(I)I").isAccessor()); - } - - @Test - public void testGetAccessedField() { - assertThat(javaBean.getMethod("getName()Ljava/lang/String;").getAccessedField().getName(), is("name")); - assertThat(javaBean.getMethod("getNameIndirect()Ljava/lang/String;").getAccessedField().getName(), is("name")); - assertThat(javaBean.getMethod("getNameOrEmpty()Ljava/lang/String;").getAccessedField().getName(), is("name")); - assertThat(javaBean.getMethod("setName(Ljava/lang/String;)V").getAccessedField().getName(), is("name")); - assertThat(javaBean.getMethod("setFrench(Z)V").getAccessedField().getName(), is("french")); - assertThat(javaBean.getMethod("isFrench()Z").getAccessedField().getName(), is("french")); - assertNull(javaBean.getMethod("anotherMethod()V").getAccessedField()); - assertThat(javaBean.getMethod("addFirstName(Ljava/lang/String;)V").getAccessedField().getName(), is("firstNames")); - assertThat(javaBean.getMethod("getNameOrDefault()Ljava/lang/String;").getAccessedField().getName(), is("name")); - assertThat(javaBean.getMethod("accessorWithABunchOfCalls()V").getAccessedField().getName(), is("firstNames")); - assertNull(javaBean.getMethod("iShouldBeAStaticSetter()V").getAccessedField()); - assertThat(javaBean.getMethod("getFirstName()Ljava/lang/String;").getAccessedField().getName(), is("FirstName")); - assertThat(javaBean.getMethod("getFirstNameAndOneArgument(Ljava/lang/String;)Ljava/lang/String;").getAccessedField().getName(), is("FirstName")); - assertNull(javaBean.getMethod("recursiveAbs(I)I").getAccessedField()); - assertNull(javaBean.getMethod("recursiveAbsNotAccessor(I)I").getAccessedField()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodVisitorTest.java deleted file mode 100644 index 9fc4c16f79a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodVisitorTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.ClassLoaderBuilder; - -import static org.junit.Assert.*; - -public class AsmMethodVisitorTest { - - private AsmClassProvider asmClassProvider = new AsmClassProviderImpl(ClassLoaderBuilder.create(SquidTestUtils.getFile("/bytecode/bin/"))); - - @Test - public void testVisitFieldInsn() { - AsmClass tagNameClass = asmClassProvider.getClass("tags/TagName"); - AsmField nameField = tagNameClass.getField("name"); - AsmMethod constructorWithString = tagNameClass.getMethod("(Ljava/lang/String;)V"); - assertEquals(1, constructorWithString.getCallsToField().size()); - assertTrue(constructorWithString.getCallsToField().contains(nameField)); - } - - @Test - public void testVisitMethodInsn() { - AsmClass sourceFileClass = asmClassProvider.getClass("tags/SourceFile"); - AsmMethod readMethod = sourceFileClass.getMethod("read()V"); - AsmMethod readSourceFileMethod = sourceFileClass.getMethod("readSourceFile()V"); - assertEquals(2, readSourceFileMethod.getCallsToMethod().size()); - assertTrue(readSourceFileMethod.getCallsToMethod().contains(readMethod)); - assertEquals(1, readSourceFileMethod.getCallsToField().size()); - } - - @Test - public void testVisitTryCatchBlock() { - AsmClass sourceFileClass = asmClassProvider.getClass("tags/SourceFile"); - AsmClass tagExceptionClass = asmClassProvider.getClass("tags/TagException"); - AsmMethod readSourceFileMethod = sourceFileClass.getMethod("readSourceFile()V"); - assertTrue(readSourceFileMethod.getDistinctUsedAsmClasses().contains(tagExceptionClass)); - } - - @Test - public void testVisitTypeInsn() { - AsmClass sourceFileClass = asmClassProvider.getClass("tags/SourceFile"); - AsmMethod constructor = sourceFileClass.getMethod("()V"); - assertNotNull(constructor.getDistinctUsedAsmClasses().contains(asmClassProvider.getClass("java/util/ArrayList"))); - } - - @Test - public void testEmptyMethodProperty() { - AsmClass asmClass = asmClassProvider.getClass("properties/EmptyMethodProperty"); - assertFalse(asmClass.getMethod("notEmptyMethod()V").isEmpty()); - assertTrue(asmClass.getMethod("emptyMethod()V").isEmpty()); - assertTrue(asmClass.getMethod("emptyAbstractMethod()V").isEmpty()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureTest.java deleted file mode 100644 index c6019e6d657..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import java.util.Arrays; -import java.util.List; - -import org.junit.Test; -import org.sonar.java.bytecode.asm.AsmSignature; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class AsmSignatureTest { - - @Test - public void testExtractInternalNamesWithoutGenerics() { - String[] internalNames = AsmSignature.extractInternalNames("Ljava/lang/String;", null); - assertEquals("java/lang/String", internalNames[0]); - assertEquals(1, internalNames.length); - } - - @Test - public void testExtractInternalNamesWithGenerics() { - List internalNames = Arrays.asList(AsmSignature.extractInternalNames("(Ljava/util/List;)Ljava/lang/Number;", - "(Ljava/util/List<-Ljava/lang/Integer;>;)Ljava/lang/Number;")); - assertTrue(internalNames.contains("java/lang/Number")); - assertTrue(internalNames.contains("java/lang/Integer")); - assertTrue(internalNames.contains("java/util/List")); - assertEquals(3, internalNames.size()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureVisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureVisitorTest.java deleted file mode 100644 index 57f6786c9d3..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmSignatureVisitorTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Before; -import org.junit.Test; -import org.objectweb.asm.signature.SignatureReader; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class AsmSignatureVisitorTest { - - private AsmSignatureVisitor visitor; - - @Before - public void init() { - visitor = new AsmSignatureVisitor(); - } - - @Test - public void analyzeFieldSignatureWithGenerics() { - String signature = "Ljava/util/List<-Ljava/lang/Integer;>;"; - new SignatureReader(signature).accept(visitor); - assertTrue(visitor.getInternalNames().contains("java/util/List")); - assertTrue(visitor.getInternalNames().contains("java/lang/Integer")); - assertEquals(2, visitor.getInternalNames().size()); - } - - @Test - public void analyseFieldSignatureWithoutGenerics() { - String signature = "Ljava/util/List;"; - new SignatureReader(signature).accept(visitor); - assertTrue(visitor.getInternalNames().contains("java/util/List")); - } - - @Test - public void analyseFieldSignatureWithoutObjects() { - String signature = "I"; - new SignatureReader(signature).accept(visitor); - assertEquals(0, visitor.getInternalNames().size()); - } - - @Test - public void analyzeMethodSignatureWithGenerics() { - String signature = "(Ljava/util/List<-Ljava/lang/Integer;>;)Ljava/lang/Number;"; - new SignatureReader(signature).accept(visitor); - assertTrue(visitor.getInternalNames().contains("java/util/List")); - assertTrue(visitor.getInternalNames().contains("java/lang/Integer")); - assertTrue(visitor.getInternalNames().contains("java/lang/Number")); - assertEquals(3, visitor.getInternalNames().size()); - } - - @Test - public void analyseMethodSignatureWithoutGenerics() { - String signature = "([I)Ljava/lang/String;"; - new SignatureReader(signature).accept(visitor); - assertTrue(visitor.getInternalNames().contains("java/lang/String")); - assertEquals(1, visitor.getInternalNames().size()); - } - - @Test - public void analyseMethodSignatureWithoutObjects() { - String signature = "([B)I"; - new SignatureReader(signature).accept(visitor); - assertEquals(0, visitor.getInternalNames().size()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmTypeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmTypeTest.java deleted file mode 100644 index f722455bb67..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmTypeTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.asm; - -import org.junit.Test; -import org.objectweb.asm.Type; -import org.sonar.java.bytecode.asm.AsmType; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class AsmTypeTest { - - @Test - public void testIsArray() { - assertTrue(AsmType.isArray(Type.getType("[Ljava/lang/String;"))); - assertTrue(AsmType.isArray(Type.getType("[I"))); - assertFalse(AsmType.isArray(Type.getType("I"))); - } - - @Test - public void testIsObject() { - assertTrue(AsmType.isObject(Type.getType("Ljava/lang/Number;"))); - assertFalse(AsmType.isObject(Type.getType("B"))); - } - - @Test - public void testIsArrayOfObject() { - assertTrue(AsmType.isArrayOfObject(Type.getType("[Ljava/lang/Number;"))); - assertTrue(AsmType.isArrayOfObject(Type.getType("[[Ljava/lang/Number;"))); - } - - @Test - public void testIsVoid() { - assertTrue(AsmType.isVoid(Type.getType("V"))); - assertFalse(AsmType.isVoid(Type.getType("B"))); - } - - @Test - public void testGetInternalName() { - assertEquals("java/lang/String", AsmType.getObjectInternalName(Type.getType("[[[Ljava/lang/String;"))); - assertEquals("java/lang/String", AsmType.getObjectInternalName(Type.getType("Ljava/lang/String;"))); - } - - @Test - public void testContainsObject() { - assertTrue(AsmType.containsObject(Type.getType("[[[Ljava/lang/String;"))); - assertTrue(AsmType.containsObject(Type.getType("Ljava/lang/String;"))); - assertFalse(AsmType.containsObject(Type.getType("B"))); - assertFalse(AsmType.containsObject(Type.getType("[B"))); - } - - @Test(expected = IllegalStateException.class) - public void testGetInternalNameOnPrimitiveDescriptor() { - AsmType.getObjectInternalName(Type.getType("[[[I")); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java deleted file mode 100644 index effae1c50aa..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class ArchitectureCheckTest { - - private Squid squid; - - @Test - public void testDependencyCheckOneErrorMessage() { - check("", "java.**.Pattern"); - - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckOneErrorMessage.java")); - checkMessages.assertNext().atLine(6).withMessage("ArchitectureCheckOneErrorMessage must not use java/util/regex/Pattern"); - checkMessages.assertNoMore(); - } - - @Test - public void testDependencyCheckDateForbidden() { - check("", "**.Date"); - - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckDateForbidden.java")); - checkMessages.assertNext().atLine(7); - checkMessages.assertNext().atLine(9); - checkMessages.assertNoMore(); - } - - @Test - public void testDependencyCheckToSqlFromUI() { - check("*UI", "java.sql.*"); - - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckToSqlFromUI.java")); - checkMessages.assertNext().atLine(4); - checkMessages.assertNoMore(); - } - - @Test - public void testDependencyCheckOKFromClassesToClasses() { - check("*SA", "java.sql.*"); - - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ArchitectureCheckToSqlFromUI.java")); - checkMessages.assertNoMore(); - } - - private void check(String fromClasses, String toClasses) { - ArchitectureCheck check = new ArchitectureCheck(); - check.setFromClasses(fromClasses); - check.setToClasses(toClasses); - - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/architecture/src")); - squid.registerVisitor(check); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/architecture/bin")); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheckTest.java deleted file mode 100644 index e96efda705d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheckTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class CallToDeprecatedMethodCheckTest { - - private static Squid squid; - - @BeforeClass - public static void setup() { - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/callToDeprecatedMethod/src")); - squid.registerVisitor(CallToDeprecatedMethodCheck.class); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/callToDeprecatedMethod/bin")); - } - - @Test - public void testCallToDeprecatedMethod() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("CallToDeprecatedMethod.java")); - checkMessages.assertNext().atLine(6); - checkMessages.assertNoMore(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/SerializableContractTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/SerializableContractTest.java deleted file mode 100644 index 586dc5dc4df..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/SerializableContractTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.junit.Test; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmMethod; - -import static org.junit.Assert.*; - - -public class SerializableContractTest { - - @Test - public void testMethodMatch() { - AsmMethod getter = new AsmMethod(new AsmClass("/com/sonar/Test"), "getParameter", "()I"); - assertFalse(SerializableContract.methodMatch(getter)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheckTest.java deleted file mode 100644 index e6518ff8cee..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheckTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class UnusedPrivateMethodCheckTest { - - private static Squid squid; - - @BeforeClass - public static void setup() { - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/unusedPrivateMethod/src")); - squid.registerVisitor(UnusedPrivateMethodCheck.class); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/unusedPrivateMethod/bin")); - } - - @Test - public void testDetectUnusedPrivateMethod() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedPrivateMethod.java")); - checkMessages.assertNext().atLine(33).withMessage("Private method 'unusedPrivateMethod(...)' is never used."); - checkMessages.assertNoMore(); - } - - @Test - public void testDetectUnusedGenericPrivateMethod() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedGenericPrivateMethod.java")); - checkMessages.assertNext().atLine(7); - checkMessages.assertNoMore(); - } - - @Test - public void testDetectUnusedPrivateConstructor() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedPrivateConstructor.java")); - checkMessages.assertNext().atLine(10).withMessage("Private method '(...)' is never used."); - checkMessages.assertNoMore(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheckTest.java deleted file mode 100644 index ee093f78f2b..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheckTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.check; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class UnusedProtectedMethodCheckTest { - - private static Squid squid; - - @BeforeClass - public static void setup() { - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/unusedProtectedMethod/src")); - squid.registerVisitor(UnusedProtectedMethodCheck.class); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/unusedProtectedMethod/bin")); - } - - @Test - public void testDetectUnusedProtectedMethod() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedProtectedMethod.java")); - checkMessages.assertNext().atLine(17).withMessage("Protected method 'unusedProtectedMethod(...)' is never used."); - checkMessages.assertNoMore(); - } - - @Test - public void testIgnoreUnusedProtectedMethodFromAbstractClass() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedProtectedMethodFromAbstractClass.java")); - checkMessages.assertNoMore(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/FileSystemLoaderTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/FileSystemLoaderTest.java deleted file mode 100644 index 0af8f175232..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/FileSystemLoaderTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; - -import java.io.File; -import java.net.URL; - -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.endsWith; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -public class FileSystemLoaderTest { - - @Test(expected = IllegalArgumentException.class) - public void shouldThrowIllegalArgumentException() throws Exception { - new FileSystemLoader(null); - } - - @Test - public void testFindResource() throws Exception { - File dir = SquidTestUtils.getFile("/bytecode/bin/"); - FileSystemLoader loader = new FileSystemLoader(dir); - - assertThat(loader.findResource("notfound"), nullValue()); - - URL url = loader.findResource("tags/TagName.class"); - assertThat(url, notNullValue()); - assertThat(url.toString(), startsWith("file:")); - assertThat(url.toString(), endsWith("TagName.class")); - - loader.close(); - - try { - loader.findResource("tags/TagName.class"); - fail(); - } catch (IllegalStateException e) { - // ok - } - } - - @Test - public void testLoadBytes() throws Exception { - File dir = SquidTestUtils.getFile("/bytecode/bin/"); - FileSystemLoader loader = new FileSystemLoader(dir); - - assertThat(loader.loadBytes("notfound"), nullValue()); - - assertThat(loader.loadBytes("tags/TagName.class"), notNullValue()); - - loader.close(); - - try { - loader.loadBytes("tags/TagName.class"); - fail(); - } catch (IllegalStateException e) { - // ok - } - } - - @Test - public void closeCanBeCalledMultipleTimes() throws Exception { - File dir = SquidTestUtils.getFile("/bytecode/bin/"); - FileSystemLoader loader = new FileSystemLoader(dir); - loader.close(); - loader.close(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/JarLoaderTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/JarLoaderTest.java deleted file mode 100644 index 3b21c63cd35..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/JarLoaderTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.net.URL; - -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; - -public class JarLoaderTest { - - @Test(expected = IllegalArgumentException.class) - public void shouldThrowIllegalArgumentException() throws Exception { - new JarLoader(null); - } - - @Test - public void testFindResource() throws Exception { - File jar = SquidTestUtils.getFile("/bytecode/lib/hello.jar"); - JarLoader loader = new JarLoader(jar); - - assertThat(loader.findResource("notfound"), nullValue()); - - URL url = loader.findResource("META-INF/MANIFEST.MF"); - assertThat(url, notNullValue()); - assertThat(url.toString(), startsWith("jar:")); - assertThat(url.toString(), endsWith("hello.jar!/META-INF/MANIFEST.MF")); - - InputStream is = url.openStream(); - try { - assertThat(IOUtils.readLines(is), hasItem("Manifest-Version: 1.0")); - } finally { - IOUtils.closeQuietly(is); - } - - loader.close(); - - try { - loader.findResource("META-INF/MANIFEST.MF"); - fail(); - } catch (IllegalStateException e) { - // ok - } - } - - @Test - public void testLoadBytes() throws Exception { - File jar = SquidTestUtils.getFile("/bytecode/lib/hello.jar"); - JarLoader loader = new JarLoader(jar); - - assertThat(loader.loadBytes("notfound"), nullValue()); - - byte[] bytes = loader.loadBytes("META-INF/MANIFEST.MF"); - assertThat(bytes, notNullValue()); - ByteArrayInputStream is = new ByteArrayInputStream(bytes); - assertThat(IOUtils.readLines(is), hasItem("Manifest-Version: 1.0")); - - loader.close(); - - try { - loader.loadBytes("META-INF/MANIFEST.MF"); - fail(); - } catch (IllegalStateException e) { - // ok - } - } - - @Test - public void closeCanBeCalledMultipleTimes() throws Exception { - File jar = SquidTestUtils.getFile("/bytecode/lib/hello.jar"); - JarLoader loader = new JarLoader(jar); - loader.close(); - loader.close(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/SquidClassLoaderTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/SquidClassLoaderTest.java deleted file mode 100644 index fb276707137..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/loader/SquidClassLoaderTest.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.loader; - -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import java.io.File; -import java.net.URL; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.junit.Test; -import org.sonar.java.ast.SquidTestUtils; - -import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; - -public class SquidClassLoaderTest { - - /** - * See SONAR-2824: - * Created ClassLoader should be able to load classes only from JDK and from provided list of JAR-files, - * thus it shouldn't be able to load his class. - */ - @Test - public void shouldBeIsolated() throws Exception { - SquidClassLoader classLoader = new SquidClassLoader(Collections.EMPTY_LIST); - try { - classLoader.loadClass(SquidClassLoader.class.getName()); - fail(); - } catch (ClassNotFoundException e) { - // ok - } - assertThat(classLoader.loadClass("java.lang.Integer"), notNullValue()); - assertThat(classLoader.getResource("java/lang/Integer.class"), notNullValue()); - } - - @Test - public void createFromJar() throws Exception { - File jar = SquidTestUtils.getFile("/bytecode/lib/hello.jar"); - SquidClassLoader classLoader = new SquidClassLoader(Arrays.asList(jar)); - - assertThat(classLoader.loadClass("org.sonar.tests.Hello"), notNullValue()); - assertThat(classLoader.getResource("org/sonar/tests/Hello.class"), notNullValue()); - List resources = Lists.newArrayList(Iterators.forEnumeration(classLoader.findResources("org/sonar/tests/Hello.class"))); - assertThat(resources.size(), is(1)); - try { - classLoader.loadClass("foo.Unknown"); - fail(); - } catch (ClassNotFoundException e) { - // ok - } - - classLoader.close(); - } - - @Test - public void unknownJarIsIgnored() throws Exception { - File jar = SquidTestUtils.getFile("/bytecode/lib/unknown.jar"); - SquidClassLoader classLoader = new SquidClassLoader(Arrays.asList(jar)); - - assertThat(classLoader.getResource("org/sonar/tests/Hello.class"), nullValue()); - - classLoader.close(); - } - - @Test - public void createFromDirectory() throws Exception { - File dir = SquidTestUtils.getFile("/bytecode/bin/"); - SquidClassLoader classLoader = new SquidClassLoader(Arrays.asList(dir)); - - assertThat(classLoader.loadClass("tags.TagName"), notNullValue()); - assertThat(classLoader.getResource("tags/TagName.class"), notNullValue()); - List resources = Lists.newArrayList(Iterators.forEnumeration(classLoader.findResources("tags/TagName.class"))); - assertThat(resources.size(), is(1)); - try { - classLoader.loadClass("tags.Unknown"); - fail(); - } catch (ClassNotFoundException e) { - // ok - } - - classLoader.close(); - } - - @Test - public void testFindResources() throws Exception { - File dir = SquidTestUtils.getFile("/bytecode/bin/"); - SquidClassLoader classLoader = new SquidClassLoader(Arrays.asList(dir, dir)); - - List resources = Lists.newArrayList(Iterators.forEnumeration(classLoader.findResources("tags/TagName.class"))); - assertThat(resources.size(), is(2)); - - classLoader.close(); - } - - @Test - public void closeCanBeCalledMultipleTimes() throws Exception { - File jar = SquidTestUtils.getFile("/bytecode/lib/hello.jar"); - SquidClassLoader classLoader = new SquidClassLoader(Arrays.asList(jar)); - classLoader.close(); - classLoader.close(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/visitor/LCOM4VisitorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/visitor/LCOM4VisitorTest.java deleted file mode 100644 index 8cb8eb52dfc..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/visitor/LCOM4VisitorTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.bytecode.visitor; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.Squid; -import org.sonar.squid.measures.Metric; - -public class LCOM4VisitorTest { - - private static Squid squid; - - @BeforeClass - public static void setup() { - JavaSquidConfiguration conf = new JavaSquidConfiguration(); - conf.addFieldToExcludeFromLcom4Calculation("LOG"); - squid = new Squid(conf); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/lcom4/src")); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/lcom4/bin")); - squid.decorateSourceCodeTreeWith(Metric.values()); - } - - @Test - public void testExclusionOfFieldNamesFromLcom4Calculation() { - assertThat(squid.search("ExclusionOfFieldNamesFromLcom4Calculation").getInt(Metric.LCOM4), is(2)); - } - - @Test - public void testLCOM4Visitor() { - assertThat(squid.search("LCOM4Exclusions").getInt(Metric.LCOM4), is(2)); - } - - @Test - public void testLCOM4AccessorMethodAndField() { - assertThat(squid.search("LCOM4AccessorMethodAndField").getInt(Metric.LCOM4), is(1)); - } - - @Test - public void testLCOM4WithWorkers() { - assertThat(squid.search("LCOM4WithWorkers").getInt(Metric.LCOM4), is(1)); - } - - @Test - public void testLCOM4WithIsolatedMethods() { - assertThat(squid.search("LCOM4WithIsolatedMethods").getInt(Metric.LCOM4), is(1)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/recognizer/JavaFootprintTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/recognizer/JavaFootprintTest.java deleted file mode 100644 index ba3d8dfbc0f..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/recognizer/JavaFootprintTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.recognizer; - -import java.util.ArrayList; - -import org.junit.Test; -import org.sonar.java.recognizer.JavaFootprint; -import org.sonar.squid.recognizer.CodeRecognizer; - -import static org.junit.Assert.assertEquals; - -public class JavaFootprintTest { - - @Test - public void codeLineProbability() { - CodeRecognizer detector = new CodeRecognizer(0.9, new JavaFootprint()); - assertEquals(0.999, detector.recognition("for( int i = 0; i<4; i++) {"), 0.001); - assertEquals(0.95, detector.recognition("}"), 0.01); - assertEquals(0.965, detector.recognition("int i;"), 0.01); - assertEquals(0.95, detector.recognition("for (String line: lines) "), 0.01); - assertEquals(0.965, detector.recognition("if (true) "), 0.01); - assertEquals(0.95, detector.recognition("catch (Exception exception) "), 0.01); - assertEquals(0.99, detector.recognition("try { "), 0.01); - assertEquals(0.7, detector.recognition("toto && tata"), 0.01); - assertEquals(0.91, detector.recognition("toto && tata || dupond "), 0.01); - assertEquals(0.95, detector.recognition(" word word word word word word } "), 0.01); - assertEquals(0, detector.recognition("Google is a great compagny"), 0.001); - } - - @Test - public void extractCodeLines() { - CodeRecognizer detector = new CodeRecognizer(0.9, new JavaFootprint()); - ArrayList comments = new ArrayList(); - comments.add("for() {"); - comments.add("int i;"); - comments.add("toto tata"); - assertEquals(2, detector.extractCodeLines(comments).size()); - detector = new CodeRecognizer(0.99, new JavaFootprint()); - assertEquals(1, detector.extractCodeLines(comments).size()); - } - - @Test - public void falsePositifRecognition() { - CodeRecognizer detector = new CodeRecognizer(0.9, new JavaFootprint()); - ArrayList comments = new ArrayList(); - comments.add("Use case: something ..."); //SONAR-1235 - assertEquals(0, detector.extractCodeLines(comments).size()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignaturePrinterTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignaturePrinterTest.java deleted file mode 100644 index 86359c18f38..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignaturePrinterTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -public class MethodSignaturePrinterTest { - - @Test - public void testPrint() { - List argumentTypes = new ArrayList(); - MethodSignature method = new MethodSignature("read", new Parameter(JvmJavaType.V, false), argumentTypes); - assertThat(MethodSignaturePrinter.print(method), is("read()V")); - - argumentTypes.add(new Parameter(JvmJavaType.L, "java/lang/String", true)); - method = new MethodSignature("read", new Parameter("org/sonar/squid/Squid", false), argumentTypes); - assertThat(MethodSignaturePrinter.print(method), is("read([LString;)LSquid;")); - - argumentTypes.add(new Parameter(JvmJavaType.B, false)); - method = new MethodSignature("write", new Parameter(JvmJavaType.I, true), argumentTypes); - assertThat(MethodSignaturePrinter.print(method), is("write([LString;B)[I")); - - argumentTypes.add(new Parameter(JvmJavaType.I, false)); - method = new MethodSignature("write", new Parameter(JvmJavaType.I, true), argumentTypes); - assertThat(MethodSignaturePrinter.print(method), is("write([LString;BI)[I")); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignatureScannerTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignatureScannerTest.java deleted file mode 100644 index 9fbdb768c11..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/MethodSignatureScannerTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import org.junit.Test; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -public class MethodSignatureScannerTest { - - @Test - public void scan() { - MethodSignature method = MethodSignatureScanner.scan("read(Ljava/lang/String;[S)V"); - assertThat(method.getMethodName(), is("read")); - - assertThat(method.getReturnType().getJvmJavaType(), is(JvmJavaType.V)); - assertThat(method.getArgumentTypes().size(), is(2)); - - Parameter param1 = method.getArgumentTypes().get(0); - assertThat(param1.isOject(), is(true)); - assertThat(param1.getClassName(), is("String")); - - Parameter param2 = method.getArgumentTypes().get(1); - assertThat(param2.isOject(), is(false)); - assertThat(param2.isArray(), is(true)); - assertThat(param2.getJvmJavaType(), is(JvmJavaType.S)); - } - - @Test - public void scanMethodWithReturnType() { - MethodSignature method = MethodSignatureScanner.scan("read(Ljava/lang/String;S)[Ljava/util/Vector;"); - - assertThat(method.getReturnType().isOject(), is(true)); - assertThat(method.getReturnType().isArray(), is(true)); - assertThat(method.getReturnType().getClassName(), is("Vector")); - } - - @Test - public void scanGenericMethod(){ - MethodSignature method = MethodSignatureScanner.scan("transactionValidation(Ljava/lang/String;Ljava/util/List;)V"); - - Parameter param1 = method.getArgumentTypes().get(0); - assertThat(param1.isOject(), is(true)); - assertThat(param1.getClassName(), is("String")); - - Parameter param2 = method.getArgumentTypes().get(1); - assertThat(param2.isOject(), is(true)); - assertThat(param2.getClassName(), is("List")); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignaturePrinterTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignaturePrinterTest.java deleted file mode 100644 index e96f45b4701..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignaturePrinterTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import org.junit.Test; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -public class ParameterSignaturePrinterTest { - - @Test - public void testPrintArray() { - assertThat(ParameterSignaturePrinter.print(new Parameter(JvmJavaType.Z, true)), is("[Z")); - } - - @Test - public void testPrintObject() { - assertThat(ParameterSignaturePrinter.print(new Parameter(JvmJavaType.L, "String", false)), is("LString;")); - } - - @Test - public void testPrintPrimitive() { - assertThat(ParameterSignaturePrinter.print(new Parameter(JvmJavaType.I, false)), is("I")); - } - - @Test - public void testPrintArrayOfObject() { - assertThat(ParameterSignaturePrinter.print(new Parameter(JvmJavaType.L, "String", true)), is("[LString;")); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignatureScannerTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignatureScannerTest.java deleted file mode 100644 index ed7bcc3029d..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterSignatureScannerTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import java.util.List; - -import org.junit.Test; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -public class ParameterSignatureScannerTest { - - @Test - public void testScanVoid() { - Parameter param = ParameterSignatureScanner.scan("V"); - assertThat(param.isVoid(), is(true)); - } - - @Test - public void testScanObject() { - Parameter param = ParameterSignatureScanner.scan("Ljava/lang/String;"); - assertThat(param.isOject(), is(true)); - assertThat(param.getClassName(), is("String")); - } - - @Test - public void testScanSimpleGenericObject() { - Parameter param = ParameterSignatureScanner.scan("TU;"); - assertThat(param.isOject(), is(true)); - assertThat(param.getClassName(), is("U")); - } - - @Test - public void testScanComplexGenericObject() { - Parameter param = ParameterSignatureScanner.scan("TU>;"); - assertThat(param.isOject(), is(true)); - assertThat(param.getClassName(), is("U")); - } - - @Test - public void testScanInnerClassObject() { - Parameter param = ParameterSignatureScanner.scan("LMap$Entry;"); - assertThat(param.isOject(), is(true)); - assertThat(param.getClassName(), is("Entry")); - } - - @Test - public void testScanPrimitiveType() { - Parameter param = ParameterSignatureScanner.scan("B"); - assertThat(param.isOject(), is(false)); - assertThat(param.getJvmJavaType(), is(JvmJavaType.B)); - } - - @Test - public void testScanArray() { - Parameter param = ParameterSignatureScanner.scan("[B"); - assertThat(param.isArray(), is(true)); - assertThat(param.getJvmJavaType(), is(JvmJavaType.B)); - - param = ParameterSignatureScanner.scan("B"); - assertThat(param.isArray(), is(false)); - assertThat(param.getJvmJavaType(), is(JvmJavaType.B)); - - param = ParameterSignatureScanner.scan("[LString;"); - assertThat(param.isOject(), is(true)); - assertThat(param.getClassName(), is("String")); - } - - @Test - public void testScanArrayOfArray() { - Parameter param = ParameterSignatureScanner.scan("[[[[B"); - assertThat(param.isArray(), is(true)); - assertThat(param.getJvmJavaType(), is(JvmJavaType.B)); - } - - @Test - public void testScanSeveralPrimitiveArguments() { - List params = ParameterSignatureScanner.scanArguments("BIZ"); - assertThat(params.size(), is(3)); - - Parameter param1 = params.get(0); - assertThat(param1.isOject(), is(false)); - assertThat(param1.getJvmJavaType(), is(JvmJavaType.B)); - } - - - @Test - public void testScanSeveralArgumentsWithGeneric() { - List params = ParameterSignatureScanner.scanArguments("Ljava/lang/String;Ljava/util/List;[Ljava/util/Vector;Ljava/util/ArrayList;"); - assertThat(params.get(0).isOject(), is(true)); - assertThat(params.get(0).getClassName(), is("String")); - - assertThat(params.get(1).isOject(), is(true)); - assertThat(params.get(1).getClassName(), is("List")); - - assertThat(params.get(2).isOject(), is(true)); - assertThat(params.get(2).isArray(), is(true)); - assertThat(params.get(2).getClassName(), is("Vector")); - - assertThat(params.get(3).isOject(), is(true)); - assertThat(params.get(3).isArray(), is(false)); - assertThat(params.get(3).getClassName(), is("ArrayList")); - } - - @Test - public void testScanSeveralComplexArguments() { - List params = ParameterSignatureScanner.scanArguments("B[LString;IZ"); - assertThat(params.size(), is(4)); - - Parameter param1 = params.get(0); - assertThat(param1.isOject(), is(false)); - assertThat(param1.getJvmJavaType(), is(JvmJavaType.B)); - - Parameter param2 = params.get(1); - assertThat(param2.isOject(), is(true)); - assertThat(param2.getClassName(), is("String")); - - Parameter param3 = params.get(2); - assertThat(param3.isOject(), is(false)); - assertThat(param3.getJvmJavaType(), is(JvmJavaType.I)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterTest.java deleted file mode 100644 index ebea191231e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/signature/ParameterTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.signature; - -import org.junit.Test; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -public class ParameterTest { - - @Test(expected = IllegalStateException.class) - public void testArgumentAndReturnTypeJavaTypeBoolean() { - new Parameter(JvmJavaType.L, false); - } - - @Test - public void testExtractClassNameFromCanonicalClassName() { - Parameter returnType = new Parameter("org/sonar/Squid", false); - assertThat(returnType.getClassName(), is("Squid")); - } - - @Test - public void testExtractInnerClassNameFromCanonicalClassName() { - Parameter returnType = new Parameter("org/sonar/Squid$Entry", false); - assertThat(returnType.getClassName(), is("Entry")); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/ClassComplexityCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/ClassComplexityCheckTest.java deleted file mode 100644 index e23af0e41ae..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/ClassComplexityCheckTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class ClassComplexityCheckTest { - - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - ClassComplexityCheck check = new ClassComplexityCheck(); - check.setMax(5); - squid.registerVisitor(check); - JavaAstScanner scanner = squid.register(JavaAstScanner.class); - scanner.scanFile(SquidTestUtils.getInputFile("/metrics/branches/NoBranches.java")); - scanner.scanFile(SquidTestUtils.getInputFile("/metrics/branches/ComplexBranches.java")); - squid.decorateSourceCodeTreeWith(Metric.values()); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void testComplexityExceedsThreshold() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ComplexBranches.java")); - checkMessages.assertNext().atLine(3).withCost(3.0); - checkMessages.assertNoMore(); - } - - @Test - public void testComplexityNotExceedsThreshold() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("NoBranches.java")); - checkMessages.assertNoMore(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/DITCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/DITCheckTest.java deleted file mode 100644 index de22ed92bc4..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/DITCheckTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; - -public class DITCheckTest { - - private static Squid squid; - - @BeforeClass - public static void setup() { - squid = new Squid(new JavaSquidConfiguration()); - DITCheck check = new DITCheck(); - check.setMax(1); - squid.registerVisitor(check); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/unusedProtectedMethod/src")); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/bytecode/unusedProtectedMethod/bin")); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void testDepthOfInheritanceGreaterThanMaximum() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("UnusedProtectedMethod.java")); - checkMessages.assertNext().atLine(7).withCost(1.0); - checkMessages.assertNoMore(); - } - - @Test - public void testDepthOfInheritanceLowerThanMaximum() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("Job.java")); - checkMessages.assertNoMore(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/EmptyFileCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/EmptyFileCheckTest.java deleted file mode 100644 index 1f5e783fa38..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/EmptyFileCheckTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class EmptyFileCheckTest { - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - EmptyFileCheck check = new EmptyFileCheck(); - squid.registerVisitor(check); - JavaAstScanner scanner = squid.register(JavaAstScanner.class); - scanner.scanDirectory(SquidTestUtils.getFile("/metrics/commentedCode")); - squid.decorateSourceCodeTreeWith(Metric.values()); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void shouldDetectEmptyFiles() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("org/foo/CommentedOutFile.java")); - checkMessages.assertNext().atLine(null).withMessage("This Java file is empty"); - checkMessages.assertNoMore(); - } - - @Test - public void shouldNotLogOnCorrectFiles() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("CommentedCode.java")); - checkMessages.assertNoMore(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/MethodComplexityCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/MethodComplexityCheckTest.java deleted file mode 100644 index c1aad9c157a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/MethodComplexityCheckTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ - -package org.sonar.java.squid.check; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class MethodComplexityCheckTest { - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - MethodComplexityCheck check = new MethodComplexityCheck(); - check.setMax(5); - squid.registerVisitor(check); - JavaAstScanner scanner = squid.register(JavaAstScanner.class); - scanner.scanFile(SquidTestUtils.getInputFile("/metrics/branches/ComplexBranches.java")); - squid.decorateSourceCodeTreeWith(Metric.values()); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void testMethodComplexityExceedsThreshold() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("ComplexBranches.java")); - checkMessages.assertNext().atLine(10).withCost(2.0); - checkMessages.assertNoMore(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/NoSonarCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/NoSonarCheckTest.java deleted file mode 100644 index 199626ca1e9..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/squid/check/NoSonarCheckTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.java.squid.check; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.CheckMessages; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.java.squid.SquidScanner; -import org.sonar.squid.Squid; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class NoSonarCheckTest { - - private Squid squid; - - @Before - public void setUp() { - squid = new Squid(new JavaSquidConfiguration()); - NoSonarCheck check = new NoSonarCheck(); - squid.registerVisitor(check); - JavaAstScanner scanner = squid.register(JavaAstScanner.class); - scanner.scanFile(SquidTestUtils.getInputFile("/rules/FileWithNOSONARTags.java")); - scanner.scanFile(SquidTestUtils.getInputFile("/rules/FileWithoutNOSONARTags.java")); - squid.decorateSourceCodeTreeWith(Metric.values()); - squid.register(SquidScanner.class).scan(); - } - - @Test - public void testNoSonarTagDetection() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("FileWithNOSONARTags.java")); - checkMessages.assertNext().atLine(5); - checkMessages.assertNext().atLine(10); - checkMessages.assertNoMore(); - } - - @Test - public void testNoSonarTagDetectionWhenNoTag() { - CheckMessages checkMessages = new CheckMessages((SourceFile) squid.search("FileWithoutNOSONARTags.java")); - checkMessages.assertNoMore(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java deleted file mode 100644 index ecc445843b0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.Mockito; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.utils.SonarException; - -import java.io.File; -import java.nio.charset.Charset; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class JavaSourceImporterTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private JavaSourceImporter importer; - private SensorContext context; - private InputFile inputFile; - - @Before - public void init() { - File fileToImport = new File("test-resources/rules/UndocumentedApi.java"); - inputFile = mock(InputFile.class); - when(inputFile.getRelativePath()).thenReturn("UndocumentedApi.java"); - when(inputFile.getFile()).thenReturn(fileToImport); - when(inputFile.getFileBaseDir()).thenReturn(fileToImport.getParentFile()); - importer = new JavaSourceImporter(true); - context = mock(SensorContext.class); - } - - @Test - public void shouldSetSource() { - JavaFile javaFile = JavaFile.fromRelativePath("UndocumentedApi.java", true); - when(context.isIndexed(javaFile, true)).thenReturn(true); - importer.importSource(context, javaFile, inputFile, Charset.defaultCharset()); - - verify(context).saveSource(eq(javaFile), anyString()); - } - - @Test - public void testImportUnexistingFile() { - File fileToImport = new File("unexisting-file.java"); - inputFile = mock(InputFile.class); - when(inputFile.getRelativePath()).thenReturn("UndocumentedApi.java"); - when(inputFile.getFile()).thenReturn(fileToImport); - when(inputFile.getFileBaseDir()).thenReturn(fileToImport.getParentFile()); - - JavaFile javaFile = JavaFile.fromRelativePath("UndocumentedApi.java", true); - when(context.isIndexed(javaFile, true)).thenReturn(true); - - thrown.expect(SonarException.class); - thrown.expectMessage("Unable to read and import the source file"); - thrown.expectMessage("unexisting-file.java"); - importer.importSource(context, javaFile, inputFile, Charset.defaultCharset()); - } - - /** - * SONAR-3315 - */ - @Test - public void testDuplicateSource() { - JavaFile javaFile = JavaFile.fromRelativePath("UndocumentedApi.java", true); - when(context.isIndexed(javaFile, true)).thenReturn(true); - Mockito.doThrow(new SonarException("Duplicate source for resource")).when(context).saveSource(any(JavaFile.class), anyString()); - - thrown.expect(SonarException.class); - thrown.expectMessage("Duplicate source for resource"); - thrown.expectMessage(", on file:"); - thrown.expectMessage("UndocumentedApi.java"); - importer.importSource(context, javaFile, inputFile, Charset.defaultCharset()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SonarWayProfileTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SonarWayProfileTest.java deleted file mode 100644 index b72b2ffc10e..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SonarWayProfileTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.sonar.api.profiles.AnnotationProfileParser; -import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.rules.Rule; -import org.sonar.api.rules.RuleFinder; -import org.sonar.api.utils.ValidationMessages; - -import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class SonarWayProfileTest { - @Test - public void should_create_sonar_way_profile() { - ValidationMessages validation = ValidationMessages.create(); - - SonarWayProfile definition = new SonarWayProfile(new AnnotationProfileParser(ruleFinder())); - RulesProfile profile = definition.createProfile(validation); - - assertThat(profile.getActiveRulesByRepository(SquidConstants.REPOSITORY_KEY)).hasSize(2); - assertThat(profile.getName()).isEqualTo(RulesProfile.SONAR_WAY_NAME); - assertThat(validation.hasErrors()).isFalse(); - } - - @Test - public void should_create_sonar_way_with_findbugs_profile() { - ValidationMessages validation = ValidationMessages.create(); - - SonarWayWithFindbugsProfile definition = new SonarWayWithFindbugsProfile(new SonarWayProfile(new AnnotationProfileParser(ruleFinder()))); - RulesProfile profile = definition.createProfile(validation); - - assertThat(profile.getActiveRulesByRepository(SquidConstants.REPOSITORY_KEY)).hasSize(2); - assertThat(profile.getName()).isEqualTo(RulesProfile.SONAR_WAY_FINDBUGS_NAME); - assertThat(validation.hasErrors()).isFalse(); - } - - static RuleFinder ruleFinder() { - return when(mock(RuleFinder.class).findByKey(anyString(), anyString())).thenAnswer(new Answer() { - public Rule answer(InvocationOnMock invocation) { - Object[] arguments = invocation.getArguments(); - return Rule.create((String) arguments[0], (String) arguments[1], (String) arguments[1]); - } - }).getMock(); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidExecutorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidExecutorTest.java deleted file mode 100644 index 0430ebf4c53..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidExecutorTest.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.junit.Test; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.checks.AnnotationCheckFactory; -import org.sonar.api.checks.CheckFactory; -import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.squid.measures.Metric; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Collections; - -import static org.hamcrest.core.Is.is; -import static org.hamcrest.number.OrderingComparisons.greaterThan; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.anyDouble; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; - -public class SquidExecutorTest { - - @Test - public void scanSources() throws IOException, URISyntaxException { - SquidExecutor executor = new SquidExecutor(true, "LOG, logger", createCheckFactory(), Charset.defaultCharset()); - executor.scan(SquidTestUtils.getStrutsCoreSources(), Collections. emptyList()); - - assertThat(executor.isSourceScanned(), is(true)); - assertThat(executor.getSquid().getProject().getInt(Metric.LINES), greaterThan(1000)); - } - - @Test - public void doNotScanBytecodeIfNoSources() throws URISyntaxException { - SquidExecutor executor = new SquidExecutor(true, "LOG, logger", createCheckFactory(), Charset.defaultCharset()); - executor.scan(Collections. emptyList(), Arrays.asList(SquidTestUtils.getStrutsCoreJar())); - - assertThat(executor.isSourceScanned(), is(false)); - assertThat(executor.isBytecodeScanned(), is(false)); - } - - @Test - public void scanBytecode() throws IOException, URISyntaxException { - SquidExecutor executor = new SquidExecutor(true, "LOG, logger", createCheckFactory(), Charset.defaultCharset()); - executor.scan(SquidTestUtils.getStrutsCoreSources(), Arrays.asList(SquidTestUtils.getStrutsCoreJar())); - - assertThat(executor.isSourceScanned(), is(true)); - assertThat(executor.getSquid().getProject().getInt(Metric.LINES), greaterThan(1000)); - assertThat(executor.isBytecodeScanned(), is(true)); - } - - @Test - public void doNotSaveMeasuresIfSourceNotScanned() { - SquidExecutor executor = new SquidExecutor(true, "LOG, logger", createCheckFactory(), Charset.defaultCharset()); - SensorContext context = mock(SensorContext.class); - - assertThat(executor.isSourceScanned(), is(false)); - executor.save(new Project("p1"), context, null); - - verifyZeroInteractions(context); - } - - @Test - public void scanThenSaveMeasures() throws IOException, URISyntaxException { - SquidExecutor executor = new SquidExecutor(true, "LOG, logger", createCheckFactory(), Charset.defaultCharset()); - SensorContext context = mock(SensorContext.class); - - executor.scan(SquidTestUtils.getStrutsCoreSources(), Collections. emptyList()); - executor.save(new Project("p1"), context, null); - - assertThat(executor.isSourceScanned(), is(true)); - executor.save(new Project("p1"), context, null); - - verify(context, atLeast(100)).saveMeasure((Resource) anyObject(), (org.sonar.api.measures.Metric) anyObject(), anyDouble()); - } - - @Test - public void shouldNotHaveBytecode() { - assertFalse(SquidExecutor.hasBytecode(Collections. emptyList())); - - assertFalse(SquidExecutor.hasBytecode(Arrays.asList(new File("unknown")))); - } - - @Test - public void shouldHaveBytecode() { - assertTrue(SquidExecutor.hasBytecode(Arrays.asList(new File("test-resources/commons-collections-3.2.1/bin")))); - } - - private CheckFactory createCheckFactory() { - RulesProfile profile = RulesProfile.create(); - CheckFactory checkFactory = AnnotationCheckFactory.create(profile, "repo", Collections. emptyList()); - return checkFactory; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidPluginTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidPluginTest.java deleted file mode 100644 index 7e99769c1f3..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidPluginTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.junit.Test; - -import static org.fest.assertions.Assertions.assertThat; - -public class SquidPluginTest { - @Test - public void coverageForFun() { - assertThat(new SquidPlugin().getExtensions()).hasSize(10); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidSensorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidSensorTest.java deleted file mode 100644 index 3a1cb1bb5c2..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidSensorTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.apache.commons.configuration.BaseConfiguration; -import org.apache.commons.configuration.Configuration; -import org.junit.Test; -import org.sonar.api.CoreProperties; -import org.sonar.api.batch.ProjectClasspath; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.Project; - -import java.io.File; -import java.util.Arrays; -import java.util.Collection; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.sameInstance; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.*; - -public class SquidSensorTest { - @Test - public void testGetBytecodeFiles() { - ProjectClasspath projectClasspath = mock(ProjectClasspath.class); - when(projectClasspath.getElements()).thenReturn(Arrays.asList(new File("classes"))); - SquidSensor sensor = new SquidSensor(null, null, projectClasspath, null, null); - Configuration configuration = new BaseConfiguration(); - Project project = mock(Project.class); - when(project.getConfiguration()).thenReturn(configuration); - - configuration.setProperty(CoreProperties.DESIGN_SKIP_DESIGN_PROPERTY, true); - assertThat(sensor.getBytecodeFiles(project).size(), is(0)); - - configuration.setProperty(CoreProperties.DESIGN_SKIP_DESIGN_PROPERTY, false); - assertThat(sensor.getBytecodeFiles(project).size(), is(1)); - assertThat(sensor.getBytecodeFiles(project), sameInstance((Collection) projectClasspath.getElements())); - } - - @Test - public void onlyForJava() { - SquidSensor sensor = new SquidSensor(null, null, null, null, null); - Project project = mock(Project.class); - when(project.getLanguageKey()).thenReturn(Java.KEY).thenReturn("groovy"); - assertThat(sensor.shouldExecuteOnProject(project), is(true)); - assertThat(sensor.shouldExecuteOnProject(project), is(false)); - verify(project, times(2)).getLanguageKey(); - verifyNoMoreInteractions(project); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidTestUtils.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidTestUtils.java deleted file mode 100644 index 06279dd4d83..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/SquidTestUtils.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid; - -import org.apache.commons.io.FileUtils; -import org.sonar.api.resources.InputFile; -import org.sonar.api.resources.InputFileUtils; -import org.sonar.api.utils.ZipUtils; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.Collection; - -public final class SquidTestUtils { - - private SquidTestUtils() { - } - - /** - * See http://svn.apache.org/repos/asf/struts/struts1/tags/STRUTS_1_3_9/core - */ - public static Collection getStrutsCoreSources() throws IOException, URISyntaxException { - File sourceDir = new File("target/struts-core-1.3.9-sources"); - if (!sourceDir.exists() || (sourceDir.list().length == 0)) { - FileUtils.forceMkdir(sourceDir); - ZipUtils.unzip(new File(SquidTestUtils.class.getResource("/struts-core-1.3.9-sources.jar").toURI()), sourceDir); - } - Collection javaFiles = FileUtils.listFiles(sourceDir, new String[] {"java"}, true); - - return InputFileUtils.create(sourceDir, javaFiles); - } - - /** - * See http://svn.apache.org/repos/asf/struts/struts1/tags/STRUTS_1_3_9/core - */ - public static File getStrutsCoreJar() throws URISyntaxException { - return new File(SquidTestUtils.class.getResource("/struts-core-1.3.9.jar").toURI()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeFactoryTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeFactoryTest.java deleted file mode 100644 index afa4bb82016..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeFactoryTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -import java.util.List; - -public class BridgeFactoryTest { - - @Test - public void createForSourceAnalysis() { - List astBridges = BridgeFactory.create(false, true, null, null, null, null, null); - assertFalse(has(astBridges, DesignBridge.class)); - assertTrue(has(astBridges, CopyBasicMeasuresBridge.class)); - } - - @Test - public void createForSourceAndBytecodeAnalysis() { - List allBridges = BridgeFactory.create(true, false, null, null, null, null, null); - assertTrue(has(allBridges, DesignBridge.class)); - assertTrue(has(allBridges, CopyBasicMeasuresBridge.class)); - assertTrue(has(allBridges, Lcom4BlocksBridge.class)); - } - - @Test - public void createForSourceAndBytecodeWithoutDesignAnalysis() { - List allBridges = BridgeFactory.create(true, true, null, null, null, null, null); - assertFalse(has(allBridges, DesignBridge.class)); - assertTrue(has(allBridges, CopyBasicMeasuresBridge.class)); - assertTrue(has(allBridges, Lcom4BlocksBridge.class)); - } - - private boolean has(List bridges, Class bridgeClass) { - for (Bridge bridge : bridges) { - if (bridge.getClass().equals(bridgeClass)) { - return true; - } - } - return false; - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeTestCase.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeTestCase.java deleted file mode 100644 index 6c8957cb287..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/BridgeTestCase.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import com.google.common.base.Charsets; -import org.junit.Before; -import org.junit.BeforeClass; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.checks.AnnotationCheckFactory; -import org.sonar.api.checks.CheckFactory; -import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.plugins.squid.SquidExecutor; -import org.sonar.plugins.squid.SquidTestUtils; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.Collections; - -import static org.mockito.Matchers.anyObject; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public abstract class BridgeTestCase { - - protected SensorContext context; - private static SquidExecutor executor; - protected static Project project; - - @BeforeClass - public static void scanStruts() throws IOException, URISyntaxException { - RulesProfile profile = RulesProfile.create(); - CheckFactory checkFactory = AnnotationCheckFactory.create(profile, "repo", Collections. emptyList()); - executor = new SquidExecutor(true, "LOG, logger", checkFactory, Charsets.UTF_8); - executor.scan(SquidTestUtils.getStrutsCoreSources(), Arrays.asList(SquidTestUtils.getStrutsCoreJar())); - project = new Project("project"); - } - - @Before - public final void saveData() { - context = mock(SensorContext.class); - when(context.getResource((Resource) anyObject())).thenAnswer(new Answer() { - - public Resource answer(InvocationOnMock invocationOnMock) throws Throwable { - return (Resource) invocationOnMock.getArguments()[0]; - } - }); - executor.save(project, context, null); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChecksBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChecksBridgeTest.java deleted file mode 100644 index 2747cdcda09..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChecksBridgeTest.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import org.junit.Test; - -public class ChecksBridgeTest { - - @Test - public void notRequiresBytecode() { - assertThat(new ChecksBridge().needsBytecode(), is(false)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridgeTest.java deleted file mode 100644 index dd7fb7fc54f..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/ChidamberKemererBridgeTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.anyDouble; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; - -import org.junit.Test; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; - -public class ChidamberKemererBridgeTest extends BridgeTestCase { - - @Test - public void requiresBytecode() { - assertThat(new ChidamberKemererBridge().needsBytecode(), is(true)); - } - - @Test - public void depthInTree() { - verify(context).saveMeasure(new JavaFile("org.apache.struts.config.FormBeanConfig"), CoreMetrics.DEPTH_IN_TREE, 2.0); - verify(context, never()).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.DEPTH_IN_TREE), anyDouble()); - verify(context, never()).saveMeasure(eq(project), eq(CoreMetrics.DEPTH_IN_TREE), anyDouble()); - } - - @Test - public void numberOfChildren() { - verify(context).saveMeasure(eq(new JavaFile("org.apache.struts.config.BaseConfig")), eq(CoreMetrics.NUMBER_OF_CHILDREN), anyDouble()); - verify(context, never()).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.NUMBER_OF_CHILDREN), anyDouble()); - verify(context, never()).saveMeasure(eq(project), eq(CoreMetrics.NUMBER_OF_CHILDREN), anyDouble()); - } - - @Test - public void lcom4() { - verify(context).saveMeasure(eq(new JavaFile("org.apache.struts.config.BaseConfig")), eq(CoreMetrics.LCOM4), anyDouble()); - verify(context, never()).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.LCOM4), anyDouble()); - verify(context, never()).saveMeasure(eq(project), eq(CoreMetrics.LCOM4), anyDouble()); - } - - @Test - public void lcom4ShouldBeGreaterThanZero() { - SourceFile sourceFile = mock(SourceFile.class); - - when(sourceFile.getDouble(Metric.LCOM4)).thenReturn(2.0); - assertThat(ChidamberKemererBridge.getLcom4(sourceFile), is(2.0)); - - when(sourceFile.getDouble(Metric.LCOM4)).thenReturn(1.0); - assertThat(ChidamberKemererBridge.getLcom4(sourceFile), is(1.0)); - - when(sourceFile.getDouble(Metric.LCOM4)).thenReturn(0.0); - assertThat(ChidamberKemererBridge.getLcom4(sourceFile), is(1.0)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridgeTest.java deleted file mode 100644 index 435bd8ebd53..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/CopyBasicMeasuresBridgeTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyDouble; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import org.junit.Test; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Resource; - -public class CopyBasicMeasuresBridgeTest extends BridgeTestCase { - - /** - * SONAR-3093 - */ - @Test - public void shouldNotCopyCommentedOutCodeLines() { - verify(context, never()).saveMeasure(any(Resource.class), eq(CoreMetrics.COMMENTED_OUT_CODE_LINES), anyDouble()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DesignBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DesignBridgeTest.java deleted file mode 100644 index 0142f234bfb..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DesignBridgeTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.junit.Test; -import org.mockito.ArgumentMatcher; -import org.sonar.api.design.Dependency; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; - -import static org.hamcrest.number.OrderingComparisons.greaterThan; -import static org.mockito.Matchers.anyDouble; -import static org.mockito.Matchers.argThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -public class DesignBridgeTest extends BridgeTestCase { - - @Test - public void dependenciesBetweenPackagesOfThisProject() { - verify(context).saveDependency(argThat(new DependencyMatcher("org.apache.struts.config", "org.apache.struts.util"))); - } - - @Test - public void dependenciesBetweenFilesOfThisProject() { - verify(context).saveDependency(argThat(new DependencyMatcher("org.apache.struts.config.ConfigRuleSet", "org.apache.struts.util.RequestUtils"))); - } - - @Test - public void dependenciesBetweenFilesOfTheSamePackage() { - verify(context).saveDependency(argThat(new DependencyMatcher("org.apache.struts.validator.LazyValidatorForm", "org.apache.struts.validator.BeanValidatorForm"))); - } - - @Test - public void packageTangles() { - verify(context).saveMeasure(eq(project), eq(CoreMetrics.PACKAGE_TANGLES), argThat(greaterThan(10.0))); - verify(context).saveMeasure(eq(project), eq(CoreMetrics.PACKAGE_EDGES_WEIGHT), argThat(greaterThan(5.0))); // >5% - verify(context, never()).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.PACKAGE_TANGLES), anyDouble()); - verify(context, never()).saveMeasure(eq(new JavaFile("org.apache.struts.config.ConfigRuleSet")), eq(CoreMetrics.PACKAGE_TANGLES), anyDouble()); - } - - @Test - public void fileTangles() { - verify(context, never()).saveMeasure(eq(project), eq(CoreMetrics.FILE_TANGLES), anyDouble()); - verify(context).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.FILE_TANGLES), argThat(greaterThan(1.0))); - verify(context).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.FILE_EDGES_WEIGHT), argThat(greaterThan(1.0))); - } - - static class DependencyMatcher extends ArgumentMatcher { - private String from; - private String to; - - DependencyMatcher(String from, String to) { - this.from = from; - this.to = to; - } - - @Override - public boolean matches(Object o) { - if (!(o instanceof Dependency)) { - return false; - } - Dependency dep = (Dependency) o; - return from.equals(dep.getFrom().getKey()) && to.equals(dep.getTo().getKey()); - } - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DsmSerializerTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DsmSerializerTest.java deleted file mode 100644 index 0dbf2b9e5c0..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/DsmSerializerTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.sonar.api.design.Dependency; -import org.sonar.api.resources.JavaPackage; -import org.sonar.api.resources.Resource; -import org.sonar.graph.DirectedGraph; -import org.sonar.graph.Dsm; -import org.sonar.graph.DsmManualSorter; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceCodeEdge; -import org.sonar.squid.api.SourceCodeEdgeUsage; -import org.sonar.squid.api.SourcePackage; - -import java.io.IOException; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; - -public class DsmSerializerTest { - - @Test - public void serializeEmptyDsm() { - Dsm dsm = new Dsm(new DirectedGraph()); - assertThat(DsmSerializer.serialize(dsm, new DependencyIndex(), new ResourceIndex()), is("[]")); - } - - @Test - public void serialize() throws IOException { - - // squid - SourcePackage foo = new SourcePackage("org/foo"); - SourcePackage bar = new SourcePackage("org/bar"); - SourceCodeEdge edge = new SourceCodeEdge(foo, bar, SourceCodeEdgeUsage.USES) { - @Override - public int getWeight() { - return 5; - } - }; - - DirectedGraph graph = new DirectedGraph(); - graph.addVertex(foo); - graph.addVertex(bar); - graph.addEdge(edge); - - // sonar - Resource fooSonar = new JavaPackage("org.foo"); - fooSonar.setId(7); - Resource barSonar = new JavaPackage("org.bar"); - barSonar.setId(8); - - Dependency dep = new Dependency(fooSonar, barSonar).setId(30l); - DependencyIndex depIndex = new DependencyIndex(); - depIndex.put(edge, dep); - ResourceIndex resourceIndex = new ResourceIndex(); - resourceIndex.put(foo, fooSonar); - resourceIndex.put(bar, barSonar); - - Dsm dsm = new Dsm(graph); - DsmManualSorter.sort(dsm, bar, foo); // for test reproductibility - String json = IOUtils.toString(getClass().getResourceAsStream("/org/sonar/plugins/squid/bridges/DsmSerializerTest/dsm.json")); - assertThat(DsmSerializer.serialize(dsm, depIndex, resourceIndex), is(json)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest.java deleted file mode 100644 index 09912ae8a6a..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import com.google.common.collect.Lists; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.sonar.java.bytecode.asm.AsmClass; -import org.sonar.java.bytecode.asm.AsmField; -import org.sonar.java.bytecode.asm.AsmMethod; -import org.sonar.java.bytecode.asm.AsmResource; - -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; - -public class Lcom4BlocksBridgeTest { - - @Test - public void serialize() throws IOException { - Set firstBlock = new HashSet(); - AsmClass firstClass = new AsmClass("Foo"); - firstBlock.add(new AsmMethod(firstClass, "getActionMessage()V")); - firstBlock.add(new AsmField(firstClass, "message")); - - Set secondBlock = new HashSet(); - AsmClass secondClass = new AsmClass("Bar"); - secondBlock.add(new AsmMethod(secondClass, "getName()Ljava/lang/String;")); - secondBlock.add(new AsmMethod(secondClass, "setNull(Z)V")); - secondBlock.add(new AsmField(secondClass, "configured")); - - assertEquals(loadFile("/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest/serialize.json"), new Lcom4BlocksBridge().serialize(Lists.newArrayList(firstBlock, secondBlock))); - } - - @Test - public void sortBlocks() { - Set bigBlock = new HashSet(); - AsmClass firstClass = new AsmClass("Foo"); - bigBlock.add(new AsmMethod(firstClass, "getActionMessage()V")); - bigBlock.add(new AsmField(firstClass, "message")); - - Set littleBlock = new HashSet(); - AsmClass secondClass = new AsmClass("Bar"); - littleBlock.add(new AsmMethod(secondClass, "getName()Ljava/lang/String;")); - - List> blocks = Lists.newArrayList(bigBlock, littleBlock); - new Lcom4BlocksBridge().sortBlocks(blocks); - - assertThat(blocks.get(0), is(littleBlock)); - assertThat(blocks.get(1), is(bigBlock)); - } - - @Test - public void sortResourcesInBlock() { - Set block = new HashSet(); - AsmClass aClass = new AsmClass("Foo"); - block.add(new AsmMethod(aClass, "getName()Ljava/lang/String;")); - block.add(new AsmField(aClass, "message")); - block.add(new AsmMethod(aClass, "getActionMessage()V")); - block.add(new AsmField(aClass, "context")); - - List resources = new Lcom4BlocksBridge().sortResourcesInBlock(block); - - // fields then methods (alphabetical sort) - assertThat(resources.get(0).toString(), is("context")); - assertThat(resources.get(1).toString(), is("message")); - assertThat(resources.get(2).toString(), is("getActionMessage()V")); - assertThat(resources.get(3).toString(), is("getName()Ljava/lang/String;")); - } - - private static String loadFile(String path) throws IOException { - return IOUtils.toString(Lcom4BlocksBridgeTest.class.getResourceAsStream(path)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridgeTest.java deleted file mode 100644 index 771976a7a34..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/PublicUndocumentedApiBridgeTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.junit.Test; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.JavaFile; - -import static org.mockito.Mockito.verify; - -public class PublicUndocumentedApiBridgeTest extends BridgeTestCase { - - @Test - public void publicUndocumentedApi() { - verify(context).saveMeasure(new JavaFile("org.apache.struts.config.BaseConfig"), CoreMetrics.PUBLIC_UNDOCUMENTED_API, 0.0); - verify(context).saveMeasure(new JavaFile("org.apache.struts.config.ConfigHelper"), CoreMetrics.PUBLIC_UNDOCUMENTED_API, 4.0); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/RobertCMartinBridgeTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/RobertCMartinBridgeTest.java deleted file mode 100644 index 58700bfe980..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/bridges/RobertCMartinBridgeTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.bridges; - -import org.junit.Test; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; - -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.mockito.Matchers.*; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -public class RobertCMartinBridgeTest extends BridgeTestCase { - - @Test - public void couplingsOnPackagesAndFiles() { - verify(context).saveMeasure(eq(new JavaFile("org.apache.struts.config.BaseConfig")), eq(CoreMetrics.AFFERENT_COUPLINGS), doubleThat(greaterThanOrEqualTo(0.0))); - verify(context).saveMeasure(eq(new JavaFile("org.apache.struts.config.BaseConfig")), eq(CoreMetrics.EFFERENT_COUPLINGS), doubleThat(greaterThanOrEqualTo(0.0))); - - verify(context).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.AFFERENT_COUPLINGS), doubleThat(greaterThanOrEqualTo(1.0))); - verify(context).saveMeasure(eq(new JavaPackage("org.apache.struts.config")), eq(CoreMetrics.EFFERENT_COUPLINGS), doubleThat(greaterThanOrEqualTo(1.0))); - } - - @Test - public void noCouplingsOnProject() { - verify(context, never()).saveMeasure(eq(project), eq(CoreMetrics.AFFERENT_COUPLINGS), anyDouble()); - verify(context, never()).saveMeasure(eq(project), eq(CoreMetrics.EFFERENT_COUPLINGS), anyDouble()); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecoratorTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecoratorTest.java deleted file mode 100644 index f0adaa85f9c..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FileComplexityDistributionDecoratorTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.measures.PersistenceMode; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; -import org.sonar.api.resources.Project; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.*; - -public class FileComplexityDistributionDecoratorTest { - - private FileComplexityDistributionDecorator decorator; - - @Before - public void setUp() { - decorator = new FileComplexityDistributionDecorator(); - } - - @Test - public void shouldExecuteOnJavaProjectsOnly() throws Exception { - assertThat(decorator.shouldExecuteOnProject(new Project("java").setLanguageKey(Java.KEY)), is(true)); - assertThat(decorator.shouldExecuteOnProject(new Project("php").setLanguageKey("php")), is(false)); - } - - @Test - public void shouldExecuteOnFilesOnly() throws Exception { - DecoratorContext context = mock(DecoratorContext.class); - when(context.getMeasure(CoreMetrics.COMPLEXITY)).thenReturn(new Measure(CoreMetrics.COMPLEXITY, 20.0)); - - decorator.decorate(new JavaPackage("org.foo"), context); - verify(context, never()).saveMeasure(any(Measure.class)); - } - - @Test - public void shouldDependOnComplexity() { - DecoratorContext context = mock(DecoratorContext.class); - assertThat(decorator.dependOnComplexity(), is(CoreMetrics.COMPLEXITY)); - assertThat(decorator.generatesComplexityDistribution(), is(CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION)); - - decorator.decorate(new JavaFile("org.foo.Bar"), context); - verify(context, never()).saveMeasure(any(Measure.class)); - } - - @Test - public void shouldCalculateDistributionOnFile() throws Exception { - DecoratorContext context = mock(DecoratorContext.class); - when(context.getMeasure(CoreMetrics.COMPLEXITY)).thenReturn(new Measure(CoreMetrics.COMPLEXITY, 20.0)); - - decorator.decorate(JavaFile.fromRelativePath("org/foo/MyFile.java", false), context); - ArgumentCaptor measureCaptor = ArgumentCaptor.forClass(Measure.class); - verify(context).saveMeasure(measureCaptor.capture()); - Measure measure = measureCaptor.getValue(); - assertThat(measure.getMetric(), is(CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION)); - assertThat(measure.getData(), is("0=0;5=0;10=0;20=1;30=0;60=0;90=0")); - assertThat(measure.getPersistenceMode(), is(PersistenceMode.MEMORY)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilderTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilderTest.java deleted file mode 100644 index 477acd926ec..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/decorators/FunctionComplexityDistributionBuilderTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.squid.decorators; - -import org.junit.Test; -import org.sonar.api.batch.DecoratorContext; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Measure; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; -import org.sonar.api.resources.Project; -import org.sonar.java.api.JavaClass; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class FunctionComplexityDistributionBuilderTest { - @Test - public void shouldExecuteOnJavaProjectsOnly() throws Exception { - FunctionComplexityDistributionBuilder builder = new FunctionComplexityDistributionBuilder(); - assertThat(builder.shouldExecuteOnProject(new Project("java").setLanguageKey(Java.KEY)), is(true)); - assertThat(builder.shouldExecuteOnProject(new Project("php").setLanguageKey("php")), is(false)); - } - - @Test - public void shouldExecuteOnClassesOnly() throws Exception { - FunctionComplexityDistributionBuilder builder = new FunctionComplexityDistributionBuilder(); - DecoratorContext context = mock(DecoratorContext.class); - when(context.getMeasure(CoreMetrics.COMPLEXITY)).thenReturn(new Measure(CoreMetrics.COMPLEXITY, 20.0)); - - assertThat(builder.shouldExecuteOn(new JavaPackage("org.foo"), context), is(false)); - assertThat(builder.shouldExecuteOn(new JavaFile("org.foo.Bar"), context), is(false)); - assertThat(builder.shouldExecuteOn(JavaClass.create("org.foo.Bar"), context), is(true)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidTest.java deleted file mode 100644 index 8286a96f7e7..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.squid; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.squid.JavaSquidConfiguration; - -public class SquidTest { - - private Squid squid; - - @Before - public void setup() { - squid = new Squid(new JavaSquidConfiguration(true)); - } - - @Test - public void searchSingleResult() { - squid.register(JavaAstScanner.class).scanFile(SquidTestUtils.getInputFile("/metrics/packages/", "org/foo/SimpleBean.java")); - assertNotNull(squid.search("org/foo")); - assertNotNull(squid.search("org/foo/SimpleBean.java")); - assertNotNull(squid.search("org/foo/SimpleBean")); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidUserGuideTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidUserGuideTest.java deleted file mode 100644 index 33c09640c25..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/squid/SquidUserGuideTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.squid; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.number.OrderingComparisons.lessThan; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.util.Collection; -import java.util.Map; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.sonar.graph.IncrementalCyclesAndFESSolver; -import org.sonar.java.ast.JavaAstScanner; -import org.sonar.java.ast.SquidTestUtils; -import org.sonar.java.bytecode.BytecodeScanner; -import org.sonar.java.squid.JavaSquidConfiguration; -import org.sonar.squid.api.SourceCode; -import org.sonar.squid.api.SourceCodeEdgeUsage; -import org.sonar.squid.api.SourceFile; -import org.sonar.squid.api.SourceMethod; -import org.sonar.squid.api.SourcePackage; -import org.sonar.squid.api.SourceProject; -import org.sonar.squid.indexer.QueryByMeasure; -import org.sonar.squid.indexer.QueryByType; -import org.sonar.squid.indexer.QueryByMeasure.Operator; -import org.sonar.squid.math.MeasuresDistribution; -import org.sonar.squid.measures.Metric; - -public class SquidUserGuideTest { - - private static Squid squid; - private static SourceProject project; - - @BeforeClass - public static void setup() { - squid = new Squid(new JavaSquidConfiguration()); - squid.register(JavaAstScanner.class).scanDirectory(SquidTestUtils.getFile("/commons-collections-3.2.1/src")); - squid.register(BytecodeScanner.class).scanDirectory(SquidTestUtils.getFile("/commons-collections-3.2.1/bin")); - project = squid.aggregate(); - } - - @Test - public void getMeasuresOnProject() { - assertEquals(12, project.getInt(Metric.PACKAGES)); - assertEquals(273, project.getInt(Metric.FILES)); - assertEquals(37, project.getInt(Metric.ANONYMOUS_INNER_CLASSES)); - assertEquals(412, project.getInt(Metric.CLASSES)); - assertEquals(27, project.getInt(Metric.INTERFACES)); - assertEquals(33, project.getInt(Metric.ABSTRACT_CLASSES)); - assertEquals(3805, project.getInt(Metric.METHODS)); - assertEquals(3805, squid.search(new QueryByType(SourceMethod.class), new QueryByMeasure(Metric.ACCESSORS, Operator.EQUALS, 0)).size()); - assertEquals(69, project.getInt(Metric.ACCESSORS)); - assertEquals(63852, project.getInt(Metric.LINES)); - assertEquals(26323, project.getInt(Metric.LINES_OF_CODE)); - assertEquals(6426, project.getInt(Metric.BLANK_LINES)); - assertEquals(12268, project.getInt(Metric.STATEMENTS)); - assertEquals(8475, project.getInt(Metric.COMPLEXITY)); - assertEquals(4668, project.getInt(Metric.BRANCHES)); - assertEquals(21184, project.getInt(Metric.COMMENT_LINES)); - assertEquals(9995, project.getInt(Metric.COMMENT_BLANK_LINES)); - assertEquals(17908, project.getInt(Metric.COMMENT_LINES_WITHOUT_HEADER)); - assertEquals(0.40, project.getDouble(Metric.COMMENT_LINES_DENSITY), 0.01); - - } - - @Test - public void findCommentedOutCode() { - assertEquals(70, project.getInt(Metric.COMMENTED_OUT_CODE_LINES)); - Collection filesWithCommentedCode = squid.search(new QueryByType(SourceFile.class), new QueryByMeasure( - Metric.COMMENTED_OUT_CODE_LINES, Operator.GREATER_THAN, 0)); - assertEquals(10, filesWithCommentedCode.size()); - assertTrue(filesWithCommentedCode.contains(new SourceFile("org/apache/commons/collections/map/MultiValueMap.java"))); - } - - @Test - public void getRobertCMartinOOMetrics() { - SourceCode bufferPackage = squid.search("org/apache/commons/collections/buffer"); - assertEquals(13, bufferPackage.getInt(Metric.CLASSES)); - assertEquals(1, bufferPackage.getInt(Metric.ABSTRACT_CLASSES)); - assertEquals(1, bufferPackage.getInt(Metric.CA)); - assertEquals(14, bufferPackage.getInt(Metric.CE)); - assertEquals(0.93, bufferPackage.getDouble(Metric.INSTABILITY), 0.01); - assertEquals(0.07, bufferPackage.getDouble(Metric.ABSTRACTNESS), 0.01); - assertEquals(0.01, bufferPackage.getDouble(Metric.DISTANCE), 0.01); - } - - @Test - public void getChidamberAndKemererMetrics() { - assertEquals(3, squid.search("org/apache/commons/collections/bag/AbstractBagDecorator").getInt(Metric.NOC)); - assertEquals(4, squid.search("org/apache/commons/collections/bag/PredicatedBag").getInt(Metric.DIT)); - assertEquals(15, squid.search("org/apache/commons/collections/ArrayStack").getInt(Metric.RFC)); - assertEquals(3, squid.search("org/apache/commons/collections/ArrayStack").getInt(Metric.LCOM4)); - } - - @Test - public void getMeasuresOnPublicAPI() { - assertEquals(3257, project.getInt(Metric.PUBLIC_API)); - assertEquals(2008, project.getInt(Metric.PUBLIC_DOC_API)); - } - - @Test - public void getDependenciesBetweenPackages() { - SourceCode collectionsPackage = squid.search("org/apache/commons/collections"); - SourceCode bufferPackage = squid.search("org/apache/commons/collections/buffer"); - SourceCode bidimapPackage = squid.search("org/apache/commons/collections/bidimap"); - - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(bidimapPackage, collectionsPackage).getUsage()); - assertEquals(SourceCodeEdgeUsage.USES, squid.getEdge(collectionsPackage, bufferPackage).getUsage()); - assertEquals(7, squid.getEdge(collectionsPackage, bufferPackage).getRootEdges().size()); - } - - @Test - public void detectDependencyCyclesThenFlagFeedbackEdges() { - Collection packages = squid.search(new QueryByType(SourcePackage.class)); - IncrementalCyclesAndFESSolver cyclesAndFESSolver = new IncrementalCyclesAndFESSolver(squid, packages); - - assertThat(cyclesAndFESSolver.getCycles().size(), is(42)); - assertThat(cyclesAndFESSolver.getSearchCyclesCalls(), lessThan(400L)); - - assertThat(cyclesAndFESSolver.getFeedbackEdgeSet().size(), is(13)); - assertThat(cyclesAndFESSolver.getWeightOfFeedbackEdgeSet(), is(145)); - assertThat(cyclesAndFESSolver.getNumberOfLoops(), lessThan(7000)); - } - - @Test - public void minimumFeedbackShouldBeApproximatedWhenAboveMaxNumberOfCycles() { - Collection packages = squid.search(new QueryByType(SourcePackage.class)); - IncrementalCyclesAndFESSolver cyclesAndFESSolver = new IncrementalCyclesAndFESSolver(squid, packages); - assertThat(cyclesAndFESSolver.getFeedbackEdgeSet().size(), lessThan(27)); - assertThat(cyclesAndFESSolver.getWeightOfFeedbackEdgeSet(), lessThan(200)); - } - - @Test - public void searchMethodsWhoseComplexityIsGreaterThan11() { - Collection methods = squid.search(new QueryByType(SourceMethod.class), new QueryByMeasure(Metric.COMPLEXITY, - Operator.GREATER_THAN, 20)); - assertEquals(11, methods.size()); - } - - @Test - public void searchFilesWithAbstractClasses() { - Collection files = squid.search(new QueryByType(SourceFile.class), new QueryByMeasure(Metric.ABSTRACT_CLASSES, - Operator.GREATER_THAN, 0)); - assertEquals(32, files.size()); - assertTrue(files.contains(new SourceFile("org/apache/commons/collections/keyvalue/AbstractMapEntry.java"))); - } - - @Test - public void getDistributionOfMethodComplexity() { - MeasuresDistribution complexityDistribution = new MeasuresDistribution(squid.search(new QueryByType(SourceMethod.class), - new QueryByMeasure(Metric.ACCESSORS, Operator.EQUALS, 0))); - Map distribution = complexityDistribution.distributeAccordingTo(Metric.COMPLEXITY, 1, 2, 3, 4, 5, 7, 10, 15, 20); - assertEquals(2265, (int) distribution.get(1)); - assertEquals(195, (int) distribution.get(5)); - assertEquals(12, (int) distribution.get(20)); - } -} diff --git a/plugins/sonar-squid-java-plugin/src/test/resources/logback-test.xml b/plugins/sonar-squid-java-plugin/src/test/resources/logback-test.xml deleted file mode 100644 index 133e70f5949..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/resources/logback-test.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - %d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n - - - - - - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/DsmSerializerTest/dsm.json b/plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/DsmSerializerTest/dsm.json deleted file mode 100644 index 5aa3a9d1817..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/DsmSerializerTest/dsm.json +++ /dev/null @@ -1 +0,0 @@ -[{"i":8,"n":"org.bar","q":"PAC","v":[{},{"i":30,"w":5}]},{"i":7,"n":"org.foo","q":"PAC","v":[{},{}]}] \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest/serialize.json b/plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest/serialize.json deleted file mode 100644 index b5fc7086d92..00000000000 --- a/plugins/sonar-squid-java-plugin/src/test/resources/org/sonar/plugins/squid/bridges/Lcom4BlocksBridgeTest/serialize.json +++ /dev/null @@ -1 +0,0 @@ -[[{"q":"FLD","n":"message"},{"q":"MET","n":"getActionMessage()V"}],[{"q":"FLD","n":"configured"},{"q":"MET","n":"getName()Ljava/lang/String;"},{"q":"MET","n":"setNull(Z)V"}]] \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/test/resources/struts-core-1.3.9-sources.jar b/plugins/sonar-squid-java-plugin/src/test/resources/struts-core-1.3.9-sources.jar deleted file mode 100644 index 2ddf4a1977e62ab7a4b82b654cd147fc03fdb13d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511448 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Νx(!< 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%0AK3EqMde(9|DCux@^rWHH! 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
r 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastArrayList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastArrayList.class deleted file mode 100644 index f6d3559a745ea386e4bc5d2fabd77f3fdf8ec172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8145 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 PF#YDh~Zcq4`EObFB%xqPlgS= z6houd)Q8h?Brp==>SZl+#=xk7F$3cQ^=hT4a)Fu^Xc)b0EnAtTz%FFQtYW`_S+M+I zLIq2nqXlY*oWNV<@rdInZ;+S1@&)#6eb-)+;_G@lP@WaIobS5VSB7^R%(vh+qHNLbsqrCIhOo1oOqi)VBOj@3;_u*kg zyC=}P)wqiP0uwv8=3fq1bkcDnZ~5bDB@n3TOit5er?hG5OqO#{u$=kK*_q1>wa$R2 z7Tsk!KwjcuFH9Cd#zYso1$J+~(itwX z%EUBY6*ySBDtR(OKFnK%Y+wbdO3iC{-NYN{Ht`hR)I*QJxgGOqn`kpcn}(D_N+xWY zUCD~Ti5){TCsr<}e80V?t4qLsAO`;rzL6WL|86w-vuG8Wv#L4|OOuLrZH9!I)ICS{ zk*p#|n<}&{bsZjU6)(xOZjq@3m4c=nwvsa6lbu!Q8tC2-J%-p5!caF@=~H_*&n!Y0dn}GS>Hq|AN@m9mMbQFuD#?;0KD8p%SR!@+z9- z+k|b^RTGt=iqegnvq&+IT*?b+-;bv;|cdoXLfR@)<*0EdQHd-#0Gqa&d zCntUH2I|Ms_m14XfhOKCYI|5LI)yiBNeA*+pfw9{N^?1sef$7Jegs2)j0X7$4#-c@ zAwR=$`8iI>FOZdA;*$IdbMk8x|?{+H5lkCB diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$CollectionView.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$CollectionView.class deleted file mode 100644 index bba166681bdaf79441d95006be120e80dc8d2517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4307 zcmbtYSyL2O7(KU{-6o0%2HX{8m>C@xL=h3iKm-9dB*6u3hF03l=1gNWuX)H1$W!tI z;)@SjrC7$QkP2^kNhNRDQ>n^cNh(#@E3tBJch5{S(KwKz=I;0FbH01N@806=2d}>Y zU<nG-5c2lNj;inGig7=h+bFMi*fPPRX&;vUNrlXJs)ai*vF#FAGf;+FVwR~RB z3)Ih@?=$tBW@d5%K6BE@H*FP&4P5sumTN%yDBVc`*M0JbA>eP924%vEvM)g zQ%_|DYF(g8z8AD3xJYEApDY^g{X87o{DCBu(clK@A|}65?=tV2vJ9A-k+uwY^2Q59 zO5lA0ek0$L%91&9eY&ll|?7^sp!If6$j)*w;Vf&r)1Hq;%PZ{2#n+AlBQ0k^HbSu zCTHpsN3t?$FvIj*P3T$K5I9CE z)Ra|6dCPI3l$T@mKB{<~0mmY@A#S7U6>OBP(Sf&QbswJ5yYSwDFFJc2fx+l(Z00(e z?X^C+$Z1Z)e-8lxYuQkAcJs_Fnyn!b3B8FxWZgz>9%g+QLso5r--IABy^oOi05#%6 ztPvlfMSP5y_=JJ-DSE|cI4VAO5j$oRBLzl>L*ysAz)#z{jfh0rWovZMB61tPX$0Sd zXDG6nSflq4Qqbm+D>jo|ohLSXV~;mB+u)sX7|D%Jv$#Pn@^O)G#v-?yaS8r9t-2p) zF~8tal&kYNuuT)WN3IKl} zUEt7viQ=!KMmlZ9QvAzY;=PAzfg1%~mjx}SqO&)w$hMM+l$K039ae3NxE@|+nx&*s zixo;8HY)Yltt@v%WM?rVc{f!E>WN2#;#7s8RuR-{f?7*Z>j-N7LqYMbbU?jKk}{gQ zik_--d5U>qu~KqXc?#ehMKBa&dZU?5R``J$?BuVIifvyt6IK{2l?XN|QS4D-7OZ;i z;-`y&+*J%@-s6=5T=E|PIaeXTZ3MWT09y%gCjquS5}+Mwd}CA!utveng4oJE$hp|; z%}PAjL4bP+a32A75#atu0_-6$A>Tg^z{dr{Qc=QJ77Uz<&fcsf7v5uyfm-X9-!y8AaXQy^oN=9Ol#jtqN~x2_+EYeqW++G5bQ4_e2I=)5f zXNvZGgbYP@Q418Q1&Y-Ai;?v>OU5HC9cC_+3LC(nEWpJPwnECZEt zkqSDX0(|rwAr<)$idzN&uZ)wj&Eg%`W-pG)C!F&jRB+7t&~dC{-AEJ-{6ED?kHUW? OG+;H2$B@EiU+^E6glB93 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$EntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$EntrySet.class deleted file mode 100644 index bb00c9d16a606be1d96d9a983af34f41876eeb23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1371 zcmb7^%Wu;_5XQfCT)TPnP0Jev2yGrECX^zfATEUpq)-k)xpCNrRpQFABgcXCzk&lo zZ~%z|2mUC;w@#X-6^Hte%+7k}H#^^q{pauZ9{{S@&0r3j8Ccj%bG4O45hWWH8{0Oj z0#?*@2ZaX$+l?UXII=I>UFEccUN7(mw4SHhk*nAHauB_ggYIkDuM4D`$9~jRk=rKY zsq4GZGXbZV1X5}Vn0vu{C9u?ReRVMG9jfrHJoLD;+6daxYst{n{$$hCmlc?Q;YZpJx>k>icfYEwp{rNqg?rd)MvT|7WuCMFn(f*YaPI2 zSjHNyiAz|YAnLRlVOPGv6!^sDZ1}G@d}DlM63)Zez-0!SxPt2w(BlcnsGMi~o?#eM zhJhQn$rydDJo&nw=d>wWOV=a*UrK&_V#={_JJv@Rd) zKnNCm03U@oFG<_96scascgVfxPRIWJ=jSf~WvpdjVKD<6i)m{4ED9)QaS0_GcWjhx z+!e6mhS$zfS*nIn-IXm_YbduCHk)D4ru2PPi#@Gx%69xrwi_>HYh56{y&uF46?-*e zJoW-Fej?!JlYkU<1k6hKRtbz(y+Cbsn!74`Eq8r-rmA60`a3f6v^{W|x>?qHq4u{` zEZ{s30u@z!*={TPR}xgu^)Wa}s;;3H^VL21Ub>yw^Ibh+VaTo=u0h8)WlMK_JeI+gKJD*$CojU!ZUTJJ<6cRPbd`cVF%9anD2_QT?3RSh@i(P6PMPJ00We|cGteHRwMxsN%oa=EVH8W> zkoro~z&M{4gJ68b1a(L2gqXw(rHNV04ItJjHH2OI0aM@$)#3C{z4W<$$RM4;IFAcV zG;tAEP5~PE7wGeUfUe>i0d$8qSVRx?lrlwW>7m5w^UU`n4jZzt&|8w8`X+Kj=&#Gb ht=>SlF-^I^hAk{{r3OEx1zfh$xK0~fv`y)n#$V<8R!#r_ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$Values.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap$Values.class deleted file mode 100644 index c1b8f27d997cf7d82f69cfec8284ed127731e857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmb7E+iuf95IyTSc9Xal=!KS>0)#e~5)(>6sEC(91yU#vMS0_4V^)bP$ByhxN&kvU zATAGl03U^zjop%zR;ph-GrKcqX3os|_n)7?0Mzj`4+HCYm{`w|woyPCl>*jKHL+>p z0fQlXZd7{6u-OX2uFVJB=?U8j`u)Ib>QI9fsWgkuQ5fx(;DH zcYRmBV6e++Kq_qpy%~HI4D&757kk5gM}+Tr$D@<0t-#@4n}@EllS5q?>b}M+}uS*roCLNd}MmUHe_d`Lxf8d@4V zYAo7_@@S(5Lp@zELw-LPhK|^E)f5*dmZq)hX8Ct>dJ~AwwculWG z_3}laNH5)_=TDDF5lu2r7NA2@?2|o9);3uh$wIaE4O+GK6`5l)HO$f1ASY!)>xb6q_XLy7m|8&s8V@ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastHashMap.class deleted file mode 100644 index 36cc37a9d3a55e3e00e1abdadaf11d4fa7ef806a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5263 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$1.class deleted file mode 100644 index bb3faa8a33550ad898a45cd972515521dce921a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcma)%O$x$5429qLS6jRA2rgWSbnpy9!G*Y}7Z``oAEq;`-aq zjr|w?0Mi>UY*Jd$#2R~H;-4__Bhh$aqZb;#pR+p)iz$iHi#?z3d7t;=dEePD{`%+> z07vm=0()^Rjy4?E!&3XFNdo->A1OQm&Vm*3G-a_u|>?MX; zXCP3^{$)BqVfvTI`zwK?hF$GbQ%!)6YHC>MM6ZQM&|%?0JZ#|{UN$jdA&*H5`>@}{ zc?(mxVB(^MgP7LCA%XNJuLgb3SqTE=g=7AlJMTKSPWaHOql$WAu>f)wy3r%Bd-Ijf zaG6yWX7Gx@!SYqvlM(V^!7k)OJ5)7lUd3w`UPq6GC-8G$7@9e;9Y>W)9lhP%0`7e=_cmbxIyGa1jhMOO)B9_1R8qjo&Tv5UKTN=wd1 zGPfWy*)_)Q-pb*uk~HK*36%*V7-Ur$4E@yLh?2bvQc<6Fq9y9#!0Ic^5O$W_t89uC|SUme*R=v0LCKS}#;G zv!O{RCwu1_8pg7Bj@-V6X5KJrdsr+wh1Y3GCl;|pYnI@Z=SnF1`2mLf1*ZHJjq*1f zkiVl-{(yfH$a{$=%kk>NL!9^1`xO5c T9H@`;!{3kgm?TRMlLzu2GnXH< diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$CollectionView.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$CollectionView.class deleted file mode 100644 index d46c1bec55b7598b8f09f4d195e52093b119750f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4307 zcmbtYTXPge7(LV3JA>SkU;yP7NV2=IC>RJ~xtc&o2$zIlK#<91AcLEoWp@I>2QB5n z(o$cryj5wb4`L|~!3v=eB}g8$&=((k@Mri3EKkqO?oL)Bn^>vs?&-_d=X`y>ue%R=Od^=ZxBNfEQJxog&qEui(Trc6DRVj^SY&=p|R_Nc1cT&SVlS_DK&Y%OKUh^HC$(P z>!Vf>83q2fjFr2hpsCD8z1?51l-4rm6Nd*b@Kk8UpGxZ*{aw{4X$Nxpuz86zYg`lF z$xSEe7fT<`Dp=wHRr0+;I|?T$ru36d!@Hh`o*~# z)-*nPc0j*4qNTZWXh_QsIYO$^1_$Y0mNp87>I@amk9-@wr(6gEo=!wdrSyEhe)A?q zf-xHvm+Px(7TV;-Vw4+3dd!hrN^du$@E3aGY@<9|6)Uky#Tsl1!c>t(vw}q>?Ygp1 zaS>ZoG$E=YflVrM$g6k;&#Gv_b`?8hk;G0FyRciu9yzdA_U*&-vS?SaU-lgUC%m!x|%&ac*XKjMW9HO^?i-|4UoU9P_8)^{wK? zvJ49E38n%m6xOSG9|23)T7$JL>-n_}f`33HdK)4dy9MPYzXaCFJ~<+i2#cLq&u^7$ zWN!l+0iRE5%C2L)<-jq@%e8tJRlLrCqtS6Ftw6H>w&E9!qLy`Dg1-ArwEvhGB;T|3~{BTVpZ zh=_J968o`I96*!kKwKO|v*<*-=)w`v?ICv5Aw~*}4wuMZbU~1|bq5iNw8&QfA)ClJ z0uu<|hp#)jfmmaAxEq>%a>fR-tMSFBZfy6*r|SHZE+e_nZ59{ENdZm@OxonOF)qPh z(ykBUG|uq*3qoO#dwDYotFw`YF;MBz>Lq&yoHR z=^LbfVOI28ZTifJbEL1%mOdBEnZ8N-S<=5q`Z?0ilfFgzBcy+s^hZhm${gtPE^z6; zN%2=vBS}ZG6o0ixymv5P!Ht5h%Yv3ev8fw&WZTI^N=qi2R=ajYTnj%%{3>a@hUMaQ ztP^iwo49I2c2Z5U7?Hf2Dg^b!%%C__A*iTQC0hoIgisP`TTig%?8>KaMPXxdfu zRE@_|%nJ)d$yMbkfMXOvcbw^sX4c!`2Wl|MA01?;V#in42I0M>ecl z&f(U@K;BghWZvVI0$lhX06A76z)uPAGXnga0KXu>FJ}bkgc{!%l>%HOFjf#-xd%BG zpBk&ggVzc0YXba+0KX-`8#4lIBQQn2e_Vi%3x>r?313+-a40r4R!K12B)spayK(C7 z7Iima!z&L4zQ;8{3fuZ7^l-+#}UuT#`qXaQc6h%o2(t_ zEkl6K9}pBjGTYq4YH=Si@e`8bfya4!i}KrBlpmjrF3zj8B{PYAdD`!R#U6kYs4n80 z<~j~|0(Px^eSuflR{jd`oXGf@j{605;vv?GUzrGh^Ej@hm_<5@j@v;%GHOD1QNy=L z?PSqjfRG`6_fQKJsfCKv4i+QpahCp=!BQu4p;TBG4!KU+Oc%)qR`@QK_VYRRp}K7fgc5Qg7%9J@)=Z(6=lfYRop#FP*uRKz7v2`MdyRJn23gjM6pu_MQY_FusP zAvo{@_)&;=9XCxQ4)r0Ko%PN$JMWDB=kKrI0BUIDk;PUX7PfL+ZO@~GvW=>Z9UC

p8m2@|544NTJUUTzDj zjZ`S3AUsrOkqt*68)p$H&#=eYFEV)2KXyKJPpCENS*7a}Sij0oLTs>G5crr%>@>pc z?&;PTXUt=q?F!V=1qyWf^3>qev|t6yqfo#cayE7gc#gV_7XtO`&)=kV z0JJ!|>UU(m(KWEhe+@vUiY2af0FPlA zYqTbAU_C+X(Q1TU{RvaxE0@#ZwK#lZd?X3yVQkGXtTHli0csEk&t?bkU(mRJiysu)fMU3ZO z;KeTl++q@tQbWMp3_mD=>ADxF?Owa7qFvea>6xvEE$KI8(Y4=o4y~lRu3=O0n@s00Qq5Ejr0s zR%`k!MxTr@`kbMfELkA46ZWE(+Vb=jXU0fV)eCdrVA4Sv85?U39%J3X6Fjx?Oknlm z1RPyYU?V}!$rT%(`YbSY)-ic<(gD5ZPHZw_cmlpC2}*K-W1s{fc|VTGn=6h}j0Jgp zi(Diz1?G?bJk5^s#cN}c@4QW}T;gw5Z=5pA4+CJr&}X1MMQfdwL76RAzQZV2z9IFM zrh#cbEe0Vqg&FFO)(MfrJf(>|7Df;?N)2IGe!vv?LUlYnH%MO?hK$k~jLW#fL=#tW z;~b!ge}VG<0lJA>1kfGcVG%vlOUe|brH2yd&$Bp;IBv+o(qKt?>bocqVYn^>_XY#q e#~kGn8@8~*l^Xn%mT=ul<2G$@(Ke-P8h-)B%v6Q| diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$Values.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/FastTreeMap$Values.class deleted file mode 100644 index 55881b6ab81bf68172c4e0d87a1a7ad43e423acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmb7E+iuf95IyTSadYVfdZ7i10)#e~5)(>6D2SIpC8SUuTIG$0O;{za96NHHlKvGu zAOsJ503U@oo1`TvtyI5wW_D-J%$%9^?>|3(0Vv}|3JGkbU|}msZ99!T3TbShXko{~ zV}V52ar(I@0y}j-Xxp+UTODP${BGCx`joD#TA`!$ec2C>0;S%|UR5A@c56CFS&S2^ zK!$#BpoXCZTOj_{3xiXE!UgQy==>~$E4{Y;p?OT6i5^$unAKVQNr(kb3IZP^5gmn= zN>z`=7&4DBtO%5&1q-AO{Xx)D`;MOC($vzFHDMW~k;z~VNeh(>o?a)PY#e?OUk&Y?n!-$ZAgw4-@a9K|#%etPwa;4_Df}?#DSUK~W zU5n!Ni$Iny-Qx4-Bho}urf2~s49!06d0Kn449aw|^c_aA^bN7EGz~29o1hb7n^>f- z1L%e&EK{0T!RiE}N~s~N(hrydU#L!pXGh^{W0y%dow0^n3^cKhJC^{({|Cxl0dyCe z1kkl*nM61BhB8K(&`pWU`^kITKqQ1#5J`Ma;y?x_GjV2uqSj}% zYJH$qt@x@Bh^=W2R>GpL0+L#+?H^nFuB%;k)&B5DyR?sgwckGX&g3Qz7* z_qX3?-+AwUKRODa5yO7Car-39!5uo>>BC*RbGHs(*Wn%=?$zNNI^3tj{W?6L!#8z! zP=|+fcvy!=bl9uIqdGk1!{a3=w_g8N37)`{C3p(o*5PR%_LZO-&*<>1Qr)Wq`9Fu} zb$G#t@AxSfrI>>kb$Cg6zO2J5I_&r1fFJc3@ZnWI!a9G~j|QE;Cx9TZKADWATN2Ss zCYBKtw((XV^n4KdyE;WfdOmQ*4U>(0hg$*u9&je?@yXrEwu+s^3j zXj6YSo@m;Vj>R@c`<4sb+oKsWl1}ni5l_amt4Lp0zm+E~sq15cscrFOti8XtE0*38 z?MiT`tS!|YO>B*( z5zDHy#vU|}FOz$A*L5mN5eWqIZO(~ka!1pquAMae@_LJe}b&MWVj}g5V+z=v)!B8 zO>sTliC8qvjo1zS(F8+Dbkl@7b$9rPew%By8NCu0%y68o&&I3(;!%nSy&Q^rqM05m zmZgXLG%>MKNwW7@G7-$z6N_p@2NKP?M7){)F7wjz0xzA?JjNeRHoooYRIl-d zCz~>}k8V#G&c(5OvQNvo%3=`9(g5CFChxg0UZ*DG-JVN568kr&`qSO9wQ zYD@;O94i7?iVFf*hGxOEFVqVqxk!gr9o7Y~5$yqd6_*9D8J7mI1(ye~RfiUA3!np? z0bHp=N{6d(bpY4tyIuNPH&!rsM=_{w05@Te4}$@GA3yNn^#F#H?Ljcir;nkuA|QY_ zl<^PI>BE}=T(8IpTqX!jyb1-dUNJVHEr1)44j_YU05^i6xOn1REO}Ug)i8$y3(w$H zdfXKAGkGUh_akS3vrw??49LgdA`Vv>af{=2vavdkiA+ZlmW?_sx2w4p&9ujEVkvMZ z&E#bvHDO=OgHgK=Q z2cEnSSOx5tSCLwM;0;yNxuYKSo83p~*S!uwym=FQP0Xl?SsQI$x9}Z}tXdW1X#_aA z!ow&Y(nZI{6S?Qe$WVJ^q~RFJD@{0pAvur#Ink|fdI>(fj8g0;)d8LkI0UK93sQ?s z_zDFOt%@NrOg?HX{cg!y|(m!y^$DqXM&0!xw6Bu9=-teUM_j zfvI?tREKyv?6BxOTMW^A;k4lXvEcp*f*&XN+XNpW_)iG_PC;hB=Tu@@6=Uq?| z85x|23*IOEFX@60=z?F<1;6cf&?Zg$VU|9uN35O6y#$H^7m5+a)liW zyq8bwj>%R`=3-%Tcw}fIvG6Iy_>AuOH{J0cy5qkE-NAm~wBS?5f=`(kxbQ|17p96E z72-jScngBF4>>LP)Un`GCkS3j@M#2}PVgB7FE0qr*2f0_hzVHCjB2w|urbupZs%R; zak!h^L3cPZjA_lDP|(e481yuZ3^jWjMuOgBCQB`9L!&1?p7@Tjx|ATqPe<^-$;``G z=v(>R%9}@LD|18e^Qs9^<}gYmf=X$i%#D~Yd`lK!ku1V8S&UX$V)R(TI#-DqxQ6$k zn|>|9wG1S^)7tWdrp+!ix~F00qNeQfY<=J7vzPQ6EPcZvyWR~$^=)rp9V`nqP}9iB z0Q}AF$VkwAYyf8)W%GGiW}SL?>N$4MsH>Hcm5krbI-gH*S~$00otZ6l8!0g4LaMu( z>aL-SE<&}mQ00pekybRxTAVNIuu3k$rE;lJxrPp^pqW%iI~u&QdQ_K)vbBZlhq3x(zj3DvZ@`x*m9`o7eK>eAJR5oDlpAfYZet$PwK6-F0bIa{FTAp z+*a@aji6L3ECpwWI#?Sk&1TadHO9KvEc zO&zz)%$8R3*(E`?Q>z`+s)t&|>8zbNS9T#J2`rReEElWau==MJw)CRiza_IPPMMWY zZ8&rQ9`|7QZIthWr)V&I9OWA=MQ)88A$O?Ayz*YqQ)^v$1XY6eh9d|Hp2lTdoFzDp zYR%0fm?>!X=wcQZ-k|p+sv|+q5uEM9NlY=z*)HruWzk^Jn>!gsjlm!I{57{#=-W?> z!}k?6jEs@Mf-^E)p?J0s9tBe&yt+^!d_mty%!&lPqe5_Lgs4`gL0|67h+%*RKHu-= zQFAfNNAWQx^s{(fYUqw3aqBD|sWNj=W}CT2=IU$*-(#3dnmgc;JL#&sFh%Z0soaBd zxsS5l&)j-|0r((Y^$;$Whp|Z>!8X~8s62}8@)&NF$8noHiHGGW?3I0ZT%N%b@*JL( z=P@WRP>L6ER9?cn@-jY#YWHF<V5AxJ)` zXyII=&R-sELGGvJG?c=Y-6pG{^vuNqXC9(_mReSN$f!b+wx-jd1=Ja(esJjk8bP#O&iLqe#MBR2 zs{(Uem0w~X{y1a{vV@5#6x{z7>N`Sm7@;9PS?ZeaJJ(#p%eo`{`PjU<5Qnhg5E;)Q zT#&;pxb=%NG#Czz<2fuUz`=#D8A)%$Le7g=beh<q+=1zT|Hw9b^7I@2H3={a|o%~JEFA9nY?ob#OLKIfdffB*B_9{@)2Ac}5G zDVSDpHHrYPMG?dYQ5?thRvg0(9?>+5Yps|;E=p@R70gBv!!4f7@hHz$b8KIT;5M(^ zVHde_H-Zn@a6W=D1q&SRo`R1Qe5~LTfy37)Z!G3-&(7YQE94h*Q~AQwq<~luXthk! zo>1#GU7#cTK>b`zm(^-9T_{=RLv^XFX9T*nvRbPpcr(G932#%N-RCpGW@O)*U$5FF z-8M9V@VHSm?8^ed!J#_>p$T)DBDH0Ws-CM?mUOGYK?LGiQ&Y=#RLkJGyBM-dMonNW zYg)y$x~gg=J*}CQidn7Ew_MgW+u-qZy{g%!HMOSctGq%SItG2j^0sAEiy0;mtkjAe zt#ML!Q{brI#XF+(O8U242Oq?K<4958Q?zSvsHqt#uu7Edysc`V7A#dG1@^)lW_s4y zvvjp0!v|I$dfD0AzH1q_ZqZ4DX5D^empHQXtEjFUOA&U`DsZ~V>HNI+@)}qh6X^FH zNN(gzd)lm5m;LGo*3Jq<#R3dPXlwVUbT&i?&VEDSuw4gS|QD&RKqiRt)>=fa%5i> zd;Q`_vj4UaIMfJ`U$5DEg(_6HEQ;(_8EJU4Zm-s<_+^bQa4oj1lLq{N`c;IXf{q4w&2y|4#G+CE0j%|1u#hOgM2a>5BM4CcPqXk!qz%>cg>6p7v@ZooQ_?=P?2mh>#e~a+>kS^)rCZLN%`aY3XC1|f>?t$)+X8No)t2u@@ zTzEbPtJ{+N1PP z+k-HT*J<|)DvB?07+;|aUsF+i~jR?i9%=xEicFtQcA9I z?hPk}LmqaRI%AxAgze(EOmRtcdbs=E^-}uCjW8O_Y@y>N+Txwh&^7-Q9UBPKO8jW> zcXV%~=WZxNE7@SC=PBAZ2{k}s58!n-dOx9pI0qd S_asIN@5`G(V1oPunEV&%&;vFA diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/HashBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/HashBag.class deleted file mode 100644 index 917ab906b329cdfd1ffbab73e3d29d07f4dc3f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcma)(O;5r=5Qg6cq*^KnDvIBlNDvLxs~8i7s0Z|-!RT#iS6EXhDXss@izJ%(1N>3O z*+RsF1~2om`^-B#J0G8~?*K~J(2&)^u%JW3qK>$V;>c-O(y**yg&}?sJyvwbYFfF&;b~`=t zjw38zs`!HUTBp2OX2=z4kNk<7fiE4i@{N?k-l~Kl`#Zs)U%P>4i8HC*V+=J*N{;TT zqU#BZ`@&{Ok6I||l6MVEL04wgz#7&W^8b4=!`>LMDjs;?_|$_2WY`*mhfwC{Cs1WL zeVp6&iJJe7D1lWuh9VrCwX_hDY| z#}hz-TwpG+5XcC5tNKGQUIpg~#d>pezLKg}`f8+hZR@%lUu%sHb;PHyen-eIZt&Xd zYikIrF{reLHASQDim?5Y_TylG^hm3^N}kJx3kl1S8bWPj@r*!7cqaS@rGymIh%n=w GKzso7a6e=K diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/IteratorUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/IteratorUtils.class deleted file mode 100644 index 70b2a65d3de3c3c7dc13a6cc0e0e674bca5583bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13371 zcmbta3w%`7ng4&efje_EKu9175H!jwB$4n?5rRm7fYBsC65c8ul1nl$nTazK1X>lV zqOFe>TSc@jEw!cfRSGVFQWe{-?$&K>x4I9vU0rv#yW8Em-R*Aot^1vG@11+@ojbot z@CUzp@0|0U|MxoQd)%8Je(;@_0L-K34g3%OSI7V9_`pCBJ~W^a45Wy{xRr{;MH81| zaTy~nV|CIEL@1U4unHk5j8@QP^2(x#xL#Qi+XLRZo zj~j)_H-%`kSii-ft+Y)HZx>HD>2$Lgz9mdM=wo4u(#|mTP;Zz_+7+fg>enfz({94} zmiG1CTX(c}w{$jluj?c%YD=d28l!{Jo_@2jCpj>XOr-f9kDEQ2n0W3q(`F_U-5EDq zGiEB9Nv4_z19LnQ*PYwpQ6A z>vrzu)7f-!{urB-tHo|{cb$z$n4IOUnw`)P$X^18&D^L`i_H^FrJ~B_xxRLLF1L%5 ze~g6Y5EOt&Xboc2dXb#cnP@6QpjN{50s3Dg>V#trfFt1CGzZ6jdr0)#4&_D@)WV4>!*QAre7WgZMgSj7f;K+3J0yfzgb?03{9IJS{> zp`D=%ZP@NqG?CtwObwW+eC{buC6k=hN-{1fyLdFfoP6EI%9h@w+QQMJX*9@r>=Vwi z<4v?H7Uy7-cN2}6?|R0F_3(DgXQ=R?LqVu3q=k#dAdKPCl5mMj(vg&Mtu}XAa-~wqRD=d75y3%9 z@&$KAkVYngA?%IdHtdUFKMq9jaeRWXv_Jrg+2v%qvCH2J3;aPYpGJ?M9tOg)5d&DM zR~{V4enN;_30IF8BWHC=K%~WmO>~fk2rEVmrU>NKY2;>=@~De-+8d$U@U%|*#Qk}l z_KW+e(J1LyXO*aRg;wnDgYx*r=An3e zeKMBdU6(yzgei_bH3LKGOid!0so81PB$$>^trS`T(<6687RO;Gq`QmbPB!NUz%L&0 zR^fBcN~zeNBurNw9{}GpN_Z7ch<`U>nw$6n7+f=A25tVDX0l)w06FsGY(x5mzK5Nv z&&S2#dOcsvWs3es9Y=jQeBN6%>eLg~u(qj?ahx<9GD2UVFGlD~^a#tKmO3&IHbv+d zeK~^LafdD9JfYD%N5lyJ6~EQ#D-k*_P`*k}Md)kvbw_)db+fjM;4mK1=|qISfs9Vy z6!*P4JsqKEuurFF#r=Rz&xtz+)`kM7$&o=OeXgse-bx|Ft%Exxwc$#Ud&rLH0M}6l z*HP_eIvwrfACvg)xJ#R@Hzo(wHvFZ+Gj4aV;tNKF^NK=|qDf3t22HeDOBBX7l$@vv zTq36`Rk55ka^~6sCW~e3kBxyZ$3nekPm|+q zcvH}rux8e1UUD%tMFnyXlXOqM7bZb$g2n{Cr)g2%_}E7(SD;3(K-u><3WGdis=KRD z|DMgm;>8Jz>FEMpdlqoEAH`#^5u;>Nzm%j!)nDB=qj_z>8kPHTB>Gf!REdvra(=$a z{I++_T&^F-yYW_NA)-TY%UCSZh5XpbA6_cmaO1RJGD~oSmoRT@P4G9GL=RIt9i{ZS z6_TAUQQZcj6I6q@6O;nR_(epm3>JESG~HqDV~P3u>oy)v$RFNVXag}#w3pk)z{tmI zE1Ur8wGa1+d!z9olV8GCc_@^f&260-H${?Vswo~S)o)D35!(*q|w<5)V zJv0_mM61tFQ$)8f@7(aqJNNwZ&TT*6L!v+e;ZA<$zdGV4eow&HPx7xtd?&t-sT;=F zZ}USD?&hobV*N>H>w=?CZ@abI2 zke~8FrhEVo=2C|Jl#eszLwGos((qG0#gw1HXLBh_{FEn|l8Zl^auGCsVlB@jvX#v; zPLNw>vDEsWVv;aEhtErsJc`G10mch}34VY#0s)TT@mzpX0Wi@I@Qw%ID4viK90^jP zOaPSo0p9lkSSlRBlePrQ+4Eut80WzfOdG}|Kf;F+p~9kqC4$&DU%(d`Ba9>XQZ5z? z!&sAjSTxaxC8Y6U9ka1oF^0VZlvr|A52L~lHba8dSY%njN^HS+DZb1i7D*Amk_#(D zWY|hS?A1P4OU5ABL4C6UGAF%i`|Kevo zi@yaiAI7(FDq!*D{>5iKi%-j#AI1y#J$td@{25#8>W4AYkMNpAaGZZe$}SGxFh7Yy z`~uF}SjtvrtYOUZL;XwNw&1UHnxc*cJi1#t-`e!+wbI z{8#*L*<5KKk}%%GU)!)Z@eU9LR&{o(NNMXzd(UERTm3m)Pcj);b!QnLU}zIitd%l$ z876Dxie0L0{K?QE+$`+!9{$GW^dNH*CDT$br>s9(h0`s*?G5z}=WqjY)W7ip+W7xD zv==FIOy#Zv+Dw*X7RxaQWm+w&wK~ku>ZLqZ=v|r(3QO^~vh$dMN-3ELy}!iY*^(__ z3y83+*OeNqwQEXQW@}3n6Y5zL@;h{U`7v9uX0Kw?ijRvR*Ri#1-7wa3Slh6bYn9IS zx^w6vuCdA+_^F#Xd~Ynm<`WigT z)}`p$oYl1%{~$}>*_f8q^;h^uOISK&3;Q+;tDnWDlXb6P^HGHAE?~2G-f|S<_<74Y zY-PvuK-*E2$s*TsglGbIblXu(I1fHM7qCs7Q6AdPg#2^+Iou?avX|d1mrKH%&)^nG z`zk8x&S1wGeC#M9=V5mSVyG-i7qIgTdfHB*_ccr?GtXkz*3;-cfw4SNe+GSL(0>#a z^>s|xb_OvPyS?F6jA=M|0>y20XR+rbYkHVN@SE7peicpRPE@fqIr(UN5Yh%PK}%qg zHi&83t(c{y(V%6}r0vB@?KX61`>|0wfL`qr*rVN!1KORqUpt7y+C4a?-HVsBLwH@g z4{vDqd8x4>u-St{I4_tZ*@zc;xVc;}Er;s>}@F^ru!#IV(($c2$foCk+cD7X~EXob_rY9Hp!;D8;X7C z_~3&xPDg#z@ueMXO@B+Gc*I&Dv>+zy7XVucR+2f0jZWW~C zHvgbu`e~;Ngg+>&6EF$_Egt4g+pM7NwmN!zF{>Bd>PDbNFvAw#unb49Mu=~YFi~>K zA!=x8X^v?LG<$(cj*&~HeJwi`G-WYcH=*!d2yA2b#x`<~^dbAU*_+hSNwZ{S^$|mI zDCY5?PxeqCdQ2}`dRBAvSrxm{siF;W6d9Z{9fdh}lQ-Rd~*iGu!OL`%z&yH&L zJekcxxx8ez%JnyHdiQ2~c_TehX_-JrmBzz4&9=u)XT&TO$Pd4(ELPSmIGRzgPfFsq zY{9dh^Sr(uKWWZ}j2M>fxaQ5>TN1ni#=B`QM-j>fGaH1uOI)n+;5Bsv4HH#5Awj9-TXqa7t_}Vqv%Q4Cg z;AMny6#FQto*DMz09VpQr|;qvEv0QkqJ0g4MDSY#6YU(TzM7zL|0F_qfqpZn$C&H0 z)jQ|=qz7~nG9O7vcHeszL4H6ykz9rHF+yTRN};htvUd&P>E0D?1|T7OVJaYrNnC zN?fUi--QT|UFTs7HN1KaSY!)svhcSU`fV4=Ao1u0s_dQ#|3N z;Ly$;cd?hNI)MSjpF@eb5)Z9n+w?m@vHb9_YJz)NBH#}DeV55CvDlxoOrMcF%PiOu z$@aO6Z;0_aXd%0sFeA*GfByoV CM-(Rj diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ListUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ListUtils.class deleted file mode 100644 index 4d97daecae165b2afbf60c35806ea682f389a14d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4405 zcmb7G`*T!R9siu{-Q3M)$*Um{P>5LVW|Oc2p+GC9zoO91T z=kxu1U!S|L{^w`E0I(C^3*${lnn;CFhh!rrG1Z7^*fPw><3)LqmLVfUHjFMfGF+13 zG1<#CB9DR$Q-W5M;c^%sz!iBrD=#hz6j83?@i0Cp!-w$UFrL6i!uTjY7RJZ%i7=kT z;|=&Et~C((nu(`OTvrGmA2~gK{?Xx~v2lf#;Th|)6)zU-bbQ#(7Y-`aAF{J{;jls= z+I?2RIOZf%3eCfIHZ@wzOr&z-)N|XJ|A}gAqGhNagbGD}~+BYEIS9-PIck$`L}^m$a3gil3U8 zAs)elXvKaTmnAFKea*zJB;p`-RInz6+NjqCT92`6Q7!= zt^BlPXwb>IW;<6g+daff5)3*}y2Q9~x6T$%h^NqyOBF0TdnBD!IJ^o_ZIU%|Vn`%e zZ{@t}@QVR$DdSvDX-mwBtXYlu*=%Au=Va}xsif=9j!G7?b+Cq|mSQ&JB<)FEiSE6o zOSx3iPFRH!(C`YNwQBTq389wB1|NSN)m}!T(S(XFqGMk@ta+#8e(Um6FXw7jSB3H|LW7!0g+q+f}E74eaY3r(PG=&HLZ(@UN zIVU$;i5s;+*1}#Up`Dc9l;)a%EYH5_zXT9!RPS#2)=+XM(`yW?!}iQ7?#yO^hVGl!(JJ_ zg0Gr*CW5cwMg((m;3#gG_<982z&GXIw@f@6!M8DL;yWh3E6WE>JSX!R6VJgB1|5d1BTlr*ZSHYyxjHa%LzC=ag zjI4fWFM-^x)uDuw6?NbTWTRIdl?MbMU?r0Zt7;s-SM@xhRb|yfglR96Eo(68xeD zS)p{h*JIdMAWv5N)^lmRLaEku-d7IKO7D7Z4f~R?YdyyY?{3ok^O)^RJ`+i5H!bZ-96pL&19tFFl%2yuOa z;}Dv05}T0v(t zq)d77C_l+(x!En0>32gl=hj}A^diC}`IickTTsu7lZ2Z>3v32;hQYkZm}NA%m<#Mv z>h>r#kg`jug?CDn?)NDjB_)Y?Q>($5JQla#6M;D4$Fu_jaHX1vF zx6v|x=e16wGq{M>xjU~07Tl|IXmPL3!8GP!1QtleEu{f8as7Q3$^uOM0Ne0G#{VX> z^b(8aCv@efEQ(tg#1ac^8E5e_^Y?Q&_@xfRVb?8&VSqSvkYO00)A!*5`=Os!cH%q^ z>B8E@+i%yU*v|qz%vF#feFxs@W#W0BmSWo)qooLJcO4&X*}iqU?>5Z9 zJj}jDv|Ttff9KCz%U;FUmB6ov_G|L{4a@vBChoUv=-*)re$O`l11sx~xF4@q)Z%^| z(O!h;!%-X~t7dlbyR;Xr^yoMlOM49B-5%qcv>+XQLf1}3E|+l6Ewqog4)_he!^@Y^ zBMrV$8a%=VUq(kA*gdaTl-xFE1NbX8;cvA3cgFW03^RbDUJi?Z*Bma{=|L6ED{122AX)VHY|C_LCL`X%jS#3aetQ&rEaK5e9=zj9gh z_f*Zxo2xGm)VzF}YU)}ZV5mfP>P2xnt8bsww_UlZ*SvX@rS~2dI)A@o9A|3bY^lb1 zXce5ZIHz$QVl&m?v$Yy$dKH|9@m`JdK0Hzj=MB|3*H^)LKOWUM7itFgjny#EXqdY* j6N2S`TDKES{>+=$_7b+s$5kXmA}BBRa-85?hs1vYlL*$_ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MapIterator.class deleted file mode 100644 index a1886b8dff5a7b94a76dc40d4be3ed5b1942b2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 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 hUiKn1wYUjFnBR>rm9J!g1z~5qA{DKW zrAno38fzSHt(ElEpnnOQJpqLHY>es-S~#a1VL5P9EliPKt~KWf+drUKGjhaF3^nEk Ry9uUWAM%X&PMEQpe*lhgKR^Hg diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap$ValueIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap$ValueIterator.class deleted file mode 100644 index 64f9873734983975d11fdf589f098524c5aef091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1730 zcmb7FU2hXt5Iy7A-q>04;iN#IZ33ii>@;!Gw9wR)7D7UzCgH)ArSgJqmaBMSy=(2R zQTQu7_MucF6(BW@pj8Vh0*N05%&gbmfOzrCow>7j&YhWacK6lmC;tMN!+IVg_$rSA z7IW-aA8|Tl+t&ZHFU;4bM_eP5HL$<6v6KB^;?Kr=^oF%yrk*{<5QjK=b2DFI7yvgTi-J@v3qky)m8naI@c0-@YvHX&d2TE3-MZJGVZVY25$Mc}nZJp&vIc9RcAWz_QbdH&f5$|x8Jgb!c zMD_)S#5{&UxQinDnb^uRB z|JuE9!4JC?wud84J;4zDa|n363(Vq-fv( z#Dcd3d;l93AVDiY;sf{>egT-9_kxWV@yy)ZIWu$S*uVaK{|R6gS2SqIYUoC;i@j+T zvl^n9lgIPjSipJtSky3s3o4dWEED2E#qy`-2s1_3+sTW4VN}e#;qL9Zj?dP%O(U?R zzge{d>xS?vn_|B}=-Phh1Qj!|30_Yt0p`8hU1vtx-EQPhKpg!Pt`$qmV_0Uo(NozFqqC1 zcf|vduLhQ#-)Nlkov3d;;;tg;%myLG1nma|VqdY?8Tfxv%&<+tsGL<&aghMRy>J|b znrOZtDOC=5pUS~JAs;fEpl!QV&oHlBas_>zJD-)b=;%SOe57>fNUB&Ntb`Cwo%1HG zgk)_8%~%3Y={Si~DlX|LU{%Lutm&9Uim(v64l81`z09j+Kk$SRthYqXst<$7gyurr zX9>59H%BC>72$802P_&^#a$MbQws)~!n1|5lfPNs<@c_@gUi=h%BElP&Gr~aKn#l9 z1jl_GEpnu=)v`xWvbnE_eC9~u93akjKu>U-eO>yDIDjFxB#CYyEc16l{+IlL=$-5r zMCb^yPkhh`^0Wga*#a5HNCTwGHo`d*k=5)W;+xaopc3Aqmz@OR_G6+Ce}9jBY{8C0 zj^z6+&M`uL ePYTktX)_pPJIuK9>wAL#Kh2i=WZq|xhw=~aEKm^u diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiHashMap.class deleted file mode 100644 index 63424bf72a7eae44e0d3f0684a6f3754ee161d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5830 zcmb7IX?RrS6@I^2GRfqIglw7w6=DcsW|Ejd5eR~q5RE1Q4ML%A!{kZ^Co}2H1QJ`j zSeL48U8-%-wl3ACRoa3}Vq7S85$jTG756S$+dlo#AKmTpNZ<3_JNFJ4TH$&4?wxNr z=RNOPzH{^Rdynh|(1Le@Sd8n7(25)6?M4}HD#jOavv1V{ixvgBa7z$h!j}v2l|t+c z;#S-iz*mF#8opkL+hzTZV%&+lit!EHEyFzle6tu8n2_OH0erg{)woOK-Ydg>^7Cdn zw@Zfa6ydx0p1kdrg*^e>FWT>rnFnOJSEe77lhjj5F zemoYyffRPZ(}+@Rp=Obwa}rM>Z_**`kG#Z0e{Zb@*a zyf+o2*eHebw>|004#f$kxi^*G+8P~+#)iz+SZa8fy74CbID}qM4z-=m;_T zntDW6sc0tFPB|IRjuUB*g1@P!TULXKRCKUA8q)-*ZX#&PvsnbmuA<@S$of=gYJ{gt z4_l{6>-yJZ{MQ8?Z{A5XPfQ$5L%(dS)+Fk_=>0$Vc{ zGe>NG{bn+orZWE;>sfWE(gr zcycQR1RY$AnjZ!5W73gLWuu9K_@(q19ZEWV;s*s!oDBH&DuZFGnRSCkA!IY7#arBT zEX)J#?xj}mB__?!2V|e1u8dY(HIq0(X_{$1PfZ>-UV27h=?n+*h&U8!K6sj{6NMC} z%?yK&RIAMlc8Xmsba)vy3gIKlKRmA%@^DEkmCQ!t$&5}Rg&ED{K7$15E$gCj=B|H) z59-g4&H*z^CQI~6&T54PM}(7an?NZ@o5QK?^s$doHcXY;+DvyUeU>#U67GJ9_kq-CI%amqr5?@BuPH5(9o*1mj-<^P^$Z#~4V?x$utMH? zWatgxNduQ4W*~#L0qi&M6gn9TZ7uDjP(-xY2^YXm3_Oizn4o!icX%}j;8_FD;ip=} zA_LFkX92umU=ywk;O7Qj#7hPa;A+yVrD#K0xU3ps;ALEG;1yY~bk|*r4J45g6D~LK zDqb_N6+;2MZr}}UHgGMjGw>#MFl;_Z@ugZZd(^-$@Jj=~!VUwM$?$6dd6|g+w2;yM zL4?_ryupeW;r1;9SBW9vqd0EhZM=2}H>=a>=y-2DlNFJ_p^sf!Y?ZugjzU92o5HfA z*{==C#d!`Ii*wIfr_?IUbwfhm+5M?(cWN{_n75_G1y14>YV_}!syvMxG%t>_M4gj& zRh79a2F5cw#fw?9*QHa;Qn@G_^GgMPciTEBl6Xzl3d5HUAkNY^`3I~w@Y7OD4OXv$0&kV5oP+4`bPmR(PgTTFPd>~ z;Ok*l{jci2M+AVNd_S`qllNYp60h$huU(QQrtPN2*3bMy~R+ zw8b-8q{4+wN7eNl&E|$S-H#Mz9Da_7ZUg4A^IXg>axOf$TnZjr=~|qEm7H6}cMncQ zCEr;OId*Yo1?Sj!A{d&23aN+S*`xQZ;W!Ikj%UM%Gf;$c(9K_lwHv2%PWn~WQ(MyM zl;q)Daj0$z-Wf%0hM&iR_=px&ZEd$j@gUB`SrjHhdu^fT5Q2a(LUj#O@XaW75CxQ4 z3{y*;YwdTW8n#q{-iLl|?rB(S%iql10=hO7o`zrHs`7$u*X7`c!jlNNbd-|_U<{?y zR*7-c;LW|6W1jzaUFsK?KzNs)!+MSbPLhf&-&0bhTlyl4_7x59{& z&*IBYbcH5SI*l@g{^n`SR@jL)zLYEML&b7msKz&qN|q5ms${Nu8pkN;4O2LF#+nkU^Q++lwUZ5xJ8?_lC;j| zsr5LQ;8!!IHsHgQ(2SFLs|j&5$1&QZQ_s_SFTnY@fO;?FdI6soQL4fg#5f8Sw{cFW zX!EXM%+>ToG=9g{x}2@m%YAiXWUazQD<%%UUAK#eEOU;h5y0*IbqC+>#4)%F_58w% z;BF?sJsSREDye6z4Kl=i4CQ$QYk_XFL3_COVjXb-gmkhIi2(?rW zb{_@oJA!zN0r@sP`3?i^w~hyaumdG*Ly@@=QtaW$`5Kg$XNvJrr0HoT4V?u~1#Ng^ z;U_S6Cr)LK&y!SPZb{hb+-l;Bm0J>mRz@+)_^y*|67@`}0~1&>)8TpUVf%z7V-hFw z)SGVYXs0)UKQmhYf;spr8u2%N`2U@S`5#QJcbORfq!0haB>6Y8_z!mAJEU@RKN?8S3-m~P%LVJBe~O_sp+67F_VVbzVNw8O#rIEDFc3gy>H@j;55~$Es)CC z$nrm?>tVa?6sc)lj#XVcMEP~Zdv}}{g$Lzm$H#OD601ILTQ$TLaYd!WJ^dgY6RwL= zXRBI{0@Z<_S^-0?%;U1s(OT(nS?Q$6EQia>oV=CNDR`S*t!lSuU0@|EUC!Ur^dC9X z^>5+Eh?}{MYzLs$63#lpIh$|>==SvtmUA&jZNhxD8DVvvhA4HIiX4c|4#Z}B!p`Ca z_@s7s6(jvqb{6vs#HQ#zK1IedaeOa5nV-J(1pWT>73YT(CJw&AGhsIkE#Mc^x~&8~ zM9^`@={D}YgfW`HVl|AVD(L_}fnF0YdwD?wG>_t|WwtSX_FCdwelXHN@vW3%exupI z*Auo}Aag{VmLHm>zs?a>@Z*D?4ENs@c# z3S4PxkX}z_qTck*1H$NuJ(Eq(wY}gs9s_&9bibjjFZ$WWcO99R1U)z?mDM5Bsh4-WQQM7HE zLi=uchNrN|g{IqD^*i20zh@BqA&>0*YfoVC!+?#FbRC~(qa^=M=Kp#s{SbQx(8Q&D SF5`NH&*gkpuz}iGQ1o9-UGld8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/MultiMap.class deleted file mode 100644 index a8c96bdb29fae84de34a6d07d15151e3caa38f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmZvYO-{ow5QX2gA%;Sr{7IYu(oMZZ>ar3NQmZbISgW5EG96k=+n z8=8gZNze1XvFGRa>l?rvHv*ReR|40BxH7r#4B;_dZB?hFQ$;2>?^~mr#i27hv7uVBPPh_#)Cm4?C-tgyi){IV#Av+w{O%D5zigo;e@CNuB7 z`Fwxx4*(YnhAG30Va{L^Y?)O;mEt5rdF2IRw{OZ5@Bm{=r`#~w3l_uUn&r1nFzwF+je7Kal*c5v95@)tYu!pv&i%Bv0k6B m>9J@}aC(T%Ed4W+Kp5y4!q6`s7=#f_KqJFgR|u234(ktdGfLq%gy3m2Dj`QV&; z?(6+{0*JA7;koc#YzThAyNecMsfLbVh0%?$YX2YzqjSYa&LnSgmfS0m_6LG@RfA5& zv6O-kBsvpXWT#$e-YXqX212ZK&UnkyLaV+45QX3HXMS4##2FBDK~`OLk5mC-!3j(lAjrg#6Ht3K79605s+a^MBtU|N z{l?PwX2$RD|8N8_Kue*n&`@X++SV=D@nWK*?}VLBtRsB(`eW->o{qG?X3w|Vtqo&Q zW7toEw4UDCz6j-I;NoP&zl4so*yz3Xj1E`cbiNUz5X$HaphEsRqut&;`OsX89Pb0W zi?a#UncX>`hk;>2PYWA+BD*T(=IlP|$gf?<} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/OrderedMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/OrderedMapIterator.class deleted file mode 100644 index aaf6369d36af2f2dbc17155e92f58e12ac6bd738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmah_I|{-;5PhRD8{@YSyn?Yvu(lTjMZwN)U6+`UWWy%ra26iGLx~$u5iMkjH$3Kj znA`nw1>j@A&|&B@^cebt&WRUWEvrbK3qo_^?Fml)CPou)74wP*3D3e{bBLuV=LC1B z&RWPtlt{vOqmNR{&&J5W$iM`25Ca1v3nK$F0}F`7zzQUp7}x+k;Vp~+ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/PredicateUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/PredicateUtils.class deleted file mode 100644 index 1192de2bbb6d74bd52f7f93d3820460c8c384249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5677 zcmbVPTXPge6#hEdWU`YDECeDdB6z`N1FYO30R%!Kt8oKt5`sz_-I*{u8v#Ww z;vKJe!@HtBdnwD5Ra)hPFTVQdv;V+n%kG)Url-?Y+e=c_w>jTA=R1A+bnl=4{qh@t z_4r1|Js69lfMOgbYsOhK!J0`Fbyzs1<1}kZDC@A{=$OJ89joB7QALM`s*Y(q&6=}1 z&avrvHa(BC8lGXI&+53qRxU7sRd`OvMK-<2rk8M8#}z!U<0>1yz?v6X^AcXx@QQ|4 z30ikrw&m?6XilveC5ZJoMU!CRpk}&2E7e= z)iQ0As(!rY=^ZMM$9`mMZH+Wu?e)$ zy{+2TnMmZ4mObs9HeJqsBo2Acwd{$;9MH?AH|Z2}Mp+0(sEnY%Qw&#+&-0gGxt0CU zrwrF957TJSL|x2ln~g`za3|=uPX1eHi6CLvMJ_CtQtBD1F4<6m=~J_ZX#+u8-3Y-P zaw8)aIU7e($JJHcqQ5lA-3?eF*cWCRU#*@rmWW+JN{KoM+8sXO=|=OXa-nH? zlaUjVaBRM~B<*<;9d=YCLF)~dJEINcPD2rn*D`{VGAf+OqjgOVyM|pEcigh+HWt=) zZw^UIcfI7{?GP+ul{s7Kms|o%f=>fNE$gYIu+J z-5TC!{Rasg!BIB)P{R$@@7M4V>$9vG)bO!}PY6<~_i_S1}$X9qG_Kny=?fzAlRYmL3aL2rB@j%d(muDMURNj z6Xi6?2G1C-))4HGyfW%mS55sCogYQv=v#KD!{ggcjRETv+`Gf{= zp&Tk3pQAr_>(bwztLP72_O}9rU2U|zpUyVXp3uG}{WHk-bkKy=wAE=3dh5h+7!S}< zA`n6fYv?SFG`d3t%l$7v><2V`N52st-|DZPq>^i8lFg#zX)3u+CK(eYr>W$6nPiJ7 zd6`OPWRk6-%=yO#P&@NGpC%6-EIV9zBn+U!tfCDav>v35o>bYKr3w?4+xZEzPxhc34aLG%# z+#!O06u<$OVT?#D-zkEBkAO%0qY-DnKqTPhBKWTe_!u7dbNaZ{@?9eMp9px?@)J_< z3K1OCh}nx}7W||Xe768@YL;4l3MWF&kz%q^L@)Kxv&AGJ&58+gg4O<$Gzd*F{s+hD Bu9pA+ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/PriorityQueue.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/PriorityQueue.class deleted file mode 100644 index 7e88c7a5dc9bd17124c67d5c024afd8f27c7e9f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmZXPOHKnZ42FNxd6e?#LvV+wggOUc3#^c!s?LgZL1&7VW-% z*&bN>`?!!<=6AwPH9zeK5o;`Av@*Su{G>D!X0J{er~Gl*bI*$?8YUjtI+nuoj&Nt( zz7|%=pE;A?e}4V~Fpi}h3Yg4dFK*?r4^teb zIm~dl&9is7cb9v!+?(St&tZYXJr4IdEOK~|#=|r!X*?20)MP`Tud*TAvfT14yZlHt zCIwQrth(h*3lv7W=87u<$ysO3wdqTt;uz9ik*>vK^)cyHt)@V+ z;<)Q&*^oxnEE`U(=G2?i+O}zU7WbdH&dbf<_#VSHrAzWg__(~`)IDj{n-9%RfdQq+ zmi6`WGJD!Vn=$L2ySZ$70((b_A*1w(lVHAR zNt>jL8sXP@*>K$9aYtsVvRMt%L?#vm(pGc6*6>IojY)2b;3))+=gKzE$#YaEHO!PTt99ZrN$MhPhzz74~jl!#LLjP0pDO z*EFPOuIU)WaUJ_HpyL?#PT-`D(;UuXSjRc;6;aYLiZLDMF|MP`6Blq%$0Z!lafN5E z^6WKS7dZEyB_Yu7S7^vMDcw=D$su|m1qdo|GS4FE@$^xD5C;mhF!j^Y| zol!8lP6fN-!#n;`0-w8tJ&W~5wV()7%3Id=_8sYNXEG!v+i{k~h!R5;wTrWi7Ex0T z!Q#?Hm8oEtl(P)$`i^Y3EGOhE)44M$YPG*BGdU5tvUZ4&>k#Ng#1rz-+`f(_&~s9R z2UN9Ox4NI(u`TF{NJifHjFZ8-PI`4!IJ6gh>lzX1g(~i>y0h(i?A0P={g$4?J0Bf9 zlW?*x)8pfsq}Q&1-37iUdUNl0fo&H!{c9*#SLXYong0-*H~PzoC-g@%|1pN3VZyKd J8@Nd={sN_N6+Zv~ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$1.class deleted file mode 100644 index e2f4f7ad404244907d685926dc4fc980d5e3520d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2483 zcmbVNZBrXn6n^gJWs_xTS_n~umVzjGg8-!<&{mMriVdlj3ex(vEEib1?80V4OF#I* z8Lcn<1Na9zUata-|Da^NJyrZB2b24s=&39$YD~MoP7z+(} z4~t^BBjc`&_Z371N)#U`Xu*f#;74L0ua9MD3_*9z$anWM^k!{mHKT26`WnyZ_Qr;7 zWHReCQf<_=derF&MFBL?mRm+|gW{%vd~86>z4sPw`~e zo^%{dFp4Mc)?yux*VwLo)TcQVtGUK`($qBa?$LXDfwQztJfgMfDRXwg(fKt)r2R~F zo%IQURh&m!#aWz_v7{n_q>2>MGN|&Jy$l=`Sj959iWRJ?SVNzRUNH>AU>L2V#t*V} zs3Jq7mx4oEkm_VOeY^rxjN|eVUS$DPjABg2x{7-+RcwH6J5VZdN{*4JQ8mU`mC&`fFvuhwb@C!;=lxI?Kw5%4`t{f@vl z-r^Yovw~OpX9O93f}HF91CexZ5ushk{wMHP@r}{XDx?hrB?}SBMpW8Fm$c=@P9ETw z_zT@K=%?sW(sBS7D1H~|JcNtz(e7}W+5Hl;j%2Ec@a6Vh#8N~mCrI^rq>4}$+AE?R zkSGv|Z79-xBJu!drH5q_5uEY@`slhHWjY-tIzhBz1g}w0YG@cM$usPcq9pF4VNpch zgZkaEG<{Mfv06^kI4+ei#1%!F!%5$-Xe{E?aez;&0K!!OmrDTOlDecXCiW3o+{5YF zWD#d_q(KwIE_!Iu%1&Khk3Bv^6tfdClI)_F!HKeD6S#uciCc)|n!qGouaWXNiZ@6s j2~(atSJ6Xr7kRePEdBy`3xmNh<^4Ja>0ATNw;=ro5gjxT diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$2.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$2.class deleted file mode 100644 index c370a549d3fb57166656b5bab357cf819d6d6a3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2021 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$SoftRef.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$SoftRef.class deleted file mode 100644 index 63ccf84fb046186d88b7475a558a758457c01a37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmbVK%TB^T6g{^^3RoZDTYN2CASzv`D~uZx6B5+;h$}Zk9i*nT*n&T#E==5*XiQxA z0e+P6PHB`x7wTs2bIv{I&b+<9yaFg;K7#}%)6g+xAa7uXkZ6doL7)mDx#@ULdyBAM zs8lb+m9Sjlom>003u(8@J()n(twULtf%I&7(2*TkUOHi@ZU0OXhN_My_d3m*430(3 z)FRYw50+F$+DUfBhKCe_(a zN2hV!EUv6RgNpelXb(|WhR;E+Lcc~*zd^r#i+;`(BRmr(hByLSg-ek)j4b1;Tn;0A vmoSR4c#_3db@de=q205iL5+y6>UR;e*=>lSHH=4H6HEi#OAI)T0c1V^$q2M5 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$ValueIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap$ValueIterator.class deleted file mode 100644 index 0b5181b4c124b4c3f7a10e58892f405e9fadff4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1233 zcmb7D%Wl&^6g}g(apF3Z0!2JaS_0%j;s&V;6vU>0R4Gu2qHNK`42dhpt{exYzkv7{ zSWqMud;lMXIO9f;A~xfN&pk79?%db>{Pq0@fDSq?ir94FV6#l?j;2)?TiA9`b8t_f zn2p0}ZAYNpPtuVuk7Y1cevnKiNjxP+kqWX<+ppDom8v*UFXeGhpnP}|XJeIx0i8Sv z<1l+Fuv0hk(ijNXd&xT`u+|S_^=dX5s`QNAEe{W|;h-(> z*kB6ISI$uTJkHXSza6an!`mitut;UywA_cl$^v)UK@&H*j04a$773I_D$55+pk*LO zl`qoaTjjj#h7escpa4sEiM&F#OJ)&Qo2_rKnys%Wd?B@Pf&U^8q3{uFw6%c8a1ob@ z9Aa!NTs$J`y;AcO_9<3A(_YqpTGE#mdhO{NPw5bz5evkk4nh3?_UhS*Kk6c`=PBtJ lZ{Q|9oF!-BR(|_!CJk)E=Kfu*bN?#2{v7iAK;2?=U^L^p1RIzX|s+Jax@#t1RG@B{oP zGbMSpyjZ^MpiAgf#*c3CSJDbDFz^t!%MW z7k9#Pg;%wX%5`Zs3q6@YR;&|Qk%9DVdEAmMS;(C;)SiDO3F(sK$-`EoEQ2#qb~!Uv z@@?Usi@;HFoJ=%pPDn5=q_}1I6Pmoc+Fq<{SwtAAjEW&RNf{viZSNnuZ8-#|Z~0~}q( zbu+)V{shWrI?x`Xt`wicT!sFKq~6A$-oYT}@)4d16KRgXR^d|QjbN1VRc;L9e3vkR r$#{~*R(18|+tBXW(V#{|SM}!z+Uz#O&>E(qu4$$L?j;7C!w^y*S-i9v diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ReferenceMap.class deleted file mode 100644 index 5a50bbc4d2153fa34a3efee00cbe4e12118b7ab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9118 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ResettableIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ResettableIterator.class deleted file mode 100644 index 2c02eb7186bc721e20b6ee3eac2e1e46ab8688a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmZWj%L>9U5S;BRS})?oU(ic~KOuM$6uhTlsV!+EY3j#$@B{oPF%dj@nB8G^hnd&= z@dQv|Autn|3zUT1@yMQ#ZnhUfdA5_&yl)K?)~9&#sy2M^?3A~z>eO8kcGfjg-ITtv z)VA;KFotamYu`rxZzL?ERT?!k@>qA_ld$?qlW&du1r!8A5|DCdiyzQSg9pDL2!f#CJq@9zq>ZGhkMrOIe3Y09f(H+>ush7| zFguUu?G7Nrgki{#GK?6;guYXa@`PxyJQ32PZJksbZ4_aC=vH3jM(uRtw_Z8nt;`k>^8~$xXSpDtsc`hLk UdZ8l3Auh!sA(9S(h2F#91q6dl8UO$Q diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$1.class deleted file mode 100644 index 510eaadb3baee013648881a7ccc0f5225a5c8668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1671 zcmbVN-A@xi5dZC6>9xlpDuN1rpjK@QQp#6VzJiFcvB*P}MBld84Lx$b!@Da9#{b6` zA2d-gn)v90f0S|ddX!puIoot+XLsf|znz)g{`&px2Y@N8=;+5p8agI5OzBWDt>Yew za+s0BtQ_X#Ft1@jLx~|7G%PoJUEbCq4b&kL=`OyXXx8-0`GvK6q{n`NEG@^ zTX5p2X2Xp6)?1=ON|`~k{Eg;bK=7m!nUv`|0k<4ViC%SEo++MKGMmG_Wt@_P4GiLz z0RsaX9x$xNY=z90R~MeBA7_io*s~%7JT$O~B?C8Qs0?l!xP!X}mN7=%7dK*&j&f3_ zwVEGz+zhHBV3?1K71gB>(~ly>Z}qaQoX$;C_;l^2>EgYM5Atu5<^H>;`i~psnK-~W zy&e7ZmQW+hW*~WnG(e-@AkLD0j%IUE=nLriBe49$7bu@dQ^*HMk`0u{7^1l$=Y)6x z7fCW)!sQ5|ghaSE@Ez)_{AVcY5fUHCs2gOq3uK@JGK#SXZ$&8HBR?W_4+?L)j!)w(=we&Rx2H*=@98&fQ=Af kq;1qmOgc)8f?Sx)JVr>4Qu=g~@^hX3M`XjOBnwdf0Q@6)asU7T diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$2.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$2.class deleted file mode 100644 index 21ad16af392746e1cfb950f46085886c166306d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2093 zcmbVN-EI>{6#i!HcM;T=Wt84$w2}jT0>QV)4o|=bSy~%y<4~-+z4l7Qji|)G>sK z3hLJCWGTRqtkL$Ewf5Cr{f&XE9!z;E~@1RwOrD0S;IU-Dri`KZk%DF z=6Y)t(Gq4uR!q0qbRC~|+m>cvDSBDnZ%fCNt5=2JSQM=}hRpH(aX=>NZLC)?8EAE5frB9|@BRHUk)ps^ds+-WI+u zNpdRg;kii)By9!K6M^e7jOGiqb+I8T?ZC1t)ksb{DNi=t4FWWh?>-q$C(%pOmV%Hb@?qY5>mg|pQ)SRB zf1%k5=xpK%QrdK#Kv)hXhPe#-vfK7ddBswB9qBFTNp+TiVdM?$!Cnmu3>RZIMQ+Jk zm7ZMP${Q85N1_h6V&ErSHBd#)z|Xj5pr)2ZT-UH<;0DGFe6L^>P&80N*}yLtqaKZm zW|HCXb}=v2{lF7uFyHNJhSPCfMzyWPw4;;a&qY-gSQn-#eLpubPE)!b-$~(%yD;g< zKLcu_H5sgQ`f+$`I6m*l6lq+O)OA}}#}(E`@v-(9tS?4C)H^yf!gPfRn}#8~H5XxA z7^Ay%i0)RpY*gpdzK=LSqyI2Qh#w_t3Y;E5FTMmTmR^8ABaUM~ttrw0Z{q;bhN7Y4 zD;%bs;RudK9%hgX-(}w*al7~&JoysIr=+yg$;};3vRx-%6UYvXe@Qz*Hh$?H&MGIb zFz_6y#d1Xdjj{43w0GE}1VpA^A@ghUNm(g9{`Ajd%=Wd)m6X{g^uPYc@j9D#Xw5KQPPh;RYAD%j;O}JL$n{H VJ{Y83{f^T|{Tph!1nsB6{{u=-@%aD% diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$3.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$3.class deleted file mode 100644 index 913dfd6fc2b2ca37b48311a055a6169289b2bb30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2273 zcmbVOTW=dh7(Fv~y!LjTG-(oU0!%T*v6DE>wIQXY4G9go0WLxCw%H8HM$S5{Hg%}yn*wc7JD*$Fv~SqOvhA%GmsdBL zhpE1n(L*ps5EZTD7$7Gov8Oh%6S(CfGn+kdYEv~z6DJOvbOYtvLB$v7&Gj{enTzbC zmhjb9<%XuwOz~UHh*MTJ5n{P;qpI$^T+9K>$8f7NTiXHC#xa*Bor)LOuE(7)OO+kp zQM0bz#Ga$oGpJKxp%()d&Y;`C%K~S@^gNga1M?OZuxMck%LZPt@G4#t7;CXuYbmu* zLP6kitIo^*n)21!LC#pEM=V;%bqi18DGRS-#X`TByUKxdtI z!jy&?H(u}(#qd!9ppHvlimo(@Otjzt4v<>Wv-4IX5JIA*Q zlA8|zi5!0jzS3JQHVe`2_GX!CSTacsl|Q@kKNH= zRAt>o`aX>K&xptF97^lbbmf(y!+fDs>$u##reboPlrvAf+xw}fH zy5QQw+#SzUjm1wPN^foDVRqW1>`07+nH|OBY|k>coow~T;9rjn%QS`wWD+SB)FiGz F{ttmU6HEXA diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$Entry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$Entry.class deleted file mode 100644 index 9e1e05fdcd3ae4a1a976fe80cc24208caf7e50c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1843 zcmbVNU31%15IxtHEZI?#)`{CD6lhCH9NE-`QUbIo(6ptYPFtFielRejII68wk&G;d z!VE9{7w`kfOCDf`xC6{E^eHp^D28(-5i3rH&hX&9d-v|$J-cVG{MX;V{Q=+%mI^q6 z**r>kSBm$fcwdSO1&WLEbWUoQG<-OOd~EqhYP4J~U>LJH=H+@timN)V>G)Wx*EM{i z;f98~K=!fyjX<%!W^GtC*YcXRTPtgJBfKD>Zdh*D7EnCweIzS#7J)vTF^0ecksuTwRwz9H}qaUv+J-VXt1dI;};keL9N6_)0slHw1DQ z9nT3b2~3ywqu6hmS?0}of0e*S>yBsN?5?la!Ch;`rKMQ+8n&CqL(G$S@2iZ z*kM0x*#W&`c-_!(Yw3pRp}!Ocj@KNlA-1xmg(bfmH0*1RY({CY^JgT<22Nnnz)N_= zz^hUm!-RoJDW))Opo%vPlrgR0rodP<7JGphoXwiRk^aQQ=`VL5J(B3f=LT-!wiKUo zH^<)>2F~Ga4R-|2|F3BgIMh!U4=Cs51))fGLI_#l)C}(_hOAiaw(YG7RMV^^y-ahQ zu8&RLY|nGan&Gr<0R!N?jF-G z%XPwh24RYAWTeQNm2D_ybsOr>Jj~!V%1PuX?=i()ruqycxQ{VBV7iAm&65*xAiSQW zn}~o2o=ikgGEB*dNfOt%$}`pc1lpq$p$m4i?UL++K(|3RndY92L-I9Dl>K~i^iYPR5r81>SSen21)$e(H@vGd&uoT z%Wk3|)gCl1df%ec@^ovUbU%fDYPWR0pd|Y91bwrz12wxb0L)hS7 z!`B$c6Hec^oU-py&1&v8tBJF0k>Gh9Z{n?}IegqnIg$)H2Ib!|{NNczilaRol3;r{ xTr9>q`*gTCM!kpeK2h4{$t}{|6I-aghK3 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$OrderedIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SequencedHashMap$OrderedIterator.class deleted file mode 100644 index f262de0eb6547448e6e8c375b9444f863d7d2b6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2340 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 P%NY;epOxmm+PnWB9n*x{ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SetUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SetUtils.class deleted file mode 100644 index 3e46357162aeadbc3ca181cd5cf7c6628f7ad021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3750 zcmbVO+f&?B9R3b0WH&5OD2qkB)LRS7Wee2O7D}yLDlIq5f~8*Cup8LW?1mH{SQe3iB4P#SBT$izU>C9iaw1}w<`0^HRRI?mBBPTt$%V7Cqe+JPi52Ohlvpzr zH8Crj0}MOzZ>LWsM@Q^UG4Cc#H|4awwR%v=DdrGEWn23^Lugn_%bZfl$y00DMOjZu ziz-RO~X}aa9rG%&Uamt)H z8Nv>PfswI7AzPEj&A2J+lBwyGL#4L3!Yg8xU6pdniRr}^%9UQ#8|%4LM%Qx6Wvjvr zyS<(%mVtH;DSsx=S}v=ll_jgRR=BmRx|~*0lHDeT6MmBIDn8@j1KdRlzKt242p20IstIEw;y?8TuJtPHWDmOC#Pb{2Y*o^`GB!Q|VeQQ{Cd zyma#F?2bAXh9f0B{cCp}I1x6vh4vTVNky`gfutgd`=6(sqwB%PG3CZ**}Ny!<-rs5DrmLP*XvZeE=OuR7e!Oz=S0PE!k+Z;c*l^fJY%5BoG~iJ(k9v z89$!4JAfF&5WNun5CcM#*h|5Vy>*1iY`!`3l~v_4qgG#LL1-N_S9-$uvtl?;)pmc@ zi5EIBT(i;6RxZ)&%xJ=JXPwuFC8u#MN|;%fDlRxVX(hH7o0o#dh(uP;-+jX99plG? hF#U5aK5YV_A=Q*Wn}Nha3lMB0d}F6Z;k(ish+Z!{NE-kE diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SortedBidiMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SortedBidiMap.class deleted file mode 100644 index 68b47723c3073b714e32458655602eafab4edb8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmaiwJr2S!427Th3zT00hX4c(I~xNNh=CJ?HiDqgRH5{63><(%AyPnyPL&5+&wih5 zKc2Tc03Th3CPRy%&CnrqRFq14kxLb-jfe@8(Rgj_fs0rKN67^9WIdgpg#eYn48fMiZ7Bo zNL6T|TwOcsc^jiuD0}?_S#Jp-%#YUUc5kHj+7lK%S{P|_alTZ1N=X0XV#U+}f792H S8|+3He|^j|;hZpGHT?jvNzlq~-3&YufwuLto33B5DJ9Oh<2wFzfuWwLK)rJeexkHw3pD2) z*PdBlU9`Qs=3bS??W`f{`qrxjQRVJ5^m9Cub>8y*mY*02 z&t5G(W<40#oR0ef5U?YcI%)<3W2!lFgZz*i0|JB50R)n>rFGA;Z#k-;ZU3TCzhbt5 zZoIA@*9^RdE`ipU@ZG?9TrltepBcD_OFBL`@DQ|Jgl*spEE^cXkimJ)2y|8fW=gZ` zR$;1WuiCCZwPD$7iq8hFqM*Y$=If{*20HMnfj2NL&=Eid?Z|N&md&C{!LC7C!Ki|J zBrqOrhK>_Z;6&9`*m?55n#dthIb#vsg#67$v|_)tvh!6)I$kjS(d^lH)3WSxxobE} z{uCmUwfA0Bwp9l1(C&H&AYt&WkCPMj!p~}E;{)oI?LO3z-Vw9|Y7WE2o|!u?zhP;@UR%b^OJ?NB#3}un=yON;BBw@%H&Pxp`8ONwhU`*rl}c@g;OS?Gn6He}+g_4$UsU8N` z#PA_o&@5ZgE!%49oIa}a2tx=Pr|PX-#p$ZG3X)Jld8WoVeq?+V*DA*M=~5YYs|bEo zakeqe_I(~>O7sIx3GCwZd`d9PDh*mxYvl!ocoCiQ5-!V*8c*F7PsGJIJt%%na%Eb~ zKD`G~MGE31p%j@qLyaTr1l|hxsu>hOgQ%sQDK3a diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$EntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$EntrySet.class deleted file mode 100644 index 46f24d3b27d4e089ae75612354dd49e21bdddb33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2693 zcmcguTUQ%Z6#mXh=8|Ec%B30$iinsCk`O4AK!fEb2!xhUT3W5047144FsaGVMg1rG z2l~Q;u2rGxT3*-k!GGY3kNymGpUEVIE?&k5U(P=J%sJow_ILI^$?t!E_XB_t6g9kx z84aDd9-&!I!z?}!!wm&<8e}XeSZafc55?lL7*@pak%kynBQ&gunfG;FL0-WIgY1^< z+F+U?y;iC2rHsdhS+Y`Q<=~*=)X0|0mg(AJUT_W9Hs=n_N0z&8Jf3EV6rMV6$)Z)l znXw()%`uF{f&#_28N&0GU5nw;n(bKm!-Jw#-7<=0TIpP?m_~WqsM^B!7sG-ygSzOr z)u#o^Wzbg~$Ewbkjatp3FH-?I3^tG`t8mT!oC1ep@f8NiEL%p^^N6KtyH?e3E3|Mq z7GK*po*1b^*Dj}4{B=66nia=2Y=>C%#OhnhhO?L2DDIPz)A4%@%u#TY0_DA&uLk8R zj!__15$bpxS_2SgOUOdjONwZ;5T%Q&=PD8{8MPAOP?~bpI;cDmSyzht3T`og!3unn zK{FYh7I)8&sQmcRC_^SV0E1Sj99B(h$rk0({Zf^V2z_*1#%p32(9wl%1)DnFLcfl; zF~BertnTabH7=Z?-BY>YizpKc3JhIm)zK7P#};nu*v1_lcX40G$M{6Y0}Sc-6bT&} zJY<;sFMPZv=s62{qgZpRhUt3iV*wHCb(s!$itcYD*bx%%j4_Esb+~7_s}|L6ccZ<| zm$qh@rd6vAUQ1KSEC#PnFI+36=VL^`d&puV6d=Mh6GFns)e(E1gTs1q9uu8Oq& zkGTF5B3qvw8fAK^!j5%BujtT457tFbOwfuFd7__wv^wdRjGisghGcul0~B!4pya=epZFA>SLfV4M> zyo(_p&xt9!@txWy)ToMqS9};5|xHe(EbI~ za5Vhuaa4Maj;!?TpTEd^hPJFsHY)!ZI!1^@yN*1?$YIs9c@#Wb7i@t3O@Plq;`8X@ z3+U&INb@D+$S(6`Z1WW_hjB6TEWgyaIn*pg^3M?GooL7@pmQ?b*5l87egJ zb-MCABK#&g_$~DEO~iQtQ+x|^{5CfDHnzxrz;{sQ_nL}~lNt?0oTefU#ymwj@X%MJ z7n{B!5I-NJglL2XvLUi^B6$jSR)noh&|lxt#FjDXHI`_VYnUR0dW&&n35jEx?g*s1 kOszPJURsHfjT2*)Ze>J{Q2Wi&4wZJyVxGS5kfn_N1*{l{Z2$lO diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$KeyIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$KeyIterator.class deleted file mode 100644 index 8aab74e1358751fe88f751351bb9c02512714b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 zcmb7EO>fgc5Pj>UHgOyZwB`FFlmPjFI03|gR2(QERSj?m>V0EYiHl=b&IYCb3Jy@g zfgiw+LcDbYN-HkD?Aw{yeV&;&>tDZr`~=WO*M*InE*#t{aaT3w?J_oT$H83(_XKP` z4yUz_K&PLiBVQiKV66NgnM{&+N{k{E=+Nv3TIw)(F$+E_{YD=21WJR$SdSIGH-i@xl7HP zQ@3ZDW6i0LHSY>M%1$7k@`}z&m4gQ6SjMs3U@ry*T7Y^}0?M*yD(=Po1 DUf?zg diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$KeySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$KeySet.class deleted file mode 100644 index 083949dd5d7a0886c0b858ca99343b610f4134b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2453 zcmcguT~ixn6n@^#CYx**3kYZsl~$$rjUCHp~w?7W7X8g2>1{IXLU$P46) zUUe;JJ~6GbowK}+4bQESRw}mTJMzBho4#XRty}B1zhFL@5lAd`jf-{uxf+Ue zrxavmB5XWTO-55TYh{A5*b4#>utV1-tmX4FvYN^k8%o(aFEAP&KtNyg>Q&3W;m8K) zI@Wh1GIs{L(IbyD20HPohLVA|@V0?|oDnF5>ttE}gCYu?YT=}XQ3JOzXy8M9WZ+|b zVqgh(4cx=Bh7|+%<+l_*HShq#0u$j)2OZpf)K6DdYkt+V{6Iby60gxP`H)&H)JQlL z=INliv@E+;8<@_s^4G(+*?$H?4&VXkWInIqGxjrg0f(a;8a{nLY#T~ToS*{_ zCS+Luhu!An#@1{<$ZOZZs(E=?v>(qG_lNyu-K=o)oI7droV0ON*WTjt4BKKdHJr0{ z{s_sP(kTa!w2K^|L6M_L{xx#rZFWw{- za+G;Wgi%uYEuMLX$S%|!-dpvp7XA34KDR(qfAVGh=#hP0dZw&FQ_3e|oW(m$j47yr z4{g67wk-V+d(eJ3=E!;rNZX+!0~lK)i+vDlj;jhCe>XSg=jLG{T?03=nM4nx{J2& z&>^2Dqq}(Jt~$KGlT@GKbU}Uk&!5BlPoWoL!~4nDZ;>5DSkVQpH=u--fIfg3&_*RP ztQ?dY5{i#*rH(;m6GO^ZxU6j9rm~F^W%rbC@KE_Sh;bZI4B;%&j4Xj$G?vNkK^)bzwWsVH+hx!k5t4EYZHRq@qHP#JrPBcyT{!i z96Dkq+>vzLU^)%_h@U{&ajOFM=)Gs t3k{#JlH#ag`Wvo%eeeTku!=HcYubsm%3@!~3P)|5#wM0gMUf+r`vfwIu^IpX diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Node.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Node.class deleted file mode 100644 index 38d6fffec4774aea8b6feadaca5ba2d569307505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcmbVL%TE(=5dNm!?zUxl2nDtHK*iDr_5q?I;EQNNENH}V@V3-VyRdAr-4eL^U+5no z7Y>>r1`kFrl6dgq#fwH`JgWbJaeli^fzpKF{ zfVBbf3<~qSf(uQMaZwnTgf^^TM8T+nF@kqqUm>(-=d>j)WolMFb!T=?&)Fjc-;!ol zbb@5*%QlOt;zPF73Cq$;t(`Fwphxiv_&mf&{MhM!a~t1vouY{FoZsBYqpWQ zQOV8g_N2DhD^M6*9yKh(zQPSeV>1js?tr&u4NIS@EX?Yq``WC@<=V5woMz5wB}3R% zr(_olt}W+v`?hF56pb|+z|Y@j+!_1@tz2+xaKQ=A)gM(flR-M8dsAZ%2vj6^^Z};f zre&A7NT(ZDu?;gN265axiN9Q{5^03B7oLY^YPpA!lc|7d08<$~D3_TL!JTJ0O&BQIkF8MEESGmI(h9~Y^7N84Zs(F1fI}srP5fXMoB-eIA6loQbce}kX6A$_VnZBZ#z9B^4(M3PdO+THMd)&6FEpvl7 z#k(cuG>g;dbx1jjNOg>R)iG4j$Yeb65>o#*(Jcate!)k-5u`sm@YNc=iarP5$5#_& z&BLUGkYFj+Kg@N6N8AoIzMU>Npa$qeKhAMllGDVkrJOg7c9vmoD2U5A#F~sDoRI^F Iu?_hD0rM|WqyPW_ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$ValueIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$ValueIterator.class deleted file mode 100644 index 16c3ef877c02bbeb8eccb8ec35847d4e0860bec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1233 zcmb7E%Wl&^6g}glcH=q}Xv_N%+EDUKHKXM)ndf(2Bt z-~;$5#2Gh0Q?c=8&YXK^j_+&y^Vjzu09xp{uyMzQgS#c}Du&)$!6vpG+;^}oVCzvh zskQ~$y(B&G<&g|V$`6w9IEg33C{lqA&AzXt4uj{@;DgeyFrd9k967v{a1)!Ega$l@=ZKM!!G>> Ds+u`U diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Values.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap$Values.class deleted file mode 100644 index b091cd6a5dff974bdb20384b99ca229a707d5cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmbVM%Wl&^6g}f4c48a~rL?qE5FpSzAdm9sA{7!8Aw^2r1Vv&wF(WeI*p)p&g*6fj zkoXZ6AOVp;;sf|7#GS-VLdC{x<~}_4+~aev{pG2E$?CM`S%uxJqijtGJTx{gL}ZsC|CW zV#sx0`D!32OE|mIm+CIV%~DdJa*rXs7d#aVOC9NpN26h1gpYaOqs($AaJkpxq117l zOl#8Av&X%WAjfI@z6kd`9z{CbNywl$#i2J!NAfi_O_j=RhK%b89!?@+n3YO|Tm_U^ zEtNaZ`Ac3ODe2YQalU1t&Hx6HSb?N`n=P%GaY$n`4x0?y$pIMbZZHa6@la}+SB_1$ zrr*y&9w+s&?!d+g3k?UWSaWa=>kPZe_GK#akys4*iReeM?s9?Q_Wxkg#5d>TxYv(V z$X&HJTV2}igs>!OEm;W)^qJ-8+oO%uT9I`q0x~ePiWDzVbc-T`tX&zys8qiq^_e0A zr|2~44vaTAO}?Xj!db>yvb1qnixIZT>Sx)?7o@%+{gM2|`nL=9*;zdeEUv%vcYS8w z-`32Gcd(52|HRn9`50pd=?RDY513Ch4>pGN=@^j@3n2NJ2=tVxjh5m8*%Vo`QXPZM yX)MZ6nBJIGo47cUR*O}@B|?~rY~b>w`xUH^-Jq&0{p-%q^G&iO7Tw=M6~-TvqcE%h diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/StaticBucketMap.class deleted file mode 100644 index 16c37d5a601cf00b482430ef140a71a0611537b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6457 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SynchronizedPriorityQueue.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/SynchronizedPriorityQueue.class deleted file mode 100644 index cc3a142a16c7fef763c96e7541c600546d5f7366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1311 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/TreeBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/TreeBag.class deleted file mode 100644 index d8e3e35a61ceaa5f22b4c61f4711b1f3b540f2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1211 zcma))T~8B16o%hvmu}r|K?)X7QSr0gVyl9Zh++i9M5|svFnTxL4rR%<+ibTc{wuwq zQ4`~}KgxK{c4=!{#hWv8X5M+u*ZlnT^*ewf)^uDmAaLD48aH@%(}2mYiCb)PI`Szb zVX-N&S=Mn|M^Q&fAo0j)IKhTMJeS`W(6+p)5|}DG4fVQRuPA>{R$MyCls#Lz`_gyV zj}Eoq&}j+e%AQ{<$)>aqRmt}1b+6H))peB}IK1EUmD-fGb%BLk`AB|{rFP)Br7f@C zl)el+f1P6+^fdAXvg36lgp(j4LF1sqZ+i-Xi37)P1p>3Vd>8M^My>Rwazu$za+)jo zcK+mcI7v!z*K7N>+HtrgW>i*@E26t?)%2Au16386?pMjGSF&kh3TN5eVUsm+7xzr8 zU{zqIFW&WhdLPQ~W6{I|HgmX4Q~kdl3oM@^+*Sv&?FJNsMnc0oMc&OQlx7BpNAJU) zCuFtyl)FAO+Fsl9@9CG-6bGcf{Lx!x2qeR)yi^|rbe;h1utXm>O@Dck{&<2`>K)l> z@*W~iJHWKQLA>iA)6ncCal6S5^wvNO;X;#V~V;#Sw0znrh3p6&f`J| zy@0Ysy{sA#YAv zQM&C<=(3yAZrF6uN(ms4%ARe1M3K5_p;AHO(Q{@@k_8)LY3_O4GvE2nWBlO7-QNLB z;i82>Oct;YCkuEVQ=(PmsERplu{L93)QTH}ajrRTTUFdB2%@mV()X2{c%pwE zHlr@T)Vl1gM2p>(6%{jnq48~)v{mA{1Y_O{y<~xKrnnoh(iMWf6txs#pzeigxf?W9 z{F&4A*)vp+T*trS#Gcqar!M3PAlS7qRPhoQ*iq~`y^H+g(_D_(b~?*yJt5?ZrLUMz zm>R>yQhm+2?o@myT&;Z4T;ry2v=OTyy3Xu4n8}kzuo_V}cGYE1NFR7j&!z;&#zCC0 zF@m>E%-cAJVH^A9cuS52Io`#4gt0VfH}U++a@6R$?MuE2RG3^^chxl+i;eTRVB=#f z5{_;&tnt`Z9lwz{iP{l6f#WuoaDk`&=EEMJChXfzku`w_vrVyjwEM(R8(nG5*R1d8LMs zgC~nI^on(K{IEnWHm}p2wQM`SOnxK^(814Hz7}38NRE34^2GKV!3dGN&EQrgur##mbHk$n97ACNy|(EtDd diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/UnboundedFifoBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/UnboundedFifoBuffer.class deleted file mode 100644 index fbe7cd6fc9478f9dac3659a14fa130d42ad9cc47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2741 zcmbVNU2_vv7=BK&ZIW#YZDT_)Ldk_{F| zXLPLJ&Zy%jsN?ta#tU)8I-tcnXVCG&D|Ec|Z-~#?EJ;S{Fmkcy^F7b|ywCfdv)BH< zybNF`rc^YcUp51>8C0Fa<3SZwIO@Z2fa}L(Ga{Sg(rna+6Mj6Tq83NxJm$lg zALABwIa6{*5iShS$nnVba3R%yD#vqimdQ=vGs1 zr3_o3p`~@D&FY+y$(|(>pOH2)hDFPOX(hPoj3sF@t1=nRJhzfYY0GcgMozc0%s|sk z?1F8k+lSnB#;odzgptp0>FDSX*w=C=!a4pu^E~gF-$e$obCx}8*k+=PzDuI3v1}oi zFa}JSzI7|4V5ck++8s9Laz;Y8jbsq_qC1Gave}5Ove_iCxm-*`%xOwb_vTUsDM$Z& z!kCjO7T7d4YiKfeTBeYUP?!x*Y!e|a+gKV~= zMPOsuY^0D*k7iAaP!;aB_1d<<(lC;moz++tnngQ}IcLqurQ%%(q7@N=?%UL7u_VWt z(%eis`*?+)unen+rI~q6Pcx|GIZe7|Rd(G5cLmY6Fl7)34q29w>r3nTypfmMoEGT( z|7Zfuj#5sU^~UpdPEXifpr-&}++ zMuy{bKY?v{*m2ubgm&H133r<5Sjduf3D~re1lqhkk#A7LPyG~4>;lVjoRo{xJ&UN7 z181ct{3Y#+fv#tWz!YaXAN@G*LxRdA5kabgL7U6K!}aYh16H}qpxa>tdiWN>3-Bq6 zP`qUq)!YW=Ds-$Z=@>;@5k&M*h$`A$i2fustep(4TEgn95>lBa?ZEOUIO+6CvTD{5 z_L%p8jAyUXsIag32+_6;(xOr6j1_wkTkwhnMK}h5<&SS%_wH2|Z~PW%D`P4Q z%Q%f!DDSJ3^);Ay9Twg|9&hpV+js%*;7z=X_i)}(sEaD>#x7zt6F-V0{F$$3dUg=C zooimHQK=vjI@!)+fzv@VM z37&G@7EgCq5UIui=S2gbfd`y85ArweG{5tPXk6%b)RbXC9@GsVb|1hU`*h6ms7x@MGgt#&Pcl@IzN znGeQi|0v@*T^)0q*|OxEbMMai+;hM8^w;n2KLAv)twO^?HXABbY-UhkU(}$W#HP&V z5u3*uR5CCG(l2e-4t52Sh2p7zQuCUYz+BySt>duWu>AM3;n2=P-7}?gDt(*R@um`- z*&TrwbpeUWxQ#00$-ZJo^0(~rsvDR^Q!`zg-OL! zQ03N=L=jk@CY`R;viKx{jY4s{iY!&sywD8<77O)rc_9r)x-H{f5*<2b**wwl6k7so6CQ-5(UHR~9ZSgTSjJr)D{NM=Ch&YhH9f@G=M;E5 zq4H`d`hZ%0PWod(SB+JSq`1n6=3q8@sK3J{u=I~^1IfxN4Zj8&YWg}dWJx4iU8B`D zc|kr^x`g;jK>~ARRq{ZIQp>nbk={$fJQirhfEzJjmohmwT`FH9F-+J&3eO@!u9p=P zC?7YmNDPJ5k6ByfxtVO~8t0}#WGkfa}7J%TNFkx7ow4kFr0FRxG2V;akL5BI4l!87$gZg!M= hG&PsTH0JJ*XYo|-w~HBpVfl^+%nHJ# z3LQIVE4~Jrb$nG&?8wv(P_@Qjs`!Fi@ho-H);rSM%7RhdaT7@#GI2j1FmS=d5-u8e z(Zox*WMJ9E%Xr1a9_%&oARaa$kvFj)kC=EA!zPCGY#b8;$p(8eu2Uz?th-`gwk@e? zICIrfYkFeh01gsM!(odyCM^Bw__p~x)LOTR6%9=3V0(i+!Tx7?Bnq;);7eaM!FfX0 ze;Ij!Bim2hL<52DMy^_~Ny0{%4Ze+UI}aNvElZWlLt|rO0@FJ>EUhP%$k^1i}_}yntyfJ;~MtP&NwfR_JZ;kWwAmIx2@M? zluM@-@1xBO6XRp#=pZj-!3#BtkmfXR>5!&xAj#lBlC_jQn#X}oDpN-2mqd!=2({Pf z7or?Z-G)ewR1r#zyo2xtA_5y|6R0AZ5>*&_xxI>5DqKbU?I7M`9QVNB_#vZygcv?1 zqECqKQ)c=MkK=RxfPq>Dz9VDQ^n0Qa^Ip_Ps*WQQ=)hp=77}luiz2!KQ{Z(NksFAF z-=bp(I%Slmz}+CU8O#Ukq4`GOU_IbaF?h&ZPyZ8Kmx;6om*?u76ABp%UBL0~i`Gwv170=)|OyhT)!XG$;KXCzn;S&CC s>g000f(f?cNj%LOLiEz@IgEXjyID;)tA8k}{{$RGn)}m3`4r550l?}F!To$sq4A+pfVLX{k-JU00hbjm?o2xhmd z(xAPx)RE2wUN22`zL}_^(5!Ftvpn+Ep$Z4u53|uIOAF3PqQf#aaiAjqaZr@G3d?PE zxS^tZXDQd|R6nm&Lbj!Lf2fX>pQtqQcY`5G);muHb`}hc&kIGt%s>@`NoRJu!?v4y zS(S%+D>khyo|RrR1Rh+pJk(Hkaa-`{e;W|YpZ7(_ZFA)J|Ct+id7Tcgm-l5XGO{^b z%n)fX+JeOoXm-Csx+`B`ePU*z$^WcbD=*>5D>URaE)lynSq%?!%(!pN$`^upT$yq{ znR2#Pf5Lu&ntixV7lsh+b!B#yO7_%eV~h4=VShDF6Tf diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractMapBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractMapBag.class deleted file mode 100644 index 3602ef1ac7db748559e082abbfd166ad6829ec9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7864 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 ES2j(2h5!Hn diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractSortedBagDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/AbstractSortedBagDecorator.class deleted file mode 100644 index 332d9034321ebdf9892038f7b5b639be5fb0ba91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1186 zcmb7?T~E|d5Qg7jyWOP}Q9#5`L5W7$ zjMx4s<4h@a!>+E}%$$#TpEGA>e*XIQ9l!?GEm*iGX34@N?$@v^{=pOsJQVXt%t{Tb zHLMZLZQa$`4x!>S4hTjoISdIiZQTvu_B(!68gb56V}Fdnd9^RPII$bg1?~V3zsZ(s#k*;4#HJjV=sW&003XK(U|c&r5GpD+JA1AE`}X6NLY}t$k6TTj={~m?zo0+y~=Jdux*BpjBU9dx4b+zeZB3|ua&1K zpOZy~_=;f}-YP?Maw^Xd%h;OE(3LYReb+A+bmt{6n3UT^i#=IlLWthp? zPD$kzUOdv(qFpYN7d=f=FM3pjs}^`k-Qw=iIxj6V3{2*Z`8%%qo?)t)rffOz7snX- z&sQ)c-aCe;?-h;-%`jRg8MazW?fG8C_YOQq=jDJGwSCeJ*Kp^{804oPih3m|Rl-Ax z>A2SL7-{v$T4yaHhQ%<{;t&=|ctp$t+jolkrXiZC)SEFU`oNGpZHM?_hgTHzqE9SK z3YM`V;jw~Mk$Hj<32O?{B3MU;A$9TIGt6H=oG!SY!;2o3LHETl@t-q+s4sX0YVbiY ze#Xbz)buve*}Z0u8ODOF$*q!_F}dsR+TNz^TUtoc6P^*OB)H5t*R-@4kH1dP8-~G# z<)0HlQ>^K4xo>)h;VJ6S>@)GeSwiS4>8k30{m_IcnjH>jTTB1PXiViXPTzF`5h&=O z4}K7x=%Qyg{S8ErM2z+{3bbCP%o3us1C-Qvu-8>Ys)&9Gl>M~IbOKl)+9Iw9RZWYl z7@$aS2J4(>q!ijjs)|@@`YYNFPcfZj0vfa!)(DvnQ2jM|9YqH*gkge3a1A50isClu zDWEd(;;HE>q*mq@F|%mLc8DoAnKDK(M$BQsec>q`lST gIURmM{o4rN9v6vzM5(%W_sih`)9h={!)i-^}^G1i!rG=f1JHPK|cUCWZ~E^fCxiI3q2 zjR^!zjGs+>17Ahsnd!1Dm!z1Ore}6%&iT#%oHMgO{(SicUc6sVXLPuCNe z6XOkG=F^DbrZBgJxh>3{1nx2nwhh7`o$f&tUMfRmW{=e1q$2hNe5M7RAtLS%&TrtgSud&0;T~71wB(IsuEh zUakVi&{uXEwEIBSw2dd7R^4!)@w!DbLsdtoOgQC3@BU=8&YKLA$3v$!cEvE{dxh)? zXNWJDw&|4^p8oHe)F@$Z&1^Hw^%6vxYJsRmw^;F};n5SrRQ8zVjq*l=VI*5!=bK!! zxZTv2>+96fVkP&AGIivOsP-WThM4YjY>$pmg*;uO#Zhq%W5V21QN#knL=OU$ zQN?|fR9wWkic6SKaaEWsaw_sDFqC>A_U=ZgQRU#mFqHlLWp(xz{^b(Uf$5h8-Mxkk zqx*^;!cy%wxn(xwbw0B8HOiCGCxu!||Fh`F2^t6Jn-jqx5=dbPCu!ys&6Lnbvw-py z>}9^NjmSsoH%vB8KENVI$c}Wqa2liZM*cWMWIE@fBR;EwDE)v$zA(Lw=qGxNK!6k( zyiC9q2^;Ua;XE$TDg{Wa*eoHj5yDcxeC!;JVlA29Lf?194hnoBnIc{C@tI7t+K*rL zWo7b(EyM|uD2(kO8N~+*2n&2o^?DN$mW7Y!QFwva4_|^q12Tibvo8QVUd)I?xv-(9i$_nq`Sh_ TC8FEjbRaD43uBm;MY{GEu04Yd diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/PredicatedSortedBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/PredicatedSortedBag.class deleted file mode 100644 index e52262e254e753171b4042cd2cec1b532af45db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1521 zcmcJPOK;Oa5Xb+UmlM~4QVN9fYI&wfh)Y2TDX51AA+?HHP)jN#4s7ftb>-NR?QrJG zw}A^4AR*2iIU(^~5VNl1mL|yLKqAkscV~V(ul2WIpS}R7${o-i$gu#Lqe)k7#l zrsbz7BfM?iv1w(dxv+LXQ-7YN`Cg0<@o`_ESc@`*Ic)`)73XS zdsO}gxo2~^t5Re1IdzQdF_ea?gTS)&X1qh{>Xtk34Dr~KG5;j)G+nAfl%#Z_EmSV}Pe(~VWxcux~Mfz&3sDbxc+s$es| zaia+y-o*yFPC2G0OV1pppwU>QFGdO{kV65}I7KTnw6cN>tpe(2u;-QPK2q;Oz0)Lf zq$4$ENuE8>!Wo*$pNexR(SAmzI%2IMO@BbCRBQW4zo%&m5~PO48wA`8VepF diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedBag$SynchronizedBagSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedBag$SynchronizedBagSet.class deleted file mode 100644 index 8a88078aaee87fdfc8dcf6749e45859133979f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmbVK%Sr=55Ukn6#KhJ3ek&ew@Vz45A|4DXLQpUwUMHI&8Qtv4?ndzSQ65C_;0O3o zVomg*Q3&QT-PJu))79N??=PRD2xJ(F>nheRxwf^h;~jzX#cs$-7xG#< z%~*R*S;d7<=t;lk99J$_MPcboAXyBmN+4I#zB+0)Dk?mc6_1hOQs7GOOorOvuVB)s zW3H`k(hJy!zOTZfC!x^~n6=S^R2p*vd;g!-AJqzMcHp6wA5(9&F2C3&?zbc}t4`d1Y!nu_oJlS# z`((7zrily&8<3&R(mVOOWiPL;Jwq(7Ji&To+(IAE0cL@FzP=-VfK6n0L9ZW!w8k6a Z4_3s9#)vG8BS)L%PYFzs3m=%g>No%Z diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedBag.class deleted file mode 100644 index 2cd28938250df9b382e05217da7a215030ad5134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2117 zcmb7FU31$+6g}&2yK3{%q^*mAri9dAiD}vZtxHJjw&3E1hm;H{51`14qg0k!S3Lx8$XKStRx)cn6dGUR?^+wbI!f@to-L+zx)bd1@$D>G7$JMgDHHZ zhL6*Hy_Ljmb+4+qJ737XWT4@$dbyWGO<;EG2iw?l9ozg-Ht*@JE$Inp zb=#J1&C)v^*%6rTNY~V@ZRvJQ$Ns8*UqCz(I9qeZJLOu zv9BNK6-&2Ul`nVqS+Z(DF@MG*HoS=VstJXhQ0@<*xem71gdr75oM?jpee_U5`YDM$)Fu~a@nY#8hdZff{oSAu1Iuw)3vt;%zx ziYeQLu&cbQR8qyC5dR&C;S`??q?igZ`CUUk-0zYt&iy&=Pws5~QT!RHQtlY(D3*J# zZpW5;+1PL7OtQxFTsP0ks(Vm~bH3Ic&OT-In*sf~zWy8vRIN1TP(+D4g*q%__%r{5 z|6B5ZM}B=`exB2i|A5)YsBOv5zv1V9j57j{-$2_bmR0x&XG^`q%~EeUs6^1_1!lF- zuf(j6BB|ti%%H`YJztHo#tf!W!3TUIPrnB|*`Wr>8KoiXYj_;=;27s3DED4%mj9tW t@7sKi1`q76oES8~B5j*dyH825egm>$10p;Ss&O|dNO_q5?7XIdzX2dY(8vG) diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedSortedBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/SynchronizedSortedBag.class deleted file mode 100644 index e506ca2853295dcdaf1651bda8cc17a789351b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1667 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 AD*ylh diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TypedBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/TypedBag.class deleted file mode 100644 index e1fc49eac5748593c4a0e040140da8544fdeecdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcma))OH0E*5Xb-1)<$D%>-+rz53QmRyjc}g5QO3br68WR+ck}(SxHjCZ>1+i!4Kev z5@)N`gNHPS*`1x4-%MuaVJn z>xerco63>8)zU%4r|&Bnd**&1+)DLU+zZDSf$JRlB8n>IUZMz@L*3vcg{l{*lXk1F z!b?&2`DLW4rSNMa^o;)Vn63+#u+k$sez;@M@W0Xs*&Q$N;ypsTRIYImanp+k>q%VB z?p!joVg8t4U+8uy)sbiF&36qOrW1tCgr*tRS*RMGiJMwYv6#)HBkL9XFe0mfe6Y46>Z~c0>+& x);I)1D6lFhYyCD27GpU$@g%>7i)H9GPfpDdLt$BkR8ei)|4S>R6^d$usDaJ6NdT7ZxiR z!;&@Qgtbplz1Kh(>(6Pgeadqr_&GGk-9#FlX5QZSTV@#0 zz%bjHXCNvVVUJ7j4Wpbd*=fAcHTbp_1NCc^uJ}=arEzOb%Y_~vh5x$n#*nFMO`keRt>&e><5bI-n$zn=d38-Vk$ z6x>vhi6MmL7)IpfU1a;Xd`~{D#ITC@<>dnfx1?9DA2F=Ou#OD{w__Nk$^vtSm9IhfTAZN;hN zHET`HmuVT!ng#Mx$&zc|7|yFDfivAfM`v|Ix33CJbVqoDZ0v2lCUCJ+0@6sY8x^yt zZ@Khj!2Oa?0~|Y`vV$_;wZ- zR*OY}BYwiNYLxu4W~S~4L`}cyVJ|xPo^KgDUoHzA^TS>6g~r6V5Iu5&NFb0t;2{tx zlr@zM!;`XiQA?|s_cI#xkj(&eNcZkvSja@z$`9Yhk05}5Ab{hW!5<0YI{kdLE)nK+8L z9LHH`3bx`XNlOabWakcHTf^hfu@lE@xS-&(IL5%nPq>cm#;qGQr&={FTPvMP>78Fz^#;(AnE~=Q%*KA8I*woCTcc#d>^Jr2lIrm)Bzw%Cjk-CI3 zs|^AI<4vjyWwlmYG3_O8YBAt4Ru6nudpui;+Lr2+?b|`U#+oPC0dvl=JJt#tP!b2o zN4*sg=;8WMwF)9p((LAN3mmPxwe1r}aIQm3>(Z^Y97uKH3M7M)tDAW`yM?riJW5{N z7lCsm)FCnbNbhuKug=3wm9?;^$hgTt;!<`&&T@?l{Irem$LZm33`a1^`wRSZhH#YM zzCPNH({h5AMTGeT3@87D_z{uhgC_`WCifA3;QGJF>i~U#D^M`Q*g2f!D(*$$6vnv< zNy+($SGfw&7EPx1(etzWR-(ucE^reOWL$(%&kHZ(4DIxHu>`GWagJBXF2lQwN~HD> zNhKd5x(B5R=@HAJ2Wup>9)L|WU=x_YB&kgirib?=0aJLzPmuK!3^74(l9#?e5c>tu z_8fN^dk=$91388oIfn2m|CM+-qC`w0%@t1(US%1Vc$ZC1B=^w&7;%9|NHqH!bzf?M zzSik;MDV%~GV4?AeS(3_eGL9izz}3-y?8x9t+zp~7Z>q{oBmCghNRO8sd50)Te$2Z zUEv&fg-w%zEbJgoyMdbOoCNcCTa$ADlX^{aUDx#G0Z8?lu6B*|bqAzryzO^qiQSRP zIjB3|xJcuk&oev5IJ|>-x5KktV}9E;CO=R<&l|i;l?`${haTgQKsNOV!_5Kpr28Eu Y{C%MKL7#Grl3v7hf(R@TCWIUR0TB0*S^xk5 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/UnmodifiableSortedBag.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bag/UnmodifiableSortedBag.class deleted file mode 100644 index d9334c261ede923f5b83c8ce2105bf9abb40ae2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3034 zcmb7GTUQ%Z6#h}^AIQsx3T{cSTrVP6jbIJy3T{WxhmWLrqZfDZaRi^> zQw5(XxGT_K(JWmpu4`6BH;uK-f`C{Oh|QZu#a0b_T`f9V*WZUr6aPH?>!Cn*LCc$# zYHI@Pqgm71PN`)zzoVt{W~sy&-it*oZxgJN%9)m}73S3K^jQ0@0-f__f%x&PZfMI+ zX;ZUS)y*O;16eaqt|}RG?HfBb)op>q^CSpQ>4t942wZ-i64uGg-q9-pldY1GQfkd8 znFW2zrCM)yX=y{xzX&ddS6ZHX38_IICj~wbGD_arSuqcc9;(R&itR7 zK;-(Dd9CbrUBNxB8D6O7ID0fl#%N3t(hY&rM=}JR6sX*K(&o;amcY>HnCI=-dNGyp z?P-!#3k87_e!`+^Z2M)U$LjX%}A*FCV>gP|a8<$QQ4E8daLILaH*w9VIOVb{_m#4o z66(J;k}@s9OE46eQOsdpL0Mw#2~4+9%j{;ww$!{`Q_+HV2FXeE$WlEy_Z-u|_D+hy zs;Dw6H5vjVb;9#SwNhC&?L}^LA>cAx4SZUSJbwz>mg*Gk+d&0K>L*^4$>$)RYJ?4F zizDTu-U>+ecy-JgB@)}#?E1J1oUFPX*)0xbtHxHvTxmF{s#4~G8WdsG%yZl=UJqV5{lQ+C|sAaNPtOgsyC5)2V7-2ejPY^JPSN#N8KS4hebSHS} z`5lp;5k8vZE@ST@4mFUYzm}sPm-#Qo%Mm7G0x7O|mhdXec$;_G~~q3-q;0pCf|TeUK@iYWEZLZ5$x}8v#R*o%Q1N0JZKKwQjtDH{JAaxilo5R!F5L zNE5i`B297*yu!xGKo-`F(_WyaDks7G?bhTpVN$JWy6u|2YJya)X{K$YZ(1OY;~l>{ zi|me6PP6WO>mrSKK2Pl!MnEXunJa6zWRTk%X_8;PyKsNap1N8y* br29Q3{2)+#+@~C&q!)0VAOeeo3E{?nE3~AJ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.class deleted file mode 100644 index 4bdfff58439c2fe5747fc5b43ca6eee552786605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1244 zcma)*OK;Oa5Xb-PI8JMu1_CY50_9N>2gOoB;t4Iv-l7;E@uKmDp6` zNe#^!S`5ZZ8Ov;&q22V7wD0l(4~~T!BvF*aLpsAy1esL#*YZey;Dc_f$DqGSjs!#9 zldLc|B|u0PCD9%MztJrN`+&yuvu zP@#8*3+KvU_QjOL;51uhIZUf$uqf2~OyrRnI^}<*=1l!5Q-cEUi_Z+3P49${xf}Ah z?;iLk)X#2f(Zo<4^Kg{+aKWFlNkx>5MQ`G=BIB`0hoZ=q$~;U)X&~N8HH7u^8rV@_ z8x|ZJ4YVn@i_P4|HLTiL!*v@saMQ*eCDyUZuv0=Pn<>MK62kmOP>W~VK+9Hic9hA` zrKfx~>yy^bZ2AU$114y7==(6BQ}s4!mq^=&MnAGT?H^!Y>84?Yq?uc{P{lLUNne|I z;WDm}rYH?uC5EorQn0q@Wc0S=e1rBIl`nLk(2U&P%}FXU`4l9kI!YFm%X2!_o9TRq zeu^r?S;DJ1f;l75I10iJ#Z%Q-iqJlVp)DZx=E|{Vp8I6BJ5oWjMk%o TovCeUu{Q6&wcVv^G~D|K6bTKv diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$BidiMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$BidiMapIterator.class deleted file mode 100644 index facfdfd3b496389c7d8dc4257674def6b4891b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3175 zcmbtX`)?Fg6#nk*wlm#Mp)92!MLX0A+byzE0eP2F3KU9_77Hy_x!s+%gWH*PcD7L8 z?*}pQ2OkM0;ty(kk%*>`R3Z{%d|;ySA2OahGrK!2RSf*l`#kqM-}&yjXSO%~{_Yxp zjkpj+96gm-k7KfVST@Hi(Tlz+oWLVh=*LO9cB%>k7?jOv1&>yt3PTDWQ}K8d)i@*P zLT(PrQz;c`6^4otIUAMDm;zJ9*(g@wOq9@{P>_jY4SH0J%ifBTk0Cj-Rb=HvsCZJ& z9ThnRu7bRR2?ggEDzd^cESF(dx9yB3MOLK7jAY6lAGfU>^_h&3a!olNHq+*~$R^u| zbFL#&?*6>U?4z}#BD<48HC@9IuI(_?cApg!BAIv1OtLFjC5uQ#@IQoxe)#qJ4JWNf`%Bsp_gl5@(~NsbLHDX-J|~ z!-LqYp#>WhoYydkrxZM`;Tb%u;5iNV<9XR^RPcg^-Pog{4SN}um(s16IT||URzpdK zF3RLlk?C`VYjmDZ8CjXt3|k8qsryRCn{~=K-L^85`mjM`I+mts%Fx9KC9^KCBi<}I zzo_8=_G)OC?AvjOp|c3)OT9Q)7)KXYn*5B|j!`7Qa4?MH-PD~U6)yVrkTkr6mo>a1 zqinoM)OKeyKTcI7q-$q~uq@lv^EpEgxjr{$Sh_oA=(d-^6guUPG|)H>p(YroSN#hjE0VI&3w>aQOBs z-NFaUP*dXOzeG>6xo@=!i zidVOZB0X@rQfIPHzV&5=2k!0C(tLBzrf!~1fh`%vO1OnpD)`}Y6I2XY!m3iXKrN=F4N4%uaG&@NEfE?L zK17t^I;vzC5gEo5_#8BbD@E8P6fpRQsNt8ef`1f(Zz#f3#SP%!4&-Sgq_PiCeHGOM zu_d!u`hyQ$L*HlL@iKasQ;3jak=B+u#5hit6hL1JBpnR1UJ*bS^{eB!NJ$w|bS0Mp``7uY z40hE(?54_m?xkHm5ySQuiEO{z$gs<5FYy3Cl-j2Vrb z;#0^EWaC9rMVWFIsbobJKa)R5<@87vazZwEGd=hA>2qJFXI}sP+wTBM*i0jjLKa2L zXE26^G)7UfZ{-X(F1lFE!o`v`KC`Gx*1Vj-6Xn&Qy4ZTyz*9Dwv_{a#1 z)x5xLc3KS+eXAQjJtu2nQ~PxtdDiYZo%pfW78qFz;^^6Z6AP&IATUwY*X_39&e}2Z znLT8!u)-Z3nSlH&#~>unh!>kk$6+KemCM(*^{y^=V$UzH_xv_iWLn`aOP|rJUgTTefp;MAL%`hgT~;kLrpIH$0V zI|_Gk+eJ-b!+Ji#9f9h*>!v>^>hBmVbmUSwfyeHrF3vonO(yRskux9WLi%u{|x+BnZ|*cjMq ze&JGZDA1F%PSIMYExAqd*B!{vvvaXFA0{;r@i7 z)L!uqxEu2a7!laC#0&dKKS$lZCdn@xAS1EtOgpbIMqF0l6|Vk_iD{>6?L$4s+#vph z#P>bhS((k0YOkMc30WqagDdk$%OXbQJSOD=W@HJAvW#!!MLd*?cq*6BmY0*F zE-~>%tYU_pcWep$W_9o}eS-7Y!Y8=E5-0HxbM)Cce40ef;SATa^o;T+^Bxp`Fh$G` Lr#ZtsDvtUG&P=O^ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$EntrySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$EntrySetIterator.class deleted file mode 100644 index d4e21e126339a5386f262d8a75f8ba3572e6c110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1753 zcmbtV?M@Rx6g@NDvTa!ukRpmoMbx$^MMYG=4=AX_;s-St!H-Orv8>tdHrp-1SMU*h z3QZtHP1N5$l=04XD>XKnNPo=Uotb;jx%ZyC{r=`ag(8=Dm>}<3^N7SE9XR2m>V)@ zx|NFS)aYs3()2B5m#lTGBC5IBQqA{->Ce}NJx6;>qB_l>*`h{Kq6?1iyHgnx9l9<9|>-eSKJiNvaGn9l7X!fn;FZo{2L6#bc@HLFFoPA-t>Mb zW>$z~-d!i8g9Xcx_v@9C^d5_nO*_2>*A(`O@GSKnZfgF9MclgsvPJ1PX)rA9gGeLy zmT**tm=$Ko(AO?+V(!Q-DsNvp(>S+}`TtkR2z5S`N33ZY7{O^Ba}0;t zC`7TyGYsveu}FF>3%lqGUoLE!vZ}PnFxl))s!@q_CPm6hxsLrNRgz?r+d93PG9_M7 zty8L;>5Pg$Z(sqZ4V=MQ1GjNUS$7%k?IX`W1vB@LXwClDeoa?1p?PV#f%q8?x19;q z@Tq@<|I6qybp2L%hR3Zid&9a9$xkbe$uMl7#-i_8PC3|*m8HMZ(5qGvRW)#HEi*s_ zNZ@B$okQ8TnFO4qFJTXTBO|0-QY=}T(s1x383!jCHGL2a$LP%jr@KHhJGu*&Wjo;6 z$POaeb34#J&;iGBTKnmP3Vsh!K8pm;;~+1fk1yc_ouwK9Fht<$m&7nmQFvu33Y=`x zIIRkBnIfsPRQ5BXPqVw|_y#?@4Q&@O1+FRZZSePWr-6My#pe&v&mUosF9(=LBSwfx z<-yr7{#&}u$#;r^MBbt6GvZHs6T9gAs-k{`!B8O7E(N)b1KP#WkCY9b?4`b!^)O0trmS z5yzx@yPTjzMkTW9k&7W8!&D5@4Bd04ZF+YY?q({EyQYh}FxI7RIJKH%H^^F+G(1zi zSIt$kChGcpwc)wK@D`fFx<|1kQ7>gz7__ppDjE7KrY#>fYgOq!7FCNPsfuF=Yel%G z^24C!t(y(%|3GdnOOJss+O~AdmS{92#mgPA84oZ^gkBe}vUnU=m7##N2s*q$(LB0rP~N-SZo>5r-#G{I8#8AJ4i+*0H4&$lOusVi&F zCJn1=Q&>&1iDjqh8uGrWCOCY=%%>Gf3_8bET#KQ=aUC-p95*N)|I>1;lRHH>mRw*xJ=i>~kJ{z`s;*sXHxt&hfox)6=wG)6*<1*%rm zk_y8om)}Dyg6%^%@7h=;_gN)z24@M0k?329uLv(nr;CRW-(#XZ(i6c_=xc?kJ&^xY z+m0UeO{0tWe?W?T#2EX80{e^^_QmHhN*%_K!g=bh*cbO16+=c5T=4(FC{B`1QI)#0 MQ?wLyMPJeQA7vM;Y&I7eUiVB46fl@60{-+GzXHW0>O z1ZSgY#84BmIM?p?z~(h#BPO}en| z$dbJx3G{$rCk)GQrwI8}?ReES%FAzdA_97#-<_t^Ts+J1Uxho1L zTjDue7v_R+47K--A$Q5B5L!6>ymWVxAZT-zC7l^&R*~$VKR{M}f5zsDL=2xSAyKac zOu~|@+?YfvU9X~zj$h7TN-=I&5oVPMM)P*n(d7+8vF)nUt0C1L4IQ|wp&fAzhmg?F ziZ%^N^boptyEn(pFA6j73RhlV)n!=;fiSXDp=2$ER65DsP1=^ZmMlnK^R-3Z>M|)F zG0CLjkxDDf(J-!P7{hoN6B;HlrJ)z6)WA}h`+oucRbImMKCyO+U->QP9a6JWw>=RO z4%gMDs&W{N+;4teEVH(Ud*o1iTrsaF-VD5Arz5~;fsV|;CMZK22xNjA2xbO1 z5PHFm0J?bWL<2xC(LhfTrDtfRO(f_Qj<7FT3xK0I!8;Cxlj!E~YNb*L@S4@;1I~JT zAfCx=qCvrh6x=!j&-q3TtwlwoZA9n|V)WKS(Y%OpABB{Z{D_bFbb#;9aFE~=#J16R zKOWvhu3rNtMFTh29RUWX5Snd9@v5wz`b48yM%iY;S@d~OdruspU_92k)kgc prLUNzZ)@CbpjT==9?_&r!C-_+vf>?H3=Fb|(M; diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$MapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$MapEntry.class deleted file mode 100644 index 22705ee0705ddca1013f6ec4678b57876ec75933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1507 zcmbtUT~8BH5IwssZE3fH1r+gXMZ|tV6;Y8QT4+g#1!Eu>_33td(=Kjz>wX}pf5cZ4 z-!(yqn&`Vf$~bphNQsRk^02%2&dfb?X6Eeu_50fo0FzjVB93dlP%s{)*Y#c`k%}RW zjCf_kn22C9iZF6f^4t*7H^Z0;xkZl|3uIei%{<}E>89?^hcPXor)0YJjs#`dG`YQKFvsDJg!N>3 zlWnn_=juj|PL26t`IF>LZAb_%T2(HgudJJV)oWC^z0N8ISrTPSW5x!vb+K<7gKk|X zE)mM#W?4D`fw2P^>Oc>*QB*zDwMt6qaCd_l9x)qlcfw$1E%&&xNiEK&TE{v~gt^r^ zkm%+NyyTQFVj0yoY;?`?Y>hAJqWa-3bD9+WSJ02!3QnOAqfekMP{0ot9lMs52{P1)Yo-xs&1XDmS37$ z;ksE90jln(%&Ym@-LqQ+RvdA^d zX0ByR80aEcYHfER3o(Xj+89gz8R{mt=Mn-$mh{@`U2|=kRbG@5XnN$G>GZax`nMRn)QT%~6~*a(qFxBG(Mm>; zMmq?I{O9kXFuo+y-x|3+(eK33Q^g{S+c3Ea13LFc61Quae=_Z zN+ghJP5NoWf1v0f`Igdq2&|-cA@3p>oXUJ9OuUEMX$i^5enk8`!p{5Aj7oRXR^}1s>X|*hA zc&6Id%vG~48u^7<({qL4Ew+Spmwd~jQOZ;q^s=)m83rq+Eg!V%HR(PQHH$pSiem_? zDqK_9fm8R^%_h~a3ace)!A^ z#yHO4Cd0zfXB>2ul+q1`DPNFMs{S&t-^Ue6Lz+K2FkzB3sr89xq3I}PGK9*IgBtBm zfpSOx8fAG;>U8FDFhPIFp-49}Qvb-X;Y#7jwm>`LVaSHdb=;-@2(7;(wEIdY(}!v8 zUwzR95Tl!bp`We_ogR(>vW}6p1Pu{dhqAeCFs-nQ2t#fM+FNo)Fi7vXN?@OmV4sm7 zJJmjbAqlpfQ}pSb(ue z*@{|1VGudJklRHxf~^BMUqh@Cd#n;Th0}z@Nc$bcSA?h0>EZ#z*O&@>`XX2kY^^Y} z3$mZ+TiSlz6ncpNHze72Ot2p)u%DP?zkD9!RAB;1oTciDeQ}RbF<=zIIsXgBah%p9 QWvQz>NkdUL^(CGE0fTvTSpWb4 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$ValuesIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap$ValuesIterator.class deleted file mode 100644 index aa8dcda254a148fa42b0c8c21927699985da5d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1434 zcmbtUTTc@~6#izq?Y3pxLT$k-R7Gsdr3#8liHU$Fji`w=81-qojAhAox7lt9{uO_P zCJ>?~`tJWRzNu%nTS3!EA}=#@E_=Rn`Obd*@$oZ&IaHHK;YtDqrqpp&9Yv)p=_toB zokR>XN}f%ScV!6Ia9zi|js=ETTX@p(8J5>wuUQdoVQ$Ha>9$&~)1lk8rRiJh-LN*T zmS|V*H9Ed0On=n{I674EO!WJEWL)cx(kX_#vJECF>r&)Q@*rou=!4%F@*>ZQt zfxRT)Wy`VryA1VW&%NtgcBSS^Px!7^JxMmD4F+x1-6W*Uy5-2n-Bv?-&qTuxl5lVC7vjw8KQs;wi*{_q4@P5v31Iuf_SVi|IST0liOa+gMv zE0zXzH0Fivj1*PH$-3M1O!>f4Rh}L&r8zYf13BC)R~ zo5HU9!k71VP1#lyU|8&TrqF{fmI^f0g6r6C3Jpnb`fQU#Qx?Q)Dz2dNFP0SMO#>Hk zNynmrTez*`j*^!cYX8r=zdFjWa!jm#zdOG<+^=U%nr^^5hOvQkR1MCDmVnoF-?N-% zRq2ZJh*`t0jxeCNQK?`Y!B&uhVd^M+xK;yrL2Wf?)qx0gorX&H}qa>N&(+6N>whvy8>?2a1*@yO?3>;&0jv@-MpNO(=NV4z9a3IHt zX=E$(0^khJlSH9#0pk>2y;KUE-bAqwa4nF5Y`J`ZsDjfJ+#dKl`l5%HRuQ>|IFBO5 zV*!d0M9hXLOz|m<*d=d;wm?B5Z;|?h*o&-wfcO_eNRU$7LsFYp5Faqa@%*sL!ve>l u6J!!PAHoPvAUYlj8Tc2Xq;|G7_;52+bv*x(7yqH zz!!ZmQ4Bu#;G@67cmIQWX1f#~5EDt0ojGS_&U}|M>Gxk>z5?h+-iAO=GtxL_<2W*D z^de((m`$S(C(P%h$@QCA&TKiA!s!&w5E{!eP+mwFp7ev6oGeRcR^=SORPwzFkFKkn zP@8!{7j;RNbNNCg45SlYt4jAO=WfaJ5Z4*jo(?Y)?q?>S%Q=~=hT6@I)z1%YrF`!+ z!5Z_6iqJBtJvCJ=6;yCf7F^D>PWp~?r)8i`94D=CR#*7Yv{v&3antiuFy_iiMR7L2 z1uRERMdoW6X$Tz~lO;3Vg_ zX)O#(@3{V~tW2o|_SW*Ep>6fJE4`WA z?ZR_@Wo&Vi<9o(qZqoL+Y1VHr4bxa_Eb9X7R5DJ2f{O67x&sDq7 zg9A9o#E9vwLjM*+pNOGHh*!ajTGF;Q<*@WO4g)L|$YoJW5actDGIMx=15`mbh0LXj zewxDw&0~xfFitOVgI=xUGg0R=5%cM;^XXZ~ho5F_#Q=}SrluJBn$0#d1-)kJ-$XZv Z+P?UP1dc@7A4La`Hm{}mpP}6ne*hG;drJTS diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractDualBidiMap.class deleted file mode 100644 index 2b9498861aa6bac0c813a70d1485963a9c628b7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5672 zcmb_gTX$PW75+w&C0ja4?OU|W$^%uXW-j2qoX5PjtcI} z%$Yg+eEXZd_k1(btN(uSWdOTyF^*n*G=>M8kijJ5*9*^OC9PM~Q zX1)=_lW}ar6ES=y~cjM@h@%LhQDu(YXwA_|HogQ}= z#)@9vE#~qH&R90<weNJmhBr$Qwr;*+{~g^D8GxE z3BEb%ovrvPY9?ZMS|Ku(_U>gj?=BSR;;v(J?vgvOSWIUI=y{l5r?X35zTjD|3O&bi z`I!NC!A;G21F78nd@fsHpUHTsVp^W9CBKcH(Vn@|04%AcW#DUuz{o%RGYo%JRb=cm2=33ocfnT^MCDK|6a=F>8^labFf#cl*m*Kg;!HHm!Eetd|SC<6Ucbp(}C2l$Lhe< zBU>V--KO%MTl6&UhMt{O#1!I(yoJ1%qRDB6W@Bu>S6FzXh`e6LOyZ2>wA(t)xY?P3 zp7&Z-zwh@}gM=NF2!<@ip8L@Jjpy6J3z)vmC) zmOENSy?dBv)<-xuJ;$P(bqlkmyc&zS$znd8ol)3SimG;RW?7-(g+(r8Zw=&?WNR+1 zL2m+*AkauA!&O#iL-O08Hv)UT*}0U;40q{i(g~%>W>es0NehJPycA_L@6G3y7_o*_ z#&fAR&7~M=tzgV(R{Ba|7nfaUue0b%_Vf~EW_7d^#*sx$*2gK;vqEJB8?o4Aik8q7 zI+hGZ%cl|C0RAL1oAy<~k=T{SI!$0S5>1b_XN!G=bv|CUL^SNxav=DctGcF5K7}Myk5DM%S>wQb8&leFIQRfl}D_ z|D*8|QLWSz`#O03akQ3TP>ZZW9<1Z;TIFo+LxHWTZy>D|l2Hm2C2wPSdzEH+6!8?9 z@b04=N3y!BJV5MeM@^z$T8%td_gZxg(!+90Ox9GxdIElJ)JP|Bw zWX3F+M@c5kxq;V3rq?j(o2;hcu0mrPHzLK~C#N-y4&%zwpi>;dQB7?C$M_V|)W$8f z3$%`q+R*<-E!odVmiZ+SCq`}+ehcJx5BcR8#DeCSG(LTfLq5kL%aM$9zJ(pnC9;;R z_K~$@HKbmUR;MVcXC4ZqAY^gxpba7sITZN7QpE|jf-}NzL+qP%_6K{H(G)^8nw|hy@fkyqm-~wx`O8FRb2>xCHxpA@O~R3UK%Xekd0B?fL+15YOJRMtBd;) z;*Dc9gqG@zJyR2bHx-NUnl1K>pLWLQJlbU#8T2Pv3(Hs^!bvmVw~Vq`Ser!#Iay&A z9_;1RhA<}VN31E1PWG2MZbOVU@f=$4JU7He?8Z-7+Lsva%b3Fz&E0H_j33F2tu`RT z?LEa9-i`G-x*~5LK4e$+NNF3>?M6lV*C~vX&?d$8b@E}e!Y|M|k?dc_76rC#iZ0)D z^6CHlp}dV-DYw9j*o>>#j-TTuyu>a0vd?Tg^=}4g`f|8}Ih-LM*{DYG)>zNj>{gvta8Q?S5tYOgJQcqOp>$VH9m(CRv*j zm`>&_@(S9LNs~O2O&;4@a==U?|G{ndPuzfi1p?RU2kurZS_emX(ujjLf;7B> zmgH4zlMHN^>jI~$a24-cD#U#j3E;L_+z6I%uf;t;T-he^tLQk@OTf-Dl1`~=31p)r ze6;7Usx!n;yl$MeSV4|a!*Pdje6!qUE+JY*)@xVSlVdwMZmr4j{#qQnG{?7;kqpP4 zIvn{+um;DN;n*!4Z#0*!SQ*)H+(V9g$#Gvzjt|u0*rPe_EF&3?hp)*ogbyA#S)(a8V+ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.class deleted file mode 100644 index b1bb89f838c9d96586c863bd5102b7f254845930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1549 zcmb7@TW=CU6vzJqTb3@XSnS2SR%_*ASwVdfQ=&DkrYH|JeIJ&QPF+~CEJVMRCPq^q zjL&{3229*vMhe?H9vHM{Q-~v{L|%!45)YNw zQKG2B((#BP@mzMKzspe0)?BY;@h-Pdgk`(!w%h5^>NvvorP|lMrtn1brEJQ#yj#f~ zGiZBmQ!u1!vLoL0+YRBp=M9HWGBwxc&N26-(uaqder+mOIhj&_5y>Uu4APe2$Lj%1dK82>+*{J2r%khtjoQYa9q`ICMNVne$ z9$%B4f$(}_GHVRRk=yrdu`gADx8@Y5sN6Sk0VNZwC^PIV)Lkalv0>s0u9~=p>n3g} zaTB*pY$|aV8w~q%kmu|phU$W#;RuX6k)bemdd9~l9TuVQOUI%fsA!usuqLRVX_%AH zC~X%>OOv*X7=1t@U-$v`m3A>)B54GtB`l$g71Gy3D`aq)G_t3xuMtC2i5#-Zv@-ga z%zs1dH{xGtAJP)R`Llqe{7_zmB&KRWC(4&6w5oqb{yVfYEHO+Is$&FWM4$rBCM2SS zy_p26{%nFCB^=BoQ0oi{Rf<_}vqOl##jO`vp6T{X&6X{QN diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.class deleted file mode 100644 index e5e5cdd436530d1b78024102feb1eb929563845e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1501 zcmb7@TW=CU6vzLwT((_CskPR6r`8KM*|zqLrl!``sMN;P^nF-H*k)nLvNZ8qX<{_^ zV0`vN8PCiT0sXnmYQ3|VDz%H)+P zC{r}?#6*c9x$CyvaF1atTk(UsE!x6qNZaw7O~2Kl)$^nix@v#w2cfJzcWdskXqR(m z4DkcMCK=KdwZSPk*VIZ7v zB<~C9_<;!hpv(}XD2CE3-pGBrwp5p+Ooq*DZeGfY+q#fJM~=`LEK;s5bcGCSggqA* z!tREyXCDmyP!Y*aw@NZHl(SKYCt7v;qlURT29=WQy8~<)hN!7u@VRKx?CPQ(ax#GBnRgUY* ztl`?`HI>emLo&u~3bSuhU~q zfkv7hvPmn)C9;?4v)mIs~QT$9?aNS6|XcS6U7Y_;kb=Ex_*wkv@>W=gVpCgqqEXE prMW#U7-QIDjg5p(4X`N@4@aZMwz73qv-fKN&?*%R=0vz9pLwix! zi^66|o!z+Ce#E?$xRd{$#s=N{u5I`9EDh9j!(?Z`acPpH?wzDaIiA4935M|`19Yj` z^rN6{Z#&9uixW<{rmP?^KXQb!5$Bc1IV`Emy*#$DqE?p$Zu~bt8u%=a`wFj)2YFn< zLj#RGc2uN-UCwvJuf1~flswf|KMZ6$RBtsj$D#&f%bWVdI^V|!ZDA0u?+v>yu&Sf3 z^bW0>EBpOjKiu{suQQgi_6oBp*JnAIs_P0Y4_IEd1rKG%ej+0`{A%1vnXc^dtj|53 zICKK%5@M|`#?#iiaFSze;+$kc@r6Ay(qeHv#vTX48ozh5{3sUqTgDvbc|Xg~WeN*? zLUt_i`WhouWViwrN-rP|j*&`k$4LLG3(oUuvJluH#3n9qm5)mZeUUo_x01j;BAm)S z|1w;u{2ZAP<}A|8s}ggILTVa!DXvX$iGtU0iO3n{&@qM#E2m54%GF~`jSyp%J20@T z(Mqgi-VkjXs~Szk*0@qSr||~fq>>EY!rKW$6H~e}_X61iO=A4Q)D-1FcMmuiBghR2 zazldLkRX>3qhGUdty(tXI3MgWo zic17iBPT>l3dLCOdK diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/DualTreeBidiMap$BidiOrderedMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/DualTreeBidiMap$BidiOrderedMapIterator.class deleted file mode 100644 index cd8cc52814bd88bdec20ffb5ae87f2fcc70bbd58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3337 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$EntryView.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$EntryView.class deleted file mode 100644 index 4072782e13ad03da5db12eafcd8b3fe8b0185ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2028 zcmbtVOLN;)6#i~3OSYrhX`4_|(o#YwcHG8E8fa68v@|ru#7=o+ykNz(b0<|smW(Wi z=^tPR%)sy*7@h;0Y?$E@SU}mZ;72ih*K(W`x`|lW_naf0bH499uKxP_*WUol;H3<5 zn8~1o*)+14vv6q`1{SpPl$M^ha9Jx?^gD|g)lpE1sk&A(sH8eH>F#bfur@l(FpH29f9;sFAVP19rXr*RXk4x zE3WKx6dx_efHE}*S0~XDO}s zs=FA2%#?OzP%}_1e}_>sulU`dsa74`osmPGoY9bNoWMy7H*BonIU6H5ZsDfD$sV2i zk=j_rEgO$u!p8HsB`|uxdBtzFWuQB5;|z}5sNe+~Yp7bN*;vOp8@KVIz|zqN?x4#8 zmt(j`<7PxhoB&ZT=8v9QU|2Srs?(X8zcf3`uI4KR?%%QdYAcZ1Qei!sfYE&6L4#!S zjWxwd+K)H4pyRz6Ykv*MgDRR@f_TtKahgXC?9uLVz}4$r z>2fpoi!wi_)3@WKFUKZdsN)>(;2f`P-U51mC?)vgTG28}={4Tf2G5b{;>4MsA*Ltx zF!Uo5-_tgPG5%+@hxryP^KInJckmEx(~%EO;WRaR>&0V4Epfx>sim`&60|-_6j8Qa z>PbFZE&c)H6C@M6#d|Pn7k)ufV14=rm=rC6dq`19?;&&57&rdJsd0mPVh_U?e}ern zEaN*EiCspDFrJ1-a(S}HP*C1S{(B#J?TEkpaLm{}MBqHqB=9K-d`1GFlfV}w@FfX+ zh3n?msF>ei&HVNdnc9F%Z9wMQfXtNvnaMtxAzbK{>mtT^PO^bneu^JPiqbr$%rrmI MB^0RVcwR^9ALKa(DF6Tf diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$Inverse.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$Inverse.class deleted file mode 100644 index cb630ffd5ec81edab53b9c7b22aced22499130e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6127 zcmb_gS#%sn6}>Hure|r{mLeHh##l~dTbr%L@}kHwv4srd$dW-u#tB<%)REemEi)s< zjtM(qhp^+Y#DRblFrWlmOO(WhgczIvNq~GnfOGiZ1I~fN2OK_ta9?-Ns+o*4@G-Bt zs;ln1@6~&+s^{{59)1kKRy^-RH%@rbh1-2NiFb&&L&Q5pyi3HpMZ8DEdsV#8gZKO3 z!v~~)r-%>wa2Owwrw@zxh>DL&`!Nw87x4)ZpY-D{e9Dhc<1>DI7M~OGc@oqjydx%}^%?_{uw@ho+5$_10rVl5u;Yd$$=elY12G zY$-=&>li5yL?;YUX-16U>F~G_Kdg_3I8r+l4eFsWJ#I?h8FVG5%!C3p5ScOJ3C_|2 zk%$o=2cp zAEQhATbB=UI=v}YSgy>TO-B>y26y*kbqQ;jN|r`D?*2>n5DJDmh1b<@tG{8!~C(hF=IxjZQ_-&X?kc^0s70m zP>`>i0DD6ry3N6`LQtYpLZ!+IJhp=pfC}nu)YP12YnY@e8QQr)Y{z$nNp^Kvivmd_ zt|y~$u5rhWaCC-F_1h1Qi>rbmLyub#Kms)>FK1 zM1GQQYCf0OM&lDk+?dE3Rj|D@%E+>11Y2R+spF)*g0|8?nG#X&tahN&Al;=wa+iq9 zja#Sn5R|)?aMn{uzGcw8TB5)>y>`|`ujYg;AL1Vuum10#^8QUt8 zHT2836GF=hVwu)9Mj`c!!$gK$245P zMGZd?@k2bW;t37AFsb548lJ=@6+hPS6XALphZJ0u;YIa!go_ze_9h(FFd?=CMHpi7 zcI;p+E)iVg%Zq>Wm}%U`f*_5U_LPR5*dfG-x4R5HD-~@}Z~9rq(;9w?pDEZ^2Be_n zWWdV25h4C_4bR|N4bR~h8h(jiDY&)_Rq4}ZRc0IQQmFw$&`&j1TmvaU=X(u%}h2OnX@MGm2`!|)Ue+5iyPMtW8f!(`=z;rnT zY^XrVD*O^GJUqdjBO>LIo*p5T?roP|ju%sxg={ZcyL4wcM)YTu#Y~Cm|DUW%k?-yk z@(+|p>*Yu7|6xB;%((~Io3KNAWyMGl_ZD?}excwQRh?72bNco@+H|fT3Rb61IqPDP zee`EAQlq?>@}wN*b&dsFZgmR!%G#+wKoa`;68n`Rndr1G!^`g!Jh=nIqlfnn4-6{U zRw}cXucxPYV=TdJ#eX~;Z^U&bsSr5&&D3?WsmDDZ3@wNxpFXj*eZPIX*-9CIaHqI zvyJGMarHh6NweoTNQ&IcI3k?#*1Pi8-(PS&Z*$K2>!?j^@{0cUIaJN&5jdM=iZ^YF z7q3Hr5Q^Lmi$J;ap=OIf-QYm+W?2ME%{S{@5vUX^-c*Y~dGetaia@1Ujo^?2b%c8? zd$mz~wE*wks9u8aXsv%9+68;8+STJ)z=}Dn%ouNn#v|~lkD^Y!V5ze=bYpr$U;pxz ztSX@7aVmL&N}epJuh`VSfEr0#MZI{(}W?*Q-KF&M&4SP)+$z ze=Gu(N+*7DIZ!*;W|h7T89(@>B&mObs{YwR%P)W1G3j88&|`wJjsbl2CDgSo;hLio z%r4hFn$P2E8P8C(Q}HhZ{wo^Pzh!~1b6lxl3T6TDjXB_z7P!=bjrrhzC-^@I{?CHo z{AhK+hfrlPZzRa3OQ>1GW}CQs9xbynn2-D~BLACl@nRNoW199c+~Ob~V3deY8rtU2 zdJ5`8Xq#O^yNy1NjyzmXB~*_Kevdl~w;_!iLbyy^A94M}tuBZgLDa$RWGj5DXmmw} zoVBr@nykfDX;LxVdL@hN3oeeQ&xSqBBKtt6=62S-EqRB7XN`rh{2)&_M^-X@kZ-ec z&N)a4wKX4VT^5;Cj`5z28OM@*fX;kZY$yOwf!pZ03LMAvYPCPkWA-(;xqxzBt=& z6|Bsh-Ji+N&*yU`j@hi8DLXQsc4nM;tI$7LwCxj|pSB8n1d8YlMQ3)-hfncQJGZi! z&RUtvqxo#Us3CUYF%6A#R%tH7Yv-+Og>1Aj4J{cfo2g{2vOV(vzmB>zH6AvOIyt9& zOhbQ9v|`b_d(Tr#52b0`$=PQr^V4>5QcS_e#`Apcyj65$?QiPkIfq6#yagM?FWXBR zc1APOkXZ2aRkL>aKG#{hddBu{c-qO$*ozue$u5u6a~kgHshiuFYmc03Re9b6JSxxE z@A4#>ofEG!wutFZ8@T(B>wg9Xw^!z=(o_bk3e35O0UR z(2It=BA*&E`NEPPM+Si(6l1scgbjFh`VvD`Vx8ap=n_PKdV4s8{IikQl{1^m7v<5G zkb463)XBw+U2s!^{Ol(yR+c)oMWIu*cz*g4gPd`fIGHOKNxIDgt(2W?zod}6EvzLm zyr7Nu>}6J@tW3r(mG%q_3}`sF759hKSXC5ai$sns9-w(AmU87eyX<7D?;enMD_eTE z{_t8+eo#m()K8-B2zQevwm4X|$B0IrBKKh*+tG4?4l(p8sw^m-AuMVH`)4DibA(j>dxiM-N8Lk%MNM;xDeG~hzpBAms@CpT))lild%&$yLcb2-r8s{V0@0zkRQ7$^U*tDBoOC# zZ~8iJNGIM$(^R~7VoKjPv5aO}Z(l}>Kko3y)^y^Z`czz>oYM8lWwfQ^%h>r>g2XUH zc^i^|@ey?6W3(Edpv(9adyIc!pYa)njn8r1_yTwGT(|cy?!rN?NCAg%H)+Z2FlRCT zF(`ea!|obT>37lGIrtYI^PV&0it&{Txs!W55mh}X`twE4^89{JI1i^ok;D0tvkf|O) zaL0Or|E)ogw1DJ2BqSgCdjH3L9lflL1oq;$l~V%E&4&-M;EtsT^#C_Vd%=F zJ6;@ecez~iwHgR5&>2PTXi_)gX0;3ZRYypjz91m_f`I4?0)mA%LY=nGp=+xnR_(5# z4vV)BG|D)WxNZ`{okLfl^glt5uLay60&EI6HU%lb9^eBWX95VIq(EDzK3Ub=O#yX~ z4m=b>3#Y(JLb1z4qQ%#tjS%g44Ky|>AMGq{FX`FnddKtJI><4Y>XZxV6_Lh3-NwKr zjlN4XsrNqk0je$e>lTst+9IMRTu9S9;zMfEB%-eC>#kpny#6rG@l~m{$9%J={(<(X zmK(2Q*N5BMbIO!A5%1e?&sR*84F!t|Ae? z*834UPSc9b@xgt6L#KxK(DgQU$&M~NH~Bkjqp1T1EmT25Ezom|xIrzUSv`X`^=!!G zBLTe;e9xuV#)dwH3$BUTQ+;}myOe<*zPs}(Zb^HL-owov5l*fwb6aN*;m$49sP?k( zMRItFS@<%4eY_GfaF73f5|85tzJZT$l(;t1o!8O0wnh9oWLyJ3^t+A$%WVeZYH z2U9JYg=n<3eZ|;Z-aHv?!dSGXTR7W}m+>8@eFxse IV@AXO0leal!vFvP diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$View.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$View.class deleted file mode 100644 index becca020f37d2a13203410265fc857538be8b6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmb_d%Wl&^6g`vJaS}`^eNmu=00r`ZCX~`r0xfM2QltP2Pz7wz#IeAY6Gx5jv*Y?u><`&c49!sAO z(&dimIEV8(7O|w`2#yNO_Nami*eUm7wdJ|e@UEJkz|__e1-41UFk7vO6DJD=Zsz9l z`*YWJn=TYIl&HIx{Xu-#(=2z9bShLVXL^}P)0zmlx)o34};o4I~x%we3N|+kL(1UpD{|$vOzp{V~kGB$GpPdF>}PlM@+ z*)<|wBi=PA&k=h+x6qVFP@)~&B>Su15LdtZ*dsxFy9y~B!i2BtaGRwPvW&9I z4*Isu=t0&$x{ycP$fIp!deKAuGd@#0f4$SWK<7_r>aTy)AcC}CsSNg#-9!4e)6Z%T P;?$c-6v)n#T|oQ~*e9Y7 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$ViewIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$ViewIterator.class deleted file mode 100644 index b76579fc7eb1d80e40bc92bed00f5daae858cf12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3119 zcmb_e?^6?J5PmL+?~%(XqNr7%q75ZEl*FhYLh%Ozjq*bTY0=tpB(LFYa+kSWsQeZE z(6628N2i^Bpfg38I#a*3GyYMX?%tgtj5@R#Gjs3my|=gfJiGgD?)5)^{0U$XPc(F6 zJdQ40M?roR_?c+ZuF?tGJ`#5XRYNMx!UQtj%diVxE_~ zDi$;x!#x#?8cqa;OKfvr#j=VoRD7u*RxvGG!KE3;EoIEASy-2uf>WtDc8z4YEDN5+ z`kGa=DrPmabWR;2dzMW^l-)Ei?VPZ|k2!?bNSSzw7F{EH@pWgmfZf=<6y3E|S zD}JkR<*30YZO`3gf{zuP-pyv7PDRNqFM6gYo5Gi{uEWBrf@}N4d&gPYQ&vjzZnU6w z3I_LaI?pFj7I(XAc%K*Eg(5gOx&QwrwU${Z$XYFVVJMqbFx=A7O4A5w_!(wD)zl04P7FRw9qgp61XUIWXRSC;vtJ1-BDzp zhvI9@B;sq#C5jGQq~`(BVUlch(D)tkzo5pRAr}3WHUbEOABuKAgdP}%Av$mwL$t$m zf1u#(WR{)$jl@gnD=%>H72QUNED7-w?;fJv_E!d5G21{USVmZz`*lK_{ zi#7sr6sqV%yEu*>aRPnfB+iRdxGd=VNpv>>oDBieuzDxU#QRwGHaR)iaB`)=l4|F( zED_Gce`2XI6+b1%-;hi+kz_w%9+-dl=m_<|Uj7C&;-4h`eZ;??_@{`!LHq}BNu0y9 z7{t8DU`=G3D3n49G5+ri3-x_SVS&QMexU@@?@l17FMwXUQgmhMx=c3Oa~$0YWT!8; zUgFqFxDh^of#X}sZm~{55ZEh7imNy$#t7gzM#Oajc(V!ILI|z{S1}rbdmV!F*s-7A z6Vxvsy|0UcrqOnA(paGei>>mR@=uYU@g6_pbi~M8G{?&hPEl%~p;3#l;W**Dhb~9o z;1E-k>}g7No|1i=l0Ad0n8j5whihUUQ{pZji3O~Rd#H(}CSG31D}pgfVFaJiAqI|+ QmZT5#K5FDHk{8hSFS{`Xx&QzG diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$ViewMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/TreeBidiMap$ViewMapIterator.class deleted file mode 100644 index ad71d8501c422696d36cc2547ff1fac5fe3f3c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1857 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 COo0jj diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.class deleted file mode 100644 index 6fa7018b3854f86fd83e6afff70f5731938f3884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3147 zcmb7GYjfLF5Ixt9EyocF32i9Plme~e(3qx_mL`PeO~GwS^PqvYRJPSbMYcS$oFRMw zhJV4oXlH-`oq^#KGyEuqvyy7du`^1>GuD0Vo;|yF&z1iD?~gwLOroS=QNvOe2`p!E z0?Qg!vPj`$nOx7}6MQP8Viq@o(akJYaZBt!lfT>Yw>E%vnQmaSpVQA}dRxOC1ev}=lB2g{H55{1+caE-WNw^`$$HaMxRNVAGIouEZPd04 ztEES*^mO;ic=r+kzBczH%`SgN+BNJZYmjD)IoqaH7^dl2c0rCw81%Ck>&}8xC(KX) z)7q!6YgV0If}HI^u_vL7S@YbzHIr!#=Ryk~kW1`~WJ7kMfr9lk^YES0K5G{0REPIM zs{skpC+(;(8ll^&>*1?Dq zC?kTYa48-kltjdhR1y|zcQKBBPuG)S7M)U4xNu}D?VPe}PSY)$%a$l??C@(~Qkqg> zBBtC?0EM|2>r(9PqvLgqDV%FdVx!h**6WVznU&SLGy?CjrEkh+T?S%)M&}J%(6FWB zMSP)SN+w_GxQO>O+?B<9I%e>pj%%3HaUXLUzS8hOb_^XSF{-e9MB;O$hUXe(uk$1p zgX>Z{^l}Uk+qvWJU1|yLbX4G?t8V>G#eh?u9pJtuuf;ft9D}z*hi_YxBD>yVjWTT8 zv)6~W%>yM;I3L5Kv!n_uG4@t?D>OQ2ck4%C=cqS+RIsrZO?RYeT;O~81eE_vNN4fw zKZt%d+9|HR#MvT}904QwzoC9YD*yN?5?lFwBp-7%ftP)cB>z8vhO6|Q!7H5UffruI zYrY*-5+cshE5WsNeqtYePyAg$kxvF-MZPk8gwenXr+rqm_pyZQ8#ohUP0>c!Wu79n zwU6{)Ewr@1UW{ z!!Xw)**)V#YveIO1ci5S{)k9-4nYdoQ3fc4Nb`IOrz{UnD^C1|O#AeLy5D8p??v#k zVYVr*zso)mX1u6+;Pne$_8^`?zfueyFT5Uj1A?a?#Cu4*?L+V`;eDUq1Z4ol^K#dB>^L3`DGn4r~Dt@gT#=^oC52c5m1&b;?S=M_HX%!U|w z=yyD?AcYxj!vqJnN8x-MNoOeJA)o8B_=q41e2;{n_tD1@kjwv!k$*6j_toqNctL@x l{)I~CRz7^Tqm9rL_>Lm~p3#1wh<=PDkZWZ>PpbqL{s-@B=#u~d diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.class deleted file mode 100644 index eedea2168bd0ed503b4b401f3576b8eefc5ba529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3902 zcmb7HZF3V<6n<{fByGCV7Xk4N@D0g867`42ZIW4-&TQ_Ud!Oe#=iGD8-TwREAAbUv#H|dL zGdQ0`0xMbU!b%3KS)_15UOvs@B0iJRr7S+zqsv)b!Bts*O&+E^ii0T0YZ=x6U$4un zDUY=*)?v$NLmoFWs3>IY+NR|;EQQ%c$6YI!b+fc?6-rLE>eL$ityHX%XUn)~m+h)q zFRaw6PT9V0o5hN??6{s)p5@FLvp%KJU$#n)YkK6nl8YmZg2$e2xkBHZQ>LGxMZ0F5 zZB~nxdtM|dj4nDQv$ATszQn+oq;!SJr*)E^wrjR`OyR)OhOBk~O;6!yZgIohGz%58wpLgwZZOGHotCjq6A5luw{nk0gCki3&SIawGGDTJ@@qe~=NL@+=mj!@N(DHm0_j zn#b$uY+G587_foQ-zr&k8OZW|1`gs-22}$uf|hsW#W8RMM>D94 z@e2dTF=OB)77Vyp$e@vdCo@e0&*KFHAL3L7n_{_X;4GF5e2gW9`6mo#rr7XYv*bkz zr78L#Vvaz!)+@L@Dphll>e8Iy5@)2CZq3$A;zxN10*uytNqp%mR`0IE^1IA-SC1^|M$M2)>7k^e*-^j|Huv~OPuY3UD`*eZ|<@F$5E?Y;2J zK7OxW(^ArpG32#hjB_L!Ca^!?oaVbk(u?y#D7wd*xSAip1v2nf;jZZ1$1z>%!KBqG z>2U$mEPq8)mK&E@9DjiR_U`GtUuE8}h4`{Tv?w8<`f1HzZx%2y`Nis56s z?ZP)Ge8yHjn|vER_};~PzP_m^&YTls3h#mJrbIf;O4fUz_XI5b-|in7{I;cz5(#|6 z4)HB}%N_QD??S$Et<>>S4SZeZnG?*2L_a?95ZjYDyZ-@pv`KaR-?P>H;FIMwARr@@ z%|sv55w;XLrUrAeh%=;Ca%Bgu&T&SXz_9P?A$BHkW}=IyA2EoZd{4R|47WTD`}~UY fnqL|MzXp2nKi7l*XX5Yn;Mb9a`9GoJ1kU{rg*S)c diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/AbstractBufferDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/AbstractBufferDecorator.class deleted file mode 100644 index 699542b37e6a085dc5f39cbfa7a4432bf1a94041..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcma)4O;Zy=5PeOSO|mS4hscBBck* zvp>qBXLn7g02MCX(_Qbq>3KbW|NZ(6U<*|TWvrO6>Y#+RBA%N3Yzh|EP1q=6vxw&e z`(4zHl6^wKtDO+6hB}pmnP$|L$Nf$q^%oJu+?i{tP{b!fN2bo3R??1ogoCEiEnj>U zVO#p4>U31M$2pE=m_+6r^v}+u_TLA+M2j#vOv?{4R9YlT?-J_XIEjq2Yi6`FIYRZG zBtp3*^IHiuuXb-g!M*MaHPrJ6^eE z6kIr%GU0`b3SJT_W1P#L?P4B}T`XYH#S#_?dt+#sLw6ZY_&A0?T;4#VG1%u|afD?r zGp3(Ju|GtlYno>7hAqO(0#Kfq=YrbwfRanSSxdP)chexbo8Rv7YZO&$x zQvC-Ce_(y%b2g8i_TOHcrIag?Sz6A2lk*+sPyU2W7*#m9rr-<|c;mM#6mKdtZdF)L HCw+1Spo!`e diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BlockingBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BlockingBuffer.class deleted file mode 100644 index 0f0eb6391a3e85dedfef2afcb88050e39797a986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3800 zcmd5;X>$}+6g{0x(le6|fj|a=AcGLe1|t#@3=oB|#z4S8Fo0rbrjs7NkK>z=HpOcX!(rI+{aJ@4Fe&wJgM{&@F& z0P}D}#(F;_)QQUmKW3rM$ES_ra+|o+XJHdI`_X_c;^}sAX%w$pMaDK6+hyD#<4!-u zV}~C(xXX`mP-Qg92>X$T9bQDlT@y*o;)$0@Xc6hHSttI-C{O6aDsdF=`bQjLV{YST#As$n;%(WI6!`SO~B$4{L+FG05Tm}Vwz3Eqen zHZ9fGSXW`KX|;sZxEgNNLSZu&V>a*6s1~*fn+PpWHaBb5;-WFeN$^yg5hCZ*>V~#H z8Eew4O=?q=Be}I^n0!^T=6h-|v&q4iFlWpQY#b}+nz574PKmQlk4E)`gv=$nq1#mw zipRQGQ3Ff2TSapDXr;I{hn7dp@GjkGNl7fBWUPzTh}F{7NJK(jVeL+}O$|j=qa{?= zw3B^XT(p%HSXv?(Ww#~1NT!hgFL8__#CW{u0 zi%cpk8VNq#@mrodrJJD*mTuTvEZwG~$cm;24oX{VaNJ79Z7s60Bdo=R0U4H8$VQI9 z-LG}Tb=sIw^t5PTt=3E~tUPA65!+vHCatixN*C^%I8^O<0#HKPDDEGzQwkQKOk64y z6rn(Yg{2A-SSG_(un0HFNGfPUyMij*te^v(3igQC$S~BM6;TsW_!QR?C=0BcLg_;EviI{y= zw=$^UKHRV10qhk__9=J}`(+#u4joz$$DaC zEN*ww-i2Z_dD>N-&YGCoBy3H}#3DE+E?ix2tKnUnEHzB8O&N$A?06BJsm9})!F^jg zc;C8$^N<}NH@FAf1YX;8M~3gURO+yUpbwBM`nW;+bSmOD9Ytj~lq(jDDR79O^_>Y@ zi%FOePFj{`*rM5eCn|;H*U7`Z+<=+B}Tg8n_k-cdZnkdH{WxCu`;G%I^(CaY2xmd z8E`OSoHf`o6Zwd9c6UFYTozf0#SXLC{mf=#36_$FB#y~Zv|b@VxlED6tG3x_g%N1sEstCZ4(am8Y+8`&kjr@O9v zvF;pl8qZ;TV-F_uAa{M~+-^)fhe;gE<5(bfayO=MET6Y-Ozpun7mB+v?JTDA+uwV- z(o^E7?!iPdFQb`cIypf$^ZAJp_XKMbcee}W$ma8YMjc?rL3Zj8x7A^8rX$RFf(VaL z`$w??k6|qyM+=^0_EY_;tYGvCtYnuK(kZL3nz*by)h|hWtx~GgP?apsop4lHfAJk$ zJ43DT1U!7uDl!9^zN06wjgxXpt2z-Fpq*y)#dKY{ThKDGx?e>SZ(uLp#KSmElrxTURXlU*sIgGa$LMlLIWO@JQ{@6G6<|&c zpE8AF{q8^E9Bsn={MucW+h$&++pfC`x4lR0&eLrd=(Z2&pAV_TMY`=Xy6q#@`Z0C+ zggSgmw_T#!J|DB&_#^PYcN>-a$8P(QihV_Qd`(|`Ll1mQw|z&q{Y1UKk@?6# z0joM5>sVu$R9zVsY7Eb8Kj>Ke19!T@a{OM;_d=4cD;y;wz1eTKMPSwazSk11dTebn zr1y?I)fGxQ1om8dQoUfXi({eL2mFv*eI;G1p+vxyA8eNP8Is$6OEApX(i6M=UQ-0` zc+(}%E!%gvyUzm|*#l=XYKdWP*H^NAB)!fMi@|Joo(Q&G9)^NKcE+i)a1EEHph?BB zFsgop`hAQBW8cy}4aQt{x47uW{2}Dgly#am{xoA|} zaYRV;tPw#Q<8i8VRg%lSj`g;AKy0RUrH1Vgg|2h%Z{m$8@oXIN4*-$gi@CMsx>%vd zm8NG$NYTznnq&bQX;YY{bB3%PvJ)gTaU3*D=X88^iV2($#2Mzum!%IV zoIr1rjI=CrF(`3h02&NHi{($yPLX(T|0FGWh6#o%*W?%ImCKJvy{TMQFODhRz%ufL zm&a->HAEF;DL3$qZogw5=UBo8*6<^)#H4IMaZrhdyJTs&hXs-b-KFTCG7s$!PgOBj diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedBuffer.class deleted file mode 100644 index 00c42bc00136e2ab8ca9cd34f0a7729063182f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4068 zcmbtW?{^ee8Gi0&vy*HFA%UcXkaSa^O*WJb)|N_;8d9i>A=Czfsn%w)d$XCaJF}gg zfdsWJ)oOoewG~Tk3$_)D_VjSdIg*GuN6smJ^0VjoANX0m=@<36Gn3tA6VGD(FhB0S z@B6&Z`{Ta%{`p^j_#=Q__^25XNDVV_esgi`#Hm6Pg~S8Ih9Sg_+L;u$q` z)Ueb77oPe%rQx&^omVppacsaD4d2%AojBSt*M#q?@3ZRloO(SU$0nRrie4Nq;Cl-8 z`x;)<@BprV~{_{`&5NIhF^Jc*-jGJd9MbiSBYZj#KxdKgDnXzex3s3ir+Dr zw2j&sI%Lo-j>E}VfFf{TJ#%FPQ+Mpb;m_(rY@cbF?tX!t|AVaw`tHt}%-w_aeEBb- zi#f7jpJJ#s_4SX=8K;a?-mr41qtkOt&Jc6#NY`^LKlLh}Ylt)$*{nc&-|DsgCs`J@ zK#UT@`Mf}9DCD_jJ~dLVfFWNnBhV3G)Go7}%yQ9otPu63R*G3s4U6xDVX^?Ded&IN zr@^nr_5jzkQ;$2Q<(_a9991H6ULa9LJZ*8o@rtg@9-Pm}qN-2I#jW9N*7S>&136zb zS=wA8F=cdA&d_4aEFJQcmkoW&AC0>s*clviZ^VsEMwUw32L}fQ(sh%(X1>-;QDmNg z&EpG}J1bq2QCzXKTUm;a+n$q=hfIGz+_rOesbuQ-DIODepw1Rui;j*jV_3aj7r3WV z7-??ooRJ@Pa$Z4NZaI!h@(mpi;vpS-uv^E^a8AR|bv%lL8s5}#UM+tOPw4mx(i+~< z@e4eq(-4si68bY}AQ>9Q-V)QZ33E^8_m zND6ETei9`%#YD!iEZa>;mXgdSbi9iT>UB}aFY%tD@VgJbo?403iMQ9*D6JU zjlRI`h0M*nG8=FS>RaJo*6|zsR$$K^`FWgOwbs$Zh~bq;etIFX7Nflh_T6Ja*QcM{ z7&5Eln|Mm#;W{?Ml49XzW*ysNyuywyFjz-5EaOTC;eOBCnUey^x*IFV&ye37`qaBQ zC*76o^|QIuvmG2(0z2+VkjH8zr$Jk#Nmd09W4|W`xvOb;^hXsCw{PW~6d0}RTo}{a zw)s$1Q!Tek<#@~}7Ny1B%_FD6F({#->Q+--;p~Q8Y^|#l!mz52Xb1AOXG#cMb5yLD zBcG~3jW3j3S>UZD<2eqSh^nw7WujVi*soxuHQz!nT*H~&A+8(;(vpiMO`{V#jlQLJd7_= zVlPLJAVw*mWf_slWLNVN8b0ALf+4osV}-fL*O zN`Zj&7P0^&Rb~)Jj*gqS3v<|tlfLn!&#@Z^FhV)P`ZScM-M&vM9Nj*R1`=R@4{3Nl zEuc5~JBZ2APm_yizK*!S5jC-hmYoAPKN%aidH)RxYUrXt@VVRn2GlxyKWwfR(TZoV z84g!V6zV_;DOe$e9-qRIPm|Fl=!(a{b*y6v-28ZK=ZgK!=p;%f z@zpo5-{!l1n)c^e2Mb&|Q??EClta>k!(_qxk2=3X+ojO6x(TR2 zd;M=UfoDnJIR@Z)uAHqRu&qpB8;)SiC&1$_B(RUB6>o>%m4oC-qvB}7n65cl|e$ru#tgy zh2eM=_u@6Ac%vG|>v$UHFoid{bse+ggrcYKkhFv&la^DoA510 sA>wz*YGqMdZG*QdPx)QNpd~P<)Bi6-1Q`NFkY#4TcE*E-qg{yn2W>Iv!vFvP diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedFifoBuffer$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedFifoBuffer$1.class deleted file mode 100644 index e7c0ccd825f49da8447c87cb02ff5d8870779c2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2221 zcmbtU+fy4=82^3Al7)0Fmm;+VTU6R1p(PM{p+c)dLDR-m8zco<$Ia$IwoP_%vqA9s z;@{A5m~mSB!izJtGeR>uBQw4@b5Wef1<75M$G8+PN$z#YO+=ZSRB<_qD8{7biag#>@n#f_X82yNL7%Pk7m zG#GHwv`qI3VREo(#MnGRnYIgp(4ICek*SvR!kN?aCDwGMZ9^~3>y9bqK&i+y2q0)F z%M#8sCteY(nP@hMfl*FOE$WqwSm#=W2V-0<#qxyi!C3mPzNRNiy0wzHk-y6|V(W+_ z%Jv$E$i|#Oc-7_rqFKA@7-H6xvG+VvyHhr z!3LMTg&I1ykgFR%KssQ%zC&OAol*$6a55X7-1_g&K$N7nh9h;mWH!)fZ1mXgHk(ML zZ_>)fHFW2K2Z55jXW<%N%z4AXYOd}PuI~PTcg39jaoNKEbc_DSo5R@E3iKzv&D7Ltj!0edTqg e$FF|SnKAr<5uSZw?Wot?BnFvAS<}OmzyAUKgd-CG diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedFifoBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/BoundedFifoBuffer.class deleted file mode 100644 index 3ef71062eca1d57c26220b4c5c9213d3032a4e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5509 zcmbtXdvH`&9sbVlX76U%lq5h3Y=8xUCL2n^TOeQqC1ooFBoGYv;AZzGxpcD|ckl92 zt0GEEt@YhPp#^Lk9a{?pl2R;G#YgLmfB2uT|8>SXj?Ud*$mPv!W=G;d1@*8()%t8EZ|NDUOHUV!ip|&4OaF7ByHX)!q>TY1W91bl z?cTIk-={aH^-N#$mY%&v(ps%h!DBg#Ckx3~8dJE|^Cw3`J7|;)FC;P>fmT3)+I0eg0 zH?J=tthToZqC(yHJ1E!woM{=34isj&NM_bm%a(#QSg<;+oS_fccs`RFn(RSKSVm5_ zvN^KyXA4}ccNWKoPzY~0kTeEu2{pXNF`-k%`)7{5Kam-Iy)qSiW=0`8<`(Zp4Hs<7 z(2km!-!L#}9kj^5dk2eK7MDpZlEGbwwM#rL+?g%pl195J38e0(=wB$_7lDbs z2-ad%1S{~t2zq6>T86Dy6TwRP`ViWsc|c)K*<%yTFMWEtE!S5NKP&|!V}E{mJ_uaE=BMVx+56Ih=$iAxQquPctdXAi$^qE ziQq@r9l@JOMet!<)o?9>w`9+ca#AV9KnhMKrlUrH3(dv2&JQ()dRGkwlZh1sGY2R@e6 zGnuRv>(8cBv4L#PaC8*G&+v0;e!+NhIpr5d@JqZM!7l7pSn+?c+QFPKmR8hryP1#a zX~~-hW1W=ycqhO+f%(2BrAZeK|5o$_2jLb zp0vtUNnze?xEA%@a=U#_Ve~>zwr^(X>9pSl<{_sHPby9)ws;I3D;wIDyd!J13#4bu zsA}MNgIxukd&bmTRu}qXo0QvIR%FKa^dcE2e7qHw#U*9*>V>qm(_588c8yL*)u^=( zk17VNP5pYl!#E&CC1ZD^Xgk-~w5N@}+EX(XYTTQ*dCIXSK4#zRM7?9uTuwj8_e-GH z6j2)*#>t#FS3!A;1ogo|`(3rbTV#uB^_=m>9p4pEzIJZC8nUv^{;~Df1-`rT*oE1A zkS>HD&1k_Q1Th_pv4kY~V;B+FgjFBqe*7#79sW_g^9wn+j=y z(Nn0pf^c{3gb_rp#iMVc>Jt3%_(k}yUV^WD-F#FM;t>RxnJcj!_h2U`A&q-6K*_Uc z#31GUluf11xz44+i<$OUk&KYq=#tvZJwmD`-gFuFC{VU|(=aCPEMIvKc>|xJq@P7K z9`!)il%Q*nz{7;}k=7=*qOwEmaZCdHu;7Uj|ObPR`U1=&j;9V<9a96 zdIl3I=VYAV@2O`ok9`wP(J`N+hMuPpPE&?6WPBDo z@PaK{oTutAh2vGW_PR>4b)k#KX4KH{#E?E)${_n~_$cRD)7gsVk8@6pn(()hXa)bZ zvzQ_x$Y)CC_OuS6Nj_xeH0szBcb|h0zhB|#RSJ0y^*E0> zUL&0gjGl`mG2(HMgiGGX`J(T!uDUc=u$P#s65lxCDz|)9&|ZAYhI68-%7s(-SP5h` zsR&4ofC&AfmBs?S?Exw}uENJlN^5r6h(>&45C6tuY#z3dxxsNlZevi%(+>i6`IKQMUz=)s>_!v7@p5LGOCo%_Y2Y1Q8JnTQ|X^D@Gm|e|82|RB%ZV@ z2U#;e_Sou8BIQc7ncgiLi_&iQ9T%Azx@#Lp5OCmR2Ku1@R(9c(J|u(PkKC67tuQHQ9SikO;) zMJkF`RgX3`3+-x-M+qBUeoM+rW8{JTonLixn36OSkrbuO;(d&8|(@|9XZC%PXK z)IwCL77zHul7=Uu-%jm5`Jv&0Z*{?|kEk2blTK_0Mg_Bj&OD=5Q>0er|Fs_U>Joaj zi>~Acf{VVywO{2GGzUD-Io9A!^GIlM^ z@(`GQ23g*2h6uhNh}^g=D&7x79+t~OGO-vj7>|y?6E$8*oQMdzl5j5yw!Mln?Zf_Y zWb%*EDfL!@cwB4E0_VCMgfo5%)7u{jga5zPz$~$WVJGLz!+dl&#K) zq0);y!7w+Jq1elUv4~&tu}>9q7`cSy1gE?xR?=gcFl-K^_{ib!xO*%dHwpskMXT=% zHzgB^GtMRx5j#B@yP419zMMqcd8tbstwG*6k?*Mu8!#+b!xMhWoh+5U)4RZQbD6?2 zw60dr6x{O|<_m()!y{*Zd_q3D9U4{>z6eB^s&Vobmjw*^iztg-(U)rA_O#m#b;dv) zO%>V(9>Frufo)(BOAJr{_Zk?U{M*s(C<{H|{k}kYK$-M2btm+I>OEr-M5pAxX?3P& z#2WoD8vRO)9M9kytvY2TTt|iWb<9$nqsn8dFhuBFBup1KXlIDW)i8a~xW4T)RSF2GN30DWAXQY1R=ISaBeZgy{&kZ*F%FxZ4d* z+m{3Hh#R24^hUlVH*M98#p&bgN=kT`aC80=yn!WLQNy}{d#Dpu6F57=yNSgi1`Ti`d#?^WoS z;o0C{J%u9M3Yf(lTQ0Dri40o-{VV8IwRViuhtO}H#~k|r8@R~hrN|2lSmYJ^v*j}H zXHO`7tv{QP|C8|MOu`CBox-i( DZXj3} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/PriorityBuffer$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/PriorityBuffer$1.class deleted file mode 100644 index 56e8c4edc9d0b76a57ef159111f4d09db7c0232b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1761 zcmbVMU2Icj7=GT<)1I{)yR92ToeJoX_Dotfae|vu8Jnw=K`fGhH=MQ~>se0EX--dZ z=#@8Kd1*{A#uy>ljV73EBY_0&xi`VY3k{kG0e>L=MMdAQr)fLjYEAn7fA91DwO8(5 zxC9`L12ObrM-&O9CCNy#Gl~(6##nk*!>$-K88Cw9G>pX%!;Tm$&r8d0DeaNu1xdyw znb7c}hDi-C5yF;J5{m@N5_)a3=D#ldy61>eHn2zhvQ-<}Nf^ty-h9Tan#Hon6x~Y2 zb!yCQTNHgu%7yxg6T-_J@+{Z0{8M`y>Np{qKjrvk;af#QWWsVRf0D2#xxRF%BLsEI zEeS$*&T_#AUAgj>?e zW^GO^`h-w2b&M-=8cKgMm0K`Rni<=4<}(Ki3p^T*j(DQtp5*#Cn9J|x;Z;pf9Ci;e zbvQ{Z@7BGdn6YFNeQO7pmI-wXBBkSDJfdSG26Sw~fQFZKydsq$Y$I%G0M~uX&dj;_ zda*ohiwb9-UMz~LT#$~vm?CU$7ntSU&6{@KH+|6&whz-fX7H+xS!8v*CdqzDa^M>o zThA2?jSza;z`9%7UR5*aB)@9-jAhQW3}qSN zGtkr}sG-j}Hpm%~G4#y?b3Kji&0J+hmbuc#Dk2|Y!$oLE&!g+IA#-z$#!=?#aanQ$ zD9TJ7J=a1RK$ua!g+||@o33FKeUGj5LkDWQ)j<-e0F~b1S8^(MWH#kf2^(YB4VODW z+M?`lG{07-hR(%>)zS*Wfirv>AF!l0wKI4xG$D2MEVfBoU=Ld8ki+)qDs&miNDrOH zFiY~y#=(!#E3HyrMSKZkZLNC=$yVGaopC)&h_~Zm``v-C5L(=RB{uUMelc%Od5hx9u>qd)Kk{fTq*7cSD@xJ3Wp3jK?(=q|3(f4HWE pa7$5fTM0MDKfog{;9VGuBUgNN&K2(;3By$T% zOF}|Ay(OfVkZ>!|aUbYR+Jb3I1DUkbhqQg^L!SE3w_cvxnO>%)-@oTr5=NAgG&9-V zv)cXk|GxjSYd-$>Pj3NOgeyTjj${yxNcoWt;9wA5WXd_2^&=TBm zs6#4%uSx&)0N#}TtpH9-|F$3B@Z+0)e9Mn-D@@H=8QVuBHJ-Vxu?!}W15=~pTQtb{dUC39JY z>3g~kn1{@kgqa*_+17u+8py3uFtYYBOW_eSJ76UT?c~t5%%GJaLa#z_AT^RUGiENu zi5h43XwFWwbmZrWP`27m+PO9bZ_|QZ1nfu+5^zeFowT-&j`UlZ9cF)mGgV!w0kSg5 zjojmN_Kcm%*tw(Y^(POX z-Bj8vZAnwFbhS;r|7}fN)&vIRYy!*j`2Cmrn&KKW%>MqXrrO!|Npeyf3OcK4LFrvu zytsmIAYqvl+iMOEDpb4ViajPUe%Gm@X$hBlhpe2!jES>~chg%LYb14u?%*Ihn&83^ zt<81h`OipO87gn)tj^To!6;eQ?*F2_U}{f;_3Qgc$d-UqBI+$^ZLl;!q}am=>Fvj7i4^?3^_b%M;q@ zXpXz{45vUY)t$>Q3nuI5%yNaY6+Bs@&ni0H`86Mu!S2*(X29BLi$c@yj@d=xun?Za z)6zVp@Myt}Z zX05EqagjBuaAvVf=&?QZA$$jyIBM3T%N*5Hg&_2pkn6~o zEQR?GKy|d85Xw%qbnCKjA9Kp(U1{QmpOh-Uo!u~!mP+L)JgFcnl)EXjBXyr#qu+}{ zru%3%XN_>1PLqLDn#j=-x#m{I;%XAtwe!iQPglH!OqrQZ^V(5pEZd`)}12U z8yc?OSy*J912OkiOYjg$U zadK(sAZpZPy)?NFi(Q7EX%7GKgWqR^A8rlhCp9{@91e;52E`NX0=1)p) zUW#W*Yz|I7`S&F^cjdFNQ)>%UMQL~7mMfe0I)Vk+9?`M+2d3d4F%5qzLafSj*@CUE zIU_`rlx&EOqv8zw>_Vc+8B|1LQQx6mLa39dRb3iOnrP281bdA^O4Zt}C-`mjDH#XPU?w}w*%-%k;mm$UtYE|A zEI?4z@TnSvRV^A-1dCK1mZ`aX+|*-@YQTCmzleLMYnzW%aEIn@$os_Q-bN=${LK(k zZix*>-$nS1F&N&0(mEW~;v&W~TvS8eBrevUnFBsz4GUJdbxXKyj!(wH%h=A*a--Ui zuM3!?qo&$0`dVdawb43`>a!?2X(;!X)@IJUhq5u$$cj1cvhHf5ZS2lfJ=NS@2({&? zq$;cFnKdX^YcXA|!z|T_m1+Z4sW>*P&Df&0pjU0hUbPK<>RAk_=QN+Cw0Rbb+HMv& zDG$RgGZ}qO7d<~r9W@?mzYjf}lS0C0*#Cw1`FnVudr02TllNZo-bdbjBTi;cRtZm3yZwy#P)G`)JtUZGV0U`%u}ymv3eCt)JZh+i(itTwPJ_PN~5orSsCk=7z~c1rVw9F=D&$) z>MhJxr?mx6WvR`dTkBR9Ltf+$q0o6etU_n0&^an}feKxsLYJw~6)N;yDl|rgzW13F z;vXyjt3op;EA&Gu^dl;C?Ewn$uNU`>LFSUYb?T^j`7bd=x>)m1Fw2Xpu@5nu!&(mt zmB{hLZAScujP{T8InE=fF7Jst=Bw0rqN1N84?WF4#@rM87_;K{dhz=$-!ShkU7fu# zub%la!qFHX0R?VV+z<6JD%7t~tA35S%DI@G2&i|@tw1#f`H+>n#o`Opd9E&T>udQ< zM0)t}m{Ta_PEjqsrpsL@C4VNl0GC{WI&Y$mx6<6MSXKQv8g?6NB%N5TFQGnSTwvT* zJu34tArWEf&D(v_qsH$1E>`uJo*&2j!r402Jkt>HOve;YHNu`6)O%*4(K8#Z{9fsa rV6CSvFYh!yV{DyFywF@L15B_3_&n|OAVEPr7{Qm>2RRdA&;R}dzOKk> diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/SynchronizedBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/SynchronizedBuffer.class deleted file mode 100644 index be14d14ef0dd534ef472995dca93db900661be09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1502 zcma)5+fLL_6kTU#m>UHYkc(GD(YYW+(8LHKMhpZqiU}|Y=u4*@pwMYer$eG&;)4%< z0wzYHCTir(_zV7uah z%aKp()r#~MjfzcAXUR3$rNLhLA32ki0G|UlO^}?l9Lt}gC`~tCW?TM-#o6ySq6z!a z7hXB$hUYrgYq=UpATZf1VQJIYHgwx?*7fb_;`2Z3M}#ZzL(RaA@1 z9RTX;m>W zigUDDn1mkm@-LwzjsT_z8dKSY;x6Lv`4xkz&IaBIv|uto=n1pf&ILvly29c`B-X_U zYmUvt8A}z4!@Ecv1)E{fYydV8rtO2JA~2S!4U#IMmKec~@l>Ov3m?$(9m%63&L0{v z9bpQ!|EPY2c&e>F)~A+BKMEg_{)CJ`ac}2Iac}q=<0&et^z33M>I_9_59$^fU81*q dh^KF#hga;sJlUpsR>hv4oH+R8%AaMMY72L5S$(#@VE<92?nAuXqaH zfF}SXpaLY|nkV5Y5aWZAs10(tKv8zRv-5vDhuxpQzkCBwhpym;3c^hl1*{hM>z0DG zz)~tAi*hhj6jTXwo^(xNwWaHsj{SW55rLi(W*Uy|`NH%F%-Z+?CJPRMtq z;kd$=gjc1eyAoT=u1CZ5Xz;~mp;up!U8J}#G%kFVfXdj&H=Z5 zgEM#Kz&YeTsL!0CYsf7#Xv*S=^Xq|@u%2*-{uaK53%D2zH4V2>C#)ubqC_=Z!Bq{{ zu%uxbON0jrvhjVMEMa4G%L$K5Q5lB5Y3bvQf4lbFP<4D1*K0ZxEBuCo_nhVbC8#L! ztnr&qVTNr5%wmo$XV|id3|j&9D`>A$JwobT=r_+}j(vc2oaJ#b^1=en@rwP~a-R1y zL4jk|Hq!h9luEUBg!Fsk diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/TypedBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/TypedBuffer.class deleted file mode 100644 index 6c1fe5cd640022bb40d17efdd9756a29c626f56f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcma)4O-my|5PcPsOfn{`#*cMB)su;Wg9JP{y09w<3t@L*Ltu}cPA85`re$U#_^7+;=P3r7CsV6JtcK0 zVnq=3mJSDwxDxV0IZ_XYI*9o8eI;YhyuXe5eHFT`OK~k6Ujzf^%okDQHs&lOZjEyDDspuFsKLOH1K*MCchm4HmmeL&EO-4dRLs-7o#`YE%8PZfN| zRt3x0HfDuzI3Lw34Xo(phkkZ1`TGcN22Fny$XJJw^F4@S5lE%`Q+0&Jfr|ep2&eU# z@n){Tl*}cx=iamo(J!Qp4t7xB%{C{8GAxvM*~{#GMV=!-^%3-EZ~q>-F&1tUn9a7x zFrbM=wi^>5DyXu@C3u4+&gacnq;yTbO+{gEjQkxxaxgS@QhLl#H=(LbK&WArvxKz- Gx&9Bx<^c5o diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/UnboundedFifoBuffer$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/buffer/UnboundedFifoBuffer$1.class deleted file mode 100644 index 254e5940315af0e1532958da4439294ec50398b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmbtUO>fg^5PrsS?Zz1T75YK=C{WrYWt*f03QH-_0#c-?NQ4iu%f)ftHm)4IavapX z?oZg`UbedzE_>LOT0kJdo$LOeg_$_CJ#Z?K{Laktj^~*#=hOf1J^+}*JqtsaO=A$3 z)A#{%q7~&RiCMN-n>Vpwp&zprBUc2zYT}v&J3$r&zHZ`%i62eeB=mVfLv0hNLKyO$ zcKk@iohVR^N`f14(`!$a2sf)?v{7`n9Ji^8ZrEytL7S!TD>wE;uXonhRaATu)WZ(H z+j!uuhbvu-Y0|Y{g1D(-&m|a3Uf{*cgyr0K#LPb>=&NBv5eBMWpw>FAx{4kpn? z&P%80JHbZrVSST3#ok7wTH#AhlAXB*@(5Nf>_o15;7RV|-{|0+#IZ4f85^S*GqGgj z7BV(Q_Csv1ir*X-~D(>(K9C-t#%7noKrlc1bS0I^Y)f_e{X-!vQ_f@c^Jut6Gndi)?B}`l}jZ|@|QToi#CiDG#L_qzM9O5<*-bU z@5WgNbbcmqitQ|GRrb&)*>ZQF7He$8OG|zl9}vcPlu?qHq46eX3FPG1WLsn!o^MF-E5` zO=k{KFYHrKVYPL9OsIfX<_zE?|(R zah7Jd(i~JhW14tBvXa5~;)s0*M!1K;j}^-~kYigzuag?~X$t zQmfUT>p$QB{nwda{QKQa0Q>PB19#!P985XP8b~6mBi8`SKpp0E%*S}1mxC>b1p}W! zLCO~8%8@I#5sUb&97^)6Y`{ZB4j1HbQO8mPmJM`ZPD)?W@wozui zbbMLIijGx*=CW0?&BC-*D%-9zm3c%!JSNaI;yPu|bi8S^P_gQM`6EM*&Rw4psGqIO z%~>UZwx`Ax%nN2;!F1;PCT16`tT!m2ofR3RFtg zA58;h`JSCcK$yI0psLS)>>3_bv(;Gp>tdM z_uQ;M<7`(iY)QcpNZh0)EJ#z!G)~85}SKwX0390Z-0Nkz(d_1A}JJ&$P!^9O9x0~a@q0nmS<-fmq5t@ zsl=FcE2XS8YRe40^A_o~U)DezQ<#k7tQRzcUw(0n;!%Nt+tjLGms3oE(p(Z1NqT&??3K){ zH&X3M0{7hp+V=xXNx`u5OsY<7U-J85+tzVrBIKfEEmq2qan~D_EiWXpt-9I4Y-e6| zu-#jLeg=g*97{cC&6$;g_e8iWHmDw%kyYHP9^O`vEb_cr9=DcwtvPDirrKAdRPWlZ zI@GfSS^~{yL+wzPfmeEmKTMVPOyh381e1txz6ToLg7;!CGvPkIk0aQJRar$`ugXGF zGi!_T4S)A=7FCU8Y(pK0)2RqK3t-fWu-ky+!lUsd<+jL9^F+Q-FOg#Uo78k*!noeU*@OnEh))+Of?a;H;XpTwPwph|ZSBTyQ@z!!?qblSkbE*dnM%o-Vm#Gq)JK^}z#F9Y zCQI-wCi*(9-(VfR!+5+)A6&&a-oqJevg)qkY5W8xeu_E#jGw|kXM$eGGk9N_ewgMR zVsXn@Yy3Zq$GD3SYZ#AnFXO*bjsFV9a7y`g9235axQ{AVCg_x1SEQGA&$K2s(0MH| z#5ni{LHxk(P=LQ;wf>q${3hi6MAiGJtI#WymPs`5zoEy{*Rg9$k?=icD32NGnp(d- z{EljWPqlwQ0)J$~`x7nwGqd|Ip`02BXe8*>Gs@P8{9p-eJxw~2Q1hw~38|IguZxB= zx0PN5{!ZfmU>o=+a~bdzk`Wj4E+eL=?Y zi!=TS{{_xyt1{!uSO1NFfZ^P`yU8XHlMlIjU(R{XbIyIv&A-q8_!Gb)9!j__;gcjH zSW6Xc=D#N`@#k39zN?U0hs)dHx zYLO3pbzN;Z1ZEd*xcmF6Rm_fP#}F-mXw!w87Q?Ab*0XjUO)r%F{UVW7noWk2en4F@4*ax=*#``9 z)6aU^^A4ZWDfzDHI>VgrF2GA283~9emlY8Rg%4RU#2UJ)5W}$yuU*_yTjpbu&A2xa z@HBT6%@FgMAdy}w$(rd}4Ru4~lAC?`8W;JUG31BHKJ3V_G{kzKXk?tjc?sJxcCaL4 z7nfyR#C-{$%h=;P8LTkO2p#p+OvVFzA>%zPO88R7EWV;95r!h+9m96pZPRkpX0^>P zm%6p1Bp!B&;o4}l*Xp)oDGkTd`MUQwaIJW}NZ&Q_z-ZrjjeH`IeYx6+$Z(;{t)wfq zy=gidrfW1qCi8*g%l$&nLsQ*XT-~`J?y+R|DH@d1K21L&O}}|e;{<(Y=xqrZZLM-?686tbRV~jl&_VYAOk_~Vb5|+t#1!rg_dtNw;*M%La z(??vTC=uF==kmvh{wz*83jgl`ZXt%-0^yWrg$sCt_Q_sgG1|R|H)-VT%Jk)4sr(UQ z`P?svA3^Fudc?L6MU4n;hhS43*c9Hv+eGahf{D_1fdDhe`T;6_fHVb2OMq`LKui^FE9 zt^s|90^avQR(z_7XPDeO#?)T~7@^zcmE+)tA!>;ZwFIf*5}h-Ah>u1@(gz@YjLQP) z3YL7NOT>W39>l2~$|>N)NJ*pSF=YS% diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/AbstractCollectionDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/AbstractCollectionDecorator.class deleted file mode 100644 index 35dfd72cd0292ad365f9b81de13d8d589a7c8183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2539 zcmb_cU2_v<6n@?`X|~B0VoOW;Py&AC0~-YdwAd0#!Abr?aiKE;gU;xsGyW*YbKc#2klnR6UgW$VIp^8uIqx~=?|**#1HdBg=Wr00 zvRKt{IfoS1rZA5yc`V>6n~&M7v-yP0H8u@4pR&2m<_4RaY(8Uii_He3ZnC+}W-E(3 zS=`NHTOen+wrv`|@9> zdau(oy-nG)>1L+k8q(g9p2g?zGVQmmuE5oX>$PffR~l`zX1JY>>vU=De|>act2ev8 zCk=l{;<9PDp7dRh*c>Xw^HkIrQDC}djsy!Vl*;ijBuVb<2+W0;wscyx8_kE5lBM!J zQtqlfOH;WS{h$7&*gAhNkrF{<4BM2RfM&RkFD-|1k+r&Oon8M+l~8igEZ=nY$FnbT_H`V= zQGpY~msqFrX-T{8wR#=X@z)+3=5A2SM~1ai?DV>R(Q*A^(=0kY+h&}5Iu7Bmj<@i( zjtZ(ePU5JJclfx7nvQqzo{m#|JdHCt-p5%s=X89)&L6T_Vsn9AK4O<;tO%_AFI6s3 z7>W$ak#eZ6#=3K?bi>S+x6;RHavTJeKK;_Hl?Kc#?I?wG^D3QA(<*4qRGvfpLYov` zBg=CKBsGn*I7T}?a6%Es>BImhLVyRDP`(QcQ2h(jzazChGw~ehKP%Oz$P6*(k)haS zie7<+i^FJGzC9w7`#H> zEGb{1;OYxZrtoA8;^qjG{D4UwC6v{dsX!9IvQe3fm+4av?dvm6||lDoW`=0;Rq_s`wD>%*&K=B9g1mW9d-4#3SSd#vg1a7J+&# zL69C5)ZRl7^=v$y>8Kz(mJT(1Ji@-Hpxp$7a|wd>ry@D=69olDLQ^LJtPsu4;{>pN z1=93N0DC10_VpfMGzAmDW};x<>;Xp8Gz4peU0bMDenKYwL^ba-%nn<3AB`X2TN*9j zA&c)vkPCwrE(}_jMs$dLidG&b8bdzAfgxfrPkvBH!PwIV{YKM0K7MYzynl?1zo2`!A+a0nytHyuhi|;0i zi5laxKg#&cb_)ykK@&IG`DRYOIp>@C&hF1&U%mra#99WuxRJq46nb$1^Lkdypo9fI z+%m9ez%+2%z#WFXFFcz&b>aE8be~tY7}#TmTv@ul;;yQ5ClEdLZ~39G@82ykq}OcM zR_hGoh3X-H#mzw3j#-wDBP>M>tMhe+R9Q9!Lx0tF#ct4Q2=5thID`yVrA1<#BxxOi zDRp4`47IBC_Dz1otpj0NvelvrD0YbBb91BNE00^M78Y;6)oiCVYza$xTuE=0O3@4q zquq;T=zHziO6)ZbseFc+=uoya+t6O1jsjIvp5U$UXh|7R-c*~edm2M#`;8@z^mX_K z?$VmJH#-{B=QS$sS&4-0GEAORh$k7iN1Qboc$V0)^}R0q<%KNjmSvI0fPtkf?qfNN z6^vyujt2%FX7NZPGoXtb?$%v~C;z=k4BP+C*`?W?lBp?iTQCfTCn319chVPz*${QO zyKj~q?)$q^?a07w#!@Ca8~^kIS-B}*^1x9q;{Hh%wEZ)uu4NdB+8rvji9#cdpCym= zmti2{ej2mQaACe}i8xVejy~{SkR-hm=tGubj{X7(TtpHn-DyGw30WsBK`~t{eFpmw z<_yu83DF{Y=-)6*>(O==Mrfv=G%jI`I1=QM2^uw5g`(!lm5z}p6+a?*jMOQmmIj$C zg=H#eB}SV&q0M0uQ$%~2GE)?%iEsw9kw7&P$df=%k%sgS7@v?ludzXUH_?xBOe24y Wk;fdaL>g&goW@mJT_eQ=uKxxF*i||J diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/CompositeCollection$CollectionMutator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/CompositeCollection$CollectionMutator.class deleted file mode 100644 index 44de3782901789b50bdf0c57724d0468d49ae655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmcIh%T5A85Udv1m4}KqKfr@tm=D-+Fq@c=U^sY#)3{7=;5Pg(MvwYprW$;(oDCHGT8B$^M_68K+b4~MCxohf*22%TrH zTxK3~E5Xf?l?K~|Vq6g>Cs}j*XU9_&bYMrgK9cK=%F?*hYVVCF^lLwNoFfcRnj<0* i&gA$&qbYYs6A)}6sxjWi!k^b~8yA8dsSu~oi`pCZthHeP diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/CompositeCollection.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/CompositeCollection.class deleted file mode 100644 index 3ac844ff3833f1ac91cd0b3ce9ef6e38b2ca0d4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5693 zcmcIo`%_fs8GgRK9as)>k*h2bj7C_%O-v+K0gF^CEn*ckRb!fUSzvY9Lv|Mxo7zjT z>BTgr=}k>cwQ23eB*sRN*wFmenf%bs^e<>TlbK{P{iW?pf2)1obIzVUB9wMaXYl*J z^Ie|zdEf87eCvDvdV3DQI=mf3DKZ+eg@|Ax$R;DrF=>t$!GjahOiFXI5MRX88om@n z5i&A!N=9FnttT{mMfy`k_$t08%`*Z#6~t+LJ&0%V4GsH5#5Xm3s{r2)q84Y0@F1Qm zz;~p7UQVAZz*+ftLBPK&&5P1}Ps8_v_yK+x#2Wlansd^ekmkIGcIhuj^HLBmKeT0SR`5oXNrmczeMh3lqLGPgBFUpUM6L%q5~)PC ziyNDo_bK>#jG?$fNnaur@1Gbu98V8M4<|WO-e<(3$$imuLcZ-uUv@M>4Yu4HZ?dRu zT9}_nNi3jHweSvw6-|pMCx`uVm=t}P#7SyFC3_WAg8$fSiOjaK@$95Ie?XxiW~8#w zM2h<>Z9>UtY9zAj@DX0&=4Nj38i$XFF-&W^7kQeOk+yEQs;Swu7#_~ViRg_E4bh*{@iF5VOmZ$wY=KSGtUBUP>RQ zc}FUy5Lv{fT}NDjD8dv4lv*Zm%ha<*expLo9ln)cq1a_3@oavAG=l@iL^>AVo{$Kx zaX|BX)`=hMcoZAyF$-k~9UIWDV;Ei1bnEEBr*wQ8J9PBoGa4@GxQs!C_9ZgcBL1vn zC;D~#1g}!{`7x#8r#gNnqORcQI(~s)YWS6otJ1%w<8{2D<6%6aur_~kZz?k}K5nG5 z@u6Mg5{^u~+fKyd<1$d#!~1M%Zb)PrQbxAH+1g;F8Wyll!|_CR)R@RNM7f&t9^2&_ zGFhU>M<&I3*K{1fn+kia+xyrh95lhLF!|WQpTKn;U%(+9hoy;$FD%ddg5%d3ey!sz z+z^H74Nu7C-FQqsr*#|@Z6SE4POL#-fvF1XtsIcpv&ab}fvi=wUG%G?b=`ySL z_74np_xEgLM&kwK7pmRyotxe)aa^7^UT&Ugdo-HqkDp-D@TJVIA{WQ*R7-gh!}2uX zCET&YoMe!f&AX zjHG#mH47F?SAMsvfv>4o+~ScXoLWjsWN&KB7)lJAk1R_{!B9MANUBj-<#ss}-2Kcj zC(y_zY$+69tRDCzJ@SR^lO)c*n)6KcY(K%TE!?5l7l&t{!rph_xdHE+obX^1+hy>w zeUyhcLg#_a{L-xh=s+jG1gy&j+inU3f&}x0Tc+WkkJL@1tteyx5u_^a=WZKGMqBVn zVhLvVVwi#Xn0>_DNzDF5Ft<`|!DP|0G1Jsa^jhuh2)_mIoNuTzbOF_M@)24;3r*q4 zjw#RWE4M$YyUKl*Evn$>ct5`m&@KlNV!sN9OsNgT3!(nOZH;XM4_t5b^dKlII)KT7*2umVRYf0XEBj@AX775Q?VIr&No zv@JD5nWFU?m(D9Jm0M;}=)pPoeOFDjKk&{MJ4vx8QODn1^_ax{IOV8az}cMIYn-cG zgU_Omf|b;Eo4^^{?CmCj^U$s%cJ>C32Tu}ICLSYaB=rabD(?e|-* zk-Bve_d(FF;z%&Kso!>rwARzZ{P!skq8yRpY+cACt5 z#B2^vqvRcwk_|^?{cW=-SF}rcONhhe3IisYk6dI{Ai#q!k<82VfQ$5jR~UX5u@;w1 zB4GlTaCQKLruCa`A_d&F7yC#cNb;5em6TG8k}BqIQPU7govOcOE_4Y6E&W$e$-t_Z zMrG(Gs@_F4|N6b{K5x6f(r;UEz4VoSIuk9pDNq}*)u?Ez^iBDce2XquZhtW4r)}SB zn+v@Ptu3Sm+VWQJB5m-U<;QCz@;Zv~24}9J9M|byH>lt=tv$nAzR5tCWgtxR*>H=_ z`5QXroT>Z{p4>|R5ak01Gl7Vr5=MsODF!}on!!((mQeBV%&2J^FJW}{&F@fr3$^>pSInU9w=xkH<>}BNAIaxj#>!*AC-fgshCiC*tnAb15NUK= zmd_a5F%}e6KVQ^+cZ>QnMg4`M-d{r0zc;O^SA%% zz3R#c<)+jAjj8_c49kDekN#9gxItR^n1wL=*l$Yu7 zPoeyknpr^ApitGKNY&A1A=IjRtY^Pbtu#4F@KrKfiPuT$+vFHxlU-_x(S|1xB`+l} zUz_K%HqXc+X3-xhJb?)O$P3 zN;P*G6=E(a8mkqi6hryLd~r0LLv_$Lov30TQd^vR^0-Pxy)9m02yt6f7xfp%34~j2 zpeBzQlv%X{e%0$>ahIb&zHx9`zUF@w`E`&u9t+R*yGTZRnM*5Q0#ygGdWo=lVKdSAqNO46w1PW8*;y| zbs^Ycl&TRI=Q0Pj%!VZhk`y4E#~jYj*p}Onv)tSaT6ebEHWbsfvJ|u}WkAap4FLA!ki0GmO+viHe6R$+_k=nXY2#c)#~RhO=5SR2xC!=op) zA9n@%Yp$%AWy6yKxkbmV=8c+B-jeyUv$Ml9d|H+)djzZJm)o%gfp|rh9oIj1C%d?9 z>>BxoXIlAUC%*9FaAVI05Qr9?3Yi^WG;O)m*eOYO%_v#iNiRBOmT9n9u7k~}A}cU- z7+T*Y(>A>sf#UyXyde-VJ%LOp*@7pjh~rY8sJCU-1!j-Zpet`z-AYJ93cYJsX2lo! zL_pgz>}vjIX`A;_7$cEB$Db=z{EG;`7w9o66@llTz00$FJEv3|K17o-1|?RVhFg|b zO(p$s#|9yyQ!25*%n=ScqFfDc;G7zk1xCB2EYN~g!ba&} zz1+BWPr3@^Q-Q&vVJm2ArMGm~N%J#&u7)ot$vJ&e?^1E4x*A#0O;5v@Ff^1<*6=3I zYq)^71Xf;LrnyqxbB(gM>i4zzm9l%+AM>pyblm^AKN{q~<+tkdjg#@Kex`3}IWsUa zb;*W%Gi2~|_h@@pAhu=Hm*jo6MNd}wCTjbOOdI5&F|$Xg&=Hi3B)g#DHvy5A<&9cR z+Vu5AxF_1Bh1wu|o9xR2;q4YWJUs3>EdVz9fg*xT{IXW1*S!ycQ|+*4R4w2PKi4Pu zGl*aWr!dUbh`)Ln8Rb&Wd(n^6(D~*JS2O%QMEFeXLu}^8_YnEnk00gO#~5H1XE_eF zqVO7C=Zf(@8pT)56kt6-57)r7!s(fKih+GZH`Bd)==&o#@hf8Ej}aGGntY6Yf$x#Z zah4EhBKgxlfBnLf5vaVQh;v*f(-m^Pg+Z*bmUU#=R~K*_7ui~hQ;ykAlUWvH%*?#p z8Rt{Y6i>x|+UFTzBs($Sxy_ZTc`EnF=cGmO0B04~eGF{w;aK{36RGhgUP`AqX<|@S z(B*f`&sO2zQ4+Hn(r2o}V2Z!vJo5?FkU`#S%&PLHa>P#Nn#fR)6A?V*UaRti|Gv)3 zy%1`ugPQ7~vcm&ZmuFP<*_OIDCOYbJ)=@XeHWbd5_HXNJr0@-0@-3D6&d;h7FBa&k R_+~r#vw^MxZ~L4t{tEk6%F{5CWR;{K7dLopoJ9FLZL;4ZMvijn_bv!5E#@? z;0yJI`a*r-)2Pf?W(1}%LmleFj33JJf9`J5RFaq(JJYjw@7{ZU=bU@ax%unwJNE!= z$9x3&7&J`8Fo+`&9F5}j7{Yj?i<57PnC!+T920R|#FU5=B2J2!7BM5@l!&)Pye;A# z5vN6*5!JegSrLT@<{~g6IIE$jY`CUwO&M<4bnN5f`!#5XG^`zS?6RlZ-jr@tjLt3B zGT>-!H+jV_%)5?lUNz=cd7o{< zc`zEoBzNd@a~k@CJ@v5~o}uxMiW>)9HY)Bk^@6KA3zng~)R`8|(Sl=px@ps|?&?sf zh?wOAr3>B_wUFDQrf2X(9PUh}>w`ZY%=6eHo-^vYI`{Oahfh7|iiUK$!F1!Ly$x2< zMb{`fmw1|8{y^EvvG}0I;WA^bj2`D|<6=d(=v#DNFVFjl5%ru&&o%9$hQ6vJDx&@@ z-H1&(6}Mm8Xw_y$!ZOI|8FY9k;RCJT^hEkN>R3qGn_rzI#}i!fB;R&&hsI~u zU1-yp+XyZ2C4@BP8ueihhB=P=i;z*O!V>mCfk6c!uGq}Y9oavz_AbKHiO$ZO@4q+n>)8@PaC4FVs#=b3oo0awK9z^B>q(fwfd~1dr zX@ERV6;ni>Aaa_>86r<9WXf0e08-!*vJkOMg_^%1Y61o`zaTn2ai5P!b`f16j4WS2 zGP1mFi5nt}avvA<5hPDPpz9RqG{2tVtX}8uU=2Qq9Ypeqki=_^jJ1t4h&)SVu?bR6 zRgg^c0IAbt3GtBfGOxT`M7M_Q^7n{NWS2*lZYVz!=;yM245+8?XF>(&JfRkPP+~^f z3hXD*P~fX31=ZTac-tOcB+R9UdbkM#P>P-L0vQlYSCmr3OM4T)O1X8a}nz`{JW?>tkV#y zX<##JX=#sGy3mfLAJNi}Y3V0*oE1yiF9VK2j~f)z204UWTNeJ|ANRbiTtW5(yw3M1+9_2Z6m)X@*5(*ZGx<(8gHJ~$iB9bKM?sNkw5(h zlJ{JIY@FTwZD;q-BrY&#ZYZMPD^_xbS82ex7UWDyRnf%#Z00*e!fd{h?b%yM*7|S< zHLmBK2zDX48`;iyE6UUFQ%Q7k%sUFVc){J~szrXiQ|EE2)|XSYzRdePu;e85NRv#~ z)$=WETvg3I*uWJV7)g27-vjr^UE=Job^a!6wa6a~Ehz)5DzQ1`H&T8l<&TDxL&~PZ F{{W!FMZf?6 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/TransformedCollection.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/TransformedCollection.class deleted file mode 100644 index 5bd25c9907e145c7bd04ff981bbe11db90087fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2116 zcmb_dU2hvj6g}fO-o)Ox`EFARHH8+(abqaq(`{0dq~O+Z8umZG@h9|bMCq4-aGsIUqAl>U>ct& zcq0jcHQ*bqf65dIoAMCjjbuNYXP?odn z((2D{$XP|flE9#=JBDVi>5gmI*6s3wfVeI&FmGF~r&->bX14X-?QgIC`JJ2oMj+)m zn&p0KJ1yN2$X9HqS3N%mD^NNv)=}c(_NzMs&>rq1V$t3l|7wFwjE|XZW=DFgAr?mJGAs@jfTM3QJgnOk=ByT z%0xFdJd|9q+fH4-X2{f@4ofW}(Xj(^9;dX57ja$=Re^J%W@Q$7Q!`6Wv)$4y zZ*jY>-;;GOa3*BqWLj<4%UHITsp%Q3ZJHA3riy29M!_u=SxgFygxyeb9PLY~l7eLw z?_))tUsZ7%YYOhD_yFrFHt?Z>yDDD6B^4jxV+oU2@hWBnmj8XUrJBnMs(UN`D_}g3 zZ4nmO!hXBj?DVdAU_Bp7;)>@ORAQzM|_m!DjZ*zfQ2Ezz$MNoT&oUi@O*Q_!=kkIZo38k8xrb zgE8EB`1c?A(CdD1n@Gc;&RZzpGhBk{v&a#DjQU^XH&$vj)8R7{gqh|}0WUKsA$u%f zRt~}(%1zO0CHELZWHlVa_XOG3H0kT`In(Au0v_r(7zzRwvR99S9XWs^V3>1|!Mu$H8;cBsH7Rt+jbu1jFJJRp z?zW8b-IDfwDU8yA*RlFMXt*VxN0C?f9mimmbd88c%PNp3t!7n*7rg3|WumMF_bWV9 zvEDUWf^snA|70_FHxxVmBR@lCR|U%KGo;rG70PR_RK(zwb=YwE4Hs9^6}s8fK}7e* zM|$7x1##DUKFQ#m>sBb_k%|kR`sUw?JHxQwe}c16)|8;e_GGcKl*2Msau~yEEXEnO z`=|U?6T?_CuVgZ()oU6T_23`6dMgk{hmm_6M1}`K>iTD;3_}fRJ{$~t-G%rv`hWO8 z$vlSAUklYYN1=i>4A8#DCxt9*4AKf`Njro^7GU@p>~drC5vexP_X*4)nIRZZ#1P4R z2Z$VoNuv;qV3hn;Jb^A`YJ)uyG`TA^47zXBQje9#%DSedc-6^F9n>K`f2;U=d3`ByeBGvJZV& z@sfGA2NE8L$Eu8n41FdyRHd-a4O7*%RD6bkEiwdRx@KC6X00oQGVlI&@#zTv?CT*0 zPmX7GL$Nr+Mkt{h`KVG-vYR}b)r&>iL+?U?XDtFVqtkj>%kf;SW*QIw_bm)vF+E5A z&LmWgFPDoMZmcPp0$BzUdX{2Whyi^7!|2O+3RKypOjXM>EQS(W%C-_MTWTTt ze`zq4w2d=p zZcyBza6{yA$3D*BR&qIpK}V~CqUED2nJqd5xPlP*tm_b`V#zCoDI;Gla?P53lI0~)I}DfBHhHiP z94wYiE2!yKFvEiyu@hKHhU;xYJCRdr0d2O_okpiJre!EuD^{!EnM(QVh97GfVYt^h zSn?AsyJ_eerJ|uFFhrV|s;13T31%woqd^5hI_1YYK9cdskE?h`M%s^IP@1pQRZVGT zxm3~(i|1BK;`oxHHE9LLm>=)sjvpU@j_+#c6sme8?WU>jh_-WzHciElv<&Jdf*lO$kW0=o;Rq@aQ;~F)qPU@XKmt5EsEi88(P)EHjnjyYFSfS8Vj;&rUqX3Rx{!T z-7JIjlj!#F0%2+ZwMU1ogU~qK=*U^#Bjg+ukSDx`4!SGq&-AvB=4d( zas+uFo~1nukj1-;ezJJ?;amEGvAuu(6dS&Apn3$99oZ42W5L}*fSk^w3k&F_OZ6P? z<06(RycLA-0N1ffr|BW4X>I|J$eO0V$2OTE3b>CB+*^3trp1ZY2%)(|J8)=C(wCqm zMXnye|D!!CMDf{Hj&5w!u!K}$L}*rwghX_)h+=TCZrk5LAo3J}XXs`431^yh-fGY} z;J`7wOaE+C5;frjgW8etV hGrYp^eN)=LY>=p)cItyILC&58`RY`V3ES1(e*sZthXMcq diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/UnmodifiableCollection.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/collection/UnmodifiableCollection.class deleted file mode 100644 index 06c25059abfd50278fd0389d9a6d9a22cb96434b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/ComparatorChain.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/ComparatorChain.class deleted file mode 100644 index 053d97558aad68608916200aeccee7582cec6c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4046 zcmbVOS#um$89jG)jass!(PB%s7$w+}Mkd1XlEe}YmTY4=T5QX1@IuQBw?kYFq_0&8d1!qu?_Rm*lBcQwvMB7(kw_*sK+9Tvd@ub zNj{&J%_V8d(zr5Lk=64_Jd?tOG@5ZSg-f#dd0G5IJ)XrErFkxi=j*WrFUa=G(dWr1 z`rMs6cf|6SWR6WYUX(X{%JWo#LsHg9_@XLc_3AEW2jW zJ#7{$R{Z^c?z;W#kFWhuVZ)5GxMY@0*C`Fpn|6^1qvy=?W`D)C3;m;Z*&R?YoKl{! z#knEdEh{vIc5r6Wl07NAJnGCWSa}*etB@G9i?+L8A==Y>S|K*<>i_w@E@ z?b`-3pAWb)aAnI4f4BFHgw6*mT2$$9hJDmCT>;bo%pU`w}HHsr%MImU9pQxu*N^hC*W&zpt2a&*KK7;$#i(lC5XA>uqFjB3fiG-?hx zY{a#6u1mtso8@^gEn_mILF?&?S>TD5bvTOB_>5N~2}kp$lP8@@X~sHiODZ=9(a`cA zlsaN|1m$#~R5CA0f*9D1JuJ0g$;$+pAChLj!Aq#$z{j!Ez(d%T#Fq`cj;Ca8%)lGc zOyHP-gR=Dm_82&X$7SIw2EK|h`dMRZ=bS2*D@#iZtCgQv68$WmT6QRm1-!G>LeI{a z#iHY8r>!hC7w4>e)|{p9vhKWE<44nUCt7B)+sGod13f9g*^eNc1Ah7 zSkZ@yE^nEv>1GR-$qA=uWrM8-CPm8E@r@+jH1HOV8~7%^Mc)RV3hzFNQwF|`?-=-u zIODrmHt;z-rLgb+zd5R53FTGQzU}l+>g(0MCq#pc&4%r*%{a{5%_R(dfd$M!Vm3vuNf6Dfgn>SjIkDzbyP|`OARI0Nq zPNx63bwR4WsJrIs@h~S6o)f}yGq4s?{1`5nWtL0kuI+kq09}07x)I?s)`J+@(Tg14 z(>}gs5$xa$)0^X%WVr5`|$$(zr*PW9%h?n z4~+5XI3D51@Q&b7?Bkcf4ft@6@u8Hx$y{G_4T*aprjWoB8lu(P=0orR2Js1k2-tof z>}_(35^OlPMnH7~DQW6*(Hlrt>B{6!k?OmN`Us{t8$Cnr2DfdAT}3_D>Y}S?2#DmU z1~3Wz80sj$5yQw}8l9M-1M_r@MOCvH!n`J$^(fSc4*Nt&iwL_YLnwdJr~EkLT39C6 zCsatQQGtBcac7zCbVI(#)J$YZtDk@ZJmdqrgcVB=e8@ z*_Fz5>|l!AcdwwI(1Y)Ua8oth6h4I`6au8Qg$PDCmO47hA0G){%mFoCxWA5C0`} zIPM>g$ZPK(K16Sb`HUQ9*cxu3`Ak#G8d`4$(ekwYmFe(4i~4UN$ZAnX-V2XSIQ_QuB+#^a>0{cT+AVSEVkc&5TuaZ|q|? z(XOzJBOG)nX4RH`@y+o*Cg#>C_9j{q%dAOeW=m`poz&ab^pTdtRivA;dlM_1PDJKq z*Yy`;YUR$2XyDEv<|&kcq-sFDYQ#p>L`xZLS1s77S}~~Fa6oOwxN65K)qyi=3!YS4 zF|E2_ao>XK)&h@E#7a5N89jkBIzWp!%Ta{S;3Phc zC+Uo8Q8sg(|6P3VFL94#e@}E!iD%wMLx=RM=(?in6yRos7hup>~|P8LwS@zrjm z)gCmfhp|OHLWTP@bMHy(sU^{Nd{$o*O8zhT)_+aga_=qV`mP}!yRM{*UhiAQ13CUy z@zG@*>w6E|#)MqmH9j9ZbpPlI?vok$TE+Hd^l0|}hSW7|@;0Qnfm#TYjIAIRy&ekD z{Y+4(am3XG!*mRWI!^o(6fub|brQCk(n93P>mqfN523hfq2}%dK9u5a#m7>LF#jJS Cb{fwB diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/FixedOrderComparator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/FixedOrderComparator.class deleted file mode 100644 index d280bc35558b67d8c2b3680be702531327233d29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3640 zcmbtW`*Ryt75=WYvJ_cy5+!!xIy8!D8(Xqtnig7|G{tu9#__8pb`qzAbSRUF-NPUwZI5oREu zuzquBYj8+Sz4ek)BU0v{$WV%f4vMESxj4&aknhUodT6YdK_ErgNAUdwNeO zXe0KbA%;!Mn64HVjPk6$P@p79V|w9)UN+_I3pHoStSAgk+U5L!UedEm#z59C78xX; zg#ta9-o9AU%erHiD+6QZim^CTUNp)hc3n!~9X*eG!4z~WKj5J}D2SA)5HTI2NJrZ@ zxI<}AfQCu4;<$Pt(^1$Fcr#8~1OlCH4TxO@H+-_x$_TQ{b>4R64QFm++Q=5uxvTQN z7qp&nK_Au^nSgd5;kwx9E^IHH6KdTo246CLCA(q@dkS&d7^;k(uj&PbeH)m1uYRw@ zVyuu0)5?=f=GihXx|{8R+v6;iydjLVl#NQYK*m@=k`-qB19~D2@n&tYf*8}i-s6D6 zrg|6@HTIOpkK5I9))+ITwmLVeiTy%K0{7#i3fr1xenhVe(&hFVIBUKP3oBKu@?_agYQacZ)j~ns zem;S59F5`&2|R}{M)9Qtp2tW6U&dF&

FCdYiK<)l$hWJ1p&zlo=BjaQVQ9Zi)G# zy=dkxrS#NB0jKmFE0iz2444($O5hO*zkkju8(BMVnH6I(bwNf)Drc8dKJ7&9c5}6y z$`$l{oi4YY{0vJ#N1}Kkfv@6g349&jV8=D#A9u>Eli_MEXOt88CSK(Da`|vaM#`~M zB7G@=Z{cNyyN4XMBiXd_^2#rm1{&s{eV(bl{!LqSHUKQd%I^#*1}V3Z`AN_8olXi2Y38!I%S zS?*&;U44C%Z*D5Hra2EvRq8zW!CE}f$6ml}<1iTQGqgm?DH3+=)|okZ%&6IeZ+0 zJc+A=zN_!jm3;6={qsa}^d=o9Jj5Y*GV++N=3xSkHd^4JiXrQ~Dj z`#jJ8xTR_{;*%U|nHy-IPtU)J$Z72fHpv<~u48AI$-afCb`@H<8J5S*Pw4!obow*b zsZ<}$HJoPHM3Z#3mz_DqU5NW>Hk8+&Kcub%Fx7B>9lJvKG1{m5Z=qWn?jxnfVw&HQhG(w-noELyP%Ck(2T3VA~A_O)fkP{oji)T>l|2bj; z@_EXm-=od~fAS|e@8mDd-$91m=7tg`*P&Hyb)7(44T&I{;mf|kNPwT@9&*zeX_6zw z>~oh)32*dT!(NxVJL?_fLr$nN|TllW)W=3f}|UpW!~hI#y* z1N9#qHU9+vOGQ;FyrjZ-L$$bU9wrl2&czedkfhccyw<2MMIf?M+=b}lb=nhNyV+Q$ Nxf5O==Zz3P^>4reLh=9r diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/NullComparator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/NullComparator.class deleted file mode 100644 index d5cf361385ac4059c581d90342af93f186e04cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmbVM+iw(A9RAMi>`r$(g;HphLa~6z-slRt0xnXQ1#C@4lWJpmo34}HX{IxEW|kOV zeD;#~X!OY^FlG~CBCVGMeKYYd;)(d3Gl%Y0mj`^9bNQX$`M&RWIrI19-yQ;3z)}I{ zaiM?-yi&jcyqf2#E{E4FTpYut0&=)Kj)Qnz9yjE0MGkLRxN2e1!kZSF0+X>Dd5*v4 zMzI$LA1q%N5N``iw89`xoFG|q{GOY=f9cM`{YUHP1P%pZaI5G0t#E7GiJT;i1ZGw? zojXpgmw0|{U~dT60X^epG)LbGDs!*R8d~tu1Qh?E7vzVGwftL|k0kFP5T? z7Dvlfa*DU*H2V}6b!esN)Oc3A`A*QOy}PkV`bLU9Y$+`Z7~y#tl1kI?nLN25FxGYA zZkh?Eh5kABm0`duSy60DsX};J9WehnCDJ{ zoYWwT1d+a0xiSi3i9ecU1u>JlX$YxBYU8^n*eMOx)L=@{u@Q(e>Ab}z`NXvHDzd^;#~ z2V^+~@Qor!OFpd$gnYRg>}!I_v^E)%46Mxf%zkAD<7Iw3u)kC0KQZx+q^t7#UNM_o ylF`;F$P9>QkR{+<7T_Km`Ugh-Bb%Z>6lrrW(k9NSNKetSzHyx=H7G9Irlr?dEEZ^^W`gmaV)5aBB4UVXfvfT zl{!6&7F=w?go;UAk~V*tlG3z-%L=Y2m{D+5pgnK8mSL}(Zr*Zo50)1N#EL*m%E{$D zBj>FfcEJn}7k~YHFMhueP&3Zfw&5C{;|g@IZW_CWUhphiPgV6vfyk_tv%EQh;7Dv; zAe3^Rm;!C9R?fU#*h-u3eIspC)3NGg7~CKQo-4|bm$mW&bE}TKp&Q#qCTr@9xG^QsRDdo$gFkJDnjogNQC%sAZWcgmbCbrBhob={| z+$k6~v*~IOCiajHUe@s33d56x@utWXS?` zA4+UoM%U1dez}~`(1|Vu*EA$CtKl@x2pl_fNx^juXK_x$9OgBg#|44e|0ypA=U^2C zIvY*HzS?s1HGkBs=jGndA0d9Fubh!uhXtY=rnl^mX@;drjl_;JF^wQOxpir+d9Ib) zU{e_;WgB^R@i=4D^7fTU4D#7&2=K|Za_vJK+QBC9bq3JEj}4+6rjGsM+QZWn^@4jO zF7_ba`M$keRqCZRjAMh_Ecr3I%Q%%7MD!W+e?U%CCE5yt{E<)m1A?Q8&j<%miK7BumS`60046!i44$JOBL7r4SHnYH@ g?~?LUjNw@|xj|ZoX_3X(t7+;O@zWHDQ6E73FUGn(mH+?% diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/TransformingComparator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/comparators/TransformingComparator.class deleted file mode 100644 index f96bb86b85ea6823246d3dae242666a0ea667b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmb7DT~8B16g{)ucI_9%id4i8zzXfQutI#Is4)a1rojgZ36I)HZM%0A2_bD?{&^i<~_eAkPdva+xzVK9orYE z);+&vnCGT-W*e5*>3H29|E_CWfg|JNaWyw5_MEO0ycRG@vurG%2&nsB(-z3povwY< z?=)=x*lf7W$h-@c;qEc2LCRp!1|PvDc>|7t9(WBb)}&|mCE_%R4JbS81wVE%Q4T{ z0rLv~S-tWT;&cFIfY>)C6x`#O3KzEtv4aK97o%d_XC%LD2r5Fz!VvP5H8HN`^Z``8 zdWpDRxkO?NnkOf)%dy5j_XzPS1Ye1^jlgq5a6*L|6cX^vhBRMT9Vbpv|BgiE3Yvl= z8CJt^S7jXETvD%aCx)-Aiv-Pu9PjDOAqw~q^1h64M!ZEl#4=fkjYo_WRxjZ(qZs#O N@r04e^`{}~%3r~XEO`I` diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AllPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AllPredicate.class deleted file mode 100644 index 96489180980d6d5c27b6570dd16aa0f584f2d7f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1890 zcmb7E+fvg|6kVqmLPHTnK}7^q&|ZWnDk=pOii~Inl|u3I6hg!}X~U!`Gde!{6+St> z_~HXPI^JgZ0N?!r|3h6Tt+6^fr4Knd=j80Q_Bw0teEI%q8^8!=Rh-0dj5AHnPANF8 zB7#x5IHN+v*%+7S+R%nE1?Lr9P;gPfxWMkR=~}v7Fx|4{l$Pgb1;jOh_N-GXdwR($ z=yt`7er+#qU0qq67HG3>y5^c?=$=^?NZ-pj?z*OL=*9z6Gn`_PVSL-RX?VmdYr*LZ zW7kb@-iI|zft5rP!O3QLB3WmR1RXi6WG+;StERi8uiD({%sB?N>Qu~iZByN-6Eu^^ zJ=8aKt>Rg>mJM`dn&R*NH-O$m%Nbq583i1)xEz*wW}xL+w5p5vCa zY1^*1pw--@p)^mRt0vXfOY7Q=)rWK}le|m&Ek5&1(((7?t@&3{e~tx0F9Tp^G@M8_ zVW)tacPg%7&RNozJ@r|RNHztTI401qU^0#=T#Dl|Sbb+3RNFsg$I*v=i8do=**NxM zUmQnqjMe|QGJ!+`ia@l$c!Q%sHbKm+X*jM={RXriS4(uq3g@a0FSAg2 z{jIdsTJwE9x6`ba+=>}wMu_=^{L=J7_KHBNQF#Sn?COZ&Y&;UU-Bc+zRV&&5HDyyM z;Y6~4)BFvp2=hM}M>|63!7g-wg}~ov2z$^ei-YqhV(3CQzwGB~oe_fXq0|S6)b=wd zZxGr_ZAYF%NrgwZxE;R!8Ie1w_lR!!PzN~nLE$(~$_(KqNH|6KON5+8FJ^F%U*lC^ zCL(Di>7g2_MbZ%Wju5>im;S|?_F2S&A_j;T=D12h22)+D!&EVVBmBlVUy8(J zht)7$#>>dT@MLf5En2r3*i}};a5*X;^mKTkykudW$R{!K#^XRi0Lrf zA~9W`b-=%z0Sscu&vr22AH;E-ATK)^$r``ruc=s){`RMZ+rX1LAEGrFwt$~T`X?N~ B<|F_B diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AndPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/AndPredicate.class deleted file mode 100644 index 3cfa3e42bb086280b799f5ff9caf9c21ba4bc70e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1489 zcmcIk+iDY06kR7tJ87EU($q`6jrEpG+t{nps#sfvN>Cv+8Ul7B<6Ye4l(^W97$!7KYM9b6tzkx>za~A)u#3{GS*~+`c}YOr7U)@Yotkere$lY& zvSV)K$^7f}uRjI4t$UtawM@g869SpM>s4~bhGDMBoat7p^x|sU()0;e%QcPX_qk3| zt4M!2;4r1Yi`2o94sMw~xT!#7(OqREeR<1~ck0!$^j3_r&67mlHCZ8pb)vp|7~5zm z!=A##I&B*$ zvkj+`yIWpoXx{|dfmIhFY|MiL`9T~sJ$qosHhasQY67Nh;sAtGz?=MGtA(0YNEdS6Z&L) zF(#Uz(V&>{0se;n;G??Ew2qCz)IQ9abK7g}b=E%T>yOPX0E3u};{;B&vZpFIB?qVD z2xCb0&cqSN*;WqEC6K_dg7XS4D7dI#L|}K>a81oxG~BZ3*bCE>0^+K`j)G&CJfdklf7q~fu~MoruF#svnOI)g=lhBD3`z z%6o*?Gh2}tP%`16^)CqD;!fl7=FGS*c=v$Dd3bMrsre>#M0VUDYck_O&bDjAWG5JC9GjPn_VW^Amz>( z|Abz8<85_x5Idq*b;cY2hQC66_7D;}I)sbe{SNQQ5~gDa;g*E=BDftx4`$+cA2|tkobPNLbNIk{-Hjk0Ljw1rG`}B53&jbjw`M-w_b^1bTCp*|1g9E~`dU3;%gOwp&|OA_7r8XIPD9U26!WR|{6X znpHQ|%7&J$ShX4t@oN}b#U@%K>)TEV#H*T}cOfg9Kq=Mr(RBAdLOE-l;3o>YsTG^G zHLbp+t{GfO6s!t0s#MCkzZj_;2)UgqJXN>UY}3|_Z0>;n)G>SqbX#Dc114{4b=9`& z)IQX)+<`6-s?^pQN1^k{3+$x2)!MDyF$A>2aao{i8Un3TlL9?AbyK%*35*>hxn%~y z-q0C@8%JsStZ7ylPZrgN$^@^sYfI9$wMx@wq6hs%8md{%F04Ie9Zsd`BdnX7O(rPe zWukN2E6sLMXHv&0>sZNZ)+^ea?v&Zd!^|d}nv$>}V-e#L9>{nIMMeor0@sdcoc|Fk zV+`X0XWeRbRpi-hRn?fOSDQ7>v}d;~+NRTc0_S{9$#z2~Yt4q8G%Y*1rX|g$VK{ip z63Q|@#76=bk6`5^%2>f839B+b#wRi!g?bRdr97Ji(tBqy$FH0%1r5gIW>J-Few+O|BMPC8W=ZmGKnPP6%=}>F) znZVL9O1kTt?UiyZ*>&Bly5;JH+R(?nC3-qicq+LXQRrU}SXgPEzzaUl!PIDtJP#oWb zEbtWuGb3LH1ZTYhzaduo_Mg8pj_$&#W}JhNAf?tl;$0lV~1EK+*mwD1Wy<{l`Pg=CP@zuX(+@cGBO+q?nT|01~}%e;`^T? zp8&05Owb7>^CSAd<17FtOMNbqK|eK~HC^-}&zf4ZwBR`xlm9cP*L}iK$gUALFD^$KU=IjcmUHG0l*b5e0y9Ggw%wzNB%T6c_!nmO=ivP}(=;Ry8j zpt6o`YmQ|z7Ja^HAA>-!RNY`~g~5MT;9jyFzuU2G(;0t=&It^+LnYwfJuc8OWtfI@ zSzxTqBq%aK&ZfZtO&ulRcHJy7)-^S=sWAyQT5~aSaN+`Io5x+z%(A+)zQye2QF|HS zpQ3EbTXd7?IjdbvZyyOYs>z|Ya$F!mI&*hR`nFrs0)svu6Nkl~sMc#v!nB;k zx}GrWm5PhGBBQ9_eS9F0IzpWfRlzE5%2-oy3m+=@2p$9=sJknd?TM$*b{iP;X7Kz*w7pv(}n+wkYBpy^MV-J zd|`PepP6&3-rD|5;8vUE&}Me^`V+n2*oIl29AZf|Li3MqM^QCnhyDeULu^E0quIRJ zyOPc7@OJo`THFh9%dCLBsnzoOUA963-6X2%4SM!LT1$*JMV#VQ6^F#T>P0^L(Su%) zmKULf<6Pl6^Sc8PoWKBAPI9z@0Kb3}sUIOydtXET4$?yo0t=53TunVf=%EMj3ZH!l z@%bicE)e7*I&q1x6L^)gN&^N7kHn=o)uebriXbhDsi)|CjE>c~{0QM+QoD!<>=Sx} zpApRkrnwLk$dBwo5%>zd>47gL!BMBcudMV3&;CeLtE(>EqHYv1vRolo7RRtamvdCH zgflGqL0qTa8@$*HTwTT@9d}iyXgx}+(|C<4sge3$=lcxK@!wAm2BG3CpOP20WYZ^` z`&|2E>IvlZzF)^&ze4n4HIOQ-2GfN_SLJYv%D5K`4PmS^b{kZodrA@wJPc8j`%5Ct zFTu5l7gLGf>^4pQdFqj973BeSrP4p3`&*7AxTkc?L$b)T&Ap#`=zR@q`l`}``#enE zm2TZPF}G;r`jiMv52U_F_ue0P`aA;)8Q@a*^WVLmi`*2N76g`v8iR03=v;oT67Sb#wt^^VliI7T4rBqQsN{EDbnwV+o%JD?DgH%3( zZz=Fl7QrhL-@$hv?l=LJ6qMqJx#O98&OLXTZ$CbM0Z_(93UMs!(6FLo6*tqkg`9>p zosL&DX(xIZoA-q5uI z>G@{Ok*@ete=7Ku4nr>AIN&e2>2SAaKJFe+#+Ab9BZj!`4u*kJb;_S=S+$(8cD*Hs zo+Wl{mC@p4^s)jQm_^3GBC;Av2IjD?;kH4oHW@ajbmE_R(Ev;eV<=8xJ5d*gg%EE` zvlR}K{c6;eGb?)H$v_5&1F^$Z=?@vIe=Y75O=C38S?+9}G&q(gctG`Dpjn)(LIun8 zQZz)6M2glW=tzUXpw|__3@)i|&^|`DbC{=_^YnLxtomYa!H&ohH?4{Abc1lzys_sU zvdTAJJVxXVZ6cwoP8PUFw41mIV?-Big7=sEs z;yQ;Y?YD^QAxYQ{`LZL-n2*pT`6@9baqYLX)zAk>e?t7(F%s{H*F72%${xur^ z0ZlYSN%Yagf5HF7c-ob1goN>OchBuPpL5Rl+`B*je*6TmgeNNQj$ly(!#x#64Z|pD z$ic|bt~`qSc%WiQg{k5p!=;c1j^#FZ5IVkiQ`=-dtJOA;6 zS7jJ+He5f90?tsZ`$5aJ+Lpb~P22Z83ZY-u<+dbNXr`VOhS3(6wFGEWVB^A(r9mln z0!xH@e&F$d(hP6-Z;3xqcLaYGc}*VdSWTBs@^#;)CM{}}?DSBzPddr2Il__a4CRYg z)}VB9-w7Gk1{Jv%30wL>SCG?1=j2Hb42#A3f%VQZT}!mg*UbY`vQj#G#E@}BJCbo@ zXZ#s7QoB1Pqc~8+-kh{;KMHJKbz;$G((}G@m*Q*;3%#T@8h6WbUj(hl<3heXw0S$8 zKErGpUhtw&7KASgO*~0QWrn8%ZqGTY#e}(dSXztl}}<=3ZeP^%#r+ zY5KZjm`vgw-`q}Kh4a31eWv=yvMmEgv??XK07J!iT^x|1I|`K_ayybF?J3~NoEx}B zFEj@Q8b)cIgN`wJ#pCp>6-*!>_e%TN=L#n2%M@8P4ABmlF@9t07;HDM9AW6!F@|@I zBV;}&!PB&klOwQ9;VZOX#SB?`Cls>@n8mWD*eaz|$U`GY)+m32`h_e7J<>Xno>3{! z6Vi0Y8`m&TeiWB5>CXh$aU*4JrcB-V3bp(lBMQpB`m}^lqsXm3qTVIyxQPOh7|FDd c63xU0GBL4-%F;2g)7N4q#W38aFADDb2a0%1o&W#< diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ConstantFactory.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ConstantFactory.class deleted file mode 100644 index be2a909d93e3a98f49646d1616d7beb123eea87c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcma)5U2D@|6n@^cY1&%1u6EP;xoMqk2FsOSSOo1XR6+&Y6~qfk<7=0ZCX%Fr{;K)K zK*3wV8~>5`Bu&|HlkOt#$vHXaInQ(6lV5+n{Q$6q%>oqM&`>MV-Yg=AjW}{kLtR5d zgDy}GW#CxuKn9`Xdpn(N0r6DeY|Hn;$nv6rm(A_c3SDkLJ|ESw~ zB2YK|U}RWtEqhlQwm%-Tj@EUh9T6}z+Lj&p!TSdS1!o2-P%-zccb4H=-pF`1++#8m z&WvQ#N!r>{pjkhj(>Q&%Y|DR5ltt6=WOp(i%AjuzT}CRVZ&R>E+4R$3*-rKL{pT{8 z1fD>y>3B}`P+<8aA_IYJwCjWd_vdkXGx6dPgvLz%;Yf0JAgzd`s`bWkwbO~rss!>) z+f6xT>J2g|_WVg;%eE8is?HKq_^o)tB`jc3;O?AD`X9v-E?_l2)=DU2iR<$3wFzv@ z!A|LrU{dS&MlV@8=R-VytaBlAd^F^d!9^5M1ch^d6_l_V^XGddZcnT7dj;p1QKi>n zg`i#1e?t2NvHu;)3;h6@eFhaQ^ITvGa2r|NVS{^Ep;wv~;d}xqVvQ+an^g)kiUi5( zn_r=Rq<0kQF_Bs%v7I2TOtVS*67yJ>VDcBjWn4)y4ceHbs(*ocNGz8G%_D@=6h`3c o>52y@6z6dbYiZ|NqMdrk diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ConstantTransformer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ConstantTransformer.class deleted file mode 100644 index 3bbb408472cf50c23edf2841458769d2adabc846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1165 zcmb7D%Wl&^6g}g_aS}qCgtoN2DWxQCsaGIS3!2}BTe9LvV>Kg*$vB2q?>-d501RdQDP5H(C+tRvp_>Lc%TaCu6db8DD zZ`K|OEH_-Qr|EmTv14k6+wZfFyKS3BKtNw>d%ELqyI$Y)Rt0ia0xVE&?CSfvX6sH* zd)nP)0}D>|%%C2RHcWvBmE$$l|C^Yuxvz;d*{~e58TPxT*Vel>Gv$VBP`FO{jEBjh zG1T35pP51EIRcqA%dvv{0@LHjbOh4Dj^zv7JBinJ=oo?P`C4MZ5o?0PDS^dtqmEl4 zAY0B}7z}JnU8d)7Sg!Q0e3LN zs4!^4*%*>8a?Aj5lU))k@&rk%OP?SgG8#pCNTeD`Y{W=2gKE+~&pP(Sn0$`7fQv)S zyWAs8S^Wt453vl>z>^Ue`8SM=OQaUTT*eiykyb5^{{r)TL{|cnrM2_J=7rb=Dvt~j WH0T3Fq>K-Q>wrp?(KSXA7JdP9Q3u-q diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/EqualPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/EqualPredicate.class deleted file mode 100644 index 6ad7219bfa13cb45fce44957db0e7fe43b1566c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1110 zcmaiz*>2N76o&uF=EQYr8`83st!#+{aVx|kL4#0eMNpI?QX;|K#2wP992>m!g16v3 zxCn?v0*PBB#4{m|9m@$VRV>+_8PEC7fBrN6_2=6U05z-@a1kpCE~!Z2vI+%P3N*SJ zj;<*vE2t>Y8Rk9VN^W(9>q*Cc-h9Nso-oWd9NY7`?RU8qh-}-a+!_A1-ZA84w8Btq z?eTqXSlsR#TfIGD`u7-S`oeEUfu>-nmk;l$v>dl@@Ymej6^7{y29$^1mPG&(;2BR{ zu_I0H3&Ld@&JJlqtw0&Yzz%Zq(7hEyJrU zH%BdWS3y<7b=+XMJ;k*nlxjGEli{PLVGi>e3@lU64|a~BJcXas&QOY?rDJrWlOx}b zT5@X&AyL>4tg)43Q?uRKe%NkoFzD0zk*J`vkuF!LlQ|J~#={z&ZH4YU!c%@4DrUf- z(XWugEQ(?AG|tf11)7oDG;1JDBVa-Q3FRZ$@H*lYeG`i` z(?&s9ijXXHI0kM~vJ~x536jyPpOO7QvlPapbt2VC#Dj>mG}?_*Bsjd(h)F*n&R{ua zuE)%R{t4OY7v$b2$Xq1k@dT=npb81&}qnu$8YR3LomxLx4~QhEE$=M3xx!=;Aug3$58uH!}`$KSWVzj}98WGFP- zoxSaLV~3&IQhwidh7LaxHdliIl~8nD!9(H-?1rm?$QK(7rM?K8F(DTW^=j?^OO1v) zq?#)&>4|nU=m~$%>AAF%-;|yVw-~b3T9={HQk?GL&~4~A#Tem{3>cnGl6xI_JXC&Q z@0@Zm)b4+IH^r&oQAmn2)z-0d;@Ga^_3f9vW4h;tmd;6U7=_xxU&qw2P41>ft&WO( zE_S81KXXxPO&6Cjg{x)E;yQypp}o6_=`jz(+&E9|FG}x3y%C3+@d3m71jc{1f#&4m z)fiSLu%#XtrsG`pvu@@?_~|7d3?^rhFQcH%KjXaN}%VbOaYC6qw}Nn@SCW!%sW zqTHbK3a-(~G_7t?)Q|BA>;pw=FTL~e?jx$Bex}GL6g4(iA0hLRl1vQMQovK9UB?_{ zT9QB{H&2n_W-Otlw&+LFSnC|wgNiXi?klYlmPBwnW|&P-DFfkg8+VAQfQ7M{bYSDYg$Fj49OUuP z!Xt;`6k4{hV!>sYiDjg?-;q(Q!r*P=6$5+CaH$>!al(V7!~KCQh%c>QZ$6(C8SF-@ zy}Q|}Z!x&dFzR{yh>HX1iLl?N60*K8MM7Ayx6MToMjzK1NJXDv+%~zbm6%-t{SBZm2*dFB$S~wZl+phJyOw)D2x{IYx4zVulyf=-v$iEj9MG zJ_vcF)&JFQib(Q=2xm$5AwTAx&x4+~(>^rUIT5>>B3D)0C7%bPHq|Zlx5O z>KXkh`p!8;ey?H-Q8=U12xUaLIf3A02sZAFB`l>}K)oM**=^}!H3560{h=f#04b->EWK5@ScFOK1h!6f3 z|A8M5ffn@LAL7pt?`%S-77Xsg+&eS(o^$S_A^(->D8NC(Y@x!i5XwMtuOov{Y5!H@83TLHaIUWXFyemH;oeZD#mCmqmmiL^40fZ{ z-rH)`w;3u;9rRs(#KnPhg&qtjg{$l~IIzhECTrM>a`G~t7_xtW{_mIl1mS2+?9s5ScnR{wnO?XqWPFoKH zA$OE1VfifGhDpz30T=UF!ZL$9r_nnT=`$pT;>@2Fv7-Euek*$h^8v%tIhg-w2Tjf2 z1u~T8;LUU}EXLVNyX|=P)ceU}{?XTV6ez!6EqCycCe}s*Sva&7kwYFdpfu(QoX1tu zCh}8sU%(~0S)|={vgS*D0sBOj9*x#aeCkpjb#)r~h^&cCSH?(uCMOYx8YgP;JtWWn!HZB=-xcG1A{@H$j;YZp8>olc*^I#p4EU5|WKuGcl`i Z43IlPW`7LpE0~dVTKyXBR$_wNzX2&^^bP<3 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ExceptionTransformer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ExceptionTransformer.class deleted file mode 100644 index 5a24827497d61ca289e4866bdf4b62a00faa0835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmb7DU2hUW6g|T?3u?u-+FEV3+5$GL#s^IxB#LcC|P0>@JP*!T;hv z@Z*7`P4wL#;?FSNS&*PL68B;5ojd2Ad(YjOZ$D1I04QN6jRbC6NMSRHJ1N|?5XDv! z+ZM$slux3NM3G^^7oOy9M|i%}>Q((21AESJp{A7|a20g8I}~x}ee?Uvcc*EFRK3}1 zKWWx>8Fm`l>)Cw3og-m8y5FZ1vaTzffVh0S?Q!KFYOgQ6GDD^(f_g~m2!>L=@PFyC znm(YsOAV<+bJ*_+ug$wIMG_UMWKd;@<_jH$Tthpghm$Hgo?v3Zk@Oj=^GY5Ll@n;s zw|Cz-VqjGKt|1-#lEko;ZyfUzZo6Fd>=)f*Qe7^b4>8208Vm!|**QGTv*Ngu{;ifC zdXCtWM%BvSIw%=}EEaG%i)CD8u;=`Ny|JDt7sJ}rpHa3U)ro#B4h-u(hRPh)e@=<6 z)SogLigOredSO@$^QE?1;nkFH$Nzb0cHXVPld4xPbnt*KbP5rqVbQvZ46>m6ORpe; zi&!zkB0omwIb5NWMcS>AHDBx#*axxd45Mql3>BBE$-PKq-nD*IUhMt; z%rNY(b4U5X8-{Y-585{0<<7RS9lz6|6#9Cea1>#Mb`n`-7-}^CGDBe{ZSFk`+EGVH_4u_TcJ=fb zW|H(`Ckj zzU~+%;(XV)8}X}f-*&IhWdB$iDsW}HTA>S&E^AvFP~mVCStk%&k+KsslcP+lxJ>Ue zhZIbVkex*yqx6Qy=uxLIj)Lx#);i`4Cg^06yc*K90;a8>7~KckETs03{=Sc)O=}OC z_i^$R*)a+P7Abv+*2|bCFW*hYObpDls0r*kl}u5DNg!Ek{u7K3I<6-rCt>R(SLOWyzh diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FalsePredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FalsePredicate.class deleted file mode 100644 index eefe61e6429eb58c62b69c98ad4a42fd765328ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 866 zcmb7CU279T6g{)qd^AaIwI6EzthJC7$s%G9S`>*EA|V!11NLpQ9g``W9ogOV!T;bN z5g+_O3JN~?B?ZFvV)hh^ySruZvus8yR(14-FPUl z)iP1vlh36;P@ZpwLsDpiK=}!4#ok_|4z({6wJlKUtE8Eh^p(JkO7(xpZo?dswb0U` zYLA9J746Gjz?{?$K42vla&`Zch?a>~}m>!fc(zp&fHO}?Bg9ORJaxrPGf zAW-BRb5O#0E1SN{+XXB#bDGgbTKl>0Al}e&KRk2kZH+umIYHi{wb<;|37ofdoD^E5 z1#Yu!9V_(8V-QwxmXW|YHXgUC(^{;Pd2P?BM)y+Y>Nq=LTErSIkW-+@pCUF=3{d)n V%+nLN?;)&|Y1NyIE~O1F{{ZTf$0Gm$ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ForClosure.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/ForClosure.class deleted file mode 100644 index ece49279c923580157b7a73dd6e7d34c14fc0bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1370 zcmb7DT~E_s7(H*duG^S`8=x{&@N-{MMGzutVkYR!GBCp>B;J%-pk%b9YmL!ce}^&N zcw-D22~nfBCjJ3`gctq;^|YNMK@#Ai?^mDaob#OLeZT+y^cBDeCKD*2sGyXDgo{bU zF_Pd)^@mGcNZ_)9Q3Y2Nj0yC#49C=(4Z~@fw)LQLTR_|sI8?T+maAEALu-15{Oj3| zw`%E2Lm+0BZO?KURS}4r<)+>8977;iwVh>ETi5gzL)GoIHRf|}HVxe+a7%4RP6>1^ z8*U{)*O^$)RrZ^j-*2Emv}`{jcz4ybjGDK$XgKrQVv{H7s;#qJjYV_cK9u#aCPn{O zPVBmAneI)2(gEbro~XNGwgkrZQo7_>x@$Wvb;fqKol%S@hVHqP*_W%XYL7LwsaebF z?BXh2oXQhlm;$nCt$XZ1`u`AtB+czKrI0&-WpO_<^dXYVv%AT?leRh1)Lao0j2m2%6o{7f#^%f#f{I976yu2h-@%G!cmU>Ob5nDH%^iX0#6e3 z8jc130w5d@=m<$E8PW*f(Kg)zaUzWEE^HxM$ZkR|lr|B2$D@!SO+COg#~JFpL;ZIH z@S!k`peOmC00E5%Rz8hH0ye2lW3*|qksE`B50GCW!zot$2t~qkNxc5^b0_5-&AU%y z=BT>fp_I59W<7po*$#OYr*Vc<0%viqO{oTZ+UpZ-8y4d+@Gt=MyW;yF*1*ey3%exC SZx|Gs5hgF~nw$%w@_zxKbuVxL diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FunctorUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/FunctorUtils.class deleted file mode 100644 index 40ebb6ffcc154a3459ebd206322df6247b1e1a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3015 zcmb7G-%}e^6#i}q>^7tn5D*L2w8b`rAE{8O8fXh?QEH@AQVK$?n`8;gB)iOJL#e*j z@ll=XLtlOIwZ6dAj+ODHGrl?F-=lsv31o?c5GL%sdvor0zVDoK&&{9z{Q45WFjjr& zMMOTv6q2j6!UR+af-3J8`6_awDl8>m08*;pcR=~Hhw~;&t>e{MqY8fL%mjc6e5o8#J!T%Y7 zXfU>}ZEE2>1&5>i5vfyz$8ZEXTu3vHZfguEL)hh7b~zAel*%bOUYmO~W99PpaYDOi zDWE2co9Ll-M#|d;>tMq;uGBV<+nSkMwd|~JA0w=8YXQGg-b^7wHS6Qx_DglLqafeB zmA8}nv?0$_oBKEn%R=$vO`P%LE@*nLP&paROowN9l+s#e(oW~Iy6N29O6nW(WC`@e z*Yv=CjR!Q_)*c12`J59lEhmuB17<#xk*N1rDrLZV$2QFLRDN|;w*@AS1W8(^qZwvE zD`1tK4F(J|rEdlNSj3Wid?s)r@KDQ@d@f^!wQ&%-+!X#tQo(&cKF0%rV2y6F-wXWs z0-Az^A4#PA&}G!7YCEhYh@qDtr2?-KQ-Sx7Fsg7-g4&Cizy-P2ReV*QOx7^0aO8q4 zJG)#Xo`-g4f!1=l+)k{sm9wW%h{?k32=*7-PN6!B-?A5VmbzVGwOC>id8ssM8ymWr z5*R$pz=h;4OXBqeXWV`&zEvHoxKhcdsGS1$rfU>6LX7w#bg+MHQugMn#(8GIM{;BZD!wiA9_%_N>aBK|iK>Wgqho*p! zBhb&wJ%qEI`HMz4hx2?>(TBH70MQaaTj&)U#k0^hJiBP%=NS!)U@d6ie3W39(S$J< zU>h#rVgWEnXGKQe(oQ;$67b{;c$eB6chK~E!+1~VCoW3Toi`Myp-b(Tv zmgZ>0pidTtAS{5$0JINRYX% zmd~!E^ZEL*^O++BhY{Ii?jACqTa3ge^Z8YkeD0C!!@EbR?cPOqrP{}I^)=Ogb3pAF uu9VciS5@sBN2@)3Y_;E!!uM4Bgld1F+8?R*3DrKWqP9qm_W>z-@WFpM8ys_Mfw919|o^>Tvc&Rg~qVxb5EFdpL@P=o#(B`3~YnpXw!B4z;uGXX@@+s_w(JKzq^{nkQMTT zq1@gww@t$~ossc$u*I!ljp4|M2QBGnafXIAYg22x-pDXto7N^bEO$JnI5gWf0Z4#v zJoETaSZ2Tpr!?ImaTeOb;hk_i;9k!h*mP2EyB3KyNjmN0!>lW1kj8t$5kZ4t`5*y( z;s%?-XIPu3rrYjwK4hn?mV27O*n5;wXZX|2}BO}f!p`c&j-Jc&FCpqoe!AcZ2z zQM$BN=zI}N^ruX_CepM5mh@jxKZEUjN9u*Xi}a3kJ4R!POh9l2w+MV271|XiPFR*m zY8X~x;5r3Mkwt+ZieCSU%qQBVuup0b={|{gAW7AUHICy1*^!@Q(%Yj1PQ}beF|(w9 zL8ks5s`3F!`eVY)N;Ml(yi&p|CA`x(6Y~t3qogwtZ$HrqrZ<&fCdM$FmBG&a197kd AKL7v# diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/IfClosure.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/IfClosure.class deleted file mode 100644 index b84cc8178185b5ff8d2590133de3c4c6cbda82dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2425 zcmcImOK%%h6#lLgXZ#o^A-IKxm+8Yewp;hXJ8dDj2{koNrKFLH1kz+WamS2jqIrZ+ z!HP9&wk(j?0wPMG65SPvH9P(b;=41Gag$hbSY&hWoIB?`-*?VE_s;zF@9%#AxPav> z-oTqVD0oZ3+Znu*!x-MpU|zvhxq2;!DO}I;={-5TFNcLZK0q^%Y1~k-s9;IKhXT`{ z;hLJYX1Jc|*mqht1jI)Ig{EVBzGnMtniUx7i+`WpHhcfL0y*=xYuqz+%{K(9ZO834 zv`tOFZ!~nL-zSK(Wf{89XkH`noflBeRW~r2mg5C3v6WHS*ptYDxujX%0GjU_ek+ux zGtgHfBMnp>m2>W>jsoLN=N?r|wN2aT1pRfxUDehtuFSL@orTp{UfS_uc5_g@y#I7P zemI6Sj+({)NLSt1w-pmtP22RZ3*0#d`EzS5uYce41g?xqWh1b4-*LT0Yh%zjUmt_0 zQ9}0ErFg~IHuONAloOS9PutQOmS%Sw%j-QJka_8mHto&8m(6nMHBSutJn3D5dS&E3 zCEh$WlSJ=3an;fIJ@M>kqW7P=+=>&py0K)+=AKN-d_f9Va8pGKvnpQ18G+M-WLmro zx|+4%c7wiQ`-|JUu_^Bcf!RcCsULWL$#(qGx>2$N%TjR;yo650a=b$h0+&YIJcs*1 z2Az|`EfvqdpsnI#bW~JP^|g|n2AqJVQK$1>WCA!X!9 z!Ia4IGp#74T$skEl>OOLk#l$r75Wepa)|IrCKyGYiz8dK$N8>U-Iev)Aw_)$`Re%{ zr~{5D6O*1j@_f#0EbdD`mMQkC}U9mhZ~dUy-Z*h606r zk7-(YT9YaKhyo2YG7f49s9}p6_XSVTHY@cY)DmrJInh!^9p}j>_|MXadF3ptk(RuJ q&5AnXn=p(TImBTEF5=PeU% zIh1oWn=x?>vj*l2*aqeqPK7)Wj^ZjQ_)UA+bHcE~(AVUurpsK)s22Z8Db;1rw4GhY-R8C{TP_3}OPg>*8Eb~k$5*rBadO3xXxQqN<# z9jB6Y27|0>8#!DobtN2HX|BpBaQTXeH#~8Sh`AWbFx_F-$i}AQ-3gjei~H*SOPBA) zt}@K7ZF4L3$5PTF>)jWYNRCNvS*<8kmM@jn;FceGULL2hz)(5isQ%|rjF^mv>v;^J zU|=zi8QR z!4%=4p;(|dkwXe5`e>X)9{u!g2IwKBFo;5|p5}4RFh*!)l%g7XXaAv>A}~+o3p8KEI7Rt(DJC?S#YQFA6>6EH43i+)^2{d~A1F$p zL#h&KiKN`tq_K83&fqNNQJrSe^Tjz#CCqBV%#}aFnE8y}cSp#q7V@AAl{-S^a2^(| eGhD!Qg0giCWMWijk8RA;uDxXv48uj;?9v}Zy%S#m diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/InstantiateFactory.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/InstantiateFactory.class deleted file mode 100644 index 2ce967da61e12bbe4c10b56b52dbb872e085f80a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2820 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 Z|8acD5e2MC|Cj|hLU|RO;(83H{{cx3D98W+ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/MapTransformer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/MapTransformer.class deleted file mode 100644 index b7321c6895fcb532e4a89f845bad537d429ace7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcmaiz-*3`T6vw}}P%0E;%sGF}-?~AW)NN`^Q0Ia!VX624Bk{?U+OfNombAqOpZ$ZT z(HJ%Hb&1dZFTNR1FJ%Lap-J0&&b{YzzUSO~fByOQ13(4$(zuCR3T|g0VL1Z@D`^@P zRg|D9C@WZ1aEDoUty^BNM|}D_j%|gMIM7?Z z=>~hA-?M$9C2QUr!sHF^+KoZ4WBV<$4(FrKS{8ZCDOk^9 z150!$rnNF?Gg6GTieW*-b5C!I!^PhX_pUmFaV&Fm_$Hva#;#$!t~Z*ktw!xR!|JS^ z9E+wCl_-|z6y$`mQJ2X}JAgI17z(|o5M7ar$Up@{mhO>+9Ok3m&^Sr61+r)}$f_Yh zBcPxiLHP)F_#M(K?F$lzB5Z-ar)deWPJtVQzK^qHWrsmn6i6xBfEc(<$s}5lAxKgy ze}?>lED0y1O(H!d5nF<^I9!bjBsh99f=Ra*m#`EwH)E!%eS%#6ij;&Cc_|@fXAGtu i!&F?x6`E(bifb`U7d9YAuxU(dtU5WyFkBZE-1rOl$rA$r diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NOPClosure.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NOPClosure.class deleted file mode 100644 index ae767c11dda23f1afd087ad5a68067a8f5a1c933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcma)4O>fgc5Ph52aq6U`KwF@EmbNJEAx1#Cv;v_3Qc#p4r9|SmF-y9UV^{t_6~Bs) zLnV;-0i3zr?6Fi>%#qwq!Nv4D6cu-J~mB$Z)0kU^&G+ut@%^!R%$Q0?^khmU&gCj!lG6puW4 zEd3+p`O#!T2z?MJKV`4PYX?!1#cEHWHd1NFH1w6gPILSJp;kM3MNFfsL)FVBLlqy& zVZcmfUxzw#!8QLB5-dW-Rms$(hKga)DcO`V>P7EE}wjyuNt{`fa{Ftn-!FD4_y}b`4c5K)~gDDxro; zxnQ0xW*b=I%~?iQ==0C|0P&8VTcNF(Y>PO~S5)4m&ui_SQ3q+}#vfiv;)K&YijE%$%8>U%$Wq1kk`{8F{QauyMPHHHRIx>qTr7 zafdJ$$xsP@Aj3%M;C1^MfnE}3S~`eg5yS)GC(>T|xcqqc)4LCZQoGyhKkc@j6Yh6( zIC90Y@D8Qx>G7B;Y<*vPG3Schekg+IK!;-)ZWAga8Mo7L&l8LlAF7D(Xj;jGB=BM#Ms9cS)p_;h z__P_q-CE~JycMo5f|0v7JmP-0>lZ@=TLs5SY&2cK^CWjXf1=#!=_K^z3uXG5KVQ3H zs8!71QWf)9AT*~;{U1H>ul`#EVQWgRGczD8qs&Z1)nse1xqGHi#?A`urp(3cb;2}=B`h1495s1r-!j)I5|C1Qh}(1gVO~NEI(%n_*~SsF0y16RLFM#-Gro z8#gZ0((*wSAK*8*^FP$nlNf@f6|zXCZ+G8w?!D*U{`T|h4uF14>$rf6O(=ei8RNz2Cy0)2Hly1Rx@(bx{0dY&9CFSG`o|*R+ z&0JB2yS_hhpLK4V0?qcUD_3mG^khLG@i61KtA@F0T5HmtF8+>xV+e#570cEzX6J2hLZH8{8Y~KgyfvEuS8J8yaWQXsj$1IY zPF_}P&?vX4DAf}EPv3Jlliw|^%d!AbNexGA+tMQ{j* zBRGvS9Du)b6NuK}sH810TH|UZoQlu1v>ex@HUfuzYTGg9{28>Lmb!FkznC*6kr&vj z6rhp9+AF@Y`!3SFTiopqLZq{E^OM=sO@Vl=4yz=@!46r@<`aQ?b#-%H-IDs>T-JpW zjK&r*z?V=*kWXO*EePN^TG0kJ0$y-uPw zWD@G3`y=VlPu$(^`SdT?u72!g0(EXFF*GU%%))+T)1xho(Z2+X%l7$-7J`Z7pWY4lQ7zrOzXL!i>}dRuqA_C0~M zu8D@Od@lWwa(y!%Glez?l%KFx>^_Rrw)SPB)&;6Vm2~owz7n|7X#P*K)i&GATIlLf zdFgndqAfWHcvIfcp-wghij8Jp;7Hf_)FP>f&r^(*jC3q;YgWT&Y3L^=ie1knUK#}Z z*;mvq=RhR_^+tC`?n*b1;n00J*rC|<=2KEJxu22v>z!lU@PjE;r)Sd0SNC-$pnkAf zD@(3n9*1f;iY0-YGlu+6+WfZ%i3l`iRQn@ZU@6bm#_i=BqF-b)#Z~T42?dm4^E`

c f3d#N^vyx+g>Sq+6?7{i~kx|;uewERgyusODhe*ql diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NotPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NotPredicate.class deleted file mode 100644 index 14b2353ff685a73be6929b30ef5d5abb695775a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1304 zcmb7^%Wl&^6o&sv+_-Vw3r#Q3atZfbNZppI3sNefmR3Pg0R@5zE5{vDSB|H$$5q9n z@B(aDfCQ?b0+vXu*z+2!5ywvC1c8*Yv1dHzeDj~1zy1378NeKtR9qXxbqx$T6?qK` z3K}#N)3mxVgfvPj=2RFe=2a{(jQQNNO{dO1-xluU$~ptP$1uDmTwj{5teZ~22Y%#! zKKXvg4j451fyZ}j%aoj9cUG~bAA%M3$JE-Mk#BG-EE zvX*j0aH10R{D3Rs-Q-+j?)?pNX zol~_awK0&ClydoJ{lvufR2r=&0?*vBvv5*+E&Mo1YR6T}?h-V9<7LAVmqTOGAl&&T{+ijNf)E&uOzK#VNKMhHm zzai*IP&C6Bp&=cmsZC&v0;AAqt&qh8Ch25~b`|nq^qww!#qcrM_ITn5$uGxHwhKoX zcoR8K({qFj0fXGlmJjByILUGch!SEH2VH lH5)E>pvxp9j9*tiA-$ap(Y0>SZQ8@0VD%1-;YxJp)!*qkLpcBd diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsExceptionPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsExceptionPredicate.class deleted file mode 100644 index 1b462f82f228fc6d689f1cc61cc610f911d88126..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1447 zcmb7^?N8HC6vm&sjdd#>;1qBuIPq;Sj)Ew@prC@7;Y5?k%}&8R7UY47bl=Xaj-+68P8Q3~QYQ;2cM=_k5qPu*c z6qTH4F9I76XgT1{DLE9wrHRkPKiBzo&QR~@3+auB=7Fxccy*@vo> zTFV_hH-Gd{hS-X^P5j}CX7CNS)!^1MrJ>W8bj4JuQH9#2dG}+o-RmZPTQf9giJ|mA z+G)@kR+<^V{lO1b=tFkwMFZIf6vT}$O_n&;W%zm(2+l^Ldc0?M@O zO+~+FHQg3BoS->|i2$E%xwexvOefpmS%XZFFp297cSDX*sBs==%6r_9Fp4n-IfS^@ z*@`}ulVzjrI@ylTe-U~X(+s%~Y|trPte!O;Cc~|e?4Zp6v&vP|Qs~SuobY*?DOddq ztG(`=>fa7Y)v+|AxtOOj8O`Nun4|ljLX>X(5QY)K1V(U-{t{{WZA5UK-eeYyV@P5g zCut=^vod8cdXE>rA$0&&Pe=90HUf9RLJ3o1XoO~=r+qM; zAWU_!Yg95q5h6k2h2lpD?`h_V`bD}!q$QHF?32bi(Kv%FMNpp4q~8;0E4s{0Qs6N& zMPF*7o=)yVJS=>GQ2d0!2;S0Se~EP}@rcAe?kkZAN@Q>j=LyYl0T;U^7AV7WLyCQY ZRF8V-YR`hWzxKSZb*W2Zxa8N){RB{#auomo diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsFalsePredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/NullIsFalsePredicate.class deleted file mode 100644 index a3885bd10229a4fb2a80d66db0b70d1ced189746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1334 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PredicateTransformer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PredicateTransformer.class deleted file mode 100644 index 76523a349a6991130c51ff0f7b7892084a676d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1439 zcmb7^TTc^F5Xb+gv|YMg?w1PQ3M#hcvVwRm6ai^cZPZvG;)~fXhq7e5+w6rHzlpED z_++9)LzF}xN&Ha8+3nI6Nvyt{J(ro^%>2*n`T6VHcK|b35^%i}DG>~50T~ftOp1tO zDn_&EI9bRs+`z0i%n7(DU|zs2hF+Unnxb!V%hpU|qwtV{J!0ruH4WQQ3};i(T^=c{ zjJ^7hKYqs`YR@dbt*MH`88SuFs>n)BQFpnln$;>f(O1{G>JZJA8@5@7c!fI!AF7h; zi`2jSrrVjWTZ&=tm{yfr6ezrEZc~JwqGs?XZneyFjDYL#|z-JFcNRrqv?M>C|J+NhJ&usp6ipugJP$ROF}SJ<>Fr zKD)&b(Ttkwc;%h3XOKws#w{>RrP_+wuqG+RlIdD1&ugB1BaM@mq-VUC4CBqv1-kx< zqAyz&x5^D??X}8lUN_4Xi`W5T?-4zK*i1D_4qjzm nigj?J0Zx!g<8;n&1y=*G?5}}{2mTXNYN<35U>L3uI)sVeiE?VZ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$1.class deleted file mode 100644 index 0e47322c39229e835cd2039ea6f92b03ebfeae7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmbVHy9xp^5S;aOdR}2;Z()7GPHcq(D+RwGhIkKRB1shP*DU-1KT6!Qv~(ACXIN&2 zeZ3z~06DS*NrIG+9^K6=UDQSs<_GVhi|thxQbp(6ypeZFm>gRhD;;Z3UCpBu~u7=HPLXUccNh|%~1`MOM} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$PrototypeCloneFactory.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$PrototypeCloneFactory.class deleted file mode 100644 index fde973edc30a709ad5075aac9b3a644fe7d05e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2556 zcmbtWU2_vv7=BLEcGD1A2yLl|5?X{dEu^K&KwFVos22OBE!Bz&o9$_`knG0I22#`; zFW|!Q;#f-H zAeIeWi(|#Wdj?hwyl>#Tz=4YNY_qr`y^8HR*JdsYh^qqor(CDvn~uL?7OS#l?$;Zc z`+xos6G+&Lp6k2*Mp+7^W^b8y%xuwg^4W#lEou4V0!e$S=sI#v`UQ7Q;7CNrlj}t) zWrOdi+d5%8wtrC|+aFO2T}34SFdSGBXr6M{2%%%vcI14ul#|}FnJa2guEm5*rp0?G zZ1xLwMWCw=USpg#E#LJvhL|-fw(c)>ly&$~-is}Rt3rDn;p zf}!}cJZbt&y0d>EqF#TC-iUC9@bhMI(z0Zw5_NJqqO?u)jB|%9swm5*mzRD+-@pd~ z5V-wRFZS$&j*M$YYQva6LkzuA^}SHD3_A`0; zYDqc`;sqvmt*x>2azUmwjC4>}=~A`gr)ACNYC3D_oJ^OixuR_mc^`5~&Xugdp(x_8 zU<_DEtbzHY{|#to-LPf%=#lB5N9vU$aP|oa=nmKcz7AO-UKbc_z}d4x1$|HRqN zxDuLj=iXHW>w$CrSvf|UKfs64gdRMH z7>@AsJjdlx{+>7C1*Fsj;rVklM7TFo%IQLlmv~#{EylegvxTP2;3LE`Lyyq>kfJ7> z@^kp(XAhwB?RIB&} z#wOwn_8r=1e?nq4wQmc_#}BoWPG-~=Lg+>d-PX{FPbs~}JU?N8&oqo~>h$nm$S_8< zU0(=@y^ql___ty3QO0im4F*%)uZ{`|QM7NO<9h-)xSC20ZsE}5;M}FpbiYp%dO+`| z2qNI+MHmEipX&pD^93pYl9Yc%P+t?mH+7DV^4np&Oep>O^ooW#TIa0~=jl;B#R3^s zTpO9ep)H8U6SQiRo7!b2P^p_6xDe8AU`*3a2N=f$oxMtD>KQNU^)+O;r+DwiyBI(m J=ePs$zX1;|z1RQ% diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$PrototypeSerializationFactory.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/PrototypeFactory$PrototypeSerializationFactory.class deleted file mode 100644 index 39a83d189f38d63db5765b9416184c911a7207f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2387 zcmbtWYf}?f7=BJjvLOU7K&V)&)LI(|7-{V-P_2L|u@Pvwl$72!%PQ-H-OOf#L}uE~ zIHR5MAM^**PQMhVmUN^QJ5Dd-)W6i}b2iBm6^9x6A?H1p=Y8JyyqB|i`0w3&08Zdy z7*V_%MkmfTb2hACBn&@B6`Ttrh?E@OQ!pks(_u8@yn^?`h#(_}3vy>%!Gt`foK)~Z z8148_!L))I1+xl164+PNZ9~n^>UPnv%$fA4fH*JEI%1hcM>U;UHDA&LHwNzgkbbcC zqd?f0v@OSS$^~7ZGjmy8RuhJmm~vT+t7r(h{#lna}H*R4XPfmQ1NxOnAICs$<^9c7}Mz=E7DWf|{+X4qfkv z^;9pMSItX_iQHw{A=am_2t>V5q$kd;XnH|W1Y+H8azZLsVHVBB(2R>@pwH0IB#7UOcnV;U|y`dQmn%TE|2P{#Z4)4)cn3g!eL zF!PK&?>_tkgR(|^D<|bJATacQsFv5#=_x}NThz;QE%7I0O-Im; z7v+$R;4qG`?&_7kZM-D%V}XNp(90WYDl`apn#E^-9dAgt;IKK%j@dJ z1&;4v%j^G+dK|p2b)S^v4*Jjbm8I7dbDyhNT8f4j?XixLXDwH3!_n(LM{7ON_!PJ( z$MO=-S1{HyKP(W4%@51N16z&MkZ!jZ!h8xA>f`|}Zxxw@I^H!hy=Yrk+$UI4y|vpr zGs97Sb$oaZ2RI%?7k_+x_*L@Z5ZYu%aNfifyM!l4xk_>6qYU>};OmY5jHcTz{w0ok zhy}jmhv*hRO5fucSCXG-yo?y7ob`~EUmx@$UgZ>zsMpN1n;YcNqskcnMGWAxe_Z9W7QSUnSzM-B>K!KLWDErXQKN2(E ztP{ih^O0caPZ4(#158_%Y3ReN+|%4yKWD2ojSv~DEFsF9wS>0dYrIAV{*}O&cpY!J z>F&ncl(Jk#DP>UvdznhHRVqPh0N=VEc2^Nzi3E{!ON3gC&JY>iAy&rov^$=`E0k?q OM;W2x%+#BdKP-Jm-!s`OE0P8$18x1_EA3sKJ$vr%-oIb}`a6IHd^3tKu^>Z% zmcv&P7G;d$vV3HxGA9|VMWFSzLsz+hubnvV^v_RNw_1S z%m4)mQ@U#!_Krc!=shxKJ3MH+PZ{P?K|TIV0Bf7!9$^mg-OCK; zQ!Z7v)-&6EhxJ{PcLfdd%nIlulBQ0aHC7f<9uHPsmiLhFgZc=Cyhq?gViyF)Y{HT#YM9?ezRW zZE`g{HBrIp3(HUqwcBgjmf1I}{c09bw!~ka;l_VWfh!{(YrdtFKkd>kRqh+9GL!91W7NVi?Zk3j<|Mokp^%0Gz0w|C`!Onp1QZg&my74Ba^5m!bRVBYaGE&RKf<2RRJU>KFfl^b6QtaUYqf zA@&Nx`xwy=k!=(&u>(kZy4V^14Wo@A@l@M~{Ouve8b{3Jp^!)I0H^jgi+^JLCrln< zqEUQ>al)D0JH+Y6)YJja{6SQ5P>EU&^QfUtYX+YXnFYExff9zXLbltO#VUE-A+Ni* zN^`f42iV3#d`HvF!WPbvcagkj={tc(>SCI_FA&~5jp&Q?M7Jz_e2UL#&4`AM1X!X~ z?2Qx;F#U75DJaO~1Ux3tMhLI;olu}a0^m~k{{=pvb&eFAC4E6;CuseU)-0`a$h`q` C?rIDG diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/StringValueTransformer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/StringValueTransformer.class deleted file mode 100644 index c08cd45fce5841ed11edda1c8928aeefa52f53e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmb7C+iuf95IvJRapIcZCr6nXOiiMCsC{Za2Af<}ZhlEId+?Y+Wm19@7(+9qa z%R>=Jd;qWf4`S91C{Uz`ec0KZJ!fXl?0oz2`73}b_6jg?$3hO<7Vcul#ID7jZ4>uQ z6iwVGtVA+Y!t2Q}Qi1=v`GP=)giDRUk7D7+J>gAcc2xf^p6%wA2>E8a(|z7w*Ur@|dc#|_3~rm*!q>Bbx@a=M}Lqd^dkWmqFD4rSa-g1VAWEtUU|ZZv{7%v)|L zU$!UXz6`sf@3ALWSH6n(2@9oikFeGXT-GC46+cfgMm$mx;b30M!NhmtAdH+&94dd9 zi2qYXA^s(bP%O1h#F=nB;SZgo{t4@@l`pyoS>>NjVqMz>Ja@G2dQ$~fCzyn;e5JIm zt$){0)gf#wVcEtyu9zsiW&-*3{u)rh5Q=Wm1>$)9$HrT&{Reo9H+YPpQ86QCJ z*b*-Do=dzA^SFCc0T#c&I6g=ABS=>>TX>Ogw~_?6e*)?$ B@%I1# diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/SwitchClosure.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/SwitchClosure.class deleted file mode 100644 index 71729d7da738b4949d3d58eda3b80886a3c32d1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3602 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 G^1lH|g4|{R diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformedPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformedPredicate.class deleted file mode 100644 index 14e7de2f1feff07e6ef64ce193c402d7148eeec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1884 zcmcIkS#Q%=6#j0~G@DByGlYHcuqIAvh8^0nbXqzpDr-B{WM*Dm_maAD?8LB>oSti0?WX+cPZY1zEc5Ip25g`Hs)K4=>*U7{_cL%>sTYLEv}+C-OL1 zLJp@&7{TcxS7+34wv2N)UxtQ>JSOv)%Hu*F7X`Lrj`_jLL3`w8>moPcI8`KH^wpk&|l<*IF&ffO*(d?QNft+fmi913UAW*6=H4G#tWV2A+Z+C7s2mWZ5jYV3hN2Y{fRV*9!Y>20w6SCb_PtWOB}-h+VW2*u&jAhG+#GG2UY26-29& z*+llA#=pBEwR?qJ%V=z3_%SUr*vqj>9N-kaPm}j7(a-UG0{gN2@{} zMJOUlB9=wmW|(rhV`yfZJFa0{PimVCY=>dIYFnVQF=UInAHd>Bm zxqG(L=MKYi-FAAacBtw5T-EJId2jO*J*Er|xzSNYk|<L&hpmhSEC!FeGA1!4 zq9S7j_h>5rCdROokR~dQVK$64Y_%Cqw()Av`bt9lu*}Bp;~~~qtWjg3|R*VH`7oqO{J?=`>jk zXUM7|O)Fqp`3CVF*wJUCo+`&kABADF^qe3UphAHw1igwmvgAP!=0ixD3M@u|+mtLt z9uk3Ml+p(XZ^=qwg!GV*9#Ih+A=3Q78)vED;3tKc^wGh2T!=6?BTQL&525rC*%Ue> x)Zl{#)QId(3{f5;%D9M2gv4+eS0Y3;v;iSN98t~EHqeYw6e1W#>IO8f{Q_bVUMBzm diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformerPredicate.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/TransformerPredicate.class deleted file mode 100644 index 6040d8a885c5eb900520362d05c7ee588473b5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1880 zcmb7FO>^5s7=G6IkS!}o>n15J11tqv$8jTC0xcw@ZIT9@xM@n#(B!sO){Z)|l#y12 z;m8l*#)Ut?g#*lhGmx1UPMzs5=!u`g@UCQH1v+?oS?$OB@x0GI`|8%o&(B@Ue*^uH~_yzc=!@sqJo=Sj3XvSvFx} z)k4K4+Hlwqvy`f@#PH)Oaa8XoPG>VZS$3M!h`-OZxP)-*it`mS1FuwM?} zHlw%%XwJ&*wZmt4O7vk}D94YPxiZ>+pW6!hj4r&bZef0IeOzIdH^{{H; zHN0+M%|ab_7*6+~E(U=o1tGKhWLin@EK|#5FUqD0UB9&$H=FuZT+gtS78XhshdviR zcf0Zrn!KC3%3a035D^#L!aDBKGtmU_^nxvH;GTicENo)S!hJn#<8yksz3izhh}=FU z9N!qjc;f8__Ga?_-LKN;aYAirQFBuy?18c#D}CZ;%4R4W-!j9+7m4_Vx)lcp(%+-T zlJ)opNX8>eIEge*GGFpUM33(b3A{&5vPlMG|Jq_O$You$Nz~&fJi5s!rV7$Ib-hNa zlB63ZZ0zC+HQ)*4Fp0A?p2sUVM@{-Xb?qEpMM(>e=7ZF4-vFnRH)&PF0L_52m8Tdv z0^2F&4l(fL2!lJ7Lk#_xIA5S~lnjxixJvU`yhST3b;a9BV5YU*4ZA`qb7Wyskm1Vo zFEDyb8`Z0=^r8tMjQcsGG? Fn5@0$i@=f+LOkaXgrN($${_S zGdQpuB7qc%D|Zh34C3|JAhSpobLgt-davqLO@I0R@dQ8}>odsVvV%OX6mivIKzpr- zwIZ$y%*QJ7WzbVm?CbDp^S*$1Brx01VVuY?>B%5f`TEz_-#$ONu_;h$wmaQ>?ZyLv zjh2oEu6!xI1Lb;pI3$HO2$YwwR_s2G)V}Y@MC}Na2P$c1B|RmuS*`sK*>324vgTTT zsM_hUucEH(2fQil`k|lP5y(|*J%NRm_Be~=L`;t{c5>jy0=K6%e36D;qNCXDMyZ;V zUQ$O~0>=esjeiy7P3ZYO&f{wuRe+~l*#!$JW?o~tNf z1_BNrn1wRV8P)V{-p*m3nbV9e(3;PF5Al|k1M@6ow{`M37 zkU$kw;se<6CHw*6*p6sb3B`-?%)R%Vd+y`spYJ~atYgi@EeirI3uUxStXMG6nx*A- z1$S`Q#61(XiMBu^QlXY!Plb^V{QaG60r5hhwiWnMEd97Ay+qCY`duF%tk|}Iq4!iQ zQ12efBk3fu_8b~E1u8=o?_?NP39Q-eZV(O~`A)hc<+#CkOhW!WPq{HOMb4{G4YVs` zMX<3I42Y_CwXb%QabJb6W#6Nv^ho7$Y9(NMK`H!ncX< z#z7c4`@VjksI&RY>WFnxi@-%YFU^zw(0SQEq}}}dToRZ+?f7#Ujo9@n8kjfHsbUpN9OZdk0``=Y|9U{t8CnM% zXSxvjLq34oY1VA;ML8JYJ~ye10%l?Hyow5{wA8qJ1S7#zVs`f zKpY&S@QHVJn`eoCWSp#X68)6u)Y|AAqu4otLCDNkls?l|$WU{P05-VTHtKkY%Y3CO zh`|+VO4+YrX~Oq}s5F12^97~VZ!in^$Y)NK3)s#m7W1$P1p&B@8zd39nZ+;v1)^ig Aga7~l diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/WhileClosure.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/functors/WhileClosure.class deleted file mode 100644 index 3d3394ed36ec461424c63dff8b3e1c0a9000b486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 zcmcIlOHUhD7(Lfuk3EbVLV;2mT0>GWV>i>JG!GzY36F-@8Rp$|GfAez2MQ@ujPE~AI-j3>9(!XbJIlLLDcou7Fva&q4E_01e;S}qz6q)T-dYO6K zwZrQI)&C`{D&>Ydb|7%6TY|qtt`&NIVEnjaJMu^?5lwnZv-a0 z@U<&Dn8eziv6egw_OH!>eyibYp>Mmjq~RJ)l0ihi8t+cv<*E`<-dGjrMlaq`K|{JCe4!zVaH&oQ1NV)SsI(qAF}5@KT@ zb%35fN{6T3`1BI#4ZU>c0GTIrP2p3n!wdv2llTe+%#vn~px5vjZwpOG?y&%ZQ|br_ zV{3vUQncBimIR0AUVawB<(2{?IRojKuv6R&uYv6ZMoa8; p3r64z{*^U*cQiQnZm@f7uz@d+305DIty$(K^WL$+7ZR_F{{bX!z6AgP diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractEmptyIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractEmptyIterator.class deleted file mode 100644 index 89e27360f5ebbb2fe669d61fabfb48d81e253282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 zcmbu8-%k@k5XWcxn*#(ZprXhr2rVF|LgE7kH3UsV118l*eA`~v_Q>`2vbWd3|Ky8L zB%0{Ef0S|ddcC`pYt-0>+u7~RXJ)@M`}5b=?*On3yBbWwMiDkku%$r;9u;A`1cnBA zWj@xRq}C@zcuJt~+;S|rPas>VHVNboc$*QJsap;^_IoWR-qDtgC*?XfsokW)Qv2{Q zC%cwM;ANeQjzL{&c9~)FUXME-uC~ogX(`*1Oi;;%XS`~8QczPK_FQ>U3y=2*6uZ`^wSGqX)Uc`3F-}@%NJQ^R^nNQ?-{L-|FS(I9p~7lTo1F)s8iDEI zpTkqyZWEZVT*a#EXL;*P-8Cg=)?-**L9ib0qaKA0lSk|Vv!l_ZwvT5ebP3J1v;=9` ze18y|7c5AiHMlQK_S#aSFQ&@1t*V=XDVQdp2bKELvW;Wj@XhX_&3ep{hvz19mG}gf zhBE6WcO=0OwZ~WfzeAnedvi6Cq`i7JQZVd&jR1qQd$WQ;oh0at< z^UaJ`iI;*2|}FvHY|qKkH7b` zL}Z-%&eh1wsA7Amk#}J!%(;(>slK3M`O|XY5{jdWy$A>k1Fujq)y;dbj0}7(X{=J9 z{=_Kj;18_((GVp%IfnHnakE&>2WkBnLpVw$to#GvB$coV53i~_riR8CMb<)f*CRzX Yu}kVzB%ajZQG7@gL86ha1cP7w4S;1L+W-In diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractIteratorDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractIteratorDecorator.class deleted file mode 100644 index 4aa7aa60ec38c1fd1cd6c9d1bbe179e65b0a8fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023 zcmbtTS#Q%o5dJooQ^!3BX`6Bsw_G_yEf5cgB2a08R*K3)Q6vyA8?$m;`Kau5)gQ$J zNT3Rk;1P)*g_yOS7K(WyQudhH`R4m(#y@_3{t93XeH}WkXfW$o(NV(c6sB;sfd;Or z<+@sKXt=4NqoK=CccqB93?qitV4ojyE0L~e?c~;VhS~!+aOFdW#ZJ+K?vSCf8NLw= zvjaB}yNN#%(F;EE$kH5yHur`+a@9RIR^-@?8MX#tC z_9?m290@->Bmwl8^yzzH64~OZt28bDlg*l{pMe=%VpvUUnWFBHB!_z&k(2l$kWY?m zaiA13EKLNNeiBPF2&Fj^W{`NELg^VWFl}HFZ39cVVBn%ce*FJsW0*Uomx-oc{oQ?r z`Ml?;kUbf>fwSHnVuglE2Nj?GEya>%uS(|`%+fkXx7R4s^a1VOFbLO1+&6#uQ&tG4@0hqwDgl?#5+{|E7LJU(`Z%DSV&`$A!B&l(LCE>7^rS*yPE2IhN)H!*Qpo3`cB*EG5A8Df1Dp{p*}T+h*TuRXd4T(^SwWhwmD;Pw&X=951_$ zmZ5vf;Z1v&@<8`cn&K{}JNv>^w%-z1?b^1;SWt|1BOTQ0bp~m}_8pzC8X~i!f6d8+ zfGFt27udwwJH*yycswAT25A!8rxP z7*TKuc?Fj-s^E%HuL|{=P_JW5K>kq5&|7G#@JLrSfMaKawqm z^CbI`Bsq=*&1D8E(I#ns3Il;HVBi7|kd6sdv}i(_;baUekp!xEG$GR&!=p$7 zwM#T1+evs5NuXYfCPi&kQ~1iFqU8g0#X2yrAyI#}`b$3UFBv72gD`01P63|j1imHUyMF-3gT9*h4NcG@ A+W-In diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.class deleted file mode 100644 index 32a67cf77ea18d462161b0fcb01b39341778b344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1472 zcmb7^S#Q%o5Xb+U`*5$&gQL*2K*`m(g>tE=s6bm4LXaqm1mb05R*56Wj%=qY--!p1 zKvhA4Ma&D}XX?r!ajhEm0{8!GQ`ttnK^YPT)Zq1G^j=IYXa$~$}g z)f)`4d%CH+n+$61e>Uc843US{8^JJ9(M?h9w(G)v!RrQ%WGa@%jT*Og+3ycV+@|g@ z?2bC+cP5UyRd-yQYpyTgM?$l_JSp<=hVV}@lymt}a36{Y@g{ew;?QLX=kl*8A=B$j z6Q{)wxN2~-p+2j(NI9vLE!x%rrALb?`xqVnM7$;K$*FOpOEU@Q#9ht}GXk+;tKO25 z1)P}Lx4O0_c62G~;@{*b%iRj5u)wf1AnnnuH@LB7H@aZFe0v zYg%r$F0y9VFeK=ff(cA2IFAbo=5bNMB`he&N^en`C0u6M9#L!mc9{&5gP41IGZaRk zeF-qk_|@KbZQX2a43dK)|exSJ!?FD8LC0jxSE5s-hVHI;&!;ClQF=)*k^@!%3MFmCPx&BEiwT$MX zg^!57C#Q#vd4qR7jM7`s$1tfqjmR+9sg;{ka`Q1_4DU`6HhqND34tyym=I?;9m9h_ z0^NF_aOck$5)1=z@%u!-Q%efeN-yxKGi_c+*nN d;xW>pAu*nNh}qtvsT?c&MQl<7rG}FsUJiau<3ql|>(>rMM@> zj1;p{%tTHPL8B(zH@s%iO86Uafh)%MCy3{!?K%Vek~k#kx?OV3^An&N3AR6ED5Xy^1*S z8RGfEHbrTNlR?7m@qJ#lxLq%A*7hj5bUI6?U%6u6bOH)4)9k1zS2Ub`N(NCVS1I!H zg?LX#NU3rwpq-4@QOEL8xYAzSsqM)GD_qgGoWM22nkh?=|A*vFN{EgDj53TI1J|i> z>fBm&>p?@<{<8x^G-V$#j7AfdYXqL3vmHNI6FEDuEXiBeaRL20uHm|l8@Q<>C$(Er z8^NfK+futD#Tf1~oK>fDwFE=oaV)JmF-)KPg-~OitjU(|ns$AuP^Bn(=n0b*`UYj3 z^sY712WUo@X!Z_qdfC8m@er)^6W!ksd)psBMB+!W^aaUJv=_q=$sr_3jw68y&<}xF zQ@Dg_`s7~7z%VY;jA)@P>PK9`)wZQFjg0n^#m`87B&CH-g^P2Y6VeQ)eR!-SP&cRvnWztIN&>Z#n$Q*X;klAPeb^=} z(0C#b8pCmc8&jCC=i697`8y^4?`1F%>V!Z diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ArrayIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ArrayIterator.class deleted file mode 100644 index 5d4bc043e13ba558ba52988ee037a92c0e7cc6d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2663 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 OY-Msr%y8X zMZM7sYK;?*q3S2;mCL(4ycTYl#BtKe2%|`ZO6v2O$b?e79f`UUDOX8)z>xnInD=k^ zEq8lLM(z+JcPKkj9Wjh;lv@nuNpdL|W_;NZjb7XqX`m$;ihdIEsKryM^Fh&6*D_<+ zALUIB9A&N-ch%j{`21lQ4Gh@Lq?d-`RQAXHAXc<>2M(qf_C~zJAF~|fG2y_*B*W3a zC2H+Vr94zW+%Rm95cs_dtka5fV6gP6wHNveC2fb$fT{0B-D%3Igp6=}^9k&}-=3kU ze+#ff)LqQd$@wIqfFfmi%zX)L^_f871;+Uk#vWllzpFHsr+W%I+BSv#N)npdZkW ziteZtSY$8v%)N6s_srb;_Wt||pp30F;>ahko<;=u6orBg#RN7I*ko8~+AX`?uAMse z<$0skt~Kg5!;#|$*A^dgw0()a7kbObq;tA157!NQW5z}HcYl;)G5@DGt Jt5k_#?E~Y$wDSM} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyMapIterator.class deleted file mode 100644 index 910a1bdf8404e02fa6bba3e8ef4009fe91155bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcma)4QA+|r5dQW&z4N@XOe=efdMFDedJ07lF%Zm$6rsoUTI%A?le;zOXGIS}K|i1$ z70q566~y(hGdr{2e&6iuyuCla0;pogLK;N_B?}sgSu&djwhU|=C^MMd{$SYZw>u2S zy&$})@hNw1Ma>C(KbS=1Jx@5&Rr?D*?Me}H8H9C)Ov9bHvdNG-I2hji&80txq?m{oBb^NJ(_*sG3aJ)qg)*zULjyQLf zV(B-wddKg%4GTGjvxG~xsk7PJW0AGqoNU1uz z6u>Thahg^J1{lh!Y8nI$x@rJrY>H0FGxF)m9PBYZULmVS1gH@72&=TSKS9W2jUp54 fUj%zG63D$kyP6~Q1YOZED4I-sZJ%s`A`KfK6^^Wq diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyOrderedIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyOrderedIterator.class deleted file mode 100644 index f36b2d1fee26e40aa2ba726335d79367d6ec3b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcma)4T}uK%6g{J>tLv6!_F->P4`rZ5kC`E25QssF(BrrcIkCDjI|lu%=s_sx2lS(& zJDc`Ukv+`)ntRW=bLYOjKfeMfVcS6hc^m5vV#udSY}nYev1Oyckh*NOJGEB5!En?J z)NPrMxi=7HFBlGkQApbNg{P&luT)f=_Yb-ZRz2tohHO)g zL~Ana3Dw~}pCY+t;Bmjpl{Ee=Xz76r8O|5c${Al+ZVboz;b#}Ais#SzaN5B{dE!DE z*1~W3r8|DlT{y@voGp0p-^?yjNHbLb4N~icT5(TDZOy01P+9=+?ZFJk3kt49D6}?{ zo|9mQzCA%F2^%yR(>X0i43-%LMO^YuNHfxj;uP#Lx?Un_)&?k2>LHfNazB%h#R_>T htbPIPMwvk71+kkc;!m&)41bL7Ra_5n}FwB-N* diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.class deleted file mode 100644 index 8628ac7926a81999c75cb004f1957e63ba16cab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcma)4T}uK%6g{J>yRKW7*@w|f)I%94;bS717zk#NBJ?<}Lr(0vGCKzStmr`~=m+$p zqM1#5sn{Ooe$Bn-+oj>jcT8;{k!u3`UF~ z*WnY^o%us1`gG{2NWK%e)EiL2wZ8}&a?C@5i#TS!;0r4)e<~k;ZN#d%-l7$|7tDmq zF1aS&`=g|MPamiQ8(D($n8{=L9azW^)c=js7=}_%S4Pb(*GX_11MqY5_?jCQGAZ@e zmps^4SCCRK4HE=K-MqS$1Pr|n6>*eTRhlTBD$PNjqVE+Y^%Vgnm3o3zWjS9-$YD)+ i7S_K34x&sT`-;Tv9LZ-G8iqi_q@%J!CG*NlVB-@qow|wu diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EntrySetMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/EntrySetMapIterator.class deleted file mode 100644 index 807e4488a7427e919240985a39090344afb341f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2536 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/IteratorChain.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/IteratorChain.class deleted file mode 100644 index 13f1c9884be4639654846854828579a45cf5fbf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3691 zcmbVOU2t4w8GgRqP0nU>(#HJJ^e0&hlypH`cF$%{yL(PN zdp5NAgF?|8uYiF8ZWz#s7hWI(Es+`Uf*BleywmZ{zY87z#yfSKu|Ds&=j=IclQDXc z@0@(+d!Ofdf4}|U-#>Z>zyzMkA&&+|_8)KHf%u2_4rEDPS3 z4fqBc3O!C>`&QujlU2)c6?$jRSu0kt8924#jME4XD-4vHzHht1ba-;wE!!6q)U?9Z z>pt;t!agz}MsLk(1g9EyIoeamI*l2xblxr#>Wo6?-Hz)7_b8;t_MTSAOnPOT1T&6n z&o=9ewtv!EtZ}E0Mpo^#N>ebZR%6z_K+24( z9|I9p&2pEDbBpJgTBfhlx9i>t>2mX4(=XY_99=7sGn!>WD%(T>;|l$8l^^we>!N5j z@lotHaWif)aVz$ixJ{NZ>@{%@?l90au^%fYW^mlZ1DK`XF-pW_Vp{M=^cSshwppv4 z@En)j(~crD8X4s4%|?)Sy&%76=Utu^g^wDzVB#VkGw~IC)xg(Gd>xOQIEMQbZi}%` zxsB%XvgZeOd2U(ym{p!2IUA8^|MMlw4S7mcM$azitqN7;gQ}gcI6h@G8+P8S35N&tDLuU6@@HE_MWeq&zOZZt!@kmqnh$)(UD9>GCB~7; zVEwXxt~(yqp44@k{lvUPeUvQCurZQb3J3m6U~1$no^tD6*{SF;*AkH}+a-@lW|{9! z4g~pnc%2S3oW@jrIk@=0WI`K65#sQho}E8=barxzPO|4E1k>xd#LgMz)yC@t9T<>4 z;(eEqR?<&)lYX+H^picsXD`pQ8M*G`e-)(p2HaA(0#$e$sf8;@zlltNOGiPyiB4Gz z`8WGRo=f3&t|KtG&XMaNuf#jaeHVuDDeg~^{RHn^z--~7h>!6<;k+Z{yhzRz_x5gr zvoL-cT`}=)WNEmt0r44*jkB73s6`NxlZrEB59vk5$3q$4p^P-qCN?Xhu%dZ7+lOQH;fVHuS4-%_B2SB_BlKa*`1|O28(SCpdavLk z?-t%bhO+xocqrC3L=NC-vOU9Md=`Cp4!iKY*3c@ukv88*yX@{|ccgU3)x+eD3g5mP z_;xTZ{plMCUnSvpN%%byuCmd--%b}e1X@idZ%3IpY3NZ+onnY&Bq&Vs@6!xctL^vm zDW|gH;#(Majqk12?$rCQY4lbLXG3%)_h4v$Ahgek{Tc=pesCSaS^^>0Mi|5K5TO_% zbPyqXz43bqb|G&I<|AHu414d+vzpzNJ$&WsFmX~ZTZk`@*)oMT|(3fa;E$WC-nliGLOi7mJf0u zfw6k^y*LD|KKd0^|C&Ah8*ImKS*yRJ`rmVM{}CtgCp?Tl!^dAZ2mYGyYNeer{_YCB zIuV9wJ1ci*;WBpJpf}EAABzt7JJ)|O0srK!^REQ@_BJ|y&}|N#vm!21jjlS7QJu&t z1HGziU3C5)3eo5Jl=Kd3?K&%lcHs>eYZy_8gQgo??I8G0j;dYQsz$L*fi3S!ew6Ms(}DZ4$UYM=PIRQRp+K{La3Roo5x-Xg9ZyHW2a@>Y%l z%4~SCFM|u2XpW0yE1T$4VCcok*p(loKT)n9hhZG0GzWq5GtKLgBCR@~M$?eV=r=)Z z_m{yjPiG?2S8<|F0~M+$qh`eUPQZ@Tr>scQ+4={$Kp>;B`+9UmjY-xXtE@b#K(8!X zw7^d5W!9T`n)vEW^Qm{r?KR#b_R)a_+rbJ}P3${(fK3Mv(G@uPA1egbXO~nvhCp|I zZ#4?Kk$JwP6fnuJbFzkRk{!Y>Jq-htr?0`d^lUgLdKw*y9@8vnZV!Gye5FML*J!k8 z1_o&15Not@@*;GwP7w=Sr;!EDsFG_f78o3UM`NzCh9>EvXL4?M3?Srye5y2}+>0$&ysyrl{~Y!?b{!O&)g#m$$s i&F!lFPG!olFvVCfB)3)4t&D1B7?l}DWyXye?#+LmOuW

HCmcLLU%Mb5@P`^cHkeE4J$En!Tj1 z8?=)uSXI?nQEi={z0H`jsW$~?3YNW*RU2w`Q_EJZdY#14Y#3VA(RuBwYi60VpK#SB zX_JJgTB`~4d#v12mDaZ?+T|3r*0-LnqjxAE=XR=E!%ZR}ZK}XUd(<~P5^6{Q6t^{JTQvl_`I=WRf}vt28UaR+zw`@gYjtazszW!ac+sXt z$-8XLo#l$vva8w+oy<7~$h=3k3}Ppn`KauON-{0_QqT zDz*%xZ0RN$Bq)KvS--UDdaLQAP0LBIYiX12a+*a2&*KGwp$^Ql*=#i$mhEV@QiB~x z?F!-Lk71pzSz6PD_CnK^+W^&|g$L10TOXyvvEvdd3dTV5l7eNdD0mI8D;UPAK)R#7 zXjNL(&77gt$vIy`Ckwhxrq*YJ*?vylX~wn_deAT;Wt6xL}!yx z$RQi-kpAKPu_iqB1-L_<>!UB2z-e?*0|#)1)@SL{7J)+FB5EnEQ|uLYkL=>k6PEx+Wb$p3=e1#&u4pp}7amQA&KVt4RP=TBoC1y=bbugE2)Kqw`B)fQq*JMTdM7MCzUv9toAJDMg#cv^o@j&CGTi&U^0Lb>&5dZ)H diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/LoopingIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/LoopingIterator.class deleted file mode 100644 index 10d899777b201c2dd3dc40c080e52fc919901dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1426 zcmbVM-%k@k5dO9;TxpLV)=~r!PDO2tQb1Io6*L4BOoK)U2I9-Ltn|qBmfT$lG5#ey z`09%fnur8V?Ok{=F->fY#5AaYfkK{5hV-^%FDkv+cFr@0jGn@u+oKh2x z@y>Uyk!~BJW!L#LL(iobLeSEXQweUV# zv*oy&C0wn>HH$JN&SMpqkyUXE6AG48+{PUSEo|1h*l5)ot0r%9%Z*^q61L4XoxYaP zxPR_wZ-uQ%akaK|nkzJu#M6YOVh}k6%PPj9skn|CDsEyzx}Px2|8FlC20|fxr5R@a zf%ZxY@5+&Ax0GQpm@iM!4cDfAmt~i-p&H@T(PV}05F^*_yEo}=f0-^jK#z-(=v~F6 z;`HKTQV-g@$v=cEv<{QCi#VMCqs3FO$zSOGf!KB?eu~6-aqkl3&nZ&p$w4pN2vT1MiJne?G)H@zkFV%OCErI7LN0l#9z)?Ts*x*F diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/LoopingListIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/LoopingListIterator.class deleted file mode 100644 index d1d6a6275f95737b82352246e6a32b6a40076caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmbtVT~ixn7(H(iNJy3s(-yH-T(wpRN}#riCDK-;6^#@dq@|ksHfnGqc;gU;AX$NmQW1CCzlrK6r_ck>~jIO9d$ujkow&hzoUx%5M(%~R;huNK#f*}7+1**s4s6%wXrxJA!#6$W-$XG06U zI&-FNdQ%FAhITnk4lfdZ+9?|fy?N6%=IYgD!(AvYTRchUol?4A_ zdBvh!M8fgtMsWEMDHMt%(0sJHa|}moVr^wE|`+Ifqg)Jv5a%cvT**M@qMsIH+G`Li9}2<$ceO~=)xsCuJhy65N? zi>5oahGTdjjw>1-#R(0MVMxO;G8#r?`?zeMmTgvsF^p?Ci6=Fjmf29! z(X`FG*|1IGAwCQPU`hE@M5JzfL?V(^&Kl1L@gPT?yE3A*0LL=hP$S==`x``-($Q_i z?qo)8qa*VbIzOj9LQD{;lj9^}$jMWKG|rOg9P!WNVOshFEIfka+!591R^(zOL&h9u zMO!-aB|3HxSGa+A>?UH-O`ZlkoxVrj#}vKv4l$Lq15b3Gtx~(##+pdiMSo%`-L;M6 z9iFCkp!xU`MzHTz*y1+ zQD{XMu-asG$m)`<#(dS=SVxOP}_ zE%JWRmbi%~KVO)Te}c1UO9t^CQfOTb`Bw(MM;Gq4p(L9qe4;{>X?lupN>E02a5%CD z<_9M4$7WjS8p6oxl%F6zN&g6VWG~>)1pMUyK)&pu!W{KUoIRN!jr|I@k=h;Wujs~a lZL#(=W991{BAw#g$QUcedbF-VaLIpfLuh4dg6t7I^A`h+w*UYD diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectArrayIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectArrayIterator.class deleted file mode 100644 index c62deec80a7959bb36721df9b86e1906f3256739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2512 zcmbtV-%}e^6#j00u*njBg+ghCc111up~RNbsvwmX&;Wu0r4xM6CAlPFlHJVihM~Us zuH&oY_|$Rqr4Kq|o3SW7>4Oix>7U}G4XP zt16OMQ1E^XYbu7snzH--gMUYZkkP_WG@~Tc|)kra7i-LWWlw1({?n& zbhKTr)wpeIPDMAgPq}3Z;7x`pVjN&wwzy6ObIqL!*K|=sf-uTXg<<+xF`nZ$-cBP= z{ZiIz^H#Z8=Z4dfKsK0Co4)J?mvn+AFvp-t+@@2l<<`v2X0ftZ<4>VZv_s!E>}I23 zS`II*H$F`$?X7u#{X6iF+Gci>NM`Fc90 z<_-(js0}TRnpe|nq&Y@ylzGj9z2ZALC*8t=AVkLQx%@^iv$h=z8=_n_@F zlTCK~Mnr4Now{4@)Znxyz(o7g`ZAsFkRPM{ zT&4wgdZR*mWWuQKhk9guh4oPU9`>-a1L=?MlYr?h-nIb1DEJV022@xsk4X4F z(Q_N2i%fyfWEi*T16~-0*Qqhw&e}j!+G&}G==&PoN9ZrKFmOVcp-h3mcOsvV0#|rQ0`BD WBiwQRi{|g|4v@I7-&?XoGyehqJql$2 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectArrayListIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectArrayListIterator.class deleted file mode 100644 index ac0c13bae7e87a36395eaf16df848317b84865f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2197 zcmbtVOK%%h6#lLs8D~6h8n;Ocjp+mmwH>ITH06#w(1Trn7>y};FE?W(`DaJGOGd}2H)W}Ax7)VWrLonLb=Ty%=}O0NZKqpW zukFz0CC4$|ub5sk-ocWk{4M*NF?H*l*>aZn{>Vz9d^M%pGs8W{PCG<%if_hRYRWvgQ9qbwn zBALmLf^e2`ySBsC9l1IkbtMrb9qEl~)$TcUdDZ0CnEQu1o?#db595S}<9LW?^K4GB zc|yZ$ytl?CkAi^ivG!cERa&#Fy?S%CCEL<+S9j~O!%wH-Q9Pz$ot;k)Q+(6v_BtKg zab;t@!%s`DVT?eIZk#XZZRs}chHiFs%XalJf>XI6aB>J&CZ%i}t*UFdG6J*M?sZ+A zRM*nE$b@J+`k=V9s>$27BXz@fac!OIlrLyl#0i0m|5uU%%l`#}+RIZk33^!EsMG}( z{{{CZKe)?nb}%k!`faOv!Vc7>ka*WTB_2>%)pbm3oB9Xy^of{346`@}QZ37ZJ~$f9 zNhM_GXthk|f=0F2hbYGGBlbP5V#tv_ggDt1id>}6&ILR|D~={_oPA?bA2So5=baSpy9ShQ1k;rf=rM$fdm9RJ55w^ zBB5prsFplxV7mANCg`Vp110e-67hS)?-zW6T!Hr@g`N%zUBp5F^bRG!e)-~$NPUU) z9ws;YQ1^?)O+rpIw(ets-jOKMOm+6V5I^gs{sCR*Lrmc#;`unjl@Ga|jBq7GF6{sp zArDBHb}R8N(T;F^LR_B`*JmWb&&P5-MgM@l6wd_(QU?WU{Jk zR*v$C#lA*n4~I9i(|u(3X@_4Ywoo1RoBurfNZ}V`@hkP`ZxO0osJL86Mc=z1?Pwn# Z8LQ$4^!UG1AO8_4z#x5r^WG(&`wQ>crnvwB diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectGraphIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/ObjectGraphIterator.class deleted file mode 100644 index 6df1f7e62c97b54eee91b4eee71b6cf3ed18bcf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2599 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 MmAbIz?C9tJ0|Urp0{{R3 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UnmodifiableMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/iterators/UnmodifiableMapIterator.class deleted file mode 100644 index e2a8897334d4afdf60a3bf78a75fdff8bebfdb81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 zcmb7^ZBNrs6vzK}u(gzphY2WxI#6Nja23VJ0TB%(!~rqL5_s2b*HO~7OWP6rD1HZD zV4@*PBJq`pAIf-cJJ@tJ3vX`ky*=l5&iUVS@2}tAz5~c%S;Cx*dkPqG5;O_-6+|(w zU>FbjX!fulNi2xrkr*C};faK&GM*_&ASdIwguH}B2HEhqqkFc)Fjughs;1ZV@;=wf zcCBVxE`3dtmpwzwH}v{?(>hO{6<)TTYBe;x!R6Zvn$3sKmOn1Nc+0G z$&WmSo^)o9*p|N-NoNWN`k}6wx>eP-N(Uq@Ng1nh?=^oW?b}yzg=}xCm zPV_MFO?KK-5Qo?7Ln2c~RIRdYH=HtGGlZ0r|EVM=l4Y1~<-AVqP}R*9r`o7-%UeAv z^SbB`Vzeocsx@3MW!YY;#8XzoG~>9AC5CL54r@SBp6>cEB6PcZ=_!ba8tHwI(T7ot(au#`?V*QeKuZ0I z#3|TrGID~RGxZ00KOm|epCY=eo*;HiHW6H-ag3-ymY8!Gpx0&;8j{Ubl0$%saW)MPHuSLCj! zpCNxmAHzpl14l|SEEh$*RI1RHOD!N?Kok*7V*w4)q$GaWwqv_wyW4EH4gM7W zgC8)_5G9fL$;2OJJhNNc#@$#$NQN`BXP)z(OXt_`Z{GpT<9PsggGfnWSO{P-fF%h& z+>aClUs+5X92})&qFP5L8TV$fj;EEM|10 zl$5J-q0Ey7y;9M&8vR#QUN9A5?;1sJ@Zz>yO*b#C5TM8lIuSTSId%a;`~r6vdN%YT zMI6j18sDi`^4xeM=T$lhXY_)sW@SSW`{tp4RnZi4jbZsh3bPc?EGspJbT_f*)vP7= zwTfO;-dQqS3l}KMwH^l%|O)$?CdMs#myXZXOkQRSX!RoP~;1>NPW>>1HI)BU)WmL%4^?*Q(~D$lwrD^^uAWBSF5^V z^5Sk){NgC#j?5>{I~I#al$w=q%b#J~F2C!yp>_;=SQt`WvUOIOVYG8j_Dn<3N-Oa! zQuMA2!$a>!4?Q~`ku<$U5_)kNSLkG%b_ej11w;}*(SHh-3wuuBJxlyR&j^uJgcQ4g*Do?&zh8$0ldUg;F1-AVp?Rjz_g9GISNxz@O zLpq~~=!EPO)tr*|vOCOD8DwwOafdk)S)->o6j*W^^PB`0={~O|H%oT1G>m(*#YL9D ztes?(2I_Ull$U3xwOA_~m$7Bz5-K*Ts0gf_DOljV8tw0^)W$Vjx6#A{HZ2=BI9$a| zfhYg_T!HG@uwq@boPVJG){0i{@QMsM7^rwppn1+#rzM~+fZo&Nm?Grf#xREEfb3o=x1rtEQ3!)5joNg}7 xHn-1hro~R0-{eey`Zwsir$k^3V+^zUe2hi%%jAz?&7%5KsP#XTZso-5zW}A)()R!W diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractMapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractMapEntry.class deleted file mode 100644 index d5e1dacac01d7a6c4d2d908f7122f583e8f7460c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 zcmbVKO;6NN6g_X+PN9?!f$;;sKyjF9M=I(Fy0LVmvl@Rbe4Lc zpk$y7OF~;hTf&Nt%Q_|*^0!>yjqfl_l&ULyojV@)mz_uT714-i4rj_s4C-v~QZV#a zU0*D=R_h{s#_Jws2CG4XdrLfYCC-v++;k&`>1q%zJA92dn!;%WtE+(@(dl_K$CdFb zv9Zp*mT>OYqd4S^xW?D+`Ej^0!=TWmq(3B(K}(t#x*`!T$$o}nhfT_zdh^_m-iVM) z5U*R@Bb9|tt zsXWhMJPlf5L(I9-w8FuCC*_tVO!S&4U|5I4FqCY*pV`C}OzF64;uJAP0xM`jS}BQ#Gr znbj@3@(t`0g*o)ozd`IpgQH^#Pi?W&eiq9-6Xc z|AJDpwxRBzzw#X#!wzn5Vo0V^yp8-jScLVoq)V2Jq$N6)5Kc;TbrY(x)fPQMRsi=& z&;ye6klb4!;Wb)*anAz0y#UAQ#GnGIID_+vLG(Rk3p`FRP)xPz$|ejMZlgPuwwuu@ j^Y*`rJoN)Fl8Iqf{uTu8KD#5p<*x>HcZ*?jjuvseT7 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.class deleted file mode 100644 index cf0bd655f07769aa3306a338b62478ec0249a12e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1537 zcmbu8TTc^F5Xb*p+HPsLP`Qh@f(X3;i-?K}k_IuU)=L5*(fG1mPuj)pF7AcM7xIY* zO%#GA`e@>ZGR`@>E~V7?;LDt|bLRYJ&VOcq{`&F_z&zH{$YNH;Tnh7P#Gv*jW!#gHV3z0X)4CC?O4YKMvu}c z)hF8Sl!&5h$rZygy!#Ty3SA?L+Y;jI_G>1gzh+qMso$zIXG^P_N}K zZ2{sh7BY66vbVlwa*@07UQ)`Y<~9QndkV!WIXrvQa}2A|S#aQ`g43I}@96BI!F9g; zSBd6%ISPibB4P5Rv?|Hm(9DX{@LMz&8}D?s%T<>!PAcbx%=wn@dU?zC@^zNCeADEZ zRRuW=D!7Ep3a)UI$Ap3@TvITO83hFtB~<>qwGwhC)dpRXK~p#=yr-vB!puMNQRl^!Nn*V_Evy`p^$*1b;dGj481nCObl3uh2sgz*y-BQuzn6UlDsT z&~t?N_fq*Y5+CU-hEcL3NRTZfj#*;NVE`)m7ceHy1Ow+WPG3Y5x#-Wr1zZd>skBOT zmMDEf;sb30Y*ILv1x5)1LX5<_L>^w|60Q7lnqNLfQbH$TwT+OD2-M>41oN7_kB7H&(q<-G^%v2;4&3*U#nNFd%y4;VUB)c~l?yLpcWZCD-VM9! zLSB(TAi)m+-pK=b00|P&N?e|h_))0e%&spAi9x)dz-7^Ypx}xM4ND5Hsx+Thv5XZlS`edE1=kqj zmrUFAFEd24GaC%iW#@sxFjO*a<7Tr_G2FYnV$sS-$*FQ{gS)1fhl^3aZh8z0CC9B5 z_!h6$jY8FFG#uNb-m;9UZ;J6FWBW0;nnq#8c*vWUzh-Q2i1{MJnQUp3KjsCC+qJ^2 z$|fCIJh~#JMF>UcIPy6|OrkU7voBK8W|qZnanog(dFew6J|wbL+jmKcRh{V{T z+ng0QqhSnb1w{=vu%@AeHHN9ql@%!zHEu1rwPu4{S^cbPY>A98oIQk=Y4Gig?f99h zWBc5+Gp6qu*24_ScZj;zb;PB9W%Numj(N&;~#J3Pr*%% z-gH63Ih<#he_0hv70-8hwf%w=++rA&{vNz+dRZ^PY)PT~)x!LZwSv?A8Yu>}ALi^p zZtnQ5Y1d@LhdWmsJYt4{1FG-_{dY#`M+PK8*}*uq6EwSk2#o+mXKWwr7aI2A1hp#l zK%V|;Z)1{1TJRZO!AY74h;#^1B!~#DDS9s71L7h<%t?q$@L32!2Sj>8SV{vC3fNO! zutGvg&;5=*25KV=JqWH~7)z31LTXO62~x;V;Y`B5)eAN%VPidEZxHO-b6}@&M#5$> z6T+II3F(~vBLp70Goy_ZyP=pQ)I@+X=*Iyg}_f4BbwR-`8R z6k1u|$3UmHxZLmuua`$u$`jql-yRLJBUVh+h(7n`~hE3)n8IAU(q}Gnr`+R zdI8^dRbFlzUdCBj`8Zba4uxH$lKv8*@Y`|@DS|XAksYW)-5y2)S*;ZkGxB*yMPSPh aUA9bzjD2`lYQ2Ed)T_iZh3j}To_q!(#>x=@ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/DefaultMapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/DefaultMapEntry.class deleted file mode 100644 index a9839e59d30d393651e24b09a304abb97d905350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmbVKTTc@~6#mZkvansm0!6%6MSG#L@kKN>MuM6Usy=A?K3&H$INfdbLeih*lhFr% zfIrH3W{O0h2I4%N+sygCbD5vNzW)HQiM9t9H!HY>+eXwYs2QtAPz;KMKlcF4Gv_Obveb)1q5C3H#y<)c zvwf8kp7!Eo7>Kb5_hk^qqfs2CthHtyW$e##awv2zgO~D?$aVHcj9*1rGU*Zud}q+l z)JG`U973mg9{!%3^bLO3wlEedA+#=>ozvM1e PS6F)-so@@0%k#ehC%Evg diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/MultiKey.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/MultiKey.class deleted file mode 100644 index 8858d518a872cb9346b8ff21fa8df1af1e3694f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2737 zcmb_dU2_v<7(H*Z$+jWoqoqYCl`V=iNg+@^1PVnc6bl8^v}i!oZCKicZMGyE1g@0v zPk5n@=!iP#=!~=sjEFZfdh3>-yJiE&_wqZscXOext&pFTYoPGDZKX2X! zupXw4eMzLSKM93F9S0imbP^hdWPDJ^$|f!zlEJX_4(m9Q#8Et>6+ z5!p5>!%-c_6c$&kvTZuYta8P6OQS>k6x2b5<^i`<@ywEU%yg<&eAgejJ6p%0 zDh5@_QS*6;BX_v!c=jRdBDG2&8wIyc9J1D{u>Bv&o)6#$LWoTYhyEkP!$CJIoc!NF zA5ODHp}o6KktMce^%joHin0}&Ce5?ffa8|L1;-WQp6i*8f)}5|{Ouqy> zWW!K;zBEGFrBl`g)~;e-B6_SlEiSXpRZYi-oqr}x0ZG@Ju*!bv3E>ZDRnN_PWxF)4 zu(Z3DESRN1l6kjUE?R@O*suA4bJmMp_}a{MO$w{9K_1U5te#yQq6x=MXHR*&I%$=> z{TGVXlz5VxMkXx7ESJrThI`teTPnt6wc;5i*E7Z}qf~VqfqNl^0*i(<_lU+J~o4f&pF$G)qEz|0{gK9gLsTRBRGM_v4$f-egbQW zC%ta=8hnOy$S_6*jce_hL=8hBzOF7yo-vI0ESca`#L^zIw1+IjM237ZpD!Eoog-hI zd>t8m4qqX$T&qhu#-tT}(#^rqh_oXj?TAP_LQ+zohxD3Hzb>SIjR*^aXu+ zysm~ai&F75^atl74MwEFh%^|H1|!r!Mt+3Xl3mK13)Spqa-?{ACacw{>FcDr?31BM912fTSMX}}ad(h=qIC4mJ^t-O z^1hvNgnkG5LLkY%kR(LT?Q3&nd|x9Y5y{wzUE%2pMaUc8mCbyBxOOf3HBzir_6|~q z1+a(z8)&{3n+0CsJMbqK`)BC*h0)zZD}JRFe)GxX0%+w$($5P(BJ7GX+{KE>RiNZ6 z5DE}4iu^d)7R-_aN&LM=eLPan`#d~+fCO^5^A;8sX0WJb@idl*>>FsAMk@!?SUNYg P_iI2qBhbBsX~4i=?wBJK diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/TiedMapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/TiedMapEntry.class deleted file mode 100644 index 19f09568e17635b71caf69fc1302752367087e05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2020 zcmbVNSx*~R7(LfxGuRAE%#yCeNgx3ma2J}8CZr_<64tb3X`qdi!A$HS!;Cu~M{r&@q{y@lF%sxGMvu1BGYPa|R1UL^n3MCo z9Pa7(M8~H(KGU%v&{nd1+jN#Kzhryv($sAMF)h$M?zyGFbc1EnDO<7ce*WvnYp>4z zEud|hMS<4Y4fBbaEeE!foimHqdH&ei5=e&Uj_KyJ_trM7TtHL94coPYn*u$3$HGo} z_b&@X$Gvq+*05b`zP!0+`HSY7!;|E!mm^e@fVr<8MuUP~61Xz!`T49_G;;+joAWj| ziJ!CM5Ce&ovc&g9a>*{*);cjyxPiYV(dDgRMq=;i>pzJ{ppkaf1TIUp<)tc>dZwp_ z$5c_4vA!ys4uN)_7P-m>dTSd3F)t`sK4%3_z?gDf%O7{lQpu9RM;q94K%%i=mI`6p zw7&i+LJhoyz_;D}abDpmc_$XUvY)diZQ0o~^-UR)cWdAx77d(3%D{PC(6MA-8AAdW z)Xgj2Q|xZubjJLAdDC)(iLY~3Q8t@Su<>dpBuQ3 z6@m66Y6@8y7(m8AS`P2vT?1D!BG7eMJ!EpL{OFP88(75`RPLx;d}-hsJ`@=KKZ@WN zaabahu)yX2$VB~ACDNgSZ7;i^J}dias9atOh24CFCa;{*Iwpwf^+<26Sf+L46uF#~ z>8a9dFpEXYT^ATQB}aWkeJ81mBkl))>S`Wwr#QO!{AhfAUc>90-{9{}2)xC|EP}U@ zlp5kXDP_c2r|lwoIQDY4LLZHDYkC(Voq2{xdf*wfUwIV4C5}l%ISzCDfF-V=g*v#* zlT;XnKJ;_P1geZsD_JPQ0@O~mOqR2>#nQh)`-O`zd4oC}QwfdGp_-6gs0ELxWIzjp zBQn7rq7fX=GF_LYrIuxo4|>RSm4G9x+?`4Pgyt8Btt1yJPP*}7~i93Ftj&I``K-@4bsSsGV0N7M75n-7rS|Z;syR2PSs=lzasFoyH^l!1OG&Qt diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.class deleted file mode 100644 index 420ef9f8f5fc4d2c329fa30ab3f05476d46b7882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1325 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 Az5oCK diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$LinkedSubListIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$LinkedSubListIterator.class deleted file mode 100644 index 2d7c91bd49783c743751c3596f3ddcafbc94dd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1760 zcmb_dT~8B16g|@|EtDbYF{MB=qsgUGAuHWiMmA4PTgJ&5`4z*plpH9-{-(v6IuGTR_N8n1 zjw`TqE{W~ovF4cP8?K+WO}Q-~(gM*AEgr}}U2 z6%;?!20yG^I8%WAVTlwCSK55esZ$c52E$oj_arf9PCFRWwNdb_Pkh~YG3ckDktR-8 zsX%?fG3T9*JUz)wpvKS=@|s!e!`Ak41mqNbbDDkY73M{=YB(aR;Y zwhJvevV-t<>O;7|wMqGCZ_uQ@MZ5M67pY6s?x6?0l!#Ep7uC~c^zo)ZKfP*kW~;J_ z^8*LcWQAW^oEwL;_K>6)Ed5EC3{$tv?yDgSkccXfUF+?iSL7O zNO)BhJ{cqwPwt|=mQcw2Ka;IvK{#3gh(QiQ1RF?>?4m)T@E5C~aR<7RUbD*Z+72TB zsB9zQ&}`Ic4yi06p?#8b(k(>Z|axKS;Xa~p(PVK`NIf;q=eh-MxW%_qqvv}tAZ mYab7klnA1QkR)mdBWUN|!ziu%Girm*habl!?#rK*JE1rL diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$Node.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList$Node.class deleted file mode 100644 index f13e7816559cab96aa4f6431af5bad5e71feef24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1611 zcmbu9&2Q5{5XGN2j?<c;NKruo_3pS!>*Cs#?No@bD@O!Z z&Ts`JDnt+b0sK*jH?~QeCS1s6cRiYU`G6r@Hmz0%og>*%r5_S53fb^KK)^5i=Yn#qPo&dEly1jk$hmX2ji$8j~O9Bg*D;n>E9Yq(=E(%{#-HBwdXWbcLhNAjf#c{#W@? z*oj=d?8y+P``^mE_*6j^wF*ioS1=|^1xHF~7+4shTLVWA&%nTq{}aRve>fI@QU#cT z$&)Fh=}uVgql~Z%@LGP|gW?IO+23K<_AZnxg|7@L9OF99bSM|5TEnQ)sH!K7ft{yi zn8?MesOOT)tW?Y>r;=B9VeYF{2?iBVEu`9Zsx*~l=Sr*-SE(hKlewnP9CD!kS5w*7 zh-qK%QJ-S-P|vCUg6c2H`U(^3b$W}P)pu{Hr}jt>_0%9CuBSJPbyJwmZ*FpztfKu5 z<`*6^TPz8xHwUaJcC9$xwPKOkB5c{cHk2i*-l3@8AF#mc!dYDlPT=GK5Oo;j!$6Qz zIGq>wfT;a>WFQ|2^64KS@`z*>X9j{44ugCi2y%8X$bn~;f&3uI-akO(6&v*JTsnjE Pe8=)s_^*vi7(wL^K`=j; diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractLinkedList.class deleted file mode 100644 index 7afadad1c0ab4971458e60c4ae9bb8e6a60fe697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10871 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractSerializableListDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/AbstractSerializableListDecorator.class deleted file mode 100644 index 1e3231a2fcd47498290e5840e988d27aee80191f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmb`GYflqF6o%hvOV^fG3KW!!6jZPmWW90`B#{E9rh!BhKTo$KEN*wn?yMU94gMGt z#l#QB&;Aa7gCC7&woAKI6JuhN&g{H7^FC+KIs5JB=Pv*ja6gR{=F+%^VhZO_QcvYH zDwtQxbqxy|bPYE&++@gk!Zo?IFI>-b?5DL&2KI;{TXk$ta$D|m%NKpK8{bPm-o1Un zkX$ouQ?4@%7wbp-CD(mvT6*2|W)DePB1!$ zVnQC89>c@B;~wbzm>Y*eH=I_B*tA=gFeD}A=@!}R4;r3yxgqz0gv~d~M{zfW;kaBn z?keF`B)wE`Y7G6aTvLkO#u0fk6vE_9M{i5JzC8Bjo^%Co1uqhJe2SZF8~r(qA-(n5 z5XV7|8g9{+LNrLjZSvf6eAf`$rmEuHUyHDynvy{dgBtE+ za2JaiEMYl=F|25~m%*x13Rq*vcl%fE6q{k|zchnk~ zCS{0}b<$$AC(D&jVDE#NVOrCHT0tM?k*D)$I|?K8q<%?Uz(w+i(U6SOs=R8nE3a(j z1hGo_1L7x0bS)JcSS0)sCA1u|&30_Fn7}02UZThZ?Nek}z;pjJaVfGh1+ej?{ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList$Cursor.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList$Cursor.class deleted file mode 100644 index 29ab77b8894d5d414580b508c03a8b85d4c24f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2912 zcmbVOTWl0n827>$1yB-!kD$^ zjr_4!Ml9Q%F&skOA=5J5VZv}CYdeJjeNNBK7y~(bcGk8^JQs^b&NXFSG)wM4y6lu} zN1rYlS<|{~gvl~y;L%If23wIJAA|;#-7tfGvQ#(V2lzm#gFXQ3?n+8{|KRkC=Tg)cKC)w z_L4rY4-|E)FmPu261!{2JGG}TiTM8<5*jM;@t_zvG-tEwuxrfDMe!`J#yw{qUKjI` z>5}W{Iky^-9r8MpZ?bq!&oDECnI2tVi2o1H3$g$PxIr>;>|`@zl?=xfGtHbpxyxgA zK5du9{gGVJF7Zo^XYI0+GftS26q_EDNV~;XDmLRe6OQMpk8xg@l zW`skv=9S+#qCrg9(>10$XL@_VaI<>J6-E<=TXrl-#UqLS8X@mh(7xI{!`bfl3g1Iv zDR}N5Glrg*t{X0yud?In=Nx0+w98!j_jQr8u47sSuZy&mEypNuljY{9H{S$l;T0${ zgtX8K!rtQzK34D$kKL#P=ql>ybu`f%Xrni=fv%yO-a;>*_xeywVh2AlC|7kK8qlIoDM(;3#chO5L z*h#A%3)QpO7qB4dBZ0*+wx}?hn3lYWMvYB0Ekj*FQx&{LB+xBH=p&Z*u?M)(f2krX zhF$zGfWIBwj`jr5xA>0uae_fZSCJ8Hk+6*BMYbo)RkW<2bqR^kq2Pp#kEP`1+h}=> zC?(HJcYoG;_?{nxWwc&rRNwvk(9GOELzF&e(YIOj7uZf;vhc64hrY%E`UXSvEsoN6 zNYnQ?ML%GSe)Kd*Xm(;d9_26)v+lxU81!^a1iHf5hy8(?LC+=|t2(BRk3c`IaR^l$ z!X?gNod0;D0&$xSimwYv5x9t6nIntn(vrTE{-gVS^uXPDuX zLb#wP(3KD_Dv>n;3l)Kdiok;vfeS281g2O|o3E`&OL8(TaWQ$B)s|f3B=EQDJ*rif zTM^~3Hls;tL7UQwtx6lVD>3vbaU_+FH7rsU7O4sg{$d7^8f7#;FWU3SSSMY6eC z5c+|@Tua47(HdzR!v+f3wYi?7)&)dfz+AS&yK0@iG=_$s3GAYNKTvC~U(?Awy7Eyp z{fswk#}VimDy-ORcD8JLFSGZGE9~#2W@z}u6;0<4CtDh*ioZs(#9?H|f?o?tYTniS z4>l`#RD)QU!nD9dEBD$A#KH~qS?I-#g}vypZ~}uCX0iV$Q-%ZJF20FfszO zJIy!P=(E7|jzNChck+iY*9z3X=9+h~Y6r^WT~D+$NPhzAr{TYN5h`L#we~cc-O6P2 z976XsFF(B+k6S!vV>{z2&|dMKoL|%YI@S6rXHq$LViN}VdFkYrNnoEI1WHLHI2ZeA zIY8|>HG}*9%*Y1B7sw;rjioIlG9#O4`#_h(L9V-Xn7o0#at6I}7Kdo-kB;Inj#48? zJ%y-C$I!=^GBO#xlOFl)Pe722Jf1FKXgs2i{*ly5o@Xu%r-LN=65=Xdqa=(Vu EcfbyzVE_OC diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/CursorableLinkedList.class deleted file mode 100644 index 80358fbe8921087ce5532f5d58dbc4b9e0b010b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5657 zcmb_gX;&P_6}>eKjA>c|0U|*X+6)*CAe=<9WsndEjKXe%EP@kDYGxW3X_zKGGYBhj z;@HaK?2EHFi(_Z8vfEBDL{{QBCnv|} z_r7}XRn7eAt(RW`a2UVS(1gVh9@Y@RVkz#x6^+e@WctI>IK4+??js?5RD*^`W$-ci z?lI{-F1@SL`?&NzA-zvZ^C@YbD8r}m8EHN%&F9MSc{~xq7c|u3i_&~aX1*-FuL$^) z(tK5#uW9%?z9AS-Y4|3-CB1Kl@Er{ecshjdhVV=X&nlFTr>A<-cG9vH^!`M`w0q)4 zGHE6iN>=A9lBOLq;%7}e8M6`(^!F;L0flWnRw9`)5~;IBJZ%CG#@R|rKM zKtfauT{ISqwsa~MZySmwQyoM-9!tbhoeD)wht4Vld#tFbP(Bn(m?P=ADbqe)1YOJy~$u|Hb&U?AeEmDTUK zc6U>MHcH;NrPH=G*Pn=*i}ZUxJ?Oeup@*28bws`E9UAWy<6DR6z6BUsdOm8T%n^n} z2;ZZ-rKd2~v?1*7sbtDFBB{)2*USD6_k7|;Vy10$>LNqLJ?eymePT<{3dIW&{1UEC zq-R@UA{f!AE8&qXO4!KxtfyZBTNkxwto{U3nE_l8b2_KYY0Gxpt)SWFoVDN$y0%7F zEN*x4y5n*20FyQ#nNwXjS-5zHDZ%37m7?B_5h#@6tC1}vifnUQp)TueIMFs?8kfe* zY11|n5tA8Ekxt~>FJg|7?UZd9(TI^uiH4q8hL9P}pB{7k#_63ot6f*i^0Lb|>xCP7 z3j4hB6SKT%98IU@)2Z>4Z5ne4&Q3yX!sEv?Q%H$0p6)C$ah44exe>c&*uN91qomqh}%>n9oyIL4Z zx?~jkHk-J)##sM01XM86{JWDuq>Wo?J7V_5xfA2tTa>7 zT*HraoJ3a$Ki2UR{8Y!!@N*r%z|jz%XUt@(+?q_%@q#Qpf){oC62H>1BuZWq)MaT_ zFcHG9bzGO}m%$Q$L&tAq@LOC`IJIew{xOL0R}_wI7D?f*jci>T!K?|6W0T$azH@k*YXw;lG((%+p zcHQ3=wQ|O_xd>UsS7C<-FlJ_Ix*oN%hXWfsnzf-?pL51?OgO;b22D^n#2+!c(8}L6 z3T^y-6TqFgDn*I?YR<88vAv6<0Ti*v+3*Tf_yz)#D=2yi!SFJQUvzff&9)LjwnJ?1 zMLC91g%KR%jPCBmJ!t1ha63HQVd4fjwQJseafR;LCT@GK|aS_=SlZM7S#%$Dl4OhcPDL%3rfO8E4b|i_5u*mCC=eiLpZRJMPFJpUtF#MI`{)RIAJqus=@pVSsDA6SD?!)~KK5xE)_~n9M zk&pjR;=e)sf31Um#>anvJ>k#$)Wbi`u^d&IL^Q*C8I}3)|7I-zhc0^4fp=rM%%@-G z(GTK%ek|Jr7tluLTh-Gzz>n&o=Ihw0@D!@psZp5V$2%0R-FzcsZ!cX8{Fm)pbjD3t zk3CA^pbDTt1%3NE|4*32gO1Z0JtjeUJ$Ry?p+rgTuJ96q*YQq;;TF$&9XquCDr!es zm$B9a4p;RT(+-5YY)~2Ut@LF`YypFdBG>0l-zoXV{d2r3JuYTmKvmL|3NRJqB1*Hy1hByQ04}4M ep9i_Kfls9{Yp493+JaIH^5HbZ@jO322>pK*XEZYa diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/FixedSizeList$FixedSizeListIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/FixedSizeList$FixedSizeListIterator.class deleted file mode 100644 index 7a9d00bd00e0e115ff4b511d068732be6e4343ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 941 zcmb_aU2D`p6g`vOCfm5$T3fBwk7xy}LWAI&vLMx!g{a4W!_01<=# zTo%%H7}hqDeSW~>v6Xq8NMn0eXl|8$_Hc)xxur6}u#m_?ycv%MLcisMoOYHHmGXRt zYw7ZOvuXFFVOZ(PLy`662QiJu(C!t5&|5h-Mo?KVQF<8jlBatjPSt3n3PWq2i_}UN z=fozS!MZ<_oib%;$(l98>REb7v=$?EKTo+OsNfW(y z=0%3wa~O96++%qCpPXXoo`dw;M-#so7^`_|r{D0UNL4i)f7#ZzS{B2~wkPK_`1er} zVUDKMeGN37Z(x|GtV09q(ds{Xd;<2FA`c<`-5>);bn6%wD7reSLK_Q|Q9TxMnJ~yy zT&c015;mi=@GHFCrN#-G-zl5m`PIqC3adS-s<9ZBu~H*+2*LF|8{yLwoA8uPNc^r5 UhKJRv<8@qeD6}(&+qj6#L4 z_~3*72Os(ae9#vWSxcXM@n85yT<(45!X%Itc}Q~RoV~yO?R~zzXXWpIfByr(bvOzh zW+Ct>i(WiZ@JT0DvPfZ-H`j7l$EW=Dm>)NCc!JNec#6+??+XQA^6#@Ox}ouElfTMr zT2Y`Y*b?ZQH}>?(it$1(8Ln6KbVu`SM?fuFmhQ}$n(OMWz*$#!49#5E9oMj}wc@OR zSQO}*u`SorEN@*i>w5a1v0QFk`%4IPR`jw>P`bdSd}&vEt`+K@VHP;Z_)znPKx)RW zknNe0Vd+ct>Zb0jYMUnQ^pxx}#nmV}JqMd9lVFI{ah#3`!!o=nfpf>Bu2UFq$DnLR zOSZFJ&}v$FM=zA^YL&8}U(?jf9;N3N7{Aa^nQ?)nR;f_I0$@|KwhPOfyW}!H^hBV; zmTP7#(~X}C^yiDmw}*&P+OR769#ykQ5ENkAGzBii$lFl1qO+eyO31sAxG-kXPg! z8A;{BhNsLm?#0>&&&YEi;uR?;cG}_SRr@&!B;zk+-DvG;h9%cYmy^2^RwJI<$?3ZF zO=cj_n=ghHi6Rr9%$8$UWhMfOX9ue!xzWuT?tGoEg$he$R;t<_x0HOQLSMHY z4XNk`U0r9f2;4liAXQw(JCxv&*w!q!UaQ%Tr&pG1+{Yy4xxKPp;|1%IvKutq!7c9i zL6`V3#_`!&WhY+XDAbP4sd@zTp+Bn8Y29 zUsExISrv1bSMfC-2+aMT5YwBk=V)bbMb0JT1y2V~aMqtYJi>0Y!MSJGNtczQ7HLxY zisu;C_BeNnLY?A^qvx1pNgCaa1CHh**~f9uH+UVLkZ6 z<$Gu4?hMkHl?eU572d@avSD<_qFIVOh9az_w8|bLwb7H_N5`KLp3i0>hLw%5vKYol zfOR#%TA;*|OdR+lG!Sk>M zqpstOcG@tS#8dz_LA}6?dJfUO!SzZW;7kJhINMCijM3_eXwh5^kmd=As~#ayN&hf-!aD?FHT(jL72K&}?}QSA8fw&Qi==%Yt}+@H<={y^YFTegDGiKW0ysd3wRW|*Q++%C|;TS zXF$NL1#RX|He6rc?CdvX_=eN;7|Az+7I_`A^PU7vk1!N9jFY+Q`fj``V3g*z2^;UZ zk-()!5bjo;J5Fm)R$IaTK2>w~JlTp_PE=KR)$3vKe!Qm@^2<_P0gNj+7QW>kP>iSx zJU(0w^9-lm7ATbJJxQM9?^bU$Zxeq-!Hl|oTYey5Nl)%epW5@oi6o6QO@?4=o+ohj z2v2)g>kD3)dxy!Y0CEnPFpwdT31!srNF|tTM3Sf3BfP)qJ5EVzT>o(?4xA6=vs8iWS z6_*4y{tNwDGm1l}6>sUubr011D8}{PWCkJIu`6R0VmnI54CO?sx0l7C;si{k;nZ+W zndR4lJFevE;=lNuJ_CU>gR_)kvAuYj4|9UAmqUO_oaFu(ZzIUV!Wd3rije{%m-&hX z_pyf%JLN7$zSn7|xn}ean|Oj}yO)GBgj1k2ovQ-4k^tD{hcI@!FuNH2f$gYJ)#p$+qfU!elNAQ*o zEF5CoKx#vQT)jMQ6y4)p zp)RG0jAc`aIz1%HTsDt%*#@S}Prl=ay$+papMlRw@&!%&k^}M;%l?|w_q4pl9!X!` zQeWN@OIXnI<`a22?$7ZL!=yw$v_$BqiFK7!XmR=*6cUx@yTj(?45V|I*9QGag+I}} b`!u6FU|glItkPFj=^J;UZ`|{`;urn`F+p1| diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/LazyList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/LazyList.class deleted file mode 100644 index 92a57a51d9663d6cff8c269c8e1f87d5bd83cc57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1748 zcmbVMOK%%h7(LhHWD;kblsrlur(g;swrj^cN-1%h67m2W<5o&Z)d&z{d+JU#o{470 zrOg5)=nD2MSa!oUNI+#O!Lky+gbf=u?0|ExCym@xN`)BoN2hQ69c2J?F;o7M7$bkKsHn$knnm7o~Yy$BMwQ!18U= z*|Pk=_S_FEYXYJwkX-fLAT-@@%XGTd&>z)r=eNJR@|S>q-E4-Qe@7r&^Za(n+%cOs ztWwkKbQr;><56xQ`Cw4$Beo;XK3VZPyN$14E50T zE%ho*?`I!Wgce9OEo3W)(xa%yvG(6h383rYe=`Cqaf_2`L3`u7`0Abve!-g%*remND zwpDa>%iW>pOGbF;{WB*!KHONZFmH2rPv`dD!J$m&u5@O5W~i&PYisw=KzdI%Z>DQ0 ztVLnwUehVMU3zxZ$o1JdBZB=3A(<&?Y0EO4uDo6>8byWmy|y!w(#Pa%Dr*-CG|Xo{ zZ)9CEDyH&g(M@#@7hOlsy1k}#r;+RBtL1{$p-`Wdn*-(nLN^uk3A0ctc!vE~b?Z#a zbT=r}wy)Yj4qYCHnZz;rN`+y=8PtdKygIAb&e9D!oxyeRGUSe$q}Xvm6oro%Hm#8g zOA>5r@7<@5>#34!=2Kl|VI3YF5vtHS{Rz@-Ps_2{BZiwfPZ|}axmTQS@1o+ULsxl@ z7_@`Cfs+U(Tzeebca*}$_Ei@o@!z8m^`hX#TA{%#dWL&SB91ioD8%%fw>xNiTMC=n z|CdS6dzKf>m}N{<<(fh?>lnIgh)9K-0{7>2Yb4b_ypL(s@qg8Z$E7MHX}ri*L({rr z6zuW9ddy#R=JUdaxfHSUftR#w$#D$JOY68_B=Bby$7=DOh6L8gaD|3AmdY%t;eZTlWmqNeu0w~0 zPSesB>Rn&lEREJ#~3&567zKi+l%)NP?$4aB}q>$dd)Xhv69i< zQ5Jqd5+&T8PD`Jv8)c3e4s&6Oqn~iq8O(~x8GH3o-rZT9^^H0EtaaPj2vw=4&>R5V zT$RyU&aN!6gkQjUUyJ8_C zoIlR-2?}|VN%It1@iY_f8UDLHTP18|U^d3oT*rhHPqW7b1Udp?%~Qf&q^+X}o#*uz zs+2UBm9QrUKu4%V5-CZyG(3mUaS@Uc0a_wS6$y0`jqwCU`Fif4o{Hx#p$Om=%6Szt z@CK9RP0Yeun2Teqo8zpUx0!nHcpMh{cFOTeqSKSr$Qrwzvl zV%i{vX2xl!sUp-*z%O|9OIGk#RdH%4!#4ziLh@}1KwqN>A-I-ql~~nEymIeh);dmR zGg~sX8y3ue33HRzg_5$2w}ohUvQ{1a`zKatOND~(>#xcE8>Yk=EXKE3hVSUP@7Y++ zu+V>CHT~#OyNX7aF`v`i4Kcaeu#G)R{JA!u+svICyuQ{(B#DHm??r~A^sjO?(hqaQ z8Lbs2zB7I%@-OuHuT{>duEst#ImIR?9g@FX#Jw2<)1c24^o!0#|DCt~Ao`#Gf8y( zIE1DP2W1;A7pu79qKe}-+Afw*bK#lHNz@oR|33Q}4Pe;Vhqc?D)VtM7b;5<7oc3)g z;_=uSmb2zeSH!h_j+r7?>KPY8rlfbD6yNy|l}--C=(9RqyT4An>ihKeiu5o68mpNK zS(hRphdhmHp5g_H?!cl9P;Rb%0Bg41!+J}hg~RlnA1^({9G(#38IDk{N^7*8po?UU zM^mO8=?}FG+NId+sx;rhYJEhGY`*mga~6JwKc^~R5bWgyyz&!X!3iuAlo{d7fEO~j g{U`ht!Cw>X&0pabPEoBEPU9F^hmI*y^D4-H2YsSI4gdfE diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/PredicatedList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/PredicatedList.class deleted file mode 100644 index f9480f32791a2df8a682394072682b720fcdf63c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3213 zcmb_dU2_v<6n@@KnzYFl`bFhS2N5Aj3n_?Sgb!;G492!vC>9mnCfjyvnuYA96w&cQ zFZ35U-aF%kUf_%aQ<-tR_GftSUr?X3U)i={3gUG7?(X}(=Q-y*=Q$^T{Qc{10FL2K z1{yA>aYdf98SKVYd3!I7IeA{oB8B&5`9PKrWw|cPM_GIfBa3-dWvR)YDHaQ9EXv11 z1_M}b8pW1t z)r;b!RI!_jMdOB1T{4SRdu4?feAeq`)g`!7jAAO~H=8OXC+r$gcUG*1IoVp7H=CD@ z`8sz7Dt46-8jO?Q!Dg~fhYWu!PS1@nbA`gAN2HKCZ8a?StiqWmNoB!%jB5GT~?!JuCaz?0(tLK3v%11 zDSkK48!6kf6Nr~+0@P?<4 ziAV;e{51v5ViH5K;)Mcb4oQ&=J;Y99)>N?Y7Ty;>n^_9ah_x@`DN`A5gpo?Us!XA@lzdd;DU~ecvHs_F? zC%{zFK7su?dKdp$+Nbxeqg%sfi0iQ&vr$-C9Eb0mZP*EHWF0*kej>J?r%%}YL%?3d zO9WBU&JO|0Yz14`28?5&6ByIXZcTIfAz)#e94`Ub)u5F9h0%LZ9&w}V&=Y7Eb%$3( z8(kb?eYojC`-Sa~80-%i1o|QAYlP>d3Y>gSge1w!6S`Mn^5{BtD13*$0^fEj(DM)f z{1rOyOT?HS@C;o#Zc*T?6!$GJfCBf^6zdrZTcnteLdi#=Wf$j2BY8xaXwHQhiw2l z)3F4*5;5`mef1^1fAz@pbC3rPOmZdk@9_fOzmDMqCS?p9E&PI~HcSHF(bv%NO++&d zqxkor?8Ps8m-wdfW-s32tVp066}-)zgLHL@Pa!H*7-4bSTJjsG7~>{|$zV97Fy%GQ dH0?M9I70qEG!5?(Q^O2JBx8!xoL_s8{1-BLoZtWe diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList$SetListIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList$SetListIterator.class deleted file mode 100644 index 236cd519e99207f6c7071e66dff342bc3b304740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmbu7-%ry}6vw}(9dwLNaDtnPGIZe9Ei^vQnBa^F$$}3kCcNF%8@Qxvwe5(1mL?LS z5B>rEQO0w+Vg{1%;LE-D{J5X<^VjbmKLKo`S3wz%7T{oAj;4qkay(wd6SN#`Ie1F2 zQ=Ji(h9~M&`IF3q{=Uxogi@$dHq@quP(?@no6(65#5VujL?(Md*lN%G+s$;MvN-9_ z=!DfdVA>%5pe2ln^xkAV(#cyj3RzPd#(@eCRANLfl%?$0r0mVVhbGM~zyxYY2+R9Z>i^9WIj!_uv%A`T#aS8&Xt*@FXBlT zBK=vc?asA*Nc1>9(k$GnC2dG=Qm@1R5;YScxYdNb@s!M3oLXYr65 N1x}l|ahte<@*mv#>FfXi diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList$SetListListIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SetUniqueList$SetListListIterator.class deleted file mode 100644 index c5974a687d0b112a7de96cc4c79d2b7ea2a222c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SynchronizedList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/SynchronizedList.class deleted file mode 100644 index f3861b98ca9fc168c10860c91734e0d2cdacae1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 zcmbVNO>Y}j6g|(Mi9Jn2zKR<|N@%HLCpDxcK+>iy38gM>LP?u8#Ftc9fCMWxU8E8sGDsAW9lwGfz;8gDJ2Re49jA?0_|D9`@7;6medk{P_3y90 z12}3XTD@XbuN7t$)Fp)jGgh^3>s5PEH#dyvKc9Y`n)rKmL7}5;l&qR= z8w$gj;+lR(&u`cjGheLK?WvL01%=3rRp#D<#Y)wf+gM*VYFG7TlPf(%t3+I#==}B; zBPPR;)b2R3)0Jw)o>u7Hjk-t}d$m$mm?&DcmArmiFRdE+lC{3hEci4{qhvF^dS2q^ z7w%R|t2L`y`Pe8sycLe^it17@_3BD~etC`Or$z+Fv`QZec_;IrS0TP)*bSHZAXC_VRw73$)w1yst6xxvSq>s!c;>umDjaSebBaCVXEZf(lcXd=h7MFMutOnC zVha74g2$?bwgWtWOLnxOMmkATuiFKoC%ZJMVZk;i0;?v>T61msrW6K!OkX4cZ>(ml zTX(31a9s!=dGHx?l9)H*p~N}Sg$f;2pbVKFzvENQrjafPl&+e5<(IIbas5e-@7H01H3hLbp@;blx{cty;s zcumZthADBJ#u*LMI4fa~DV%!(xgDuLBJv$ID5Qc)-*GtV&h6oABMT}vv4ci-inED= zt;#k0B5 zEks&_UF4yH6YPk)%?}p$g7K)_Dxo5Bv0m75J|&fo?9Yh)fmmybR{|+^crle|!aIML zXi=UY;`#W}+@INB&@njLKxY_Z+dm;O85!G7MIJsNY@B76LLXv*-GWOkdPoOYr1v`C zZxC)Nkj9Xo#t=p^=1?8tpN*uUM3o+mnnxquLL(tG?t3IW4*kUIM~c7ZeRMe`dygF6 z=jsOm{Irjs_VLqri8n9!YzPnE;J4(Fa_}#^WoRH7!szzq-01e$LkGNcNFWXuJOB@cm^BGRA)!*Z@y^VyKhOU2`}>ct-vBhxDj<(DdE{`mfO9ynqYFh; za8ak1badH5)k2LStGY6&v>2{?QM~W+$K3A<*N=L=C`@P#0^uvE<3J|L-HmyeJc{C; z=y;T`Gvs%khN>%+^a*xDhEm;R*sjh*^A7kE?)H@oTut9nBIYWJ*K2zW=0?;J3=5tN z#r=M-E#h6?4ybb6i+mpJ@mT77P&DLU>N2`d?=h->Oh~#zPNVCXC~Q}bmP7+5;A^^tpD(T+&Vgy+N431CY$Bux={cWnJ;xlL5#j}oQLRLK zbey0|wCadPPc?ES$^+;&<@%IU{{W-$85xfPv+)IU2FB?xsmWJZ#Oo2d^PBGA1XhX4 nw4J8VvqQS|H~kIK-xB@ZKj{WeQMU$8!=bf6-^r1Di!grzp*l=P diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TransformedList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TransformedList.class deleted file mode 100644 index f8c6c5f59133659d26c9847b39071f6d8dfbe249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3067 zcmb_dYf~F#6n@@KNFZ4*4U`J)C{=8eKnb+g3!%kIFQ!eQmP<>~)+JeBG08f+3xoPW ze~`}T=)hoS96$SWobjvU^X_go+aye;t;6u{dwtG1&w0+tU;qC82Y@Mjm4Jc=aeOAf z4-**1at~)KajeRnwIpJAB!|axSeL^SIc&(&&*kh3IeQw%Gr4%0zyQ9KGffVg5~~zP zS>ViyrPb^$)2iy_qG3A)N4GS`v;@>bt)^QG70tGFTVTM}EkmoU>6UGnwbjB+0dZHL zcfqXLj#hKlw91~|)%W*58$bQ3tqOFP^^!>_U0^X?+|~BA+@51pa?(h?Xj_cIl|XFHs2R?6f%(@9Z;kOdI|eDf+Q|VKNQfIZVR?c0w(dw; z8GpJBTM-@$oK6?~vx-*R&Mj^3l59TiGHPZ0fXOTn$ek~3$=e=V;ky~$h?(v?$+Vl& z@VP*eVsQ!*Ph!L@y=v|=D-o?sr46SGt#2}nKE~r4m5RV<{e~-)g+LGa%oB1X^+A+S z7DG2ES4mDoy`wEm)Xy06*?@~clA%*!&}Cb4cCqeIILx*z#_hdLF9k#CLY?RUoF;p= zEVJrTLz*4apGEjgAfc5?x^0h7PfrVMq+dw|ZK!SC5>O6kLOGbBL(AXPoE_aUN(~2Q zqyvd%bI&U2w+&fPLybyw)ix!wu0jX%d!<7Ww^OT%i%831Tg49M1o~d=3@Rotsp1l* zRLtPAimP&XUoJnuhtja2;v>wexQ2Owd#~WacvDFA%uBC!RouWQDi&~4#k;t`;_hIf z(Y3;b*-$2l4w{U>g?44tE>E|@J*9#6a*dOtBO8koh~ z9EZJIcn9NL@xII(&!bXlK2`w{{sHmq#N-j8zi_J16?s{jC=l?j3pVCmLk3yy^MMO1 zjm2G9g|HN;4||zkdDfl%4PAdC*6iRz7gP1__?SX!+kZb#>(YKQdx-eiV{|KMhIkZ; zF&Vg(L=Mxgan?vXu!&>zDEN`sUYs6b8z+EW!Fw(kYwZNEL@U^{4q&X=c3=!M*&1f) z1h9ITtbHHsv7gFRcJdJ7zRTR?G1LeeS?zPPxWlX(IE7so+skY!pfKfA2&5q6SBTHP z;#*k>Tj>p~^hH9PdfKVdO0A=XJmy>r*C=aG-qY@yQqD#W(cheQ%SH5*6AP5Xmgm2| zgD$=Y2A^YKJ?qQol!7CqnxXbX)D8yW58`8ALF{+!f^JYd7zwG;3;J6I{aweP>$I|& z`WAGSPn2$txE`N7#!v){vc4~|f=<6s;+~=Jq2dSEP}X}G1TcbIZU6+sZO#CeKnNFos1+V7919&Jg6+D0mB<~U4 z2YJ08PXHOx2vLNDkmSv^HN3Nq3G-9Se6XR*Dt*(0IKTU@-++ z>&6G!&avriubm{-53$-1KuGuAbGvmq1P+8n4^~e5LLJYQ1PSYZs8|YfATRVal!mww P#$O-HOyo|Oh?;%?-xofS diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList$AVLNode.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList$AVLNode.class deleted file mode 100644 index df246196908588d81ca5ffe6e66934e2f685211d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7620 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/TreeList.class deleted file mode 100644 index 2353499c46946ba092a318114b93a5eef3d6e348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4318 zcmcguS#uoK89hC_Ms3*)l8`h81aiS>EL*Y=1S1TQ1$G7t3v44JNWiU`mfU94EqZzs znGPRPn+Rr_9I|hpkA3s=S2d8M3^w{D7pWqH@0Oo}Q6Bq%uxbYO3zN zbNhbhocnFvfBx?G?*iC}7h7;4G#O@+=tDlqRY3+_hS?-in3G|@95H0?Kpb}@(TbvM z&&y!SwiU;M{JAp@Tjr7sjtpfP7Uj%OWpyx)Lvh@dL=W-_{7mMb%kYZ??w0wUB)V~L z9QVa>e;mJ500nB!G1-k@kaCpmo0aDD6weU4&6`3Sw6prr}(rAe`x+ z;*)WgVD*Gy>O0HxGrGM;nE`Z$)v+ZQ)H zbh;h$$8_^2X6vPLk(OM{TZ_z}XuhaxOyX6{)%+bflYv>(80T0fm&*xXvgByCDq&NeL>n8bG3GAw__XT+}85!tj?rr%b83j zqtNSC9X<6dj>>S1RWi^k&2Ec|=kUD9ctOEHGgqk6x)nb*Q*vxA??~md?=^$7ZWH^_ zyj2+It)wtmePhz-zPA^$#5YU7X^N!Q;}h(YQ(Cdi1Z%JMwBfR}Xu2Oj}rBhh`jSTN z75cmVQ@DWNU48u23-QOk>8{uuIj8tx#U{#ekpC{>%x^73vr7mccaIHmOwtUPKm^xg z6IZHt2*WgxFS898;V1yxT?(L80J7^Vi0rMwv?0tRQ-s+|$eUfLP8Yh>hoT`a#bpFj zr1$xtHz4Ys>dL0W*$SeO!V+TH69}a%h*yyKEm1?L37w(9d>wjMfZm18ytSb7b>X8A zy8q?QC(!bG02SjlP;7YLQC#U850O~T#j@cFk~JZo^UBZ`|k9-pYCCJ_4J`UI57zPF*&f*_P1p)-35sp<59q9{u^`)!0?!)c0ARA7B(8(tm$+HTHV!fk(Fac}+zu z(QD{g1v@e6t9_956D4k6qx#vo;Uqe)h-{#$&hALfJ)N$}Usy^XqXVB%%BSeXXDIS~Wbk+D`bV9cMgpB9zRtA_s%R27?GBpX4l0sb?x@qG2z7W_ zjJ&-0lB8cTZ@y-nzH!OCrr6<=h2&e*_y7I8yyV(&dhN?dq|bd7%#H5pQ|OsqLOQj! zf^&J_^HS$?A?eF?1-(nS;JsRAcy;zqvi^%~-@1%h4>h>na1e%JcG&^9zJ}Rr2Y9gr z`|UJ$q)FFzJY{9cjn-Wzid)ssYA&+YQLCBM&nE#1ja1L~Z$b*53Y&4gbo?klj&{GJ6bNEBO*-G?yx2@BPTf6gmD5bT8I~ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/UnmodifiableList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/list/UnmodifiableList.class deleted file mode 100644 index 11e6e263e2a5a5f275e32f6be593a8b9be431dd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2770 zcmbVNU2hvz5IxslYddSFq;+VM0_Cf5oHnK*G(gfo;v~hbNq{sdX^_y`-X>eEz1Hr! ziV%H6{0II;c_D;KAYS2>U&8}p=I*Y&jT)^ztZv#rMuzyI^EzgM1pCy=b`HOtmqUEqy;<%#xGE4E$3ELIH1 zU7kH}5QvqmI{A)QjHbTbZd7&qfmSuiGEuQ=6j!6@^zIvDCczM?ew@UL(KOsufs6f7 z_bH5fY&Zh9E0%p!)LL5YSTEMBMuSw)ziH|xV5&zK>kjrv+jPDh zR()= zKt&PnD0svehx~F&#RvFMU~?3DYgNa!wVJytCxP(|-$%~zhIiBXPGpXBw_8zx%RRl+ z-Jt?p>du6&UEt0TCc*u4da@OCs6ZinZvu1A!08yNONg%5B@;bF*+vwzU5cL9+W#WQ zXM>;u3t@uctsas+8@NTIc^q`F=r@H6c!~ZeXt+mkk={~N%}KJnOqLBqX$4Faeuwx0 z@xt>Lh#VA75q&QGFViziKENUryhmr3aE0Df?-Zd=OFwEnA90nUM97vX%$*|kqugZ_ z{#*d-h@&JCCOt2_ir2_a{t}BBQ{VbnOZ3m|GKHTIKSM&`XDD4_3AuSUL@49K(MJSt z`XDPlq2voB4^EN#jQ}HHO5XYVAv(zpoh07E+cNxh%#4V%GXN=%S&3A@oR73X3|QD8 zPP-vZ0VjbQBWrp%fJva~=E#~32OtHS=0`^QdI%DY8b3SXvZv25#${K}m%ScJQMc?g zqI{5bzwBA+o%Hk>GLip6IS!G^c8Z_H0^TJYZlgsXZ;SBw9t?NT-!RP9P)sfZW8T1RA9Gl{yCKCvYcab(@efXPFizVmIWdptk5b#o+;d+VZ`HXl>$WY F(Z36$BXj@& diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$EntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$EntrySet.class deleted file mode 100644 index ba4c0b5778abf4ab1ef655eb8f5c94e3df96c450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1769 zcmbW1&2ke*6opT#M;b{UW3Yp89Eb@RqJISf4#vg=96MGpW&uU2vTF@p_Bf*%Ga6Gx z9w5u?$qQuT1*uAuN){=y$s!L$aeDM)#dxJsRd?T>o^!uG_iFxo``6z9>S*RMiE0iG zYI%kYGkj*_`UKMW+ypoBxQWF)4}4+5TV`0YaofhSKxSV>I*0`px58+rq4t%#s~c|E zZihjKv+rv+_RPAi_8a$Foj6i%ys0|7`q@LZZxmL%z>8M}mWty^l%5J$YvD63Ftz0c zdi$W=($N#u^0_m;6}rlQsv^(C{Y@+0^*RFC^&pO3KGvjnnn9qWHD7f)nosVIMY1r^ zm^}^bX&#lE@#>wy)-v{Pm1P7x*fhSAYp5d)6N|oKQI=4Fz{`( za&(r@ld{>^6v&x2?^p53NtGV2%Z92f)9D0o1cHqE`GNA;Tvty_dHe;66x>LwSSO@( zYtRJ(tK+z~FyzB0{ANt@BSXJTmvEJV#ilvKooPlJNbv{c%YQ(WE59T4E29)Z%B0^54r9sX3W04mMA&BGkqmt z+Lk+pX_52D`_>Ur-ei|IVavr6HQ361jURc^qE@}~57Mttth_<`q2a0iiHtxO_IB-G zOx3DgWM9Fye&H<-M@S3&^g=E%(``6%8FO+4Rk@mEEmPUSMaw;moRJ%t zk(-#6P0Y)0P?QgbY(RO)QO4DTW0sVc6W)1D;8X5N(iKta`*o~l6R(fe?9mB+ra}^r?Wps2qOc;iCrB)B8LLX|OxQ-QrcPOP$I}uM3K_2^=Dq8xhTc<9&TnVWe z)-y?xf+NK}#g8tpG;jGG_aiQE{FBx#4To-vr*TgOVlOmJSN;vDWB* zyIH3FuQ!IROgiTMe$4$hEtp=@DY}?vD45%nGHg@-nG>cOG_AEP3Ji@bVN2h|V-Ys} ze6uVy>A2a<3z&f3JKrSt*`gcO<-Cs3e~+PAT@#7;N6?s|>d zx2pf5{Q=}9552{xMMCWpQh!v{b9T12gCp^PEX~Y0bIx}z-P%6JBofa>u}@2G$I$ zYY?veZJ;5!COggBZs32X!CZG;+h28Lr(<_C+^l*2PF1#LqiI(g-rk<)c4&7TyAibb zyeHe$m3k-eWg}o1dwWB+&-VeZX&7sgdez&uHE0ww{QAK8C9}l!mfH%JH8e|a8h(8=&ZuT#i&~*FoT#;2d$YS&xBW-5?ocw5HLoF^E$O#d zj+7#3wx~Oa9Xq(otHQ)Nm*H8nY2S|Aq20`Fnqx7?jqb5~ljOFi_ue#5@g;wGFN zp?Hz`GckwHOq|5Di2`O!oWf}nvp8+wu8A7&8ya#U)khOCaREgWWmHUDFf zR35jwk00BsH6_kz+8Ea{jm>&=4|te zT1~_Fk)9CAvfZ{_V!Lu2$wTup+!tbLrnEXdI!A7ChQ0?=h|vcj4?#cTi9RfXsS0;u zE8K}N+6}sy!#p(d1HLCeo%VwD44PFwM9eyMh`4p>5W<=khtPka+ZfKW4H5*Kgb*nt zMH(4lA}7W%EiyPq_g54W&WG{Yo-@%xPtGM4o;aI$c;b8n-P4Ff*({L_+vlv`A$~>T zDGY5N21`GaTBVU-6LBI8X)5z5B(d9vs?rTZ>Ex`x>YN{P*89#SERf3?a(Y0aI7gG6 zH@Gc&Wq^_4J24Gi6p#`#A=bRI@7Eqa4?@$a-xk%$b<)3_Aste z`(KkL%@2bt6nB-O_80r@rzanwuSMvy&yo4^8735RHoMfr35M?>+r#955QTbq2z53> cjnPo@+`NysX`iH1j{Z~Mf=RS2p_)kk2S440zyJUM diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$HashIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$HashIterator.class deleted file mode 100644 index e25688e6e0fb8689fbc2d774c3065359160f0f06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2583 zcmbtWT~iZR7=9KG`Eo^#NVOJ;){i70DSn^=q8I_Ad}y&KBGt|2ge*;V(`BPD(@t-C z+rQ9WdeaL#BQT>g_D*N|TRPK!Q2U%@O+vLd>CK*xeLtS}InR4`|M>gmYXAc%M$n7v zVI09k7?YS%vm5G>QOlcZb}NYK2tv3X#7qdY5kxQ-#>tx5?I7-i@MQ#hFc;zGe1vXy zgZL_fE?f^`L5=s+<9-N>%Hlx?OKSZvgykT<4&qS|k2M6!hAVAP!_c(juB42zVHRY{ zbV?=1UgKCSO4GB{ykwM9LDjc5x$?m7LQ$$E7J_MxK%VlsY8xI>tcix*M@;yj`p0 z^O712zgN-YwFPL_3C#W+c>+bvUTt=t7Wbj!wUAezgrvPIcC4MN{% z(=gU@E?-aQS_weimFgG9f%u2AQ_>8qNbi>9?X^>wwQ?xTlg)nqZnJ{xh5@5omUd1< zf3t@#@Me$ZvtxoC<{wG$FY^%bE*Qm%6i4|1=>;W>4&M3f3VwBj>V@h^HC9J9NOfdq za179*AE)Uxz|~8%(H9s^ZbM7^ zRp{xyx7hs(k;Uk)ZRl!?hV3&PJH|-I?qQ(_i;}tjByAI&eb4L2#`tZAxKFAU(Jhv6 zSUg0pSVlrT!k~DJAz@%tWHBL3%!nLr3yB4h$C6mVV^L_LFY8xy7*iM_K^oVCK7B(x z@)~`k{7D$C(kF1aUU`bvioOmO(%Ar4qpjFPTZf;74UH>4Z9kDV8xW?Y&1ce zszc*V=R;fN`73A_RlYYEe1$F^<$-AT7Cxy%I2b)tUw*oUgVDoWZsD`%(Vhksoh%aK nJ7W1B=fw|Ac`y2T+i(uCP+rsoM zxv%hQZnjwSJ#PAscx_FTmUwkKy}}Tkb4!AutzbFg$ws9pyl1>VDn&ysSe zjQVRhWrH(svqL1ok{ciHOJwsyI-SAAYV9A#rtzbAy zPo|2fY-f_rlaz--9}vrAcfnrKPC=5^gw!e@p(>xyPI6b>3LUsW64|30J%qt<5xpVS zXdnYxW*5p1A}`6VjuxX6D4zo)UGAZUNK6h?c>g&f0ZVsg2hl?IJzC#DeUXgqBK|IW z2ro%7K>0%6eMO7%4eiSJ173EA*edBR!w9^hDfl;w7P7Q7ysoqSAeNuR@{3r0pTa^@ z60(>SON8R=k+Ccd@5PdkEW;GcnIkl0t464;A`03g(SXLN1MH`~2ZOjq@G5C!Sh8?K cL5ip+;p3B_K!9?WFWPI42H$37n2FQJIxMjW}1{F9n5vAZ{p(Ka094Z;y$lxYJy32jxh79XX&)+k7ms@RNT3)B)xdF|NBdpMt>kjXl4_ZO! zb1QtvgSOax%)2!r+_POfyw7mAI3A+3&7f|0yMkf5X}jV{uhSC#Gv0D2l52Vvcec52 z%Y715!?qnz=11aiOOSS>;kv@#aCi_1ir2@|u@cj$A~mpIQfj4GYA{S#j^KW@Bb`~x zb3<;slx4Qq+~)_}bhx``K5gxjPqoqx9eg1UrS4M?Nw6mgN#7UCA<@J0^Y}(S3!l^b?WikT>E*Q`;nL*XSED8qB%ZQ0N0}Hri z;5L>RYU4CIafix|>WcLBWkfx=GY*wuvTrE4&#*em(@{?5Eno0Z#4YRlge7|AHTnrK z?IkP?guvlsA~6SRp=*v&54h zJ)%zJ69api49GU77{iOIfDL~2^6`NVzoSdlKXEANm| z-j8Hl#9YFt(@9yECN)%!FflCR!-;aVK{*;OVLnQ~FhK1Ph>SqKkE$n&^z->+YHZd= zGU^j@%IAo_7~dPv^9fy}MqI`f;xa5!i{i3}Y|DHbvhB-=l2cfYPF=-0nsp*&>8~sY F<39zu2ipJu diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$KeySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$KeySetIterator.class deleted file mode 100644 index 91aadc30e6c6d8439c8f0516469d7ae5bac0ef4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 989 zcmbtTTT2^37(KI_WKFtWn%Y>cz4t*axFDralz;|H#n?V5zE9R6S=r2n*|D^Ls0E+& zr9vP21Nx)HGiwmkx9u*>`EGM&zVk8vF8}-mu!=VgRPop?tp?`sB)~#|rvkN&L?^Z_ z@Nub|nSLZkG9IWX&W6KG=fpHsu}z#kl%r^~ms=xa`&s4#b+ji(>&u4%l}>h~1g5)* zR$oqrJ!KALFJ+|J&0?7zN|QK$9IV(uk_$}jsvrBx?pS4{&5S^}qqQ=fROY#2e!J9t z-ri7W^bzX!8>Tc#^dy7((I`xKw z!nOa8fs^ek%W(_5FT=zsRQMd+=h5PTATU9%P2VHdR^DAeoEP~z*M^JwKT-96(FR)A zRd|3YdaTDZX2>D%5X~{yTHyl|D;My7!#`u42gg=p2L5Tm6grz{Uo&}lR8-AklDGh$ Rx0^@Eze-#r&Jmv@yaIHk5|sb| diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$Values.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractHashedMap$Values.class deleted file mode 100644 index 9d87b5ca929c036dc62e8d4cfea4956e79799827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1108 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$EntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$EntrySet.class deleted file mode 100644 index 359d0ba36201891ba5789b3e325194de21991b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2330 zcmb_eOK%%h6#lO5c{uoH?yN_YrOoJrzh&sgJe zs~`jjA&@G{0v3RfSRf>}MJjzz$?Cd4q8t7P@ZItFL5UO=mJ{DQ=bn4ccV6H4?q7ej z0L!xejp1?xEaksK&-7Ifg*|JlsId+3_8l(R|O(DXTuU0 zEmUl4saadM+!b@ZO3D6$Q#PxsrdyHEfiU82R~iDb1>19Xh(kcj+qUKAs%E2M@nmTb zz>ajxGX>#>^fG#1_=HgLEI&;Glc{vyaXygquHrfKu50cHBvR>j+B#L!-pVeoUtlGu zAu9aO3k;cUy@_45QmI|UyBmzUR-;)ZVzuNn-LkbX8;dPu-@P>wxTvs%_iB$QM)~y|34ET}ojuALwPYCl`3PA6KX5gX52po>$gU;Jto#-O3Km z-OZ;IJiTbAb&5WA{F1-^nWWM)QtcLKdJdBv&K9ow?Km7O|g^k7fPwKgSFX9MyW zwyjHfyWyF3nR?SffPEhF0sr)&qSrp8rJaUn)db=`&6J%wDJj!$Cm^K!e>p0jPp@(? z$N8!P*kzI)xQpwm~@`)Gm2p**|xswh;+>;Fg^JnNxo+WN0yq39!$Sn*pfNKcdK=djP+K!^W(uckS zt$iVIAS9s##y&#ScRtfLq;Q18r>FGR&q(T1w-H;@r;gu2ylq`AeI63O{{5%k^D@am zfR7o{A8#Rf{rP!hk0|H8F`q$X2M*bLMD4$aohZkU~j{YNS& z3QAEyeD+6)cQ%`*Xdyo2WoPEjz2|&ZIzd9d$1?j8^U6rU!R+hQ)I(N-9`?18!K2fv1wxsXHDE>Se|froW(?gVJ34T$fO->yw$}x47)Q> z<3BVo+?xVBCMlXoJ)!Mb;|y!3DqD+kX)>*e!U_{3HObJNQbYegel&&`CyOB5L;$m( zWvkjji5`tCy(H9=76$DMq==dVS?1~VgwAuc=4o!79Q$#u Ad;kCd diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$MapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator$MapEntry.class deleted file mode 100644 index fcb7b6d85abe9ef7a6401cba7032bebd58a2dfec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmb_c+iuf95IyTAahf=7Nz)Rp4KyuHg6atT;UO>Hnb|!vvuDow*YD5Y0qmnwf{A;}DBykxTWDzOK^bK{G_h@> z$xw*76ro}`bRv0f^O(CsVY^WfL}5a!?+aIX+75VZ9}E&DxvP%CI90u&a7W_o1&^Nz zH>>cUvfKDo^KPpnH}pcq=8nS zA=it}1jDN1h2l632135(1D_&QCvv&p=hD;uB$!h}kD4k{Ba?QI7tu-cIv;V8Cx$f- z8#C`swG*NG+)t^+-3d2756|tFg9~E6+Zx0E4pGj_F`znYvvd-r(iP7=ee0chQ`^_m zuu#Gy3q>rO*t5_=-NFVoE!;$%VWEsL9L&+$NL*#tn+ool%&F2$v>DcC$cUjnTV7fj zy*YJ*|Ij!?g`S8zI+@O_@=qIR&?7VH`H|iXNPU&jo5l|0?l4(m9FvzAUP0~B$8?;wzzk|{FfF*~F zT;~(=2HsHIfUZ-@&io+s&#cDg7&EO=!!6vVj0Wyxn7gRZS|z`X9ashZC)vU}ihlr` CnHR?f7x{UclP*eHGR{8AU2GaZg|-dD&C(ZmdEX2O;fGRRXz3 zuJ6WM0@=!HQ^2SP2TEYN;ri-%zuQvbzHE8aTxbN2^qMks^*vP@amS4Wb{aw0wq;K` z9c4Q~w;T8orROOpcJ;X{d-irKibLtdyMC`9*E`BNQU|2{L^(miYLhW4jYIiP+Wpw| zY`$%3Mp-&*LT6tDN(|;4F|DTb`XsoLI(yP@+b>#&jJ>%!@ETPyiW{AJB{W>Won-%p zby2#Ad=;3jq|ON$s>rXn7xY6%J#}?Kmj9PfO*6JIgIT>TSh$WG0^=yv(rNoFT*eg> zH48U!OGmK<>SO4Iz{WXHM!Pts1PPhsD6oGHBL5n#VZHwRfYO<95_mN_db-===o9DH zSmdWI@J9m^{InbfZ~}RIKq<7gdIIr@hYT)qFH!;zX}W<+JXr%H%we844X}^`Y|&EN z=BjHa$o!4)nBle)g!zG0ia>ikGZ2P>tGJe6axPQMbxKVtV|>(m!YG$$-j1-zq*y{v zUF!Lg+_Y!8`UTk!nEMXnb@ekQz9J{U6wTw|?RW@1g)GkpFri4PJrbgvhR9$svA)eh UfP}LwP#%+9C9WwhgKHZ3-xcsu6951J diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$EntrySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$EntrySetIterator.class deleted file mode 100644 index 3dcbc879cfcb8b7378cd82b9c3efcb02999118af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1063 zcmbVLOHbQC5dJ1OF-e{BY|5jw6msAp;R~vSs3HLZgcRr@i2KH@z~HQ{^#;K|0*M2h zkT~!I_)%47owO>ClfBZscIMleZ{+9Sk52$rP_LkfniZd|m~b)WVwzC;8LH4U2x|+? zSfBVJ5y7eSgSgX)RmwVwWMD#TcSPcEv{R!+V49&im&f}eSzkONI9u_tBn)v>9&|fx zsSiav;>c(-4n%Y$bZGs4&@rcBN*LZ&Mqjn0*)viL6KjIErv#}I}YgD`^8K9-;PKym2-g*#5_L6tZRy3JrbYjYz#7{b`Q#RIR4 g@7^gcU_5)`6RNDIvbiSV@hM^wUmOo#S$~7~2ZhxeS^xk5 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$KeySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$KeySetIterator.class deleted file mode 100644 index 4838ede52462f79ceae9e701f799d05acd511ca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmbu8TW`}a6vzMW(zFZNjX`1KIyPVzX^|#`goY|XHKd8c9)|YrW>%MxI+5c}@U6xR zlX%!OARhQch`-x{G}fn(NIn<){Oog%{r%UMa{!xo9Kgp7H{1-cfJLX>s^LxzcLn_C ziB4=&;Mr7r)Q6nLSXu}`na#`u2n|b%m{?LS}W5^Wl<>3 z@02>v%0=onGt8w?+6p`^1th`K>I37it**6?<%x_^sk_l$=a_}zY&|#XB+2?baA*i3vv8#-JKCCy{g}P%nsk*I zxCJKN9T@2^S(;M2{$;R`&Hp2?(_LlReu1e!Eg2o}Nf|PhP~}T;-vm6@H85#fO;q>; z{`$rl#3yPM1RMkB6<<*m-*AO?W4H<-W@vFeW-&(wp9SVetgV3!)Ys2Y`HYEEt{c*P x&OrPakV2<({~?JtacsOdCjRG`_zJEMc4=Uma*^3paT`;l`;_-67buqy{stiKAv^#8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkEntry.class deleted file mode 100644 index 8e1e5afc000158daf56915dc60e9f2fb8e3e487b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmbtS%TB{E5FCdI>ORp*AXf|Hr;|9-uL6Z?94mbs z$uw1|z+o-X53X!TKTxip)ayx{a*rbAXQ7Gfvf&r)J=uKTT z>z>lr(u;_cYKbqS8>vHc{srwU2-&|KtCy_LG4ygNFdWc)+k&VH3_K}LyVPx!1ACTH zlfLp-NmKjkG&Ck>x`w=G`Ys@c5eF**2miY$2dn*Y^ypHc{1+4bm34Hn4vWtj{MuX& zBOAl5o%d$u0zPM=w;1FC^4mL0yYu!t#9OPXXfRg8;uNhSMtLr`GcnfUG5^OgK^_y8 kFln+GO<}sFoW~3!o9HZY3v(FaUSecnflLKvEiu3F1Nocy_y7O^ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkIterator.class deleted file mode 100644 index 9d40e549fdc362027853977731dde85fc104b1c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 zcmbVOT~iZh6n^$4WRtL>#)!35j7pURC4P%VPzXe+2vihBi*>VkA&Z;cbhB~vAM~a- z{R6#fz3GLW;bW%G)Vp@3KdRGnHp^yFI?Qmh@7Foc^PKaZ^CtiN`^TRE2H~cV#Y7S( zFquRNcak`RyS$v@<<~sB$9vN%?x&E%go>F2W>e_G93Os@zylTY2|P^U0OnF;`Y1)7 z3o0I`a2OK_JmGPXKTi{Q#uncuu*B=<34EvGg$i9oS%sk>Ue{e|dkU^iJMKzBuj@ut z77V9WbL<97=dfG8`Ye9ESUI&{ouWC|g8jGCrq^o<5tDv|idOy-F5DHeU z>Wvvc-j4p;N>ewWjclrppx)oWxyO zb6!zONEcF4@V~hOF~M zLAGr>ZB!W98|<)#>sM8`*T@3aNlH2JL^?t*7R?dP*~imhA)}BkBqlc^uG=Y zPPFqdMUAwgTl1do$q4KDRyqm8(Cw^aTW_*uNprHU(9)1ueVGIV$~3%$rC|g$N?{wj zmE-Z|^0K4?Om3CYGYvKz{?w^QMl^g6izZ7NZexrtB(z&nFt(TG-&VBLnQcY07m@-F0I5-yPS#o1-sF{3Jv3Wy)JEfea}Tbg0_o# zM5}}dwwdoh@R50f^e*UDQ^roxk5Co@CvgffWVl=Dhb_j9;g8g-{z#olW0FqJ)6brQ z0rn-h9TStr2T*npQ_ZtiPNC|jIQ@cE^Z?Afk^^}U$O5! zx)#&gCiZ>E^T9g0{V_<}8oJ+w!Sq6v)TMCsh>s^uR~b_WRQ4I_VBs+%`q0kRV0Fr06Co8bzg-ss5T* diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$LinkMapIterator.class deleted file mode 100644 index c29b02714bf2f559e67b2ad219c29b00661b3b3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2097 zcmbVOT~8B16g>lNx2+3mK?N15ir5dNev5)gK@eh*2Mp22>2@ru+ub_d5=_+ipvDI^ z{uF(IL=$~9@kbf&Y`3L>M$)Fq&fJ-~=iGbd-bw%b{r(fcI2NNgh_w2QMR5V+YL#G{(cYs>W+!Tvy`_4L3F1(lEsknlf$Eoo2Y1$T_l@;bm^Di;Urv zN{(Hj(Xxc$nrdF+#^QD{vyy*G($H?WEX9WDR4L|AQMmWT3kJ=oN=2%Hw2dtC z%KE(RO4^udCkEx`$vo0PP<%wP#;qy|9IiB`qlvw-wG217QS*)MJT*}iZyKVk3W;H=CQ>39 zH@F>lZ0kilFKAAu3vvF0>LIT5rhRS~XzPh1MO=!Kvmp{mMLy3kUDu#flo1RON?pEA zQO;ph!ve$IPI_l|sWN0chH2^|)c`x@rF|e*WI;%;#_B#A?vXP4xHUfpEvl4iUR|MI z^AQ!2KcA%@Y6Dw&);gepK^@RebS)4Vdg?9fN2UAi>YGQJdui2`rd{+Nx~rW;&d`oq zLri+8d+9}II7F{~2m#e}Wc86XjV}7pYAU@A_Kjv;=%;T~t+FzL>^Y8*eYAFp#zC?a z%5j_^42F{!^06*^HV{s2qiYM@U+G*8EkrwDu7{+nIl?{?!>N}3ffoLoE&b`u@cAF1 z+lz7_wS{0V{Tn?$5PBTbwh{i7-a=$2o)~EW_L8!Dg$R3%KK7<5%K<;OASo2bSuZQ< z@&B_#eU<~eS>6)MJ7RfHEFbn^p*O&1F({XA(rHlTvOHGLMOQ3iluXZVnvX>DiD*6( z%@>a*UIS=c*&xm%LGVGkV3n4-_@sA5DGbnfhD7Pb1dc(cg1Jq$PDL|;$$(D(2_`TD F{U0u!8?OKW diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$ValuesIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap$ValuesIterator.class deleted file mode 100644 index 40cc8d53cb56f57c5b8a2357b768a43568df555b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmbtUU2D`p6g{)eX16hI)#|FXepmY;G$0~KWuYz=3adU;_I)-TwyD`kn9P>?uk^)& z5B&lCB?>Dt4_h(q={=+|^o{PAZE+ zF}_pjJS*o}w^(5=jnY=&StUX;cv>AZ|H|5W_fQ_mD3y8;z3m^eF^o2IqmGhn#3KiL z*~rA|RpM%I{nM*WmmQ*kW{A7E-@t z+L{jnvo18TU$P~YcPlyA!1n(!P=SH6rR)N8zr~mw@M#rp+(Vsr#62_coL*qrL~Ydg z0{+J16Npc=Y6v(6&MUs6F23OcacjH^Ar^?Z9v5+m9J~-%oNzrUG0@yNLG3eUK62fd z&1VGSd&v|!oBNNM_zh0Y_on3kn37+^)pC~><~c91x;mCIM|Pj{9WUhXVVTv3zW~-+ BAAbM< diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractLinkedMap.class deleted file mode 100644 index eab1faa5aa9737dd19817add1e70837e6dacd291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6325 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractMapDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractMapDecorator.class deleted file mode 100644 index 7264aa3db9c7e36c1aaa130611b2175b22cd6e0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2391 zcmbVMU31%15Ixu5v6a>}ZAd8}PFqTBml*m%Q_?25ZVE}=rr_Yx!VDt|jiXkUj3fsN z4=@bF13!ePKEMpL6PSU=&h$qy>`FJbBgrqk?A5)x_w3o-v-|wtKmP`>g!_5S;aV2W z9Ioe)!1@f1;YI;3;(azBu-Ra<$>t`T7MojaZnN29bBE1`Y(8SZHk)lWA7|0Y;%*k7 z2qgRJK;Urefx4^Khn`{9Z>fV7fy@=dGQ3r~uvqB`q?+~@I^Q!a{r0fm)tzm%Ytl)n zWoxS0Q5}Q#@-XG?7_PwOmhJTF>Oj?Y^txvE`?lrMYMQ#{8T?JY>y57KIjZK7+v~b! zJE~_piiDRl(ufElNK(1FR z_bIH0{I?XKO#T#@-3REX=8!^6?*?m5w>;-jTld2L>4+F7iJZWhIDc_ovWC0fA9zH9 zGE9UrM99ZZ4u*uY9D@^uky$v%KSKZw(-fGY{BGM#dq7Syj^4L-DVmgPd_xO4-JnxH zG%D5nfrK_kHDV>`Uk+81?qqB~eFC{1)!hjMk@M`f=NMK`;OIVt&n7sf=lQlhbTs{j z!D=}kSM4R%o`RQfLg1vYLmy#-bkbAJhSMANDf8=JYx;m?L!L+j<^It1%9ibwyL#Cg znkEC>Q!tO?3QpsMg4c0IL4{2XXBE7OB?Wc7rQmJep2K+s7qFn<9sY3%%L*>zT?H%r z;wo=fu_kcoe@a-OI1VMy9VzQTmxaVBGgj%O7O36lAgFN#e&mQ~DwL4o4AIHUv^!6$ zpfz263h^6#B=8DZ9u}aeQn-j$=}QSN;Wdx0JQu*ZLW%)Q?rN?{72#kpZ!ERv&cP3EsqhP825@n5ia$*XMQrkl|fyW^t?TL5_ zqj(B<1B*Td($N&KToml?6tJoUBRxv63qCj%E{JbNAe^C3V`C#RPoa}fL?Aw<5iV zYKnL|1rf=U7E6aZDjq?J2Gom1pmvl9o21MnRY&oQb#@Q4$w)*GeT;H&Z&WQsR*QAd zsZJ0gb-2WBhD2~E5z&%O4K$dNtc$*|1y2hJ7*^HcXy)B1VEdV;sUyKcLMTQv|5a?> zXk^7B9EoQB+gJpecM_o`GgPcqe?dC+*e}2nl*YYs$j|t9G!ec>7C%fxR~%KLh$~X& sG(;uxIa+xJB`AKgYg*&+qZZe@HiO_y7O^ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractOrderedMapDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractOrderedMapDecorator.class deleted file mode 100644 index 3b172e3d1ee8aa3202c2cee0a634b9908f36ccf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 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 N^wz0HU9A$gRpj7A>j^Q}@g)xW|ILUgd(a&Er h#zt14!>_OtO?)@gQ-cH!FgAi-w1pyU`4BF_{0&Crv&sMf diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceEntrySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceEntrySetIterator.class deleted file mode 100644 index c9212a98b5d4421e0144bde07a413612000aeb5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 zcmb_eTW=Fr5dQWYI~%W;+z0_efB*p!r^J*(fdFa2O>n@3lF(2ty=*p1vSIBt>orRI z%#SEMl*hdA&`LN+tpt54QvX0(sg-&!y{Q+q551`A%zCjMninEu`OKW#%s1c68T*5O z-?;;z50^D;z)%e9aa2PZ!!a6;@$@)r8P-l{G>q_YlBdtBIK^_5hcOLtoM!C>*2Y;o z!`h1~&T3eRA-;D`#d!^FWj_~qh_~4=9M*xk+nQfig@wS@T{~ z&`>!uSYFVFb2-aPIYyyi6%?eG>#u9EVRB!e_pB?nTO_M$&YJa)TjakbGhz;fx!e>?E;!oQY*4o7}k6He(Z+V9A zdJ4vt3+EvsYm5?8>afhg%DPuL!DDXGGp!+;*Gtt;9Z4M2(TPneOdXT3 zbX7nsnBk$1hXZ`-5ccWl!gd8i%X}^mv999@By{ZH;S!GM=wZ!at(UdKct$}_ z5N6T0on*?*g{4Y4urJ!C!LM_0*0l1h=-7*W3OcJ7M%=NYIX&oDS*rD#bKTgkV}Px1 ztdclP&wa{p#(cxKYR;yRRdDL@1YA>Q3Yw~}%WssPK^1zn#`iAMH$At4{W_(eikNy+ zWYX}d?YUH{X`?V5meb+$k5Z|8k@|v>@2Z&K7L=_viYcqyQ|d_x`^mQM|5xe~#j7H( zVBisAT>^}P-ODjR^}n8enW!2NLleIS`ndwXfk0Bp2a>8LkW{6Cq#6w*6>%V`jsrYw$5<~u!B+7po(lE?i`b2)X-2jKh4M8z#W&a?zQs;)AA7`i z=ojB(K>UD|_z`LG6OM_WF)Dt+Iq@qD@f#fRJ6!Qc5Pl~G)`Sb#PiaxG3TMzy#4{zA zLrMhqt&oUe+EHk4bve*F66y`a-^I$ax6yjH%6J3wCH_Q%_zP{~pTLz~zFIL$oiH>z zK$6Y2lD)?FiLqN~z6UkJ39V94$7jSsjjh(uR)pJ7XzO|iF;mS|OJW|Yt~1Owg1P!` zKynFdYRG1_k+Z|DDM6g2AYaY2u;#5w8WPX|DG65uEi#IBsbaIN#||089;xAwjN^#Z zaa69T!I`Pxe71sfZy0kdz`4kY#{A1>a?(;`Bo-P`sG}bVgH47;q7>oUD$0N<*;aEo zTDhF6B=c&>RR046_n4w~qG;V+idxWDpGU_T=3-5?c9|k7^2IM~8@+kRc7nVPaoK^D zasxKXjp&k{=#iVyCpTli+){(6KSU((T)^%iy*$wWOG$r4)7T1~x=9*)r~^zPhiT~l E0T1?~+yDRo diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceKeySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceKeySet.class deleted file mode 100644 index dda13c366cae70e82b264bc67417f249743d985b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmbVM>rN9v6#iygy6tuago2{r6>+;@G%p2Oq#E z@UJEYf<_;}NAV%hGux}kpPEf(=bSn7opZkPWquxh{Q+PKs~Wm-Ma7tg6S%6vNYFp6 z!NjZDn|s7t113bSo9t@#$~d zq8M0mU*Xlva={NgUJM>_zbr~?yqZmKGDKJ0l3?h`TaH-YsT73wj2CS3^yS?mw>POvqvI}?Rov6Dg8M2SFg)x)N9_e3 z9UDWo1El7xMjLX9H8wN<14Cr{);l6IVx)6q7&)o*xK$q%!=RCF8$;Uw`&uM6yd z4rLFKPh`~KV)8&yLMXi!RELrP!*zi7VR69hH$-2UU(mIO*gn)Xa}V+L$pa)9KA?Ys zb{fM0k_w)G{QYZU`~bRwR4thIp}`?*OX`? diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceKeySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceKeySetIterator.class deleted file mode 100644 index ad17d7d2b32a7d609f8cc7218196f67b5fa71c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 zcmb`GTTc@~7>3{Jwq00Pkb>0W2@e;XWQ{k*Ku8Rc1g#Rpa6er?%aZMEGdmdlS9*hq z7ybZ$l<}RlAtB054ZI{Re<`Jc!W1^$2y$M`+_lh=mY06`Grw$=sI0 z=2Ew?{X`FSdL&6&38wuOTlpYXOe(MSaAWyUp}t+b7lr9= zX5`JupeOd7?&Zw1x<#tKk6jcrl0Kfj;R@|(Lr%yQ`yP95S@Q% zx9&&9Xd;Yp8+Su2#<+)8i2DkAW1h!Fd!~&4O?+XTJ%3W2Gll=IO?q{zw8GT+K82Um z>~hvarFSle#9Pr9$IGbjbW9=^`NkT2b3lzBPZkOj^tKpRnU&RVP+zP1B>$1m25V>p zkLUyQqj6U-#mEz;ag7Xx8MH>MCshngtem2Dir@?TYVfosD+nG}q}cnM`wyvx*{W*} WS7{dzaGf2*tT$+H(Y9&tApQ-XO*E|l diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceMapIterator.class deleted file mode 100644 index bec0b00aab48a90efcfc830deed103f1b2b0905d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2072 zcmb_dYflqF6g|VX>{1uhib@rwB5F&K`hFrlPyEO@ZM~n1xUUGV}uhd%^QmFz3oiuZ~T0gTKz080l?+G!S z%a`8CHCc3}S1mp%zhkyEMOB3l)dvC7Sq(Iq3GNQe%jU{GFAR8aYbV_Lo~kg{6Kw>- zStMDK?kclvHQVCJ+*XIW`j}j6-A!+`7f3DotAV5L*K`dt-O4_#!?v*pdu_~M*2GO4 zM=)yR7T8W>n@L$<3st4N7|KxHd+(@*ZYMTeD@D0{){$P;_uLQJvZ74uN>(nj8?rjZ zJeOXDN6UVovVp4mYbux5ytf5rH!{#G$~Z=evXQ)AQI2E6#2ta1l(e%qyEdx8vmOU> z6E5ntMHOz&R;JCn^=xt*KK9=Rkcm0wZ5#W}2ct^|a~^bo<9QhR(=mYuoU9!Xw6E(a zX)6&pN9F$iLE_sK&vWec{?1`r41=0ijh@5HJ@N@$*ul+qQjz7eKLozN{3s-m&{Ih* zO>Gu^`~m%wh0hS5DD`0<|5JL`m`BoBz%ca#Ei3HD2sPRxgG0m+IE>L4>s+J**5o?+ z)?s|4T??(BCooD8lC5P}F_O@aLVW)vjEH4~_YRP3GtBRWby%BtX~qEK zDZP7!0pmIL8814#9Eq`$jN~YeMP6}||IIQGv!woJc}bR6WO+@NH`}mq(qk5fu^5aq zqhonAwGqoM%`(Mc?7wN=l17rIOqxnWlWhUCQ=Y*IoFsgbr#dWMxKmMzb2!L#oJkqP YMV89qSNs}_ZnNkYafNz;>kZhy0Wh2?qyPW_ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceValues.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceValues.class deleted file mode 100644 index 2e3ff16ca7a6dff9358b9ec215b7a02a8a66ba38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmbVM>rN9v6#iyfx=>a?C?E)O6}QW!DmSr+B8oOCn5e<1zozX-muz>N-K|mI!3XdO z{Huw{?u$TJLk-q@0|0UFZ1Kqm+t@;upLJiE^3&G;|wloFgoa; zjKjoi98t_E_k1S>rqpt|6IXCmEfl(>VVNPeZaG%4!LVjzU2i`n$|7Hssk~b%xsFeN z+m`vjQu~r9r#5qb;E8;2U-(5?*b(J)a*rXpl5m6E7}R07LRWdiAm z!1V|wB0P_w?-VQ|+O~YU+0%40OCGuvf8bQkX4Yze{;f{v84EI{lQFDPO z$HtIu0jV*o>AIX^_07`%z!2HK^@hld7|9G7Mn);U-Kq_WVZcZ>jiG6Py~iZhy(FKa z@OR}a8Xn<2BRnTG5_OQjrPOr{p+=xYQ79@&0-^APR3^GE1lc!$0@ z+Qk`;(8=-S{qLW1vq#W5j+0To^E0w$ltJf8}ao78=RDj&rKN=B&~9W7&w iSfbYoGnl|670xjgHZV=ygIM9j;UfCcPE49uf&K^FTxV+l diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceValuesIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$ReferenceValuesIterator.class deleted file mode 100644 index fb8f65b4645da6ad3993d8db3e9c273ff0fa9b59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb`GO-~a+7{~w9ZM$?`K})3;6hS@kl5`U;MoXHQ29lC05lrvX<*_W;&Nj1CBi{-x zHSypF@Ix7&S(*}~TuKkS&+GhV=07vPe*gFhppI7_3V7lnj};G9Jaw_^Vojj9AF0SR z1@^Z(iS7q-D8q9K!elT=RLVAvDKwGw2XYv^@1;h|(45d0(xgKAAcu|Zu0Xz(oRPp% zCsOorH0Y83EPF9$%AF*XaaZcd#*<{;oJXlZb&BcActmO2kd`LV0)AU5(ydsgDRJYc zS=aXZju{%f^P%J&7=gF5!WoiR^oYXMd9nxWBg{b{c zySg3aqX^f>bG&e|;bRkJ7cT{lXFQL)_RKQgn|Pp%zC0y!ds4Nj!vEGvR-G&@u=sbM zz!7UUpY^cPhw~u`EcD4_mr>x&j7)6sD=YA;19JTF*@C(3H95{QJG;o&4aSyP_ktHnQ5iXknwySV>oi+GeFR*>aw#s%L{vV~+HU0nq diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$SoftRef.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$SoftRef.class deleted file mode 100644 index 8c579d0f3edad9a526984f48f077a7a1c33f9066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmbu7%TC)s6o&s}J8?)1;nEgpxOBlHM1U7m>LOJugj6X~pyDD{Y$om`F>>rMwn5^V z*dT!_bG+9ulZS zD1Y`tKlwuV*z9yK#FcOZ5f0q%y$k6j?TLtzefL=QrIMj1k5ZY+_U0K&?MFW(q2BdF zd6)cG&1x@o)*ZbIS}KGLb1(MN;m%xg%g*AwTZ+NM1+dInw-gO zZt?|HPoh+L@|&-rmY?dqqkB29vFf0NvW+#u*H>~78jl2e(1I@qChRsRK%V_rpI$f> zKJf3c_%{&@jmVb4wv7s}Q|z4=d8f6t{S(w`Jixfis;a!sa295YvU!D?d5s#!TA7{$ z2X*$qyVj-5n#COJ>)1RN_$=WK-WHu)-gQ-}br0i~4FkGGcGSGdq@BE=kT&oxt6JnS Mz_rAJ?=g+aKTbu&u>b%7 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$WeakRef.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap$WeakRef.class deleted file mode 100644 index 6b50cadf161211d7f24baa1c536f5e21146a7b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmbtS%TC)s6g}5Y;*gj(r48Y=U=bp~i&kQh3WSg&qy4?i|Q-sbt{F{jTiF+VU||ZHH%)Fxv0} zx!Y|wr8*K#pEDDU&=vl%P@ay{WF~HT5y3i<;)=-#c0CBB+V({hNiJ+PLUrMYj&NJj zal>{y3?jC^&%=1yZ;Otz)r?{#-1upl9no1z8EdRc>E+K->1i@6 z%em&=T1**td}9bBLqUv~E{dR)2%4$cD5w61gj-2@eMe`O#&Q%jW z8#YEc0$a^Xi8qFE=GVCiO!8gA6h5S#9JU&jt^R~@&yE4zBDrebCDe8gkWw3%PEa3t N3^10Ma0bK3{|DIX#H9cL diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractReferenceMap.class deleted file mode 100644 index 6bdbefc50785180502835980c44a2c1b366106e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8859 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 VJRlY@hc09vX5YqsG5aMj{|dNWw_N}L diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractSortedMapDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/AbstractSortedMapDecorator.class deleted file mode 100644 index 8f7f65619ffffe8c6ed19b8cd4051f8492bd7ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1508 zcmbu8OK;Oa5Xb+UIC0{*1kxwZv^?`DacK($0}%$?|JfP;`u+U}fEpfZm_b>XN)|e*DpoZb@8+POCX6A> znlSf-Sr=wQ#iok;4CyC!&-S+&lBMzigR<)$S`7Jy-Lu{fyDiIm$6F5V6dJC{odfRK zVjXNMe#ag#>@-}jZSX!fJCDyx7<$dE>Yv6m_^qa2dTZeCW|Al3` z9`{|Z&ahN!9P^Ld82YwjgdTOFC`rK#^Red)dfPfBGAx$LQyewY)#vg)ab47HH#{LF znIqd9_lV*y(XvoZD2 zv4o2{F5$9{E4ZrT8j3oui`fm_)Nva{hNu748w^|j5KnoAT}3S$Z7MpF?Uax7huBkA z=wF!ubw2$}S+bNjt`805N!0?qWX6J{|-D@K5MvI4M8 zp29a>sh%KlmhcEEJeGuou~$GKe|qvoVkqK$1J*i?LQJOe70I7aKGS@xCoT7%N3>)@ zEmWEyelv*ID&LSAA@G3&kLITw_o}f+=_F@Ut6air;c#oXWP#qzYm=Liad5~QA zAUP~!MJ7Pa6)z_{DW@4LhdMJLyhf5fDxj3JI)av*(DPn0mdAdf9v!!&9#MRuEI~wS X_JDgf&D>;~AEu-^#xmTI)h+!2sCgN9 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CaseInsensitiveMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CaseInsensitiveMap.class deleted file mode 100644 index d0bcdb515357153bbdde3a781a14da8288a310cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1905 zcmbW2&v)BI5XZmk*j6Gd#7#@nCM8WE6vu%WN=hjyX^R_EwQ5}ICgn$a*w{;=RMz@Q z>$HVCH|VKw;(sU{>i0Nsg9A7I5dH-ovyu`kCVh{`^Lw+J(adLNcV^{3{{H1x0E@Vv zy>uBcF@_JcSk~gA79W~e!6g%yab<+mkF>37;wn~6yo8#Gk8w>u*#@o~xM9FCaFd}J ziooUGh6qAe`s?;p26mlcv?~2jabIn4uPbst{`uQqv&VffO7j~G*{W;_ zhB3$W#ag$$DS|tE(<95cBb$Wf1SdT)X4SSEGMsm0uvOt5-rN?Irfjz<7p}D zD{bDXRCy?DKNNoGDtA}hyUDXU%J*Jv%hFr<6>9?jQd8@{oN(S_z zMzxfj9lpyeUFCWe4bomiltdSP@C`*brN1izbwd#LOcLpFf2&g8+@S)O=i`vHiD(bB z`}kq6a!pVAbRx$}hej422Cfn@o8fel(3MHLdRKM2s-XhG+i~5ps~AqjnGScOO{_j@ zicWNx2G&TY@YY_A>A@Vfe=tSH^%51gXS=?C@C-9)Umk{QQq^SF zZ>3!FG_uh|7yG_@Z5mdR+V1*WgQF8$={BT-_B;zpI`W|ibUWy}tgSl^!{pvxVsv_> zXl7gDOWyU=-Silaw&Vf*0a>dT(k6<&g+dj-l zU=)g1@fxMl*trDTFL9xV+#q#_N__Bw5?{v|Vr20KN(sxMRd2Vr@H+|%&yjx)M`8cQGMXA|1$;dl>2C@?-|Si7;^&atS7b zx9D#w6E(9&t1io=lFTxRLVufaLElnA-(dt#QU#g&1(~SeZOZfxG4xoRCEB}KI)rX% h`sg72DMfux^dDY8KZo}cdY+hPah|mIDOUy;{sHc;j@|$O diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CompositeMap$MapMutator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CompositeMap$MapMutator.class deleted file mode 100644 index b4b3b9435dc039ae350a88631bd3f124b047b051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmb_a!AiqG5Pj3u#Kx-aKX|a0?%kdwAP6lz6ufv^!_uZqvSD{q@Yg)}0e+M?NkwuH zA>d^nGrKcy=Dq#+e0vA5z%0fj#x-H;jJJF=sb$W6ZcD=cc4gg8=}KpNqcU3*w)BF` zCJXYyt3p>QwMAup9?V)-%hf?2wW>qT>hG|jIdxgip9sUM4useKgwMY+vMzUO^KuY| z?~%Hh`KhLxB1AI5Ju_kZUqk$;&@7m2ZS6Aikh3Aox|%H-$zn_icRkg<5sBAz(7`$( z=mwL=vNSGb?Y;5hZR<*BUxMn%6%hyn`7*$8Bz|E82%aHoF~+&v3@~ob1XqHIR1hw3 H8I8XH4lcw( diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CompositeMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/CompositeMap.class deleted file mode 100644 index cc84146336eb6ee079f75ffddaefd6d50567541e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5701 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 S;d{Yq{)WgUM$>HZm;Vp1kp0;J diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/DefaultedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/DefaultedMap.class deleted file mode 100644 index 6a8b0e78e482bea286fb4c1823fe4605b0989e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2845 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$EntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$EntrySet.class deleted file mode 100644 index fbe60cb831244e1ae7dd3d795678e4fbca01ee09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1828 zcmbVNU2hvj6g{*4SbMWc+9nPVplKl#J8ojr8W%_?gpg2E#|2Uq!P|JdN;a%_t=&zf z@IQFzZ|FlnkWxM>`amTrz8*jzehlKw+M5_P5;d~CbLY;z=bkxpXZOM1U)=?;fDHr3 zu#m?%Dh8@}K|RjtsEr_l7uBS$9v9T(B?B+xl@TmrDUVliQO9crMzO5p4IL{2*{%$1 zFA|t<`oU&JcBQptS1iBN@x73v>)KZ2D7z!Ol{HsJ=htO-k%>!==R_9;s>Pu)OV08phCId&!`_6Q<<%9ycRWAy5H*9h>8=hweE3OPf zn=AEU2+Srh+(SBaK4#TavD6UASgtLDct(oZ!0z}rxL7DQx8)64aizCexzgUI9E+t7 z8RoaQ72$^#i9|tzU5;@nLiB=mBFC*zydDFVPkm%Fij~40m%9=~%{h@B$jB#;sbXm$ zuhI82&DijF0?S@=lwzaFkt`@8CMGar;y6y|c+JG!inWipX}@ZbeTEZ>Wy0B&B>!WogF#O_Z+}$rdpa-hJW@9Jq228(D(z4x!VwPA^rg5l6GfDe<~rX7eTp7e)HZ91!!3 z3*M`I(MMmXQXjAif=ZQ_C#rn(FKCro<%5>`pyloBnc3_D(K0^lIo)%5`un<1cTe)g zpC5k$;6}WWKpKbY(1ydZ9FgU&1cq@mLFsM-_r!5;0tW6gaDN=f5=h`aIkLrQB#x}? zIawT8M&lTZV_d|%EXQRz5l2DZnGnU5#gk>yKyd+D#8nz4k!X;HZ(u5cRveP$WE>C5 zeoB_CAc)6P{b*UMM(OKQHoxJ=wXZ zVEY>e?8#d-)Vam*S+L!)&iy0DnKD|} z7Nc~~m_gN!IsQIpT0@+|VY@KJc;cm5ac$~qA9K2`IT^m2yxN|;yh4sp&I40+fe~Lb zms1i~-pFwcHJ(52FikZ|+Mi3~anJZ9o?JYnKiY}Q}}IStqh zdP7s$@!bVyg0;H)RMwf4nxx5~XUQF;+AJOvr>(qeF(xY?lmJZx=1C1JE7#M&U24WIB}n zt`oo8=Q%RxngnHs>&0PN*-))?S1TKv=t1c`~pv%n5>Ha5kSp2@Gp`)FjQH7+;B!1v^nNq>dLB&16 z-+F9dg?3ZAi|0D`CFu*$(&{{PSya0HJYpa4xsHuon@~gX8^rXlP^W*52K`$s*1tnf za2C9en{W#?dJ1sa5HbcMlwSH_QxN4G0nQ=zA!^=%5j%sJdY{ijlv=UTzYn~cp?&04 z!xr>LzV2ac;;S`1gW9)Ie-XxTGJXMdpQdBNe3%fiV-m>OS-Yy9lnz5FG^!eODFd5S9k!_j*sJQR7#^5q$iew<443?8hSx;Q znxcK_KQnA3!z39lA;TszTtwhBH_`z^7p%rM$~| z%utp*HcS56KScA9NVv8vtT>XXR8=eDOrb@Bt4MG)n$#L}tF_poQrM%?*sn4HNh>50 zrID1d8+!=a#16TQlJo{YGZFDGsk7UV3yIgL_uD^5%i9p)Gqemy-3@YCeoL(55*B7Y z!gU%hq2~-1b%e?cR=$O`%VXiGC8x{IpmBMO$JB!3D|;`DrHiqwL!H`yMXDP~)q|z# zCah4K(5h|@V(AXK&Bl_$?LjO{F@Syi=~%&72Kh|!uk{^4q%lUuFK86s!?cl$iMonm zNksh;(Lnnp5;y~+eFm#Ck({CYRAop6t*m-!x0OV(dCY6z{-FKzwBrZ zh)AOOd5(x24H6HeB++kS)kU-pU%+Z%GlMnB>u0c5NKu}_4QG?7%EdQG0BSEe^x=B7 kFTf55Rw_!2jvq|8_R9U|R41`fKa{1_;0gcK`qY diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$FlatMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$FlatMapIterator.class deleted file mode 100644 index b9ba526f9d84548cb0813ec890da5b4441d59525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 zcmbVO-*XdH6#n)mO}6RsD?k+xS$?-^OG0T8rLFvsN^EJN#g+mUw#jXpve^yErnZQH zh%-7mj^pqk%;-42IHNw)8AutKk$3+n$8)lqWPvJ{hunM4=Ir-<=iGBo^4H&g{0U$m zK8s*41{$#kgS?#LWhjDSoQ{xnCX5jkqY;F0mi_m`7*jDGK@+rNVKd7xphoI@VK2Om^Fi0OAeKCQ?hW@m@?@}bkI&2 z=9p2)vhO_%Iy2cKMYA~4mULvnaBRv=OInsJ95;<(QBpwfN_6ac28}Wf<raN?Jjn zrIj)aas?D@XlWgsHRg=CX;_)~@YF07jG{vYuNV|eDTOl98ITJKR5Hd4vqagb#hSUN z<#~){VH@V$ccah8lP=p#D`+T40w#FJ9(4*?EAy;I_bF+NjM}9_O7>^DwyUa#yN|Qc zkU*b?c64ae({T+kw1rXB;Gm@8O}wQ*uVh_vvSxh99xbJ2PM9)By>wzeCG*@f6f$J% zT&0#)oxUh6=vhm5W~832oDqdE&76j}(W78ny^2X{yNqFuI))>Ca2;+<35}Xfw=Hu) zpOR!#bei0h)QxFE_9!*<;+TRSxAM!s{(aRWeOZo=82&mhA2UZ^wJ%;4?+AJ{+`vr@w|MykHx)G3tLvWsvC{Ok zq+8Nhy)YLv+{UN8+@UMnOP@&%@8Tr&NiAej!QmCmiDz$-g0*!S?p09`dja56cY6N| zf=9Ub9i9$V%?jFH@D3eiZL(3aMk*zX#a)R+V&%h&2H{5kRranLPk<`!e#Skz!lAg_ zZLb1$GGNs?;CH(GPPgAV=y$pjoeD-*rs#P=%Z{t6tZt^LItSSa8Tq`lXk4`~S1%vD zzguZ$Jr(XvTR-(v;n3+faxVm0(24+}JjLioTJT(}>@?bFZ=_EG`=OwdtaJ3epnXGZ z2}&&R5Q3LLtnDF!zteMp1GF}yfy`k9#Q++`AXbahSTD|?tMXmteRSgxd4yEqr3=M_ z(_`r)9EHD&Js^Sy2tGo?PY4HpMlkRjJ$G3`93#$FP&GH+L#2y|9uMmh<;GaMV`YTy zW7T7XC!*>S8lS|1tbBqff|ogwG9rsLa5sf>2#X1<6Bp1dENLP+F**3|AsRA3o`w^x5K8ckQCPuk-fk;$x8V^$b8!ZoOZp|78%f zr0xo-%ON3b91>S?L=(O89y55QpG}SL;y{A?)l=uz};vOR6zOM#NwNs)WGOq?{52}-Ea1U*dv2|hzuSd6) zp}Xz7J-WlSH^q|@o{-J8AVo;~+&^6U4v9{~C=tDz2=Bx=#4A&aYW=#@jC z9CC8#*KiF3H5f!biR&0rF|45mH&u+N7-gs~aaY(rLvO)x*K)kXjdhVToMO?jJ(?{` z7``d(A}{4;Ebb3J;3XM2X4xL*O4>subUnvyf3yF1Tod;Y+JZf7WX_s{(L3ryFw7+ANR}`lu=1%<`}9BOK>+> z5xs=r*giLH0&h+iHux6LS=?UBJzUu!F-9}XwDGCfmUNFiB%ZD)I$H!yhPP=EVMYN7 z(-$uH9ZJ%Y&V+HBzG>y=B0o{m7MxAj5HqHfqPDDcpUk170q1qpmu8zy-Rxzz(2KN|7DkyHGQJEM+T_{@FA-SX&1}cXnJp;jl zgHNt_zRL|isA;wWFov3PfruDG_i;5kt}+@o4B>fQ!~OjXqQbU4Ntcz6G|Rnpu^Qf! z{0UBWB#xSg8Z1zz;jeBX7d1-lfr`PNq5tG4_nw!VE|&c5av`ZJ=jIm{C+DZ88Jdpk zNp#S=rH&k{YK5Zi_Fp6n2@TKbiZ07(z`L`Y2D2J%QwLo^?X zj~_77WOl`dsyN4DTtIt-F-|+>xssAYb{AFul5h_lC%J!|BnfsgNZ+{+wM;-H1e(fF z;BJ?D^z%QYTaGAX25oMcp%VXyy{1>P{(HL2~ zNPI<-VMne>(05QjLfiR{n#aE%Dhvdpfd}6o~ XM5S?t<`l)(()Z>x62vZx8%X>C+be@4 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$KeySetIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$KeySetIterator.class deleted file mode 100644 index bfc51b0848405ac4bfecc8fd3367a82518497289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 763 zcmb7CO;5r=5Pb^;6ssa4ej5)S0HZbWVuWxZk{D4B7(Fj_gC%84meuHg&_w@(# zs0iMI@rxh)QO5UlEkhxZW!bsBJ@4~A?{l8^*Y7U}0LJi8K_{*!q2h*u5oE-W6+=!8 zc?CBy+Ck^EBnr4CV_boPqKw-zCK=jm+%;^UVYKYH8yc^1ebdl%r&@Jvk7mmF~k>~b%UY1Y}&?hy;?EcRbH_u(o=SHZmn_G z6#Fn3_cu+C3a)XhZqPz4*|y;>Slsi(w%AJfbOVI=$361}Rg^N>5<{DA8QcwaL@%K` zw$DwQ!22`hExye)i`yI8lgbu}F_V2p3EP5zF`OaRx&wy3j3SO2v5$s<?!{A3K9)zO4SYgI8u-fyO)^hF%)GAOX@V#HH6rN^j6du~g$U`Y}K|$_r2#p^e2_u((Z{E7cm@S%+X2FS5k1u@1gBq z68lHmNglS7#3hnUl&5zsgtAEnL8mC7KB4_5dc)NoEoV4g2W!d1QLG$%l~uD diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$ValuesIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map$ValuesIterator.class deleted file mode 100644 index f9618ada67690f4dffd898dce17a1bf9dcdf5bf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 765 zcmb7CO-sW-5PjRGrq;C9`u&Lq5B)$Rco7vZVnL{SQ0jRbmo}1a%4RG2uk@ne!5^T4 z{vvTUR*HJcAv-f~=DqAZ_T}^G8Ndcsa>!uX95Xpsn6)u)V}W60&zHX5XV@$^Le+M8 zk9!^AdSSO4%7|hR2v7Sa@A95o54hes=DpoYlfgO&F9pMR!H%o!jvp};nmp)>=tv92b*LDeBPoSC2zV3;>hC4F#@cVOUD~I|m5`cYJ&6tx zEh%n@HdU@PuJ|=~11{U{Y3qu%r*7^n>?=>yeY0Nv$At|u>0ku5g9(%zETLp$nPDe^ zm49|12a=EvrB=6RLJ$2c{)e({p<|~QY6--#N-rft&j(1+M{9y1OW8ivF;cBPg5Agc zQ95%5O}`?Oexn?i8SutXpvowWqevRexHZt)j%(spACbDKJ|KNZlPL`K-bwEx)^ljq b{N-COg~@nw3VDhp;#io2LpRJ&TtxN@jhVrj diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/Flat3Map.class deleted file mode 100644 index d794fe0aadf272b11fc42b0053bca5408078c19c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10980 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/HashedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/HashedMap.class deleted file mode 100644 index d0468f5980aef05c84ee4cb66649149fe7a84d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1578 zcmb7@*-{fh6o&uKHZlwl5KsuRC`t&+xFCoqi-AZmkSbB|wn;`9YBCdNaeFGgF;!mp z0KSN~K7r-wnITM4P^FcsGkv=M{?6ZhIzRt>{{dhgFA{6(fD8o>L|72vp$Lm2EXjC; zWf`4#EMo;v#OSGnRS9bn)+KB(q#e!HxpAP`j&7N+i<=B=hoLKPnU2d%_kbIomi(p4 zh3>NRn<4c?H+6TFA)cK+U`XVxs>aY$(oJp8s~u_fD}H3qOkc^W5SA01@^CWYp6Cw4 ze95wpRbJk3gShGmlP{_J$HW^nUZ zEgzkdCvwpF!PZ?ZNEyaLvTlWnvgg)4ci*)&UJJ@tp35*2pe~k?`SJTdnz&#q_%T{NY;d8zZ_{0jQ9DMChsQ4uB-OyahL zEd>P(D0q%33EK*aBH6(l!|ea`j$z>+`4ZQuK8Emo&Uiyp2&I<(?lxYL7NZ%z~r;!p!F+@=Km`sRSC8f}&a+wC=?SyqCvEdU2164>M zJw|YY7{bzM$SNXEKS0W5CL2h!!**%Yo(~%jWKEb9!e}eTFixceb|S={TbyYi*-kwq zi*GKmcoVmX!Ngk*S*o7{$y@`eFXS}_abGE#26*JIlA*a6?qG^k;>rv36?Y}ie4{f` zxN>f$+dt9?HAP1UP9uio<}qbtF-?_n#1PG!A=)hFE}(Y^y4+5$)2??!w=bd3LmW@g PQ^cIXUCQoJ7Q_9&?w>rK diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/IdentityMap$IdentityEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/IdentityMap$IdentityEntry.class deleted file mode 100644 index 41830f5d6553a38b5bf3ce8f5eb5aa6d7144bba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1359 zcma)5OHUI~6#njX+M&ZBm6w93s3?6vM-h7L|=aORfC){Q?v z6AeaJ1~+Wn_*xj<`lF2J&a^yILz<>J=iGZ9-}jw6fBydX3807@Cej!;aLGg$Cc2?v zLU~!`WliLeH!x|S$dH z)vwomFC^=_qADHb*ZGEhyAsNPSEcGBR+sq3_+H1kQhA+ka@*zJn*Fe{PGxiLC%F{{ zebHYP483K?6Av2oiU=O@ic2SbWxvYZ6&^S$ZXW8g<`BM~(yH*JBe$CH7dnC4s!>2& zepEk4C_M38GTiE<&r!4)x@x3G%!!p45>Exm+t<#WA-T!j1`$n(XASNWtHEr0TJACR z@GI+-?#r48$Tm3-#>oxoxVECyqLRqwXs)^JH-f6T>nJHRExMFfRC}>tqQ`*E&>yYo za1#rcF>T=rrVU)RFoRhG*BItIcoGK&9oE>ub%uowIvk-c?fnp1l5S1N`%2(}Y_459 zS_a*(#42a@-{bODC`FxQahk74J==I?|6KveS?mD$0qzVl9Tc=t#X0(9)AT(93FvA^ zU^qt66C~*enEAr!)Uf^)>@!6gdes?O;1$)qMuxnZI1|UwPm#JGz##Qe-Vjbi*(Oe6 zm}aQ65%P4pKZView3n2l?q&=59VGSL!f$BXNG5g*zo0GUzaTOB9Xi7f1}I2UkWzu6 ze}bOarNS842vX#~AvkYgV4H}%BY^J-%!df*SUhA8=qyeX6#5J>hBNfn$R8p}VhL_W zF_2O7zrj$G$-LN~m!eGIW7OM<{7kdAhVv1s3$VzJ(A+ep&`nVn3g{!N;Udna(*FP* Cl2UE} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/IdentityMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/IdentityMap.class deleted file mode 100644 index 3f61458c78d05c4ab84d69b3ea3dadec1e39bfa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2744 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LazyMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LazyMap.class deleted file mode 100644 index f9fc36176ac65f492899d9d05fa5fd27c5518b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2619 zcmb7GZBrXn7(F)u7QzNnpcPtdW7P^tY>IDGs8xhw(+1E&L8?|aVF^n&yUb>{3XVGC zH}z{r9cQeLzo5?a#o8J5n=}3o|Aynan@!jRI>2P+$?m<+p7Xq%=kEUV-|v3_IE{4$ zuf-s6UYgfq=))TdCff0446T@qVG0*IxHBEYTev8%a`Ng@4409YW=6qmC%Q4$iMR2N zyt*RIyn+PP44OmF$9}S(R1WDeKO-K>Lbbv>naW1uhQd z*R`8k)^iOrJELuk?}ap7Wvl=NPh9z*Ui6QKyV2Od0bOv%N05dhK6ogz;Sa?aG^`;yG zsVQGLjhoRMI)@=PZ+lKrpEjiS)S$+vrMp0Ck2wi-Ma3yRCrwJ4cLh#vGv+v1CC!|0 zN?uvF+X=;_qtnE(Qp0yHk>1kH6RNCQiYpFoPD)|Z=+av5%&yuHG zB^y*Uq%7MVv$W=-1ng|yw~XxV&PaGtyN;@6j6dJ`l{xc?oxR2qC-1!u0HGM zJkW?28U}$w0o;|)jP(r#$5f-vJBzmEYKB$0EcM<{;2PPry|o@nRiK0NsJ9U8#^cc^_{E9k(JIL@6DygQE;?gFt# z5X-6b14Qol{z=+4`T+C91+jcDIWoMXKhd7yzQlU=aahr2tm}`(8YD)GocsW59Z~*( zK^ap^=5NFwp>?^Z?E#cOQ<>k;eh(eLazBD3?Gb(m0PD0j7?FuySd7p1*^*Tp3}Ki) zMD%lznGO0mM10;;joTO|FIq@S_apNB{X>ZAj8(gD8>5eA+{hE_Hq z$A4Mgc=|qK>C|0x-iNxKU6-H1SB&#(sQ4yS!+4z_j_3KMB#2A5J#fUk-&?1Dd1=$;u*ZmJD!EKGL0{S+KtEz(hre{ z;0HGFE;@K~D1sS(J@XJfQ7mQd1YW%nY|EtD$R82MZPxN9O6+Hf;+J|&`_YB7c$MT} TdbO60V2o@0YQs3!BRKazc7Ke; diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LazySortedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LazySortedMap.class deleted file mode 100644 index 84577cdb7507da13da450422cb32e9a0f7bc4d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmbVMT~iZD6g`~;28Ll#{0i!>_<@oTiHqMx5d~2+>VwFxzBOThu_hU6GTBL1&th5rvHER81*Wz~A8#f{3D%MwG+_ny4JTQk zYtixR!5w>5VE5M~SJsw__vfF`MkN8ml~IC8kF7{L((?tfU$eC*Cz~^@=&U#9X-|Pt z)Jz;Ov`>5_Nt&_fdsVHhe`AqAN8ss6W7(GKGzjF{&?SNg(s6Z_`M_)V6?@tVjUV5S zQFZ79PHl3`HteH?!#JYCkP0_dxMkr0W(0P%ImZ@`7(v0pNsLUVl1Uts3qU_55kIoM;TKoQ8V_IQOB$bypa#8)6sNT%KM%OyJ z1zHjQj3Jm!1Uk4qg1HglueJ!Ze|v zrFRW6JA}LV3>Kbi(0o|f+{FPDaf+}6!_Rz6F|$|iY?`Ayq!Hy~)+w80HRU>fNa3zx xEF>_#p#5KJ#?Uv}CSz9f2+oH*DKhXLNZ{$)gy$7;{!ZWtJB#z2Wd|vo`vL`9?z#W~ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LinkedMap$LinkedMapList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LinkedMap$LinkedMapList.class deleted file mode 100644 index d36a4d144ec4eb9d56f0a834f8f6382816a78e15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3040 zcmbW3O>^5s7{~wXIFYR=Zki?`Z32{1z;;SZLunx|1vfOr)NOz?fwsKKvXUr~C66R` zT0Rp8n1MKj8MyNWfEf-PIB?*=fddDI;n}q$%Zfd2NGF@!)w93nb)W4I|9=e|xs_p6p&92pK%cZ}jscW9W=QXunC>z$kUcIT- z7wP1ZVHw_4hKt$b9nEbqBvZ~J7#K;WG~4o2!y*GFvPXq;cL`=!_PA$VNRl9}Z}&J%{9$s>D{*~X zYB21fZiTIL}ZllsFt?_IrNPT#SP-CHR$1jf-88H53ea$!m@;I1v}VPa22mhF!*ARFWyja z4J#7%`3_ac!g20>=dGax3FAbFiWS#$RLyGz@WOGZk-EO2Q;7}j>kl{h1w7f2SK6W+ zjI>n>ndLs3f@*RLn^w)P8r!0?1oc7XR@F6|Vo90GNAFW0vDl*oi~mb+wE7t4qY9&+ zI+S*NV7Syru}S6M;VVDSa4xRvh>k^^rPpSHULPuIUZ6A^qu(iUqn|NDtI3u$o+L8=kp-0+Cog-SIZuBXeM{xPLgD}e zpVPcW91{D#2$Is0@kxx|7~0`BEt532Db3GMA0YWf4Df5jlyqoH8qeW*LeK?6wi{~p z0E2N`e(QnCAumvLdwZaU;;7&Ipk91@)E|9N)JA-(uKBUbv|=sIK0+#ixM_bzc$qL@ z8N7sx!pr$E_Deo5^)1qOnvlPbh5oMyDHW1ZVd&?>(Dx(#-GdZF{^iieex!eTkOJ>6 zJuZogwq4^`PW{|Je?`O{81eJ=2*V7qI%lZ}WF)*O z^d9(-F3DFCM<`0fsc7;Suqce6r^V+j_(qL}MvX8WA``c3G-B6iXcxUoKBwIPnmBQY z(fIlC$oU}5j6Y=l`E~=CZsKGYz*NMgXagwv4S=3QAGJn3jCV0PKRwgL*db2EjhPXw kvn{ExqGh}(SiHksry1`^tKu%ag{L`>_~Y~+_NS2g53?CqYXATM diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LinkedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/LinkedMap.class deleted file mode 100644 index 797ccf626ac59e62f50d73e706878ae7dfaf8b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 zcmbtVU2_v<6n-{svdywUC=`KKK&X(WK*WLyg;EF&1VXEn7QxSLvTe6)cFSf{J{0gm z@m{aI@X|q)add`hXK=T@>RbeonDbTT>b$Da2&&-r@aU;ldY3xEUo zr1iugpkWK%5^+()sEA7<#x#uMvW6G%wuURXDzkS)ysIIP_e8ue%MX$iA11jpL`=wD zNkmzMsbW$?2c}d^tFTnesJNzJZP9YBndJ+{Y|*Ov3iN{Gm|o5{s#UY9AXPOz%dp2y zuWGr@SmCq+=F=2D3z37$*YY?34aI@8)wrKM}(eOp|O*j#~aLQY|Qmrwe)cs@bkl&Ko7)_4pxA3hCmEF=u3JzGY|W zf4^w85L@^z|3Z|K?K^N-8S!cgiG@ z4hC>Fx8jylHg76uqgIe<1!}N0GAV~v9_f*Qn~v|@QbF@c$e;eUCY6 zWVgG4z$mv|GYQnb(kv5dvGzQ(;?6Ni38Pvs=Jv&G1v!>IqG+RT%`2ICOX_f4!_oms zxsF|MMf8Z+CnBrkRrINt)o~rWb$B?eqN>A}MGgHr=5RyDP4wwFCE^xt>-Y#~b$l$M zfO9(T;I57n7}Qb3Z3Rc4r@(^{G&)o$-BYmdc@PvFdIt3sv1hdhZNT~*4Q>JJcD;Ew z2HQagGZt%tfaj&^wUX=1 znO=RdXSLQ_tt}GMzgpH68%Yb1Y&H zXL6LP*o!nrf$0fh2B;~ziA?7LTAC5Y5a&B82%GC#Ap-T0K`$``YhQ>}Kns6>n(6Fb zKx;GD1P_%0u$^_a2ACRx@hJB5ZI1=8*${S#V($Xt&8RjhR-Quf6&xgnB9~E!C72S5 zcxC~KA32FZ;*|(C=OVF+hvZ^7gu~R5kmor{thC;F`bg2XL}p#!(j6w{E|RzxA*40j z)bJW!r=>TDA;~*Jw4>->1wAR~S~L1*JawPwpFait7>09U*~DTV!U?g{&3 zrgI)^=Ak#c|3w5g*&v<7$uQBUo(i?L8S3kQfy&`@$m&bRt(C0$#N&0vmgAYnSpOKQ z;r%lC23?un{g1I>9_?Qt-t~y{)bOV<<-y;7#2)cjJ$>6*H^2j?@msXvA$#aMy8Jy! zJY)s@5Rl2xOo|;ggtI}a`Whbg$$LXOZS?az|5AO$hOYzEmau6ViQC3`Y-)D)NyOP` zvKQla0mGrQeZ-RLOa6?GE3ClH%}~DuQ1xzIOhF7IfunDti(@;Z zp+CS+e9#%8gU&em$r*o?<2k#VWWn?U4#T~B&%Nh4&pGG07yka|*WUr$gi0cdg)a1C zk%#*{EG6*(%PFkjUH*EHht(u)JWSyc$~>%TSWiL6`@Hu74<9D6iN`#A#KV?`CrR{T zTfkXPMOI2NyziY-pscbgf4QEF=YG=(j zm=Q>s^@ehMn?Sm}Z#*+fhpuUPN9jO&jWO zj7CGz?!v{X4Tk}_O1sK!nglM7=0nu|N<=}(czYPi3-gF(azAMnzOxh#oTUj2a zs~p3%2`1Y-;Za)+>~to%X&*XOwPJD~d(TSnCMT@pRZQ!+f~z_PFsS1d3~BgO$7lFl z!xy|B(J_j=jsl80ZeT>impaBUuHzPN6KY$xq-(!@l%Ur$9R?~orcl*!7t===sJ%=2P8AQpq7g5=VF4>Q6nZ@g5&-re6 z18>rb0K9O*`{IC-en@3Om~~q5-caEeME^o>fo6Gv*eT)y$B44|C)$^U3v@HK9DpVV zaYYV!@t8LG2k``JIl!KvnfDStrglW%K2DtNG8ghswEXEBboNi2_rKoJpKeazKTpvl z#Y|BNyNahsN}Pun@gTDPu~x}a^jEG#AcAk;OTbe91uMP;Yyy)W*i?(zcNCDDJ6`+~ z`VWXjj@lHz$JOE=&`)tmV2vv`c7pCF(W6M4`!#4(z7nZf#qbep#?pLxXO0^!{cl`Gw1mu|76H!MJI3yB(eg3E10Uq~w*nbGst*+0`3wD140 zqyH@43HgL3uRe2PUDhxdYa^E$GE z4u~^93NdSfqDmDNily~DcIMmJZ)Sh~`t}{bCN`?@aiancH?4Nd$9fGe?)tdrBV_Q* zQ0C#5j|U9Z*J9ccrYprqhG1VQq4!dr=OSm=jWa!n_?Ra{5hdAZl&PF#nu^3otB?3N zie+vNbYE!Ef5XS&9B!MT(wQnV6h@vJ>ECw4N@((S?y#KorqV`7P@kh%T0UH084ln;2eSgSFz@!L2+{iEafki z(Nl(UAp*YrC#Qbf>3z1|+SA4V>cFw^0=Lj*ZHcn&J zw!40U1e&jbFf@D&?f*Uz>-1E7dO9>KmT8i8vH*wH5|+t6Pudf*OC)QpN5^2TjW2LM z7eN>3?@@i8oK)rR0(hs;_QD*o=4hM5MuYj}l gP~Z&C!L=glI>CbU5-PZlD%I_gZ9f;camTCt1`|jUcK`qY diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$KeySetView.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$KeySetView.class deleted file mode 100644 index 8a5adf9e31f4ca13bf34da0bd1dc42af6bbc71c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1320 zcmbu9?@!Y}7{|X?x^?Rc2sl(!L`B_(QUS#mLyRFIS)B3$U83)9Km|Idw0)0_j!J{pMQS%1YjO_Y!q-g4;!;KuHdSATvLyd zg|Zsw3b>9NHnNzv;99uJkZtow1PQ}ZJ&d+p-sawpaJ{hA3WJzN-xppY)x5>qZe7O7 zMzkd&vGtI*t8{!t1~OS?SS}soe7V73u7z8IVYDs-@u<^kis&(K`Xm{zhaUGEJd$di z3e99k#tilY@nTaX4Jn>8IJF=U(VEZWSkT_;(H)uX<0vLGmM_WvP^nyF$a!Iqa2XJ| zSgP;xJ?{EE*mgIXyOfw}`58lIkNX|%@L$`s>G^_3nnuCqWFjJ-gd~_OmAkl3B7L`( z%E`RF8FnI1tV@-IiNhJ6R~8(MVA_F$VG9cmPT{nJMNBz3k7)}3$YmUees+O@z)QGg z;kJVdm{G=-8CL#>N~zPC(UIP7#!1Azgv!UTaAYh);de!-Xp~WE-bnQV!`PvWl8BNy z+&8Rso*bi12l7+>SINo^%+Nbmpm&hER@H@O8M;R>N|F;aTZchEz^)vCRp#Eocta}# zV_Iv74t{~jz9P@Q5doO&YGZasPJ5sj*yG8bv2Y9Uv73u7NcuV~&SW|f?M*CeN_ zlad(DV2UKlr@N%Be9EiybNev=1pF9qCEs%;kFz*O2&URCMJ?-f&y`F+I9r*Zzh$V@ zsNT{p_uQclOBwfI>b>GeWS>^LFm$m_2JkIa{yLMVFoU0txG7k diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedIterator.class deleted file mode 100644 index 5e5ba879fd6c8a71354d1e254499ad66e636d72d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1436 zcmbtUYflqF6g{)8-O?_v+7^7HBDM>%BEBIeiXbFaKBy=rYNp#sS+d=2X17HDl_nxV z6Muj|%6MnHrA0^x_+fWu?#w;so_p`i?>|3&0hq>o7FTdJ0|VoI$l{v%O{nE{9pwyC zm{g0Y3`)3>rSq1Kn>uC~QcW&}7c$INd|9`6liM4@vi(NG_W~MSSJ=)OXWk8CPl;FB1wsoQk;3|x1=qW9Hp{X z38jBpJ7{3}VPYKL!k(#|0gC85WOS)?Q&mv*?BL^8xb6sz~n{xQI&z z?&E=uhiXAd_&?Ham7W|Cyc5?mupU=~P;xu$_&yc3AD4O{>dn1QVn}z~7>b=LMB5!_ zQZQ2Lsob7jm1O3Km=4|(hUJsrfZjW$=u>qOQdJm+_k~U-in_lmH99j9tJnu}udcI72IfiO5(qJBxGV%~apUWJ`pi_C`%}2d9YTCsOO?Hzesx z>_GoQdu_f9jnLjBt$m1ijJ99Q!&HODn9C6dP$bB-!upOr1-DDF;!RhHP;+9@+S5U_tz1*$h9@b3U zH?b~I8p}}mvB0Bl5DslQmd=5)onSNy{D^ya{YZ}Ot{cVs;Xs9I@Jf!inf}D} z-T0}%i^hNCcMs)}v_0t$?fw2C3vD-h0>zzRpad4WuCHDvqrM8?$-YNVts6Mf>&ej7 z_QY9?58Oy#>2GSgejI)juwMGU3U@piMT$YsFV1l-2bcFQyjO&;O%!=XXYq_th^19&{2D?7UayOJ6cW)Rcu(8Ma9B0E}LjrXkyhu3vCmd z79OA@uzTTV=LsRObq)??N{QRg`cWK8C+65pdb5#p^&Bxc5D(8OGCi4W5WB$fd{Hn0%nd9yaZSApIo8lWp ztNj(mXW9nlxz6h|!$Zj!p=$V8ps$|A;}Vu=F*C&#>5jc+roalWOz@gc?4j5Jz?D{vL76O27pGt_QNs(5v=u?I@Tq7?* T@Ab6u4Qc^uA*f9qizxpAf$S;v diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ListOrderedMapIterator.class deleted file mode 100644 index 003f0590002c4f9d9411699c19cf92aacab8fc84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 zcmbVO-E$LF6#v~#$ZnHusVTHrL;^)jQ=rr$A|F+YAb~=GVi6E=o7}cr)7`k))K=wF zXM9i}d{Af9QJm57LB>IC%al6e_~;+ycusb+*?u6-JAXIk<^d3;DZXFT|1pPe%bgN9@B-v1bNN6nHz^TNog+y(TkWl85C z1yGV?cl6OoZCM_gLRUwP(g`_9FB3_(Q|wWzvRRXEU+$q2WPQ?+6Q*4zB3dz6#vD0r zPf*B&Lh;8&qq}zny+5@g*S|b7r8G2tS zp7?-Wc5?Et$;oV581@b>4xJjJM@I%7I<{fEj;(lF#oIa@lvKDn%9zlRM!Sl4bUcSW zI-bW~9s78-AA1EhR%)zLL0Kxz5u-5R8m>GvnUh5>Q-ST?Yoyy#Im1fXR$(eNBxz07 zdD`Y=${41~Oz~T%+nLd%jsr|<3h%0Tk2k#n`@L6O9wv;CGORp#7`7dms=5~FslNTn z0Cc?1Bzmf8TPezAT%p>oy_uJ)-tzFUq>intmiYx8S8+|p3;ftuah+Q6fQ}dW!No-# zhj5sZ8yH^{IP%C^ai1;_XsogGG(n*20q8Xas&abpozq;zE;s(e-&v}70twS9NyigG zBELxUs0kV>@dPSJ3Q{1^tT}D1c6VS>J)_HBs+ODxtPOXq-*DXQ5#q>NS99v=a{Yo2 zWJmQ#W3f!*o-mfL!w;zmF{4|7&Vj_9-ogeX?H;0`kedkNw`UmpxBYF5KgxVaSl1%!j{XXi3Flv*J8s#u% zv1V~1egt~r8dX^xZg&GcXME@=M&^>?cC diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ValuesView$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ValuesView$1.class deleted file mode 100644 index 80bf0016eba1675d3990a95c206b6904433a0aed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmbtTU2hUW6g`&$%g0ufHn!roq5`d5crK|QRg)&zK2&)hmI+L=?2_3*+kd5r#?%Mn zvwuNB7+AG z9y)kL$eN*wt4#-WLZK^yiHy5Sz9+bQVJP)(AmUiYgq=>L2c8%Ue<(da8jYebW*Y?3 zH_G}WG4?ttHV3*dwd}tZs>;6H|k45siQ)&x>_uIa&~TB*vWpF@JJ@t_ z4HXBEIe)=~rT%4T^a&x8SeKij!V+FY!D@@}{G0-6CPC~y>%~S3-^@jMA^j*($AL#^ zpHt_btwdO>oyD$|JvT?dLNEB3gCHy~f=m+U52Q(&l+gNbO#GT0eqgq3%2pG$mv{!G z_$%Qu&#$oegy&0ai;c}MpvJ~$q&_A|W&US53G@>y>|aeb7O~2n9Yw5RonvG*o)v4e z>?Kc diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ValuesView.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap$ValuesView.class deleted file mode 100644 index 024d0867bed16b97e5c0ce21538dee99c1fb8960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1710 zcmbtVOHUI~6#i~o`WU7lXz_t4C`en73PgOgfQS;CR9T=+bay+wfg#hGW@d_y-{e9Q zEm0HqV&cMuCN5pL@JATWoerfGFab+?ALpL?o$s9Q+_LrO{YL;3SW?i1%Q3_;p&)}R za+s9ER0Pv4IgiW_XorYa*jrm5OCL zG#iG{TwSg!yqYQKj=OA^g)PeWc{NMdbGoU!a||=dBiv6F8A6LzSuk`LbW=R2RZ7Bs z$V&!UdJC4ujUu;ox%Z7BcTIN~lp;53!YS(FDTA6fO<^w@+;Ie*%^jY|@D3d16ms+z z6hD|u_Pij3m70m<}~VaN9$pWTUz( zZ0=fQ=u4&={xw%OGI`%l;e)G!$Ubf>fwczBWlDsEvR zg4-%C;Gzt+sNxPrRNO^MMH(Xvx&H}5<@L1iYP(Q!T$^jI%#&gA(6|io?I!U0gk+=_ zV?SS!)$iFQBbi9S_)cuk=g|?~MoY!A`}K)@I#KGBZAR1z-jWoG(~kl`{V4ULRg}Ix zv?Hl$wS)lu0ZMukEIsxXf!DMP-~^3b2-3w*2(c~1*k>fj*4OZ+`84h5o`*^eD7(VP zoT8ajMKt{efjWXOY282!OFR4GA*l@?ABo{C2FM~g&62m|6qEPI>Ik(1d~Kl;Yf_2f z9L^I2qojv?s2OkHq|&jIoFYT8Z-}t(`_iFK^fBfUq7{(%fbipVBd5qaL>V>_d)1cP zj~1{*Gq+)k_+Yzo>#sv;2l#nFZkI6X<&s3ohq_1dkU%6Im8pNcj?Q+hUmn(A!>d^* t1r01Io~&4a@aT;lKu~Q5{ryjZ0gQPS8OJG_dkH*F|6fj0*M(_MpTG6rXRiPN diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ListOrderedMap.class deleted file mode 100644 index 574e69809cf8b5682f940cdb616ec55c375673f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6719 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiKeyMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiKeyMap.class deleted file mode 100644 index ad3926e4771b27fb7e73159eca6da982c9203786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13867 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 Tjin)Og6Y@$G6T62W}@aFM?^!A diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap$ReflectionFactory.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/MultiValueMap$ReflectionFactory.class deleted file mode 100644 index b004265fc7e6d9b0bb4c8fd0d36c30ee03a8454d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 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 Iics-?0oi4LA^-pY diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/PredicatedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/PredicatedMap.class deleted file mode 100644 index 50a5e43c07c76f82efca43d74a48cda5eda13c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3359 zcmcgvOLr7S6#i;nJ(=l{5JF%8VN@Q;BqWF^NC*!@&_D=CLXd|*XQl}alkU*d!%G3* z4>)?G}PNraBRLbY& zs*r+-Q*s#7a5@bOXEdBmqL{)$j3;3y;Yhs`ayX~K)ld>>ESaul6h}iqFO^kx1d;_a@3=~l*E(>XDU(=_1Z35!8+_#A9T$BhXoT78l{rStS+o|aix-C2BOTKj7ktRFhkf854+DoHU zDySk|6KD)0cR!ZW`+D*re|E_9`6IA;j+;R>hLtflR%zx|uT){#W5lAh?FdJDFR*D2 zO>_8g{}#)X3U(BWG!p2jkWIQ=$BYg;z0L$HBsJue-MqQWQdFogR;IaA){els2k`#B z^3bssopKn|@i$rxiI$o7SA9iVY zO~>naLq|J0bZo|(8s5_Jw%pk+b=24B(D06qck!OUW7YcaXR8`BiaXq~@;EtFsVAna z*RXBJ%Nm73mbA&P%~o*8x~61}S;$(R4C%T+Ye-r#>EGn5q9xPI{->ypJs8lj7lQ)5 z4}tfN(URvHc~6zFsvc8jY^UF39hclxfs;)`s_R>q{buK5&F%huApo*flvHCGbi7?o z*)D`clBx}{UoOjfPApn5T?#(K{4wPNW<8uy78d$^A^NzEHm) z2!Xl-p*Ga|fXr2@ie8(t9#pHD(>j|#%|6>D`vco09_3rWGX6h;D3)M3R&br=D@KGT z&600iH%rQKuH)Zotf53JpZXE!9Uy%d;&86LV+xTk`4~YP#{`AI0?cvD`eKr6eBuSA zR-UJo;s|1r;(^*fD4pcl{#^SMqPdPq#BysV5pSPHLSP!2z~)#cHjSjfN9d5NI)Qsg zZH{N+(@66;As0FqS}v2wXm?P5^Y352qE6qpPTB=ujN&-TH=<)`z;Qxwf}x$ndcF^J zV-!1)#{df0$G0LG!vXrVo&a@mj8kGhp2P-5xs&@(aivL*@iaDamMa;njBvk-HKJA$ z#3(Ioz$QGym?LaF-5h-|BU}OX?RPM*J$D-ochFdMd7grBf|t%ghpSv_@h?=2)?*8L zXml&p#5ix``F89G3=D9V1{!H#evU)aJuH|+!)zN@c=swHxfZg~Sh3NFXVDwjNKoH4 z0uYlOm3uOb8}w7wL=Pi~{e&fQV&a-3_!#wfvG8zH%M=#*Za|Fv73lRZ*e2ch?`2C?h6L$gzVOVlHmZr zCK8HuOH~c+glI_=RR>cll3T34FG5H(Rh(<8Akh>cA>>a%VBtqvNYJak5TW+cgrZX` z7e1Q?*ZN$Fah6ny=Q6QOTv6#)<<&HnMo>-FYW4>3S;yD>YWRkIAzJi%Fh(WLlg IvMy2g5AAap;{X5v diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/PredicatedSortedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/PredicatedSortedMap.class deleted file mode 100644 index 19f455404349d1f898f0cdba73f48bd372875830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2082 zcmcgt+fEZv6kVsKw6ud&6hQ^WJCv3p-Ywzf+PKik+&MSi{B`&D#MI|mpaamw%&2%kk&zf${aw-q6Ul9;D1iGi4O3jlM zZ&uoMGcxw>&CM@wdtM8~ie|xarDqDf8qP1uC7G>zmYsdzxSmd$t2J*?GzbFGH+GP+x7CC>CVVGo0^`yQ{b&6 z@5X(g43}k9ptlW{@yvYLh)p21@p}ktSyE|g^6s3pDwa1TVE@M?%`zcg$*KvQSuc2I zVzm&()#3>l3#QlD3-k@Q%YAI#a%%vCLawF{BWYb_O z9_;7$D#<6pXE(ND8`mCw{X*D|F8+G4lbSwiuG1#WHSrDNQED{(8KL*uu%EJ%M!*&9 zq8#$g2)BnjI;bq^^Mpzjp*vL81K1hvI%pLmWacx%ANU@E!i;kT?jef%8aL(JG2{c( z(?c^T-k4@k)-lZxrX@=jFiddOR;iEZ_<_jZQ9st`hHn#~3svpF|3u&)Pkln?GNJ;1 zBRp+Fh&K?}Dy

YY~bq5!h#~5xUkQlv*ONNdp9nx6?USHu1~lz5x>HMHG$44&#ech8?2a4!^-?w{p7*le?9y|AbY`f?ckz7dSrA(K$-F?mcW5o z+qLE!)iujsHrE`k9GdmY#F~V29xp1vrd=19nDzXPf>|@mn^vLhRjbtE+i|RNKqu;j zs#z;6TI-f?xn-+VvE0B8w&u**q(Ek*RFcB#Th`X{R*g!cB+zkJx*5&0v{;oUdadDa zSYZGZ6{|eNtx{3$?JG-pQUx@}Gb=^29C$vhirfpWLWHtu);9%uMrQArcg=!hx*LUs zwLA24a+I=ZIw3>dvq_KS$!Rz6X)xU8_}()Tm(&iEAib1HhB z7BFH+m;qKUWOF+j&_I93w*xDRN8o7erR~KbE;NE#BUlQ2%dAeyq@}$^ATSuY-rkI^ zPrqBXYGEB!yvjL`SGF~ByERJgPKlK53JmO0NE)eljm#yl;g_wVEjz8RU8kIsB{6Uq zCsZsNSi-P@0SpTCwrb^D>#Z&`u#6ijRt(%kw}D$YtKxM7t8(%N*m&puXU{&~$t!F1 zz-JFOV_~-obcfC|(@Wtcwcm^G*5U2t(n2%Y0>@gBO*v-0KJNuZui;h_CS5I)rLB5k zReAsI_HsWIKj{kVt=v z)YqZq5k57Z0Q*8`-Fu}~WQ!-z$C>2x$DDa`($XS7F!(6WZF0zWWRtiJ~uZ0 zIaGzigx67re$T|-PpIXZYB>}_&w(7Ci`7mw)k?9N-VPll+`LCy2AuXUyNhe`XHK|e$Xeo3S|nW7hPjtO~@4B0gkq@BlP8+wPN gYrE;c^3-pn|NaR21-ul~vt&--B4?MVmBQtJ0iRvOEC2ui diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ReferenceMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/ReferenceMap.class deleted file mode 100644 index 010da53bf3ef0964dd88716bfde88e1c5d57e76e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1622 zcmb7@TXPIS7>3{8)5PwE72=QsiDR$xRhf@OCvGE0g+_cwF0vl#*SItJvMdja+iw;-%W;}~nNjT@}VlKRA2LeZCJb%fQ zEot3TrsXx8^y1rbloc|Gz--Evd0pLAzH%*fO|~Wl@?-V7HZ&fnW2O%qv4gumTJWn8aTr_!y9dn9jiU+ z?n;Y{?FtO8a_ANrI7{Zd7x|W|+4>ANcK2{Xmr%wAj2f6M;~XkwoX2hhQ)OJxlZzM^ zF#q#p1Wx@!#HGa`^x5g|d;~VPn>rs~LHkK^b2hb?>vNrk35>+6j&zsIX-5XZtQXe2 z$Zd2<2HJtY9}@3lL*12;6W;1R*xrV>V!nMPp{u)WW(v68b!g>=_iKt#{#rfYrQ|cf zpRdGsnZIKOz1-nXf(pltTseyZzkqTzo2yj%MD{Z>A7f=7$08$u1;*dPCap@e*o=P8 zG-pf7nI$Ky71hC^KXEK_8Zl=i(WV^D-HL4~dpo}}F?%3o-zGcP#U5TGN1yB*vK zU)b7j5JSvCS1_EqNV??dQep+eTXSnQ;wc;QEH*iwNINE_P5~t(1rUTCEJZh^gq;{+ zTH0^GHYJAS`6Oc&MmE2n<#Li23sF6`#0kG#gWKGx!a zPsmm|S;amwbWQuYKZbFRtLb@7FRZ4&W7K=n XKm37S#etMwAag$sa(0Mb8BF{HXc;s_ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap$SingletonMapIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap$SingletonMapIterator.class deleted file mode 100644 index d15d85e23169994e86c98a5c20b7053e7c456a13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2599 zcmbVO&r=*#5dPl&nqgQ-m=Gd~$|@LkmzY(=L=8cOKtdo8vjIaQ>ahEONzKk|&CXKc zPtlV%FII_VSS(3I4<1bE!Go3uEe~2Av`Wi=z_Q=W?CkJEDRS6(J@0jY{dM>2o_+Ao zr=I~hjiQ1s3^(C%jEKht@fejbCgY-lI4&s|$7LB45+)TW7?yBF#*~62F3Fe{r&ndX zCe~{*@)E8qXveUO8L`ePgmzg-ugkb0UPyUPyx){?OTrrx<|VwzkSJ?5Hyws&CoOv^ zrFC4IJ%HaS~-{3%_W07mU%@hpJR}gwaOH~L)PpjLsLOBFLEc( z={+&1o4PZ^FpxelZf2GtHewYy!=Xvtq-G@IC#- zS3FyFw?0GM<^)N=j+J+8DkY_C8*OiwXe)WEY8UvJE>hkWj{md>GKpTCNumc&C2>+b zot(G7U^iwvU$oYW;(+#RIlH|0VMH)hpgI5o}r@=xmV`l>f$1&_Gk*UlF+aq9tCRX^YoifVhArYTsYup*t2684mT)x z4MJ0AALMDf$ZcMvaZ_ixzs)sq%N;Qu8a7A64dh>Q(RaCh{O=rk)Tvsz%*`Uhsl6aW zZ5PfmwbV9se?Ej;c$+#>G_ku7q4fzwp^65hk48kaoV!xj(b`PEUZla0A?XI4M`&%& zZh&QD>xg8d>xgFi))D)N_9MvBvxB}ZU>_sKK135+Lo2(BBWxXg?wMEVW?o}ryW6Yo`Mm^-NN`?v}__irzSQa zZ3(IoK{`rDu^QyH0NP`G4-&hNHnxQh_Bl?lFG8-m16R)lJkOFN;i|=RCB@!HEV`5L zmm!dr0AwKGJLB{15+Jene8NpGVK>1$xvGd!8oq+e9zbPZ;~4uUDe0#K z3ZC*Nl(`KwZv}CCDg8ENF9-HC9ew)=pJFFbjJhdJ&Z#XMXx-YC$W~GX`;HR%Jtgvo z5O8MzOylSOfDbi*4>v000slzAKN0ZHdjiu$@_}cGhPY?P!;IVNzqh;?;xQb zS=&TARp_YNQNyup4Ug2&sUG*_6GDEJ8xDFyAY`}HL!MxM((uCfk-f=~GF>O+mP56MbLAcWmK!#A>c(1a zhlaI~r;wx@?PVt?&KY`4TW~*uqba1UQ20D_$uW}4x8j?jWgDf~Pki)>+w@JbYRT#J zxA~F`(-J>}K}=-Oj{yz$GkAb8hRNf?>rT-0Jl7A!)|w}4k)SK@OyS85!~7}AAMp#0 z^*^GP!9zTf)gLoFI|Ziu0(Fm_rWsL=dS9vqq0h~*BIs@oMSjaQD$(V(c3Zc^IAcM2 z21m+8SBFMl7p)gTHI7E#DWz28q=1|GDn{u=>R>nr1(%UQFYV9Mi&fBv0VxFSlk^+J z5S7}5h^`rT*b8* zvq&qWGe!L8B2$ZtSDyM^_WQ9aK{7CT?Rg&Y!1$LYbdEKypLU h*@KqYN9t1-PPPLl8{;U*MNxT@PY#!npha9l>L2_RJR|@B diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/SingletonMap.class deleted file mode 100644 index f78a71efb4f3d8c51eddab81a6ac9661c46d2e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5854 zcmbVQ?RON_9e!pu+1YG11Of@+Mc4p_un8<6pcOyPh6~lGm07LK*5W$`z8k^!qNu|6<^9!a z`~W|!#*grtf!Cuv`ePY>BEwH3ctf5)i{MQIKaZjTFB!NfORq%Hh_|Bn1>QFB%P5xP z9Rru5Sb=wh$h)%Vg3R7C@GArF8~Ak;_sa3#$m(SSSE5*l-^%d22!1cm4`jG%;134= zXy8uppIdn#r_j z4yB!u=x_$PTHBqntpkOTek*&}>`!y0uG<-) zWRvpw?k!g2hf`#`soTj8CC!XEFl;3UoRJaI;WM44DDuoDN6btzs1fC_ZJEhx=88~i zYncmvzjaD!zFoFQsIz+0uQ)w@(nHqlBY zr`5R-&xuKu7p9Jg3oKV;c*x3A1$w<@-AofuBYyWZisbxha~T7cJsxt>gYSK7+ORUCe zyE^=!7>>yB9G=mzs#vYMSVD%(bbEHFFha-sL^U)V z9=782UtA(KK2pf#F$Gj2oDU;UgT@uy9)bxp^H!0VFgk!%;k; zVS9&Z+fF{t0F2w#^Kr&gQiW1HW2Un4^>KPTp323KrN*p5S9or!md7vv8hlwty9l3@_juuj1lK_fF+?Glx>e z#GiZbZl_=mDz`FZ=D=kc@REO#B9(HIy{b=0op$eTH}ci}uWaY8POIi#^2!AoFqA5# zk(A$mG)ya|!CF`}?$j!86DeQxTB!(Ls}6)j!DBWz|emMwYQ(hlc>Z-Y+?(0AGRQb zrFZ~egN6s$@9Nl&Iw^^2&Z@}gDt=?7QU>QY(=XZ8s1q!qpK7c#>lu;hrM=(+V=~9`hgx zpa=`8S}Ej;;4VBG5To|x5Mg*TD_{`t4C#E6bk35_3uwbRY{QGx?|i`I?Y;%t z@fZ$~QXA^=I7v!O@cQ&fCixV1R3<)zevK0y5*}f-_^JYQ!=lm;3tqcr4u?t)zftxu zZ%ps-;}j+4iBWQ>C&8c!wG}bk_`JmUe-}}_7tk!`Yo>YuqE*r=PkO=B$KZ3Lzl~4P zOs}|FqSn;_Gu>C~X*@IM$s1))KI`kWpE^nW)h1fUG5;bWqT4mCRINLR;4{?VZwk&0 z*;-$%sT|Ryx0#dD-^)_^`b;x~O3m<(vM0X*)06q2r%YHWQ+oQJ0q$X+d)Uiw4gKYD z7L?-rYZe@-4&p%eM;@Q&ynJf(j9Zmx8%NzWl}`&LpL{pF!Siog`9DmPFO>wh5;giv z8~sYu=vN|(h0qP2_dQvM+`RpO&@8Kx9q!*!J|wu7UH^(Cb`y9Ui=McyNY+myxs*u; ztp;(e7EM|mwrUHpS6hTfw8cK*t^B8go3mgJyLDM+ZboaYc~jXWwO+_YCehG0fyG5* zs8rTg2h1Gtks`jkhWuM&GjT+<*^m+n$t?;~NSd_Ip6T|nIti1yNi_B)6607hfu-H8 zA7NQB4WhC`+s4Xwe}Gq=$E$`JEn18FkNdcr)jN4frJ9E3YPh>BuMskgLhsq}o{ zaIsit@9yx~vWIhicx|H!;#56Q%Ur8nP$%6QHdRa|Poyys2j=er@WeG8SLtF5=Owukk} z?Mb-6d1)_lAhBNcBI+hvBrj}7#SdK4~U(wrQx;TVd$yF;Cxs`T9oG>zlAr z-;5@G3%2T8l>!Nukne{hY-J=;>amLr%^?!rinvODNmu^j@>CJei;HXoV{{n4~lD7Z= diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$1.class deleted file mode 100644 index 3ce517f5320d03f38fae2f07dc5b48f123287f7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmb7ZVh3U1P;00UiHO78=@B>(ZMbH2M diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$EntryIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$EntryIterator.class deleted file mode 100644 index 5c52c0cfe282b1d56a262ad13ef954010b35be63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2637 zcmcguT~ixn6n@^#CR@T%TE1#qwWt&!p$$+9MQUyNsKy4WQbBC1U6vJ=CL7!=9q^}k z(F<>S(+iy`RP9W0WJYKFF*=S{eifgy8%WUJG#6fE-}gOx&U3z=^KO26^6g^)r%_1a zIgBQ86k~PVjT@LqLXQrYW%s6t-%28jx8-p~WVt%@VNxuo3|vj(AjU-ej)C_?ds^OH zGw^;AEf}lEVa$l>tbq><%o+Gl!LV0--|+&4*4(mn$I7e*Za#C#_pSAuTM9-L67#F} zZHEdftDxtt61VXQFYwnD%&g}*{uqTNr?ekp(pu>VwFDwqa!Vb(3In;KznHOBEPKhx z*u_Gj=#{wU^Nt<3vM*RGnd!g^TzfS1N)+1HO|N^wl0zx6&byu)Tu>P5ss*fjhDnSS z7aWDgoa;GLtA%;Tzh=$nDQU_TZ7V-x`L3MHLS2GaXb6+Z299q9MPFgG2JcZpb}^Wk zv1FB|oHbT7*452!D9^xk1~?T4I9!VhF_n^ege`aJNLP1NZ>t-lifuZLLpXur?5dx1Gzb^tk0; z^g1o9H_?e#oFW^N3ADg%Z+Rno<@d*}94C0K*SwmDf*Fc^b@xEcx{?ACnBS$-CEiCZ9?uzb(>amw= zsI@CwzA>ub@D8l-fK25DvFHR>9DWBnp9b__?Ak~pA)}pNvZK6yj`8!R$sqEhsmU0I zD~E+^lguu4PI3<<_?}bEa~Drzi17@xrXE5|r8f{uJ%T>>5b+HpzTyiF-FzlRN&SjC z^&3(=n>42p(m2Ic$!wPae<7ewSt<1ZiA@-H5!df?e}KQ(*Qk5^1?Hk{Ql$NJx$nzw z!sBGm4`|^o(X)yA*`5b5C-3e2oSLJmerqE{iBJtay?sBueGdnw(%YxD?(N)--KXmm zY`Ap4z>7y#7x{3F(ilVoqx~JG`UA(+pGc{{Fr@y*hMgF~bk$q|Nr+HutTK-88K1*& z+4u%sigBkz@T0`p!Z=&Ec#MhY8?-5G;>c`DG0X}LnxwT_Gec}ayVi=6T3eN;&ax-s z;ygVFzs9*TEoPs72vtD}<0PSkOzn}zo^=ARhkO;TUcehfh?uM4BDFPK!b@CJi1Uxz dyJ%0yU%D)M_@<9*KWE`JuD}6uAxkD4`v(M)p349L diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$EntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$EntrySet.class deleted file mode 100644 index 1031381becdf6c2fd7d1801de735cbbaf8c81322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2761 zcmcguTT|Os5dO}wCD}rdmP=YE&{9gNF9aKxOR&Kq5E2{=B!QBUv}uIUfQT(qTVzQ8 zN&5%#!b3ZgLfX#sI@5>#gTC~!Kcnp)S-z0r1wHiT?Aasj?zi9BUFna1zW))x2y_*1 zBCDbk(_z}psL0`(SY{PmS0Q6w!9p8CxG4^AiDgkNc@cHV}){MC#mo2#;%z(%B51-u97SkO~bLozNGIb*BsrkjJX5jsp%~1`&owY+H>34 zHR+UmOeZ@APiB1J7_57v?1EM63kn{H#_|l3Q8e|6s}a(W<(L)S zDbvBlXsocOKhu*3j#W(Ny>l`T8D-niEt`<^L~E}Ub$chdy0u5FW@8T-n5|%y0^hYh@_hufoXwD*I3I~q`RwEcL@_ED_6`?`I)KU4g(lU zzHZb{HltZl2mFvqk{^yTO!#xcpstkgCckD;qsEe-lLtYKZl$Jo$t9}hJ=!Y3L&#gK-_ zh-*mWGlr~ROm1`ZG{aussyY?jaNP4rA6{$qI_ATY?lgUVGa|Ezo=Bq#-7%ddld8JA z-hQWxUeyi5tX2oFrl^$i{_58a+3Hrzfx6>~R7$}U>KYnNPZ{=og@`@!Q{N&Y^=lo; zxJdE;jPH#c+5G%KFVb`i+U6lm-=VXH+*t$3PsNFx(N7<~PWl?spc5@ivWGN40T<0o z`rD+9k;X}?@e}ZP;#&m1A&nzKt4#0EAuiEg6MLw*jCV*f(fpo=G)eI+6n}}pF@i_5 zZ?(VDVjpVQ)7^qD^1$Drq955LSSe#hmAG<=Nq zFA)kxg1;R_q?hQ(NH6~Vo3s~b%g7`n@=t*y1cE!UpJ%1bhk- z&!CHE(a)!m;xovRT;$iV!DrnZ#vmbqK75Ec?Fg}#jo2kHO!-LU_X?8aw+jnMVU%Li zFsbLtf?lq6;unOzf)qG9XVTGn(mjHWh;)n#$9UuZX$Jm0gMk-)%55Mr_m>u^Wuo9wQxi z;xW>TdmbYYpBZ98G{Oy%0g`e&aRSyX!qz6}uf5UmEn~uMEYT{HxJn*sEygiLo;Wge nMzc9wB`K>A%#4kCMYV4pbAkysv2Ms)cwSa5*NpgoC!+*3Kmeo zf)C)M5NF(g(uz&JnKS3!ndAE!|N8yoCxA_~929WdfsH#w?#hPVEun&YHa2YB7bxgq zFsVKkXm{ge;K{M{hsyKg(I}24#4uF84$OWe$6ilM9r!P%{zs+X$ZX<@VGxp4ywFI`Zi3m8oc$)a?bzthdcB-|TCQ}zBxMsQP;v9-D>S)?{t+wrLmLXQJqO&x4Hi@%!A z!buO`z(8qEkHC|&has?hLK9^^SDO!+<8SIubjW}lEYlhCWwNc518$=!j$k#KUy=Jl zyM^;y3p@p@f)(z~4YOXrDv?dc`dp(;G(M;C4f*d_68KEEsIal1;LH_ZMuVqJ6fcQ6 zVxiGIg82XU%f~1F-7er-nw5$2I&M(mI6n(F)34uR-r(OVPk$8`>Ay?_Yhe=~kXP^! HjY9Dc*d;_+ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$KeySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$KeySet.class deleted file mode 100644 index 4c614d93a7bca007be4bf752fc7189ce1cb60335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2527 zcmcguT~ixn6n=KI$tK&y0s$oy~TEg=80#O^5nV z`~gmHxX_szIy$2>GSdtFJ6@~LyGbBLZn_s<@SgXaea~~gPx#~SpMM1~jz=20F{7ae zvoYRs8uGXzjyVDl65F?KV{p5fW%^}4xZc}vD_UP5g7spD-~loIQT z?bzPDgy}>Ou;hvaWx;)HNjSS`J65q?DOuIKMyX6m@1koO~f~il2biux{hbq4*lp)G@q0WXESrBw9Sm>lj{U?OWPtcU%&GsL#kR8_X*8Q zJN$E0EYhK(pPShrQ3+KM)0R=&A|T7ZBmojCfhrZmgG+f)UwMzMChuL6Fcl0$g0}3| ztEP3+7H!dYq9eyeE_L){Kpf|F^x{nwMIGEMKw2_1JZ zqT_RXq2o(@rDFxFI__aj#k!9B;#&e=>v(`M3A4e>`~BU2+-cWJHLq%zo-dycfZ1%O z$pD%x-o)#xF>mdOVE$M}!!)g0ZFnZjjwl3c!~YD97}YlLR5q*PA$y*igG00%$VBpf zkTw+-Ic;rEE{hQVPy4NDk8E0=pX zpW`Av^kYaILH)%yDxo%fs27OMiOUOULlbMo-<$U{LlZeAuDrxlTxmehh2!D$_vnd- zUt*Bg2D-jOk9ZmnH}J-)GIqEhSDxc+PI>mvpJRv5pyeWChw;d7p?!o{(Iu`ypon#! zK7irVW+hUr9OP}ptf|HSO%FbIlh=h!K3`_o?W-Nn9pE pvtwmU5lO~0hDcNNsGI+8y+cWwbd>s8Qg$Hq^7xqYWzxGC{1*X#aM1t& diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Lock.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Lock.class deleted file mode 100644 index 69b183126fd2285f90a305106659ab31240a5b9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmbV~O-lk%6o%iUqob3hn3>tfs)e<1G@=lrMM5B0Ee!Y9>5^CHLuSUP{#C1>ML(dw z(tn7~wP+D-l7V|Z-g#c`xtzC;msbFF>{v*mV!=SgMAgJ5!HCqOBv6--K2g4kPYKD| z-hh=(aKlQzr+j%i^M*3K7DJai#a`eDcOXKg>+hx!k5t4EYZF4Q>-#e7xFU)qcU!$6 zytTztI3sC0f#(H&#L;!76Dys2Vrute5i93x=1gRKA*Q?9scmA50CuP?V$p2tK@#^3 z!qH+pA=`iOn#&fSX>NnwvBY^!=M3kN x=Lm+2Y@y*6D+!JoroZ9x*AG8%3acnFwx*p}E6>k$tZ>w}No-&lRTMY^nNLE~xv&5L diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Node.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Node.class deleted file mode 100644 index eb596d9dbbcc8b2184966fae029c22232d83c8e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658 zcmbVMO-~b16g{tRx8f$T}kefhFB4 z83KxJEITw)`N#CM3EMUbNNZW-Fy(zgUrbFq zx?^TnsAnunHm37g-I~!0 zru54}#mSk}56&9SUD-l3-c_xM5PzTX`UvIpV$Rc`-~_S8lag+cq&a>N+VzNaE&ZyusHn~f*e>56e z(Wc=n+BKX)n~EC(Lq}X0friR873e&KjLT7e|A9j?t8HqZK<&P+1p5D<2EF_kYvALz zr@;?J&W<0gBFE?21~k#C%;0Fb3N7?fwA>2>5^v#q#fuNec?M-rY~lp(nwNl+E?me_ zGqNAN4*$yv@TaO^zD^aeQVHI!3g!xw!S`9GEIXE<@)lJ8DkAc_!A91h>_!wuo~~7t z_IVF`Y^N`7PnrES+5N=m$;1l;l(pnX1fL_|UrTNxIO$2&cfW%wu!XTzG|7OeEhx>E0c2o#Ya~sP!8W@n;Xew!^QL`2*aSPAd60 zjwlke^5KW6BO`KaMD?v{@e+0j14yEquuFu=E$ea56dGw;Sx|(e$9M~302hK`#OVW} Ef17SsO#lD@ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$ValueIterator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$ValueIterator.class deleted file mode 100644 index 100c00a51a85dbe5f3c4237c3eb104af5c3b2ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmbVM%Wl&^6g}glapSraXv?Ee8cKjXpe86Piy(wrK&ljA5tRMJj1m{ej+_Zf{|XjR z!GaIqqY!7@08PcF-prYE@67Rijeq|7{sX`c8V(A$<-o>Pk-L(ix0kSuJ2vjxxF=B1 zgJ4{KB+zWfN#Bzr=?|3W$HQS9jfr8Xd>xqmP>#HgmOAkFCjJMdU&~QTpx8Nz^gz){ zt*1d0=w|{?Dp|y;U4i_5{9XyHw1Y^!nGAa>c_(`zEtlJ|FT<`(0>fva?QmeiY}_C+j!`5 zy4G!Y0?*GsH}loaCh;=T$7zSO4^UqJz-m*q2iW+s^W@ zrqeL*5m@XiolcOz({Kn|Aa4*4?KZps0-Ru{*xYV|M3 zeWu;Q1+E32g0+Da?#&IeUc@SqjmP>-qe(PAr}h>3Z&(ocM0Q$X^OS-!Q-B!{o-$Fq zAm)gLTKyQ}|KBg2ocMdYfa_^iCdv)mpu$Oh7H+0r-(=q4Un@_48JFn4LIi7J6YrC6 J;{j@g;%}f3N0|Ts diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Values.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap$Values.class deleted file mode 100644 index a37baa80c1575017ccd75a181c3b6c0275e96244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1353 zcmbVM-)qxQ6#j17CT&ce&bhfcv}$$zq0KtRhEznY2!+m|3&0jQyFB8#Gl9IofcyJ2DrC3Tby zR7~i&Y2cQD8iOwTZdBZ6*lh>lbDIyj(-*cA3zb%woUAPiF-ofEIredbOhoOD=FUAHg#u)oZPdMa%LVv1wurZ9!$B2Af0LjNhpe9ajloSuirpW4* z>KJTJV^M~}^v0}O$K{E%N~{8|5W-Ys4Ob`KuVIDk232M0pLmX*Z;~ak=>8U}(Eb7# C%|74& diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/StaticBucketMap.class deleted file mode 100644 index 10b9747fc3d9fcb3b8e10a6a9eb1f40aee2c1452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6534 zcmcgxd2p2F8UMX|Cc7IF0wgTi1Ubr)O$bB+m;{7C&`1)Fa0RVqvut5uvk9AB4Axe~ z2vxzWYAf{sRN@gUDB+MPT4~XCdU&)mwVnRe>C~~#^!VFKf6x1U`|TRg8Mib2gMHrb z{oeOEe$V-ZUw;0^c>r^8)`J-0Q}DZrtxd9uCOn!F;YB zkTVbF!;Obz?_pUzB0t~v@aKRVk9tsy$J}__gYiOt;6Vu<^P&Pj^x_E|^5RE$QhuJ2 zy{CoUGj1FfdPH`P2%m#)9Q9zT=rIG&dhr~dcjK5FLvFmF00m!5JRV6bkA?dCBmD}l zjiFddFIGkNbVQO0dCl=;LY8j4sNm&xOEQuOC3_QYyrfW|FJ!h}=9a#Z-coS1_J((o zwD)d}C={+}Ub$>T>-t-oHY{J&yuL$0weZgJ-gtj96i;e)c7l3I!QGt-?~Ej=R{f2w zy@_o#p}tUfd!#1Z+tb72q_J2eoQ%r4C)8KdkqjlH;U;~lEz~z%1U4u*W0apW6H%T_ zT#eCqG`U28)?ikH0=J`-;V<-`oXLHk$+#aO@^K&qQ zq8+nZM5Kx;c;cxZ!#=We^ha-_MEABx^7>H!c7+MET6ctYhiYP>__mtW-8+a)!)$_U z-x=8>nqBsiJhtnbG)m5e<8-(?+TYyMm*frZZs9NaE6lhO?<;XsafNGgFf{EgZ@4#} z3`OJpjI=K?iAoiuPw9A}k9SMlQrW%~m0ffNWiQut_T^g&`H4s}m57rq!HGu(1dw>- zRwH&@iAYcHZi;dAB_g{S6a-c$$=F#Yvs5w~tKpVJj8=($n)rp6%dMd0nY@UZTs%(A zm&GWx*i>G#Vi-4w^X-gp=8mDU^+sWQ)=oO($k!Q;MM4ScDWRXEKhl98*_8^#XokJF zdj~o9Cbvh(IZpz|NCFp&K~FTSP?`<P(aDWKI?ykV-UgVTB`=w!LU+Sd{9GV-5c z9}0&f{r%JH=FU~a`QX(#A!P#Oh%yv|8Ip%r=$T{B=TEw0wfFd ztWsecm`Ce6dQ*vTWMxze+W1jbb&gaKA6jsO4~UNSb}Exxz>$gA6~(a6&B`L zuyea9xQGI;`mhV_K3tE5^260CwE7UoCLcOw^-XMGKIEVq%MtThWE{_pfv!}{qlO%W zr+csuA#}TO!iU%Jx*I2b7{OXG>XZ-b(BZ=t+{ogn3w^pu_z*$2LPe(fx2IyUHNDX| z`*`y}IMOE_)Q1FiyK&lwGq_fv_UkLDP?Qm2gcMue*XJ{x5x69WYjjY$0xB%cfq{0= z|Hfj}ogi()Jf^1O~q27P0e59X*u5-dbvbq9`6x1(_J1H+5wX~i*= zVF*+30%qYwdhR89>SgLVtS!09(8tohRmwEA_0lJ8T7M z+(7L~c)J=0ZAA9tvW!wCbQW-mDxN_B&JwgUn2d9la0k^B7;QW?#Z<$_6RS0h3Tv>| z6fQv~p;J(K3cf>dJ7~Q+MK+oInSxwo(peci4YkLp9#x$@fu;4;g5`V}SjhH~v7lKcW-O!LPaYd| z*mqja>NK6@qIqd&ZR9;8)jl#!-S8Er&KYg$IAcSb>ULCL7`Dv(FxyPxE@n0|R=_N8 z(X^FD%5%1vf2Em!+XPG(IGIN7v<_62m)s~r? zEi*qh&FsoVIRcE86r1cego<$h;}d5L-J z=o*1n`5laEXT8hsx`<_dmt0Ecfh;a!somZBqdx!m)^1jlbIIm z62X3_-!+1wQF3{62;TZUQh%N#kOM`;_gz}In)O%c0sLIkckydY4ZOQCk&R&jT&fgB zY9c18Nhnukn5hD&R^_-_RiHsl#trH!tX4CySvYBu($O5CY}*r%#+fcuZDS{zna zX4)vFFDA62BM{~#?Z8AE13)@T%_tFX(ZK{K38P3u! z722xK5?B7AaS|703hkBE!RoUJ*w|IeHw|6-%L&WSNsKV4yWmrIV}crF1-b{b)jm|I z{aSUITLNsu(&J?gskXqaCiqb*;bRkCi5+yY!cJ>ydxoc_jn~;5rP2T-gYM2UKc z3H&gosz)$~`}5VKT5TCpim7-EJ-lf{tuB({?K;bk{IE1JO!0&mH!WCs3{J;z@TaIa zq{pqdP|?QWVKQ;NN)f#=nd!km?kPCc({QW97^9A`raVg&pR-gTOAD`Q=+!lO0>+?^ z$O&Hj-ZfSD1)pWgXvv!4gOoAsez#$ z`qV41saH|J;#s0jphCTlY3d|`Y6P|F6zZ4`%lQ5}b=C@l3g(+JQ8;K+dID=P4YaW} z?=mN_1o}<0Rufm5)5dXp^`67j&eNFoW@XTR8q+f|I7Yy?y$YZ0IErm2w7?SMnuXpt zBsu9T?($pLWd0~)Q(|n6G2C?nlMs;!GHvQ4^ZSL?>2e;!pS71SW(urWqu3yFCyST$-QBNvPaOrN5 ziQsG=2Hq}H4W7lFI$8~dY%J#@c`xw-zfJP_Wgz(FVLWM&Z;DB)NJ~hoN#~H(kj^EY UM_NmIHEAB{e0~ACN$W7_zk9o@NdN!< diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TransformedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TransformedMap.class deleted file mode 100644 index 55d2ada9400734a941bc00de36fd1d152e595c09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3575 zcmcgvS#uOs6#njHlFrO@$ijexu!#s^G9e-;OIXAZG>`-&EV9#?X+pzfI`;IixdHAA zpty_rN|j3$R!OLUBED#8S>>BAYL&|`@DHfpz1`F4ELFgZROQ~&x6l2)bI<+G>EVZe zu3iVQ03T}D9f!c41ZuEXTKnX%Uk-*`>y2Y3GBG}82}$v|w4RXGlhXAm4Nq%0DNs`|9m~jV zGo6BE=eKsO6%gwMs@m*)!8P*kHX~Ow%Z;O}f8X=>&H;f5ht1<#93x*iU_1S$BarU2 zoxT=hz{nglTQYWkKR0sD<;;vr#6nBRyOn%LBw%PwpfYP_Y{zg-fn$xGhm0deOVPD* zEnUVy>+OKwj_>?YJOa@+JIe^FJFUFgUF`2Qoh?Rhjw^MYc7_Qum?l2^i)H-=lTkee zrM7gI;DiDRH^^63AXf6Az365klO>eDtjvf&#R@BLxvK;Y{cqXY#{9SktpX2o)UjN1 zWA7neufR+{0?TgkmNpjMfuh^vI;PRzI-lFh>>~Z9d5Id|O(5QWEMpERxo9}WXKv4y zIA)CI=*W+xh*)`nhEWV*Ck>|s^xzgYn8yX?`lvZ0-{;5P>Wd=0#BAICS?fH8k#8pi zsH#xHG`uWV> zSwyxY72=qMVvg^tSd^K=J*HR2vdh5Jv^yMS)D!VV_==| zI-eH{mpe8F1xiUPXH^DDq}{f=&MxM&A(v>uI>F1NpgO3zOwKe&!YAH*MW5-a%BXD| zTMAQ4ag1#y6jIhaU{KZD!wqQCI69Ry^&^o&-9UgnS^;eiHJM~7nvvz5x=DJ6)yf0L zf?gn?S%vog0hjWQHg?E>Dpi%U=*VBn4wAAeXeVW1aMlsS ze5B~n#HS9Fa}SWX2C*a6l)i$0#LJ)DX%9K0lIs`3(=3(BcWCnH`S_bai=C+Os?$Vo6E#i9BJ zYA!<`&2ff%&+<6uLL4;#M-5iv0iUCScq_1m{%ll!;x_p#NuD6~9m<<7Nuy~9wGj+o zpm&-J(AeE#ymBcZ?=;DPDT%dcCu&qSzj4sxCG`0C=pPgP6QX~16LfwoeDv?hB}KW5 zfOUc`n$cgw#2tL3Fs~rlMQf745GD(BHxJ9l~x6oDJ4Umi`Tq*$j445C4q)1*0l z2s6sC{o=nrrH4~68EH=T|ugL`5LR|MQo(zrFJ(3Nn7n-NrE>qCRbhw{}{?qB7jZc5&s4@qsPzD63$Z0 zRTAu5Xwi#^mVL^Fa7XxA!Rel(4=3d3%Lm!Z_+_`4B4yannMyN9T`c;FrnE}caF#rw z{K9(wm9qa$;d-5BN)YB0=1U5Ncq-rsZGQ57t}g%dwUR5^saRA$8Lj(2Nb)C(^si7Z dY6Fs5UPuceBiN}9y9*mQ%l}=~bIeGu>m2|2_piSLIE(uU zyq$)^+oE6sOk{cwfvPi0hmTH)OaeLs1;&Wmu5uEg3#c z;3I{@4a>7lr(}5z+pR6nT~kmu6#8e~TEjPMe#vy2R^P)%n~Be7{`yWKS+UBlXZn`H z*W<+vbJHv|ecLH4x}I-U=FR#{(e>5}X5B2WTZOV)trCcD$Fa&j85)HpU9W0+ z2lAch%BB#Tbt{Z!plH{ug=Tfd@|MgMhnAtDTV`e^^W!`)MyqCB;aCr>Ll3O2j`$RE z2g!!j+>~Zoa@-3W#FCA(((mlf*& zbE`^hi@$C+6pS^?4?|KoKHjU1$yM8H_&2RBg`+!8j#*nP+*;Y7bXb*yV+Ias>Z)#1 zg|4S?V#izSa5h}wj(DTF!ip-)1o?LYwyNG~=@nXH)pM&lvZ1}36#9HuFDBM4Q%-=w zL>IcA;J#@)dRKbUZF*(vx-H@z4&`FCTY6T6qHtlK6V^)+1}2a-@G%w*EMeI|3AYX0 z!QBMz8TbUBio<6HPUDQik+vwq{u#(2Z}3_w7aoH_YShSr(>BS z_9+bD6`Vm#Si-1sVN|&wDv9$|j5GR}h&M=ki8I-mWXk!cNdC<42qfn;-@pbEc%Zqm zEk8^WLw-rkC3Q(^F7ZxkE@7a$1BUZ_Yp?7tNd19yJG)j@eT{Ckd;)YO2P4=&73@#5 zSeb1Y3eO^Jbs(fe1fHty2>p8zzU+#?BiS9{&|ZYEx+3sA2M9JhC3PN^EGBc?7>Hs) zG?8an4)Yn@CAe1czkz{=8n{*b(XjZVcmr<|nt-^#uLwN{bwi@G^4&SoL`kq)n^x$e`*vU1+Od`1S E4+>={2mk;8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TypedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TypedMap.class deleted file mode 100644 index bcdf4a8e615d587452dbb45018d84fdc3ba6d178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 884 zcma)4$xa(V5PfAE4<5{72w@3pPMB>XafEOH354VXB#i+li`!9f9e0DJBVjc@F2#YTA_~c;8!7^dAuA~V?tO!RN zm0NKqyd>7X_f53-JFYK+rg!X%DC!TC-&GKD$EMC)lNBAP?@6ns!YfhpIWk=_QutL7 zYU_7{*_LQq@Y}uw=ZCt#x^Ht?sc#5E;ZFF8>g4kWI?(YUA-hqoa{Ks3M}(b<37ej1 z3wfhFX<984M67*Z$yi&P`+An3ZvT_uUYaD7>O|W~$9sugI~L)~5L_3bs%yz>w1f^; zide;35hbi!F-_PSf~41%FqJMO-TZm&mWL+n4LsX zLHOFe>Hn^_JZNJtWW26M-%A-V+-vdhZOT=wV}#$T{W2)P!6-l90(<8i&$2H40bOry z{X%A&&m*!ADb!_|XDD!hF_vo`Fp3ywkIOKD$uwWW6k8eO>?L){_gLH7kCk#DJNsAp2X7GXIgxM7N@fqQB?QZ}8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TypedSortedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/TypedSortedMap.class deleted file mode 100644 index 68fd2414e25cb3e06d4af1bba9963231ed002190..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 932 zcma)4TT2^36#h;Uvt~`J(cW)fo{TLnMd(Y^7r|0UwV(w0IGG*e=wv7C&I6uMxDprz(opbxnH)qZ{zkYxJ31Aaz0Un2Vf~O$}&q7r3Jiv(vZ+(?M=@v(okk?RXwQf&yX|QHH;+)+voZ6|w{@Zp@_tvP$D(W4 zv)Hy$n2t!bw@1!$UknHj@8Al~)#dT!fRh`y3L?}lgvr$~UftG-cDsb~db7htxKo`G zw%RuBMPeZ2sfwiS_id7~G)76Mz0S8so**8-oDd$_Je6u+`>L02hBtk)2=Aug{gkR$ zOK$R*Jix0uma$St1FQa6B)px1>Shgug<@pIbPl^`{1`%O0?kRDNN3Y5`jBK!BvRRv z>jDXLJ>~ue2s@*l_-FjhNu9hVYZ1&HJ2j!iF~#(kH9J_v4DYu8N~j^gEU$ZwtwZ*g zSvG!vK5xAKhSD4UuTcI{Ktn#O3*bn4z_;lrWnqFA7mGbe8)ge#E2F$~1b-^KJ#}tqd3%n|df1=K4~JH)R$J z^OnacMcRFx@N~e9bbcLd*h5Kt^Lr}OL%CmF)g@o`wK<4*&XYqCB|6KrD(Fm8kyz>M zjOWor-mb9SiC~W!5#vS{&K1rO7QzmAT9VL5b#p0K2hmPEqI$iRaoXt+!<3FkuCHno zXRn&Ox-^M+DP8A_6M{(Ps>^D@N0Z_4UxqzZlzFa=6~moe817o#`jCj+84ms+z(a=Z z|27+jjSINmi{m3VnP?*}tl^2J2e01fg-A3h)F!|Z!_{*(f@ZYrmg4yZCI0o446|og z@eB=GS@(Hl(eS`a{5 zuGL&?HCOlz-n$b_{UDqN$L13P_`n=O0!{S6 zkD`eQQ4;mp4`n>FY)g$bypTZlpeQP;7o;~|6g%=T=##xPfH9r0ss_N48YO({Yy{cyF`X2`7jUBNKXvOTfYb2}p3 zwc*L|&5n?LEJLB`c_LhQcoYfJZnymK zz~lk94uxs?uIqadt&SrsX{)`<19KFyGD_Gtv&xXOlSmk5M#V?bdE!LUZMAlO?{M$H z-0mEaWqO|#%5_@f5Ey2MAe%g>#A4FZLgD(yl#_H-rOepzd!Z#>*(y!*qkL?rWEU`o zLIE?F)$yo+BIa~77^W`@F|eV-WN2PlmKY}g@k)8K!mt!ukJGT{MZF;KLn*r3f$9jV z#m0#x0<}@@qyP z#M1v-kD)X?GJ{Id%wUB^&!ABR(#WVHgY4324JrBnt-gE;_L+7mT%*4cOW)FfzQY8a zi|1Onj%hlPzUmQTFx4XoYm3;5RjhwO>MPO=KapvjA-hj(?GxP$v)_~b4@2x?!X772 zOIV26H&9O4Pv|WpLhcOu{wZ=l1~e^}e~d{gD$+?vDcp>;Zefbn1@bPBMNASsgZr4* L@)X@7mQeZwH=H+3 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableEntrySet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableEntrySet.class deleted file mode 100644 index 75ff07ac65c931245e4764d967cc6b55bf622e76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2668 zcmb_eZBrXn6n<_(*sv_+t-MuGY>_6}ZPQY1i)ld$v_?Wv15~8GY&I9z&Sp2W+0>%r zH~)lR{NOm_SDbN5D>Jcv^(XiT{1@uEn>tLcKYNMj!PJ5waq=hp;00Z_2H}5UnFsKH_rriJ>rN{Dmyl}z17_^74A^e z$mLt2kE8=db=v%ktX=VR+aSBiaNnqV$OfW(xmARi=65R|FOkB1?HNv)beam|1pOy_ zRJhq}a-FItLQezfm!6DHbYKMMX#NU)Eg04sig*v3BEe!eN z)C+X&<4pdW2>bExKh>s(K`Js(o06fUkJ{9E8WSk`9>)n)p|XAp*Zl%a1-@l!b2o64 zybBi70gFF~MH^ui)Md5y9R}2==zfZx=ri=bKp*`r3wqjf^hdB9of*>vKW$9#)5aS7 zqJp1RQ)@pUrtN7_HLBH~;jCKIXeF*{HI@&tzm6{QxI^qrlAJ|iwMh~VG?a0R#yjwk zMHNffrT^5v#3sI?Sikn8OA*`2AUcsf5&H!i#jGA(glylYIE6?vv>qYMAsWy5d5K^U R!{jwWzr(~Mi>3CCe*hJHQ7!-g diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableMap.class deleted file mode 100644 index 7e4f08365503db483d12440c031b4135dfb18659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3160 zcmb7GZBrX%6g^KMSy(oOQVQ5sTVL8j(vpf5Yr$F?ih?O3^ zAM}I%fc}d*qebnEwqN}X{t#!JaXioNCfS5Av6IQ}K6mdu=kC4dxx0V<``hmT#;~Jc zQNjBvV)#JCusmGHQa6`3nd(zLxHK_jzC}8a82D>G2F80*voS>0%BeunRV>4r`z6&ZdHu<$$$P@ zn3?}OF3?pl@{X%}hQNuD+#P*W&s03q%3RY+lcP;*fzGT`pl5H+w2g&Iam{dV=xY`& z{W&L3R-N2jhsKVgUXsp@r~-*8(>A?JjM~GvLJn`kEDM~^IqvO@Uefa$MkenRi+li{ zEz8Jze6n(e;F)E+=oHL#pHyZn&~wiuT=4tJlD{RlcQwo za4PgW7UbC4O+dZ6l{ZR0t%AE;GrUmcc%hkN&TgcLnYO^uCWfe!0!tvCw+!87LL+`! zgb=t8LR-3hJA8o204Hh*+Y~hs=B}|V+v3;0@m73OYJhDZ$FxQ2ZkF5q+!wrd<4RrP1XVkRH-%(KOG8MfzcFByzHNWQwhXd+}s zS>B22F0dz96F(^7SAZfLZivp-)J2d^sWpMY2ztYPb;+r?d1Ka;@*ijt;+RZHAl*j7 z(I|oOHr}jrv*0zH!f6FX4K^k;yn>S&Qg9TMG<+c~=fIvM>jh%%1y0vRv22$srIO=% zMq#led&sR-6T3v85Jl5J3&y%$vAmnn*>t$o2IE9}t`R9RD5&-j z=z3)S3{*ATxXUlMDNVihQ58n&FK}z*S+?af?)(4Kx@cxqg*3gVS+zr^DK`T&zqFvZwQc$q6Lh?3*M_v6e65igM? zMq474-bLq+{#}V8KUcu57RS7gFc^4Y1f#Um-^b$c=Cn!kD6^a6SwzLqCvW(Lvi`?}XJ*&IW{@`^CvM34Pz7Z*DSBT0% zgbQK(EWKq5_KUat_!EIoEvqiPiHiX*n|IOAVXD@qDXwK{_rokjp0t`1z3~+hIs!9vLqX+U6HI-aK0PDM6U2G6H&Pl`X$Su`fdnx z{0$NAM;=TKQR1}E;vL2d`Fd%AHz4s2H{*TFxbNEF@io-~Z&2b5HRF9xydU<#dylf0 K`CaoXx9}fuR`HPl diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableOrderedMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/map/UnmodifiableOrderedMap.class deleted file mode 100644 index 10432336c556f416532e4ba342b44ced706243d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3707 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/AbstractSetDecorator.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/AbstractSetDecorator.class deleted file mode 100644 index faf4a0d98f10cc8d3f8ca0cfea03887c2515a3f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 738 zcmbVK%T59@6g_2zha-rfBKS(&0VYfW3u7=O26Z)YgJECB25JVz%oM*%HJ?+Qm>l=U?jw~dwqeH<$9J@&rlPD#z$B;OeBdJ;pM!C{uFx&o} zV8}XhByPsTo(OJv&!d&RFO4KpI_#%$fJ27N$|($||GW&t)gL<-mdxE~&t00ELgJS_Ssd6GL?+kT1xG`lY%uo>n;gQ8AahS*AuSXs&{Cx!gd#vn)%%UROf{0;OEY_z`F8f-@y}o1z5}S@xrRJSY|0vRRMOaF|0st9s%#84kJ&t7 zQ)9E0#&#M{1yV1pzUA!-#EYdPfkeYORssu6tFPVF#-;qdBcONGABw zALoQu=3#OtuG4#MtDfo;s}M~T$a>B+Al+4x?Ky&!n%P!0IH_*RL_%Aq}*aGjvV$#^Og@oBs$^R$0d-EU;PD@eDfxiy`eN z!s=MXH67P+L&qA{b!@P?gS$HJvAK^20x$ooBLsH-B|p?l0(t6=#?LEowfB$?J zKpY>3u@(pAFd&CRAsi0jNF`nmBZ#A6Jcq$*)MBU_$MA+6-VEa{9G7duRovA=7^y@e zj72yaLb4KiH6l1siO~?oB%)D?aS3C{;iOziRU?4395Qk+wX@T#%J#cENMD6XU*oy)3jbQcTZq}mP|VKk^=Q! zV_gn0+h*9vSb8o`s>G`GnDLww5Qe}~&t^C8$avBdkq~Hmi~-LL51b?~NNdF`x8@$` z76>w!S<=~AG0(dBSBlP_emX3o-+{aGnb+V>FYlthd?7bOiNGpb5; z*(I6ev|O#~X~P;*Gp0&1rF5$lnLx)=7WrBiK*0Ey#w}CTRBtAVbmUr@V40MW$y>UX zRLv8-;@VPh0T%`K?yxL9owZbnm`tihF+nN=o;#}+GC4hOrY4w-k+Yu5@zS!xwyBwQ z@21^lp`cw#VqH1o^CY!hif9LRDY%5a3SO1NhxjOj%L;nX%MS9C(G}>N=SISb*rSSC zp#MMJf4C{kDb)chM~&H?V&SN6xshXCE^lgnbZ2DA@(W>iRyN~Vr#u}u;wGfLDiC6= z_u19WQfGfyTE0EIH^k@h+U0qe6-lm&^L?<(dDqi*`p3B$$Q$R_bZX}6O<-)^Zp~_R zGfLra^B8&ZtLvPdm&$~hu{73^Ky`V#Bb9o>_mXj~aT`vt8)FTBb*u%uDt`-w`DEAR z*vz+0dE1+L;0C)EP?5$J1;{RE{WP#>7a0)ekF5d9Ggf0Nf24Mu9F zu=t)_cz}ov$+acrwfl%fTVuqKcb5iXBb88!)|W}^lQUPMfjg)j^v4FKQ0F?i6E&pU zjS%)>F?yM=J_fm;4(-RwIDkDk$k|~G;Ruo#C!3wV)9yl6;FNmi9t4cn1Nx zLbnG711<7#8}+VJ5nFNw9U4aiPLe>%CaD$;I5f7FXwWFOlaS9Q)L9~=@w6mV7rPrs zcCNaPnrLj*#@kqN$u~1O^VeK+7OGHSG%fykKkb+clEfBUt^{%n*Dd1aO)v5*C^EM>Bm(~7?UOTqu5@Fvf-MA?B*Zt& z^|#FFcUX__*_3WMajE0qwLW_8C)oxkF0m3RAJ6tv5rP=|iRELJt>-hsS%hw_tEj?G J)?rsg)j#>whjjn| diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet$1.class deleted file mode 100644 index 61e8dd5ff32f67319cf50db91ce3462522870a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmb7mzpDC*Y1%D8!%F$#o)WRaK|O#IfBH&C**rY!{jl_nB` zAN&FSDC2p%j@E>PK>Ttp?|IL2`kZs#{{Hjx7l1mN8cL{W&`>S0WlB*iV;&3As+VD5 zQMwHk%PLj~xllxeiPoWgY+FZ>+qE|QZdW*w>w8T?zH5gZH~R6e?d@ATokI?Dtnk|P z+~^Hqp^{18jznNbe$dREWgx4&47%a(3BpLr^~C$5UPlBU?M|0ZjF#`%-Ca9yrJo$; zqXReO*iNt~0WzR1rS?}ZIuMcT5VW>`6gXnbl_MJcw|#ZFH#$aeTZ%OuW#~HY;+~4< zI_~3vjv)-Ic%fqoFQu4P@rtndKL$luzXE13#?X4#38TPvE_P>AIDWjRgykzhE?F9G z@8qS^lp`?Gw=`H7UX=7OeGP>11SR{js-FpsYkw1F_vzh*NhMi=O6XkpvOj@##!ZuGj zfqxtOfMJ?HkUwW6oT9*X;Tvc4t7xo2bqtXeSI}cLBdI`gOA@qpf;P41tyaR(Rxk1@w!PZ&({d>YGVm|$(NU&0c`QN%;mK=CiywpwHW diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/ListOrderedSet.class deleted file mode 100644 index d62d3a64c833a020b9041cf4212b75a171c1b269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4900 zcmbtYTXa-c8UFTMGLxA@fC(fdBqar`lSxXrYHc7TO~8bPpoUA+3VJegNCqb}bmjyB zmC{Ic){Cpxm-TzgAclv^@88O&zUnPA!un| z_UyAS-~avJ|L=eAH81|>*>3?@gQp^}qnL<6;Ybwkj$<8;#&HZsqc|SHdt!*sai>h4l-^x2td-%rV_1Z{s=4O<(z`Q;d+-7I{9qiXaIdVtH-h`*_jC-)aK8+H zNSY7J7@Jc#9mg4bM4FF^F+KKx%swEW?480%X-Mr1J|+_%m*x}Fd{UZE$vT1_!-LX1 z6vM-qjNp+79*y8J1-fVS=kr#vCuf#QR!JeTtC+EhR%Xbu`)#Xe+J&ORqLNk2nz_AJ zv6L<3_w@HFs2vImdJ6fHZRYL0W^Td?|Ldi*e}B2@FGC8^l4WZgZXGye9x*#6>};-M zAX~CKIh(Q41tMDtyOX|Yn(Xv_>ea0Sh2m(3dDu*kSsm%Z_&6={H0HmQ_4Xi4K% zXwyQdr;s7~!hvkw8k`s(v5LFRksL=71BEpGFzF4y-N7I+WO0S4Fd<5gd=+}!ncLtaatoqRK%tlTlde8qJyc(T-gshZx?@*4t>OXq6^%w4>yspeH1Z zI#&M0LMfB!&gB#u{0{VZxuWp`Sz;~mG4?SDNnR<``DT5)HJ9co4^DkAVLhU@Oso1FG>(XSutNd&k!r6SrI!eL%6(YL7 z>);ji<%+sw|K&U-3mVH4`sDg_kf=n`V~mr7FlX+K(X+O{RsF~|7j!ukQd3)Q@v~^gHJK>q7E#ng|$zC&`X{oFufHi*DX2jNAb)6Bb1Jc~0u((n? z`pnW84avmk47?M=((9wsl_fe!goJ@kY>wdb2Dab}1|G-$2)<}wm#pu-YC@|kl9sdD zz+3QEAuwg&OBgcnHVj4ZWdl#(NdxEb6$1xk_yGD0m>7{JZQvkA4IIL|WIfeAfYAuP zYTz*LQ0RFDyt+q9cF|1RL;Bjt9+zTEO?sWWFE`49iW;0?{dxtcv$JOPx;a_x=9(^w zrR;I$87m}HyryDG5dKGfVA^l|KRj|o=-87VFJ!U@^&R3s&Z?O*)HzR8j7fcQ?ky&A zg;nKnDUA4QS2>FQTd}gZ^Xg0f>UFxpN7IG86fL>#D>Ta1c)Z8V(x7#eQc*!3_fTGc z%s$#~k>(ArA$&y$*YeS^mQRay2%r&fz#G}WfzPS{-h?HR^6b~4nn~ZqnVa}^1|iM@ zH>aM*f(uZ?iNG|1&$X4mLh_ZGL0I827;Q7CQaJ0bjL6&tM2Ayt)2RNMwzHM(HHfh7 zC-M%|U;qj1L=(@}8lH(8nAqK%t#hp6X7uoj_R&jrtnlQv&E>WMLH2-ZZDSg-iis*c zaX>>E&LS5|0JggT@67M~M_I53Tx)oeYS6Y~O3 z%nx{CUi5U}UeDGt*Za7qjlw&wUWe85>+nNz{SkHeF@63Cb@(Ygdg(Rkz}Jea!$o3C zjP|=aypB3FO(GoBi86!h6efA{%Sk?kO-`RF>P2&9Ihume5YkCEiE56%USaCeMPFdo z!=SOBQOuuXA%4Mv@k<8pA|3h_TJdYv$N$#G zoXWhylVJrM=7iR9l*)W7?>y&a@B)p>q3;WJ(Ey9ZjUh=TT`o3BuZ2V5R6|&kY7tTm zVIM2`Agz0p3Uy6gdcL_LKngMW{{sQV*O&^RSp}KaA*@$nbg3$Is|b2jHMXmm=G{de z&CE!VCd|E?b*_nzeV#9Uo-chm>m)O_^X}e5FQm+r!#vD!5mWAq1jD>0fSsc2>V55% z^wSka)gZ1GVzFA}6R&(<5WqDUr_2Qs6Y=;=XDiRDS=ZWmbX2f)^i`wAbW*!~tp!lz Y&Hx`78~K}HZ#}VjHL|Wnu?f-t0?gC|+yDRo diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/MapBackedSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/MapBackedSet.class deleted file mode 100644 index daa2c97251319085fd59e3c9be57ef57082c95e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3168 zcmb7GO>-1g6g_V;$s{wKPZA^uIHnLMlfcM_3WN_s0wxdwnh*>K+L<&-ho0_XrY9sQ zuwbE8SmnZnr7m1jWm%S12^gu;rB(h3|A~5Tcc-UeM!?PM_g=qy?z!jQ`?~-9``6z9 z?85CN8u4xdQ_Yx8B8GDb%*fXHB(~ta7S3j6xRAm{yf4Eg87`-=6(7j#Lz(F^n@b@t zd-E`4xFUNC@^(=MQteHw`Pn|*>vo45k6g*l@%t6&oz zyJ(gbc278^g`8g0^NU6jAppD+#1+>%0S{ot@=DfC7o8woiM$@#c&rpt)*krTwz=jT}rB;3TA z2NyG4h3<$!gke+3C^*Xuvc;cx2Am6PZ{C=<44pAj1d5q(o#9eRrwBcn{)@HgQpjZL zY}Y^9sQXYG>R6Dzajl|TRIYhZFE9Fam7H=arMz*%l#=R54 z{4VI$aA~1ZFl_huO5P|+x)nA}FB)lfMY>QayJ_2T({o1Ju2`1FUT3_y|5+|#mXl#j z!*;x)VFzAKpsZmJ_G;LN*EP7PXm|r}YFNer4MRAj;W}0lSWV!DhL7aT$GE9s6t^@S zm)9p`cv~>XaZ-j;8Yac~4EFLCs0QlyD{p{mhqH#6c5iJuxhe0$FmL$n_*gYgxh2zH z7?S)(%&9JuaMf7#a5^6=albvnqCI6uR}?Gsx4%xA*Op1pF410Cr|Ml!)r#iLQH^N5 zZdr${iAiIH4&%1>=w9ddIOdKzbm}(1 zseE>!g_YLN6Irfa;~B+gQ&#-~^&@9749MEsJ%B;ZHUC6_Bi1_u>uJP!9@v!q1Feq` zo9$|Ni1_c1&^VhNc!;JdUK^Q#wGn4&w6Q1zccX6`;1b1SsJP2&3_Q$oC6?{khe%`x z?xQ(7cpoi4amy##MMz+Z<1_<1NAMXBJnfq?z}l)wzEp)FPu%M}m8mp>IMl)^z4i0HuP4!}kOu#S)u5!-7Kmm-KAAz}v( zJ|q0)yvq8wV*(9wYN;fpQbA`!obctbT8ei_+F!a*;Jo>xE9gQ3^K zAdV!9e-GYb1Pa4pL_g4bBmIwsZVoe~PKC*xYv@w=3fnl@pl~oQCwgTJh~4|=uh6It zx6N!C@SaSf!X{j%_v`e(!U|dSca*I#aPIFEKn>--PXB}hT7ST zMYPL=G<@yW&>edo-ENZGE%e}aM7K=nI}_@*E%eQM{ArcYQ(Fmlo>2+>C_D{uV=dw* z&p_lCCP3WJXQYc?P^jJ$^4AO8vhv#2v)lTLoDnO~%hns5q@bd^vwGa7`3t;ND zPH(KHpTGEz@FsBD3x{9K0P$GRjBS4Uc|i<3z~*Xm`1iw?5xllAxou%{^Wz)f$;Bgb ZwT5^P@Zytj-$cS}4d4{c(kzB|{sn>ZH;4cL diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/PredicatedSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/PredicatedSet.class deleted file mode 100644 index 6c8b571c76ccd9edcff14478fbf49c9b91d51878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmbtT%Wl&^6g}5@IJFY`0NV0y%R?naHR?7|HbF?O3_>c6)TQf;S|i7<>c6W`6$q`W?U~p4hnOKycqd6%UNHVq?|DnqV$d zY3N5im1bcQ?`^*j$c~`VP2x=ZvF`cNP*u)8EbX6uJo_Q2^;M9hzE*;rb?=@3-gk#O zjNDzNTV9eLy8f{r94R+Q1_MHHjUp9jVrTA~RQ1DvwXLU@Dh1_k(kJGu7sl%KaB!f~ zxBfvy&w`f(eOiL-W4H9RPea@V-_gecpzy5st0bm@nAzarWFs0!bZm8YO5N@gU zb_5-`6Xx!&+NG38D{)VWX(jH5@IauuEFIIZmZeiR?b6cRtblkT5Y5=7vTKywWy7k- zj<@d$zgORX{2BUg~goLwvu zh^uAEoJ)ps@|h#^W{wD{k(TxXfsCCeepl8k$%RUBO*+qwHH#-bSvyBx4SLM)+M&NJ zU4gzfSmCW*I)V7VyCx7!nDnd>kg8^>@uVG0WZkigk1Sb~C1Uk78w!M7yRP6Tt3aqA z4b=n!BQ40=QH5N?v^=Yhb<-)+x_39aMo*bV%TTu(+iJ^T6WWeIY**E5!%Y1qMZHD4 z;^gFGQ}s@)-gkRx9asI!p*f^u+Z08|8Jtz(p^h131WvRV2OZ~eLB~a0(s2r>b&Mdc zV^oO*#&ixbMG_MN6G!txB{{vXHIFuXY|1EGDpQ}#=2Y&^Y>F`m{$T|F8UiQLg>J6L z`3v%)2VuUw=;KL0Po@#zDWH9aco84nhVPT7H$WMr4vY{UPVTOSmV<{4)RIPZZCRn>3~L%gMd2dl_J9;}c0EJF=;lB>GwjDJPo zCpr!~xa48#Rh=59P!+7%OF9{#{a}0>!O_GHLVhf$aL3|b(77+-s-r8=@zMj0R}Jfq z4&pMdctnG^%AJpzQ4BLDex9;bYLqLqQ<;c)lsgFfFs~RBZ5US(!K;SU#OjPOk4Nyn z%HtygyRi+Ab_h?NII;~-HL^w?Hhhg|imNJtrsCN_MBrc%%!VRp^&)UuS|jMq2*s8N U9JSU6(Po6#EfKEKZyzTA0!6TviU0rr diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/SynchronizedSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/SynchronizedSet.class deleted file mode 100644 index 947a600839cd9cf41f5f67f5d04bd6130ddd8b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmb7?+iuf95QhJCk~%dhJx~JW)D{ZlfNE5@OI0BS6%|GFA`poyv~gC6i(@0(L4s%C zf=2-fDH2Gimxy=a6%hYAR&x?UTzKr6o%v?w_x}9-^*exFR7`AI5ZJO{Vq2S=i*#?9 z*fDWiU?ozaE4`KqBRBA096c5gPX(6hfgi=vk6Y3ksN9FsADxfwSHA@E9pwa}j1`fk z#)*6@?Lq8%c2mW*@{BK#tp^=uE;n3XJsb4fDts>69wTdwz+qR(-t^O8CQ`9Zo~8;c z?7O}jAFyh!V~aiFo*M}~Yy@G~mT#ofQ??WI`&@u;&r?p!%_5s{yZO#{dST$Z?^Q=n zEU+_+9Ci1k-?fk1CoHa&brUaeUhA=w*(OgpURTA039Odp6|kDYAavBBtG8aC>A$OK z0(<{Ic>(LVsLdU1?iNr&nSX6cIe|z20FULFQl@^Un!v`SKI4N#l^r zFgt?7CgTMyr^|BGJ%6Wa?OM&2U2S^pHWTCOx^^>Q#@#9dRX4uuG+VycalT>>aV84o z;qW0V*Xrz4KWy9~(8_`YbiL+XNk>;@P^)0<*g*`eaI7?{N||o2!78$YQRqRO|09or z8Ncm&?aQv+wmZbi1zx<*wrorKq_8j~!YI6KU^%Y#O5b+;F1@E8rZ7lQieQO0&r0uF zoDvVkkOsxUQVbPc?U zlLqE-%D`#7Cgvv$lwlgEh*-pufvSktaYo_76Bs=jvj5CiEuKAv;^2HeQs{9qN9cwO z0f&zTe>l<#Gog*Xm;qlfinaEjL--#;6;9=q|y<<8bK3cT{icT{E@o^#5=D~SCPhfjW82h;T6nL zE9ip7Ig;W>Sl3A=NnN&VR`!v49PBEcu4%Bj&@2YaMqqT6)-qH|x*NfsBW9A z{TnG{No1aG^C;;xtV@Alz)fm5*^Dh}Zt3u4o=>xBQWdc<4(DS$E1wE*vVyLIW?N9CRCuc3ebYEx2DyIeM{!iMY5+| zJ2m!0qK;H{sFTbL2BhF#6gqR{u9AJL%Idwb18v(+{>l}EUDGG)e43Z~&2Vs_?Y=rF z7-^*@V}*)!(!U5cD(yV@as`4JH@ZZyag~w;&8@u5T}ROQuhx2O#vSIB;Mt`6*~OSF zeXpV*-ZMj+>7Cqnzcf9i1Qh8O>r%wiHQ3&r#Ha0dd*;#kvT>>#0A{rZ;*Fu>!%1l*SPDnO=5uO zn5VsUj=};K=@E|>mUtd|IWD+%(clL}YwH`QXnf&s08bRx$vY%`RgrN9v6#k|cmTnh8t_As(gFi}&d`@P>$bz|&N??5 zBK+s)`;UtscHT1dmPN_5xFZ-g#tU0~hi4j&Ze&(X%Ms;O;baS@Rn72iUfL9yl3A+} z5WNjUlpJEPGiw&F+ZEHQ2`f9%5rH9;H_OD(U(oAfxlt<$YmFBT@(dQt5>?BoX8P|t zgSK!OhPz-zofaWO>Llec^vvsZ-N`X5{D;G?)4`lg-Da3Ot_nI)n^5JJx(r%XIL-eI zqvPE~3|Dl^CSiv5BMe@zW>$(@)QK#WVsN>uQjfMdb=0&NV*8on(&6B>})2*mz#WHJ84N((y!Wul9$PjVNW`MFOxST46i4L^gNECe2PGPR4~XIcgzfmAp7838W3U}IhwE@6yzDZz!6WQq$LAXsXG4?9h7x!0Tc zg3vF74;Q%NVrpKDkI7{J{QMa|Url^P&mI(p!w73_2x=37n%^0r_b9?fM+BOj&IpmC z2yZ$f(AfD1f;0({3UPUgWNHs;5X-V@lO#*@K;JyMIW!bq(1e%Rlsk?Dk_1a&NYN@l zk$r9pg5;(7_9cUt-6jhheYjCW|7;||T?Rz`{VxTM3g{SWr Uo_B;}bm8$%*3NT_P7uJk diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/TypedSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/TypedSet.class deleted file mode 100644 index 606774924a2be3192d6703151d1290e01fb1d507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 796 zcma)4+e!m55It#Y*RHMi`@L_rqO16%RY3$nC@LrgAJa6pDcgg9q z+g4B?>^@8~Gv}O{oy^DQ>pOsLeqn8Umah6NXCEIL?nu*@)AlR}5wNQT{wa+5!B zuWgj?T}xByx;_u;-l@-{s8sj`U`UKyy{bAvaAL7D?C)z?*)^Q zG#31`45^sMd*V#|DaepMRDm+b49Sf`#UdLjV%RF{uQO8YX`#UF!IiW$nZc&efQlI!$@74euCks_mV%J?jQYcF&fw5 zpG_E;T&N(AA=)teC6IxGVOqKjc_&Cw1jxOC-4-`rkmw-!6vJGyX@UWJ7$G~`1tNbVLW~G>Nc^ zu(Mh}75_xgwK@tKCb24PC|m0}BN4ZQy-1{Kt@5gjP}nmeW6E_MtKZ#DOC?956|rZg zZls8sBGJx%bmmiK3G;8U?Ef>)oPJT9P~6tBwm%8^)k>4A+7q1;s&$jJ192wgi3+6Y zbWEJ`8bwN4?e<(QIAUnnzZt=Am~JA~zIMl)9SpC#W)L=p;2tI_)RLRnhkN)^!ZN;= zFokb!nkM`h0yTIB!c_JoS@-|6PWdu~+B=xzZY-@y(%>LYt%#*E$Ik~OjJK723iRK6 z;CbKSKf`K-UvK=Gp%IlPRxrXp(v2L(;9-lL`+kMoCGzK)%;&kt zGN6iao)>yTlrX^-r(hCgju%|xA8}P)UB<}TB?=e3$-!a#EOnEmTN$d<6JZ9k93{+U G%J~NmP~`9c diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/UnmodifiableSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/UnmodifiableSet.class deleted file mode 100644 index 859f994ffd7021a23a68ab7f6f413d949b13f559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1674 zcma)6TTc@~6#k~A-BMaapyAfB*UZ1Hd$vHQd&4Cy5BAlSryp1bQFt zVkU`M%xRcUB7p@B_ZS8|;hNmq60T=Dc5!``fjwtP=N;RV+?HG1s)^Xn%!kqVvyYr1 zQ5J^daw!-lGKGD9!1bCmEqznSrR=G1hMv4rrpPk|(-tplm6C8@^O8lL!GdE@R!+I; zJ8(ulAysfIDnoqPv`zV#PW_W{i*m?4(_@$~IPR{_tK8TVy5UqRB!E`S5{4vYo=)I; z(XKdU^R1s$F(y5x6eP!S8AdW;0qcREVxqiUW*82VTio8&H%j}2yOiA_c8+f=O+NAP zKJC)k70Y564|C6-@bV#g6i*@$QXYz6h#8jP#4wu4lHj;2D$W5FvA1sc@MKGF+PxCL#H%PE0PRT9jX;R#W33;`aiWzVH9I2EaJX~2Ps^@MGX&A7yuRYRQ`W&j8MnXOKLrh>`^i=6->FLM(T9jL3HG2+>17{v5sgDF$@+HO$f31q{)bLZnj| z#t5wu)vf^XF?~hI7tc){q35%|t5DSc2=D|ktoR5c^(c%JL-mXMSc)-qJHT3`Rpm+N zz99AuafYwZn#AJ%=30nQI)G!igv$ZQG9^-}6URtwAEEar*%2s8_4Df?I*AiH30%R1 zpZ+SYb&2$%4bpYo@R4p}GC-Oo21-~vPOn0m8k}hIyVg`}!=#}p)3v7UHb@Ok*{+e^ LbU@1aeVO_TG4WcL diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/UnmodifiableSortedSet.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/set/UnmodifiableSortedSet.class deleted file mode 100644 index b0e7350364abc145bc22f31d0a58abd4f6f6f9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3003 zcma)8S$Eq+7`92o({SCl*1RAbrct3{} zN;zD`VwSTdIlGp_b=;7TWeqoT7{rP^wc3p=ZsqU+)->GCp%)*@dEW2J{R+i16IJ)bqK*x+*p;ceWa?Hhgb=~xC8tXP!21;(33JmJt z|7bDon}NVk8?5fnJu5Jm*6*5So;n!`vD`wqv{Vmj^x!|rqgKyeqz&x%amIvL0A4bQF4*=E&rh?Nc8 zc%CMKfVRbuDW1_?c-oqmkjlkF**_gByxVXpZwz;dL zfR{CxIyNw+V-u4)&R|P}rQ@z#$>TGD!DcNtgCtFD9aT6wUcm(ou8w1<37l1@RZgrp ze!W&x<-b&uNykcxt3U#f;T}8s)<<-!iI8CiR1FZQY=K^R8#VdZTSA88_c_Pr;<2wv|;#c8)2KOm>Wjj4sIn| zPfn(I*ge{m5;OZqD{P{m1r9{0Hxhkfuu-wCH8+qfHKv;CY(1N1(2SSt3CRp??y%nX z@^+(T_$@84(J%z^N&d!iOS_L31$63)Lnd&jMOM5)RbjAN-yzJk6yIkl(5L(z#V`(W zJj^#@3P<=#%Q6d(bLBa%%p%PhFpz%=@dG;Z51$~lmfuGDp*nwp&t9GZ-hhS)+Frs* z{?kJ%oWf~!?hKwMx(%p(fZYI+)2i<`vj*Xn+^+BG1tj zFX1c+MmX=_ILiGz#`u&3C61Dyp9ET-kFGzE{TZD*Ij+(6I{I)U!Olqc)9%Uwa}rfmiWb1Tqx~>Ux6SwQcnMPQVnTOGA4zA*U;r(}mX=IY~c( zi~B^f+8|xRq(UlUDnhzI1@dC;G*uIKYG`69?fXvm+9+wArrayList instead of a Vector, so it is not - * synchronized to protect against multi-threaded access. The implementation - * is therefore operates faster in environments where you do not need to - * worry about multiple thread contention. - *

- * The removal order of an ArrayStack is based on insertion - * order: The most recently added element is removed first. The iteration - * order is not the same as the removal order. The iterator returns - * elements from the bottom up, whereas the {@link #remove()} method removes - * them from the top down. - *

- * Unlike Stack, ArrayStack accepts null entries. - * - * @see java.util.Stack - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Craig R. McClanahan - * @author Paul Jack - * @author Stephen Colebourne - */ -public class ArrayStack extends ArrayList implements Buffer { - - /** Ensure serialization compatibility */ - private static final long serialVersionUID = 2130079159931574599L; - - /** - * Constructs a new empty ArrayStack. The initial size - * is controlled by ArrayList and is currently 10. - */ - public ArrayStack() { - super(); - } - - /** - * Constructs a new empty ArrayStack with an initial size. - * - * @param initialSize the initial size to use - * @throws IllegalArgumentException if the specified initial size - * is negative - */ - public ArrayStack(int initialSize) { - super(initialSize); - } - - /** - * Return true if this stack is currently empty. - *

- * This method exists for compatibility with java.util.Stack. - * New users of this class should use isEmpty instead. - * - * @return true if the stack is currently empty - */ - public boolean empty() { - return isEmpty(); - } - - /** - * Returns the top item off of this stack without removing it. - * - * @return the top item on the stack - * @throws EmptyStackException if the stack is empty - */ - public Object peek() throws EmptyStackException { - int n = size(); - if (n <= 0) { - throw new EmptyStackException(); - } else { - return get(n - 1); - } - } - - /** - * Returns the n'th item down (zero-relative) from the top of this - * stack without removing it. - * - * @param n the number of items down to go - * @return the n'th item on the stack, zero relative - * @throws EmptyStackException if there are not enough items on the - * stack to satisfy this request - */ - public Object peek(int n) throws EmptyStackException { - int m = (size() - n) - 1; - if (m < 0) { - throw new EmptyStackException(); - } else { - return get(m); - } - } - - /** - * Pops the top item off of this stack and return it. - * - * @return the top item on the stack - * @throws EmptyStackException if the stack is empty - */ - public Object pop() throws EmptyStackException { - int n = size(); - if (n <= 0) { - throw new EmptyStackException(); - } else { - return remove(n - 1); - } - } - - /** - * Pushes a new item onto the top of this stack. The pushed item is also - * returned. This is equivalent to calling add. - * - * @param item the item to be added - * @return the item just pushed - */ - public Object push(Object item) { - add(item); - return item; - } - - /** - * Returns the one-based position of the distance from the top that the - * specified object exists on this stack, where the top-most element is - * considered to be at distance 1. If the object is not - * present on the stack, return -1 instead. The - * equals() method is used to compare to the items - * in this stack. - * - * @param object the object to be searched for - * @return the 1-based depth into the stack of the object, or -1 if not found - */ - public int search(Object object) { - int i = size() - 1; // Current index - int n = 1; // Current distance - while (i >= 0) { - Object current = get(i); - if ((object == null && current == null) || - (object != null && object.equals(current))) { - return n; - } - i--; - n++; - } - return -1; - } - - /** - * Returns the element on the top of the stack. - * - * @return the element on the top of the stack - * @throws BufferUnderflowException if the stack is empty - */ - public Object get() { - int size = size(); - if (size == 0) { - throw new BufferUnderflowException(); - } - return get(size - 1); - } - - /** - * Removes the element on the top of the stack. - * - * @return the removed element - * @throws BufferUnderflowException if the stack is empty - */ - public Object remove() { - int size = size(); - if (size == 0) { - throw new BufferUnderflowException(); - } - return remove(size - 1); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Bag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Bag.java deleted file mode 100644 index 256ef9f5751..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Bag.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; - -/** - * Defines a collection that counts the number of times an object appears in - * the collection. - *

- * Suppose you have a Bag that contains {a, a, b, c}. - * Calling {@link #getCount(Object)} on a would return 2, while - * calling {@link #uniqueSet()} would return {a, b, c}. - *

- * NOTE: This interface violates the {@link Collection} contract. - * The behavior specified in many of these methods is not the same - * as the behavior specified by Collection. - * The noncompliant methods are clearly marked with "(Violation)". - * Exercise caution when using a bag as a Collection. - *

- * This violation resulted from the original specification of this interface. - * In an ideal world, the interface would be changed to fix the problems, however - * it has been decided to maintain backwards compatibility instead. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - * @author Stephen Colebourne - */ -public interface Bag extends Collection { - - /** - * Returns the number of occurrences (cardinality) of the given - * object currently in the bag. If the object does not exist in the - * bag, return 0. - * - * @param object the object to search for - * @return the number of occurrences of the object, zero if not found - */ - int getCount(Object object); - - /** - * (Violation) - * Adds one copy the specified object to the Bag. - *

- * If the object is already in the {@link #uniqueSet()} then increment its - * count as reported by {@link #getCount(Object)}. Otherwise add it to the - * {@link #uniqueSet()} and report its count as 1. - *

- * Since this method always increases the size of the bag, - * according to the {@link Collection#add(Object)} contract, it - * should always return true. Since it sometimes returns - * false, this method violates the contract. - * - * @param object the object to add - * @return true if the object was not already in the uniqueSet - */ - boolean add(Object object); - - /** - * Adds nCopies copies of the specified object to the Bag. - *

- * If the object is already in the {@link #uniqueSet()} then increment its - * count as reported by {@link #getCount(Object)}. Otherwise add it to the - * {@link #uniqueSet()} and report its count as nCopies. - * - * @param object the object to add - * @param nCopies the number of copies to add - * @return true if the object was not already in the uniqueSet - */ - boolean add(Object object, int nCopies); - - /** - * (Violation) - * Removes all occurrences of the given object from the bag. - *

- * This will also remove the object from the {@link #uniqueSet()}. - *

- * According to the {@link Collection#remove(Object)} method, - * this method should only remove the first occurrence of the - * given object, not all occurrences. - * - * @return true if this call changed the collection - */ - boolean remove(Object object); - - /** - * Removes nCopies copies of the specified object from the Bag. - *

- * If the number of copies to remove is greater than the actual number of - * copies in the Bag, no error is thrown. - * - * @param object the object to remove - * @param nCopies the number of copies to remove - * @return true if this call changed the collection - */ - boolean remove(Object object, int nCopies); - - /** - * Returns a {@link Set} of unique elements in the Bag. - *

- * Uniqueness constraints are the same as those in {@link java.util.Set}. - * - * @return the Set of unique Bag elements - */ - Set uniqueSet(); - - /** - * Returns the total number of items in the bag across all types. - * - * @return the total size of the Bag - */ - int size(); - - /** - * (Violation) - * Returns true if the bag contains all elements in - * the given collection, respecting cardinality. That is, if the - * given collection coll contains n copies - * of a given object, calling {@link #getCount(Object)} on that object must - * be >= n for all n in coll. - *

- * The {@link Collection#containsAll(Collection)} method specifies - * that cardinality should not be respected; this method should - * return true if the bag contains at least one of every object contained - * in the given collection. - * - * @param coll the collection to check against - * @return true if the Bag contains all the collection - */ - boolean containsAll(Collection coll); - - /** - * (Violation) - * Remove all elements represented in the given collection, - * respecting cardinality. That is, if the given collection - * coll contains n copies of a given object, - * the bag will have n fewer copies, assuming the bag - * had at least n copies to begin with. - * - *

The {@link Collection#removeAll(Collection)} method specifies - * that cardinality should not be respected; this method should - * remove all occurrences of every object contained in the - * given collection. - * - * @param coll the collection to remove - * @return true if this call changed the collection - */ - boolean removeAll(Collection coll); - - /** - * (Violation) - * Remove any members of the bag that are not in the given - * collection, respecting cardinality. That is, if the given - * collection coll contains n copies of a - * given object and the bag has m > n copies, then - * delete m - n copies from the bag. In addition, if - * e is an object in the bag but - * !coll.contains(e), then remove e and any - * of its copies. - * - *

The {@link Collection#retainAll(Collection)} method specifies - * that cardinality should not be respected; this method should - * keep all occurrences of every object contained in the - * given collection. - * - * @param coll the collection to retain - * @return true if this call changed the collection - */ - boolean retainAll(Collection coll); - - /** - * Returns an {@link Iterator} over the entire set of members, - * including copies due to cardinality. This iterator is fail-fast - * and will not tolerate concurrent modifications. - * - * @return iterator over all elements in the Bag - */ - Iterator iterator(); - - // The following is not part of the formal Bag interface, however where possible - // Bag implementations should follow these comments. -// /** -// * Compares this Bag to another. -// * This Bag equals another Bag if it contains the same number of occurrences of -// * the same elements. -// * This equals definition is compatible with the Set interface. -// * -// * @param obj the Bag to compare to -// * @return true if equal -// */ -// boolean equals(Object obj); -// -// /** -// * Gets a hash code for the Bag compatible with the definition of equals. -// * The hash code is defined as the sum total of a hash code for each element. -// * The per element hash code is defined as -// * (e==null ? 0 : e.hashCode()) ^ noOccurances). -// * This hash code definition is compatible with the Set interface. -// * -// * @return the hash code of the Bag -// */ -// int hashCode(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BagUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BagUtils.java deleted file mode 100644 index 46a36234e6b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BagUtils.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import org.apache.commons.collections.bag.HashBag; -import org.apache.commons.collections.bag.PredicatedBag; -import org.apache.commons.collections.bag.PredicatedSortedBag; -import org.apache.commons.collections.bag.SynchronizedBag; -import org.apache.commons.collections.bag.SynchronizedSortedBag; -import org.apache.commons.collections.bag.TransformedBag; -import org.apache.commons.collections.bag.TransformedSortedBag; -import org.apache.commons.collections.bag.TreeBag; -import org.apache.commons.collections.bag.TypedBag; -import org.apache.commons.collections.bag.TypedSortedBag; -import org.apache.commons.collections.bag.UnmodifiableBag; -import org.apache.commons.collections.bag.UnmodifiableSortedBag; - -/** - * Provides utility methods and decorators for - * {@link Bag} and {@link SortedBag} instances. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - * @author Stephen Colebourne - * @author Andrew Freeman - * @author Matthew Hawthorne - */ -public class BagUtils { - - /** - * An empty unmodifiable bag. - */ - public static final Bag EMPTY_BAG = UnmodifiableBag.decorate(new HashBag()); - - /** - * An empty unmodifiable sorted bag. - */ - public static final Bag EMPTY_SORTED_BAG = UnmodifiableSortedBag.decorate(new TreeBag()); - - /** - * Instantiation of BagUtils is not intended or required. - * However, some tools require an instance to operate. - */ - public BagUtils() { - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized (thread-safe) bag backed by the given bag. - * In order to guarantee serial access, it is critical that all - * access to the backing bag is accomplished through the returned bag. - *

- * It is imperative that the user manually synchronize on the returned - * bag when iterating over it: - * - *

-     * Bag bag = BagUtils.synchronizedBag(new HashBag());
-     * ...
-     * synchronized(bag) {
-     *     Iterator i = bag.iterator(); // Must be in synchronized block
-     *     while (i.hasNext())
-     *         foo(i.next());
-     *     }
-     * }
-     * 
- * - * Failure to follow this advice may result in non-deterministic - * behavior. - * - * @param bag the bag to synchronize, must not be null - * @return a synchronized bag backed by that bag - * @throws IllegalArgumentException if the Bag is null - */ - public static Bag synchronizedBag(Bag bag) { - return SynchronizedBag.decorate(bag); - } - - /** - * Returns an unmodifiable view of the given bag. Any modification - * attempts to the returned bag will raise an - * {@link UnsupportedOperationException}. - * - * @param bag the bag whose unmodifiable view is to be returned, must not be null - * @return an unmodifiable view of that bag - * @throws IllegalArgumentException if the Bag is null - */ - public static Bag unmodifiableBag(Bag bag) { - return UnmodifiableBag.decorate(bag); - } - - /** - * Returns a predicated (validating) bag backed by the given bag. - *

- * Only objects that pass the test in the given predicate can be added to the bag. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original bag after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param bag the bag to predicate, must not be null - * @param predicate the predicate for the bag, must not be null - * @return a predicated bag backed by the given bag - * @throws IllegalArgumentException if the Bag or Predicate is null - */ - public static Bag predicatedBag(Bag bag, Predicate predicate) { - return PredicatedBag.decorate(bag, predicate); - } - - /** - * Returns a typed bag backed by the given bag. - *

- * Only objects of the specified type can be added to the bag. - * - * @param bag the bag to limit to a specific type, must not be null - * @param type the type of objects which may be added to the bag - * @return a typed bag backed by the specified bag - */ - public static Bag typedBag(Bag bag, Class type) { - return TypedBag.decorate(bag, type); - } - - /** - * Returns a transformed bag backed by the given bag. - *

- * Each object is passed through the transformer as it is added to the - * Bag. It is important not to use the original bag after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param bag the bag to predicate, must not be null - * @param transformer the transformer for the bag, must not be null - * @return a transformed bag backed by the given bag - * @throws IllegalArgumentException if the Bag or Transformer is null - */ - public static Bag transformedBag(Bag bag, Transformer transformer) { - return TransformedBag.decorate(bag, transformer); - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized (thread-safe) sorted bag backed by the given - * sorted bag. - * In order to guarantee serial access, it is critical that all - * access to the backing bag is accomplished through the returned bag. - *

- * It is imperative that the user manually synchronize on the returned - * bag when iterating over it: - * - *

-     * SortedBag bag = BagUtils.synchronizedSortedBag(new TreeBag());
-     * ...
-     * synchronized(bag) {
-     *     Iterator i = bag.iterator(); // Must be in synchronized block
-     *     while (i.hasNext())
-     *         foo(i.next());
-     *     }
-     * }
-     * 
- * - * Failure to follow this advice may result in non-deterministic - * behavior. - * - * @param bag the bag to synchronize, must not be null - * @return a synchronized bag backed by that bag - * @throws IllegalArgumentException if the SortedBag is null - */ - public static SortedBag synchronizedSortedBag(SortedBag bag) { - return SynchronizedSortedBag.decorate(bag); - } - - /** - * Returns an unmodifiable view of the given sorted bag. Any modification - * attempts to the returned bag will raise an - * {@link UnsupportedOperationException}. - * - * @param bag the bag whose unmodifiable view is to be returned, must not be null - * @return an unmodifiable view of that bag - * @throws IllegalArgumentException if the SortedBag is null - */ - public static SortedBag unmodifiableSortedBag(SortedBag bag) { - return UnmodifiableSortedBag.decorate(bag); - } - - /** - * Returns a predicated (validating) sorted bag backed by the given sorted bag. - *

- * Only objects that pass the test in the given predicate can be added to the bag. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original bag after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param bag the sorted bag to predicate, must not be null - * @param predicate the predicate for the bag, must not be null - * @return a predicated bag backed by the given bag - * @throws IllegalArgumentException if the SortedBag or Predicate is null - */ - public static SortedBag predicatedSortedBag(SortedBag bag, Predicate predicate) { - return PredicatedSortedBag.decorate(bag, predicate); - } - - /** - * Returns a typed sorted bag backed by the given bag. - *

- * Only objects of the specified type can be added to the bag. - * - * @param bag the bag to limit to a specific type, must not be null - * @param type the type of objects which may be added to the bag - * @return a typed bag backed by the specified bag - */ - public static SortedBag typedSortedBag(SortedBag bag, Class type) { - return TypedSortedBag.decorate(bag, type); - } - - /** - * Returns a transformed sorted bag backed by the given bag. - *

- * Each object is passed through the transformer as it is added to the - * Bag. It is important not to use the original bag after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param bag the bag to predicate, must not be null - * @param transformer the transformer for the bag, must not be null - * @return a transformed bag backed by the given bag - * @throws IllegalArgumentException if the Bag or Transformer is null - */ - public static SortedBag transformedSortedBag(SortedBag bag, Transformer transformer) { - return TransformedSortedBag.decorate(bag, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BeanMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BeanMap.java deleted file mode 100644 index df2f7dd1190..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BeanMap.java +++ /dev/null @@ -1,804 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.beans.BeanInfo; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Set; - -import org.apache.commons.collections.list.UnmodifiableList; -import org.apache.commons.collections.keyvalue.AbstractMapEntry; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * An implementation of Map for JavaBeans which uses introspection to - * get and put properties in the bean. - *

- * If an exception occurs during attempts to get or set a property then the - * property is considered non existent in the Map - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Stephen Colebourne - * @author Dimiter Dimitrov - * - * @deprecated Identical class now available in commons-beanutils (full jar version). - * This version is due to be removed in collections v4.0. - */ -public class BeanMap extends AbstractMap implements Cloneable { - - private transient Object bean; - - private transient HashMap readMethods = new HashMap(); - private transient HashMap writeMethods = new HashMap(); - private transient HashMap types = new HashMap(); - - /** - * An empty array. Used to invoke accessors via reflection. - */ - public static final Object[] NULL_ARGUMENTS = {}; - - /** - * Maps primitive Class types to transformers. The transformer - * transform strings into the appropriate primitive wrapper. - */ - public static HashMap defaultTransformers = new HashMap(); - - static { - defaultTransformers.put( - Boolean.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Boolean.valueOf( input.toString() ); - } - } - ); - defaultTransformers.put( - Character.TYPE, - new Transformer() { - public Object transform( Object input ) { - return new Character( input.toString().charAt( 0 ) ); - } - } - ); - defaultTransformers.put( - Byte.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Byte.valueOf( input.toString() ); - } - } - ); - defaultTransformers.put( - Short.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Short.valueOf( input.toString() ); - } - } - ); - defaultTransformers.put( - Integer.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Integer.valueOf( input.toString() ); - } - } - ); - defaultTransformers.put( - Long.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Long.valueOf( input.toString() ); - } - } - ); - defaultTransformers.put( - Float.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Float.valueOf( input.toString() ); - } - } - ); - defaultTransformers.put( - Double.TYPE, - new Transformer() { - public Object transform( Object input ) { - return Double.valueOf( input.toString() ); - } - } - ); - } - - - // Constructors - //------------------------------------------------------------------------- - - /** - * Constructs a new empty BeanMap. - */ - public BeanMap() { - } - - /** - * Constructs a new BeanMap that operates on the - * specified bean. If the given bean is null, then - * this map will be empty. - * - * @param bean the bean for this map to operate on - */ - public BeanMap(Object bean) { - this.bean = bean; - initialise(); - } - - // Map interface - //------------------------------------------------------------------------- - - public String toString() { - return "BeanMap<" + String.valueOf(bean) + ">"; - } - - /** - * Clone this bean map using the following process: - * - *

    - *
  • If there is no underlying bean, return a cloned BeanMap without a - * bean. - * - *
  • Since there is an underlying bean, try to instantiate a new bean of - * the same type using Class.newInstance(). - * - *
  • If the instantiation fails, throw a CloneNotSupportedException - * - *
  • Clone the bean map and set the newly instantiated bean as the - * underlying bean for the bean map. - * - *
  • Copy each property that is both readable and writable from the - * existing object to a cloned bean map. - * - *
  • If anything fails along the way, throw a - * CloneNotSupportedException. - * - *
      - */ - public Object clone() throws CloneNotSupportedException { - BeanMap newMap = (BeanMap)super.clone(); - - if(bean == null) { - // no bean, just an empty bean map at the moment. return a newly - // cloned and empty bean map. - return newMap; - } - - Object newBean = null; - Class beanClass = null; - try { - beanClass = bean.getClass(); - newBean = beanClass.newInstance(); - } catch (Exception e) { - // unable to instantiate - throw new CloneNotSupportedException - ("Unable to instantiate the underlying bean \"" + - beanClass.getName() + "\": " + e); - } - - try { - newMap.setBean(newBean); - } catch (Exception exception) { - throw new CloneNotSupportedException - ("Unable to set bean in the cloned bean map: " + - exception); - } - - try { - // copy only properties that are readable and writable. If its - // not readable, we can't get the value from the old map. If - // its not writable, we can't write a value into the new map. - Iterator readableKeys = readMethods.keySet().iterator(); - while(readableKeys.hasNext()) { - Object key = readableKeys.next(); - if(getWriteMethod(key) != null) { - newMap.put(key, get(key)); - } - } - } catch (Exception exception) { - throw new CloneNotSupportedException - ("Unable to copy bean values to cloned bean map: " + - exception); - } - - return newMap; - } - - /** - * Puts all of the writable properties from the given BeanMap into this - * BeanMap. Read-only and Write-only properties will be ignored. - * - * @param map the BeanMap whose properties to put - */ - public void putAllWriteable(BeanMap map) { - Iterator readableKeys = map.readMethods.keySet().iterator(); - while (readableKeys.hasNext()) { - Object key = readableKeys.next(); - if (getWriteMethod(key) != null) { - this.put(key, map.get(key)); - } - } - } - - - /** - * This method reinitializes the bean map to have default values for the - * bean's properties. This is accomplished by constructing a new instance - * of the bean which the map uses as its underlying data source. This - * behavior for clear() differs from the Map contract in that - * the mappings are not actually removed from the map (the mappings for a - * BeanMap are fixed). - */ - public void clear() { - if(bean == null) return; - - Class beanClass = null; - try { - beanClass = bean.getClass(); - bean = beanClass.newInstance(); - } - catch (Exception e) { - throw new UnsupportedOperationException( "Could not create new instance of class: " + beanClass ); - } - } - - /** - * Returns true if the bean defines a property with the given name. - *

      - * The given name must be a String; if not, this method - * returns false. This method will also return false if the bean - * does not define a property with that name. - *

      - * Write-only properties will not be matched as the test operates against - * property read methods. - * - * @param name the name of the property to check - * @return false if the given name is null or is not a String; - * false if the bean does not define a property with that name; or - * true if the bean does define a property with that name - */ - public boolean containsKey(Object name) { - Method method = getReadMethod(name); - return method != null; - } - - /** - * Returns true if the bean defines a property whose current value is - * the given object. - * - * @param value the value to check - * @return false true if the bean has at least one property whose - * current value is that object, false otherwise - */ - public boolean containsValue(Object value) { - // use default implementation - return super.containsValue(value); - } - - /** - * Returns the value of the bean's property with the given name. - *

      - * The given name must be a {@link String} and must not be - * null; otherwise, this method returns null. - * If the bean defines a property with the given name, the value of - * that property is returned. Otherwise, null is - * returned. - *

      - * Write-only properties will not be matched as the test operates against - * property read methods. - * - * @param name the name of the property whose value to return - * @return the value of the property with that name - */ - public Object get(Object name) { - if ( bean != null ) { - Method method = getReadMethod( name ); - if ( method != null ) { - try { - return method.invoke( bean, NULL_ARGUMENTS ); - } - catch ( IllegalAccessException e ) { - logWarn( e ); - } - catch ( IllegalArgumentException e ) { - logWarn( e ); - } - catch ( InvocationTargetException e ) { - logWarn( e ); - } - catch ( NullPointerException e ) { - logWarn( e ); - } - } - } - return null; - } - - /** - * Sets the bean property with the given name to the given value. - * - * @param name the name of the property to set - * @param value the value to set that property to - * @return the previous value of that property - * @throws IllegalArgumentException if the given name is null; - * if the given name is not a {@link String}; if the bean doesn't - * define a property with that name; or if the bean property with - * that name is read-only - */ - public Object put(Object name, Object value) throws IllegalArgumentException, ClassCastException { - if ( bean != null ) { - Object oldValue = get( name ); - Method method = getWriteMethod( name ); - if ( method == null ) { - throw new IllegalArgumentException( "The bean of type: "+ bean.getClass().getName() + " has no property called: " + name ); - } - try { - Object[] arguments = createWriteMethodArguments( method, value ); - method.invoke( bean, arguments ); - - Object newValue = get( name ); - firePropertyChange( name, oldValue, newValue ); - } - catch ( InvocationTargetException e ) { - logInfo( e ); - throw new IllegalArgumentException( e.getMessage() ); - } - catch ( IllegalAccessException e ) { - logInfo( e ); - throw new IllegalArgumentException( e.getMessage() ); - } - return oldValue; - } - return null; - } - - /** - * Returns the number of properties defined by the bean. - * - * @return the number of properties defined by the bean - */ - public int size() { - return readMethods.size(); - } - - - /** - * Get the keys for this BeanMap. - *

      - * Write-only properties are not included in the returned set of - * property names, although it is possible to set their value and to get - * their type. - * - * @return BeanMap keys. The Set returned by this method is not - * modifiable. - */ - public Set keySet() { - return UnmodifiableSet.decorate(readMethods.keySet()); - } - - /** - * Gets a Set of MapEntry objects that are the mappings for this BeanMap. - *

      - * Each MapEntry can be set but not removed. - * - * @return the unmodifiable set of mappings - */ - public Set entrySet() { - return UnmodifiableSet.decorate(new AbstractSet() { - public Iterator iterator() { - return entryIterator(); - } - public int size() { - return BeanMap.this.readMethods.size(); - } - }); - } - - /** - * Returns the values for the BeanMap. - * - * @return values for the BeanMap. The returned collection is not - * modifiable. - */ - public Collection values() { - ArrayList answer = new ArrayList( readMethods.size() ); - for ( Iterator iter = valueIterator(); iter.hasNext(); ) { - answer.add( iter.next() ); - } - return UnmodifiableList.decorate(answer); - } - - - // Helper methods - //------------------------------------------------------------------------- - - /** - * Returns the type of the property with the given name. - * - * @param name the name of the property - * @return the type of the property, or null if no such - * property exists - */ - public Class getType(String name) { - return (Class) types.get( name ); - } - - /** - * Convenience method for getting an iterator over the keys. - *

      - * Write-only properties will not be returned in the iterator. - * - * @return an iterator over the keys - */ - public Iterator keyIterator() { - return readMethods.keySet().iterator(); - } - - /** - * Convenience method for getting an iterator over the values. - * - * @return an iterator over the values - */ - public Iterator valueIterator() { - final Iterator iter = keyIterator(); - return new Iterator() { - public boolean hasNext() { - return iter.hasNext(); - } - public Object next() { - Object key = iter.next(); - return get(key); - } - public void remove() { - throw new UnsupportedOperationException( "remove() not supported for BeanMap" ); - } - }; - } - - /** - * Convenience method for getting an iterator over the entries. - * - * @return an iterator over the entries - */ - public Iterator entryIterator() { - final Iterator iter = keyIterator(); - return new Iterator() { - public boolean hasNext() { - return iter.hasNext(); - } - public Object next() { - Object key = iter.next(); - Object value = get(key); - return new MyMapEntry( BeanMap.this, key, value ); - } - public void remove() { - throw new UnsupportedOperationException( "remove() not supported for BeanMap" ); - } - }; - } - - - // Properties - //------------------------------------------------------------------------- - - /** - * Returns the bean currently being operated on. The return value may - * be null if this map is empty. - * - * @return the bean being operated on by this map - */ - public Object getBean() { - return bean; - } - - /** - * Sets the bean to be operated on by this map. The given value may - * be null, in which case this map will be empty. - * - * @param newBean the new bean to operate on - */ - public void setBean( Object newBean ) { - bean = newBean; - reinitialise(); - } - - /** - * Returns the accessor for the property with the given name. - * - * @param name the name of the property - * @return the accessor method for the property, or null - */ - public Method getReadMethod(String name) { - return (Method) readMethods.get(name); - } - - /** - * Returns the mutator for the property with the given name. - * - * @param name the name of the property - * @return the mutator method for the property, or null - */ - public Method getWriteMethod(String name) { - return (Method) writeMethods.get(name); - } - - - // Implementation methods - //------------------------------------------------------------------------- - - /** - * Returns the accessor for the property with the given name. - * - * @param name the name of the property - * @return null if the name is null; null if the name is not a - * {@link String}; null if no such property exists; or the accessor - * method for that property - */ - protected Method getReadMethod( Object name ) { - return (Method) readMethods.get( name ); - } - - /** - * Returns the mutator for the property with the given name. - * - * @param name the name of the - * @return null if the name is null; null if the name is not a - * {@link String}; null if no such property exists; null if the - * property is read-only; or the mutator method for that property - */ - protected Method getWriteMethod( Object name ) { - return (Method) writeMethods.get( name ); - } - - /** - * Reinitializes this bean. Called during {@link #setBean(Object)}. - * Does introspection to find properties. - */ - protected void reinitialise() { - readMethods.clear(); - writeMethods.clear(); - types.clear(); - initialise(); - } - - private void initialise() { - if(getBean() == null) return; - - Class beanClass = getBean().getClass(); - try { - //BeanInfo beanInfo = Introspector.getBeanInfo( bean, null ); - BeanInfo beanInfo = Introspector.getBeanInfo( beanClass ); - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); - if ( propertyDescriptors != null ) { - for ( int i = 0; i < propertyDescriptors.length; i++ ) { - PropertyDescriptor propertyDescriptor = propertyDescriptors[i]; - if ( propertyDescriptor != null ) { - String name = propertyDescriptor.getName(); - Method readMethod = propertyDescriptor.getReadMethod(); - Method writeMethod = propertyDescriptor.getWriteMethod(); - Class aType = propertyDescriptor.getPropertyType(); - - if ( readMethod != null ) { - readMethods.put( name, readMethod ); - } - if ( writeMethod != null ) { - writeMethods.put( name, writeMethod ); - } - types.put( name, aType ); - } - } - } - } - catch ( IntrospectionException e ) { - logWarn( e ); - } - } - - /** - * Called during a successful {@link #put(Object,Object)} operation. - * Default implementation does nothing. Override to be notified of - * property changes in the bean caused by this map. - * - * @param key the name of the property that changed - * @param oldValue the old value for that property - * @param newValue the new value for that property - */ - protected void firePropertyChange( Object key, Object oldValue, Object newValue ) { - } - - // Implementation classes - //------------------------------------------------------------------------- - - /** - * Map entry used by {@link BeanMap}. - */ - protected static class MyMapEntry extends AbstractMapEntry { - private BeanMap owner; - - /** - * Constructs a new MyMapEntry. - * - * @param owner the BeanMap this entry belongs to - * @param key the key for this entry - * @param value the value for this entry - */ - protected MyMapEntry( BeanMap owner, Object key, Object value ) { - super( key, value ); - this.owner = owner; - } - - /** - * Sets the value. - * - * @param value the new value for the entry - * @return the old value for the entry - */ - public Object setValue(Object value) { - Object key = getKey(); - Object oldValue = owner.get( key ); - - owner.put( key, value ); - Object newValue = owner.get( key ); - super.setValue( newValue ); - return oldValue; - } - } - - /** - * Creates an array of parameters to pass to the given mutator method. - * If the given object is not the right type to pass to the method - * directly, it will be converted using {@link #convertType(Class,Object)}. - * - * @param method the mutator method - * @param value the value to pass to the mutator method - * @return an array containing one object that is either the given value - * or a transformed value - * @throws IllegalAccessException if {@link #convertType(Class,Object)} - * raises it - * @throws IllegalArgumentException if any other exception is raised - * by {@link #convertType(Class,Object)} - */ - protected Object[] createWriteMethodArguments( Method method, Object value ) throws IllegalAccessException, ClassCastException { - try { - if ( value != null ) { - Class[] types = method.getParameterTypes(); - if ( types != null && types.length > 0 ) { - Class paramType = types[0]; - if ( ! paramType.isAssignableFrom( value.getClass() ) ) { - value = convertType( paramType, value ); - } - } - } - Object[] answer = { value }; - return answer; - } - catch ( InvocationTargetException e ) { - logInfo( e ); - throw new IllegalArgumentException( e.getMessage() ); - } - catch ( InstantiationException e ) { - logInfo( e ); - throw new IllegalArgumentException( e.getMessage() ); - } - } - - /** - * Converts the given value to the given type. First, reflection is - * is used to find a public constructor declared by the given class - * that takes one argument, which must be the precise type of the - * given value. If such a constructor is found, a new object is - * created by passing the given value to that constructor, and the - * newly constructed object is returned.

      - * - * If no such constructor exists, and the given type is a primitive - * type, then the given value is converted to a string using its - * {@link Object#toString() toString()} method, and that string is - * parsed into the correct primitive type using, for instance, - * {@link Integer#valueOf(String)} to convert the string into an - * int.

      - * - * If no special constructor exists and the given type is not a - * primitive type, this method returns the original value. - * - * @param newType the type to convert the value to - * @param value the value to convert - * @return the converted value - * @throws NumberFormatException if newType is a primitive type, and - * the string representation of the given value cannot be converted - * to that type - * @throws InstantiationException if the constructor found with - * reflection raises it - * @throws InvocationTargetException if the constructor found with - * reflection raises it - * @throws IllegalAccessException never - * @throws IllegalArgumentException never - */ - protected Object convertType( Class newType, Object value ) - throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - - // try call constructor - Class[] types = { value.getClass() }; - try { - Constructor constructor = newType.getConstructor( types ); - Object[] arguments = { value }; - return constructor.newInstance( arguments ); - } - catch ( NoSuchMethodException e ) { - // try using the transformers - Transformer transformer = getTypeTransformer( newType ); - if ( transformer != null ) { - return transformer.transform( value ); - } - return value; - } - } - - /** - * Returns a transformer for the given primitive type. - * - * @param aType the primitive type whose transformer to return - * @return a transformer that will convert strings into that type, - * or null if the given type is not a primitive type - */ - protected Transformer getTypeTransformer( Class aType ) { - return (Transformer) defaultTransformers.get( aType ); - } - - /** - * Logs the given exception to System.out. Used to display - * warnings while accessing/mutating the bean. - * - * @param ex the exception to log - */ - protected void logInfo(Exception ex) { - // Deliberately do not use LOG4J or Commons Logging to avoid dependencies - System.out.println( "INFO: Exception: " + ex ); - } - - /** - * Logs the given exception to System.err. Used to display - * errors while accessing/mutating the bean. - * - * @param ex the exception to log - */ - protected void logWarn(Exception ex) { - // Deliberately do not use LOG4J or Commons Logging to avoid dependencies - System.out.println( "WARN: Exception: " + ex ); - ex.printStackTrace(); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BidiMap.java deleted file mode 100644 index 98dbcec78a4..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BidiMap.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a map that allows bidirectional lookup between key and values. - *

      - * This extended Map represents a mapping where a key may - * lookup a value and a value may lookup a key with equal ease. - * This interface extends Map and so may be used anywhere a map - * is required. The interface provides an inverse map view, enabling - * full access to both directions of the BidiMap. - *

      - * Implementations should allow a value to be looked up from a key and - * a key to be looked up from a value with equal performance. - *

      - * This map enforces the restriction that there is a 1:1 relation between - * keys and values, meaning that multiple keys cannot map to the same value. - * This is required so that "inverting" the map results in a map without - * duplicate keys. See the {@link #put} method description for more information. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface BidiMap extends IterableMap { - - /** - * Obtains a MapIterator over the map. - *

      - * A map iterator is an efficient way of iterating over maps. - * It does not require that the map is stored using Map Entry objects - * which can increase performance. - *

      -     * BidiMap map = new DualHashBidiMap();
      -     * MapIterator it = map.mapIterator();
      -     * while (it.hasNext()) {
      -     *   Object key = it.next();
      -     *   Object value = it.getValue();
      -     *   it.setValue("newValue");
      -     * }
      -     * 
      - * - * @return a map iterator - */ - MapIterator mapIterator(); - - /** - * Puts the key-value pair into the map, replacing any previous pair. - *

      - * When adding a key-value pair, the value may already exist in the map - * against a different key. That mapping is removed, to ensure that the - * value only occurs once in the inverse map. - *

      -     *  BidiMap map1 = new DualHashBidiMap();
      -     *  map.put("A","B");  // contains A mapped to B, as per Map
      -     *  map.put("A","C");  // contains A mapped to C, as per Map
      -     * 
      -     *  BidiMap map2 = new DualHashBidiMap();
      -     *  map.put("A","B");  // contains A mapped to B, as per Map
      -     *  map.put("C","B");  // contains C mapped to B, key A is removed
      -     * 
      - * - * @param key the key to store - * @param value the value to store - * @return the previous value mapped to this key - * - * @throws UnsupportedOperationException if the put method is not supported - * @throws ClassCastException (optional) if the map limits the type of the - * value and the specified value is inappropriate - * @throws IllegalArgumentException (optional) if the map limits the values - * in some way and the value was invalid - * @throws NullPointerException (optional) if the map limits the values to - * non-null and null was specified - */ - Object put(Object key, Object value); - - /** - * Gets the key that is currently mapped to the specified value. - *

      - * If the value is not contained in the map, null is returned. - *

      - * Implementations should seek to make this method perform equally as well - * as get(Object). - * - * @param value the value to find the key for - * @return the mapped key, or null if not found - * - * @throws ClassCastException (optional) if the map limits the type of the - * value and the specified value is inappropriate - * @throws NullPointerException (optional) if the map limits the values to - * non-null and null was specified - */ - Object getKey(Object value); - - /** - * Removes the key-value pair that is currently mapped to the specified - * value (optional operation). - *

      - * If the value is not contained in the map, null is returned. - *

      - * Implementations should seek to make this method perform equally as well - * as remove(Object). - * - * @param value the value to find the key-value pair for - * @return the key that was removed, null if nothing removed - * - * @throws ClassCastException (optional) if the map limits the type of the - * value and the specified value is inappropriate - * @throws NullPointerException (optional) if the map limits the values to - * non-null and null was specified - * @throws UnsupportedOperationException if this method is not supported - * by the implementation - */ - Object removeValue(Object value); - - /** - * Gets a view of this map where the keys and values are reversed. - *

      - * Changes to one map will be visible in the other and vice versa. - * This enables both directions of the map to be accessed as a Map. - *

      - * Implementations should seek to avoid creating a new object every time this - * method is called. See AbstractMap.values() etc. Calling this - * method on the inverse map should return the original. - * - * @return an inverted bidirectional map - */ - BidiMap inverseBidiMap(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BinaryHeap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BinaryHeap.java deleted file mode 100644 index c7c188c3463..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BinaryHeap.java +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.AbstractCollection; -import java.util.Comparator; -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * Binary heap implementation of PriorityQueue. - *

      - * The PriorityQueue interface has now been replaced for most uses - * by the Buffer interface. This class and the interface are - * retained for backwards compatibility. The intended replacement is - * {@link org.apache.commons.collections.buffer.PriorityBuffer PriorityBuffer}. - *

      - * The removal order of a binary heap is based on either the natural sort - * order of its elements or a specified {@link Comparator}. The - * {@link #pop()} method always returns the first element as determined - * by the sort order. (The isMinHeap flag in the constructors - * can be used to reverse the sort order, in which case {@link #pop()} - * will always remove the last element.) The removal order is - * not the same as the order of iteration; elements are - * returned by the iterator in no particular order. - *

      - * The {@link #insert(Object)} and {@link #pop()} operations perform - * in logarithmic time. The {@link #peek()} operation performs in constant - * time. All other operations perform in linear time or worse. - *

      - * Note that this implementation is not synchronized. Use SynchronizedPriorityQueue - * to provide synchronized access to a BinaryHeap: - * - *

      - * PriorityQueue heap = new SynchronizedPriorityQueue(new BinaryHeap());
      - * 
      - * - * @deprecated Replaced by PriorityBuffer in buffer subpackage. - * Due to be removed in v4.0. - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Peter Donald - * @author Ram Chidambaram - * @author Michael A. Smith - * @author Paul Jack - * @author Stephen Colebourne - */ -public final class BinaryHeap extends AbstractCollection - implements PriorityQueue, Buffer { - - /** - * The default capacity for a binary heap. - */ - private final static int DEFAULT_CAPACITY = 13; - /** - * The number of elements currently in this heap. - */ - int m_size; // package scoped for testing - /** - * The elements in this heap. - */ - Object[] m_elements; // package scoped for testing - /** - * If true, the first element as determined by the sort order will - * be returned. If false, the last element as determined by the - * sort order will be returned. - */ - boolean m_isMinHeap; // package scoped for testing - /** - * The comparator used to order the elements - */ - Comparator m_comparator; // package scoped for testing - - /** - * Constructs a new minimum binary heap. - */ - public BinaryHeap() { - this(DEFAULT_CAPACITY, true); - } - - /** - * Constructs a new BinaryHeap that will use the given - * comparator to order its elements. - * - * @param comparator the comparator used to order the elements, null - * means use natural order - */ - public BinaryHeap(Comparator comparator) { - this(); - m_comparator = comparator; - } - - /** - * Constructs a new minimum binary heap with the specified initial capacity. - * - * @param capacity The initial capacity for the heap. This value must - * be greater than zero. - * @throws IllegalArgumentException - * if capacity is <= 0 - */ - public BinaryHeap(int capacity) { - this(capacity, true); - } - - /** - * Constructs a new BinaryHeap. - * - * @param capacity the initial capacity for the heap - * @param comparator the comparator used to order the elements, null - * means use natural order - * @throws IllegalArgumentException - * if capacity is <= 0 - */ - public BinaryHeap(int capacity, Comparator comparator) { - this(capacity); - m_comparator = comparator; - } - - /** - * Constructs a new minimum or maximum binary heap - * - * @param isMinHeap if true the heap is created as a - * minimum heap; otherwise, the heap is created as a maximum heap - */ - public BinaryHeap(boolean isMinHeap) { - this(DEFAULT_CAPACITY, isMinHeap); - } - - /** - * Constructs a new BinaryHeap. - * - * @param isMinHeap true to use the order imposed by the given - * comparator; false to reverse that order - * @param comparator the comparator used to order the elements, null - * means use natural order - */ - public BinaryHeap(boolean isMinHeap, Comparator comparator) { - this(isMinHeap); - m_comparator = comparator; - } - - /** - * Constructs a new minimum or maximum binary heap with the specified - * initial capacity. - * - * @param capacity the initial capacity for the heap. This value must - * be greater than zero. - * @param isMinHeap if true the heap is created as a - * minimum heap; otherwise, the heap is created as a maximum heap. - * @throws IllegalArgumentException - * if capacity is <= 0 - */ - public BinaryHeap(int capacity, boolean isMinHeap) { - if (capacity <= 0) { - throw new IllegalArgumentException("invalid capacity"); - } - m_isMinHeap = isMinHeap; - - //+1 as 0 is noop - m_elements = new Object[capacity + 1]; - } - - /** - * Constructs a new BinaryHeap. - * - * @param capacity the initial capacity for the heap - * @param isMinHeap true to use the order imposed by the given - * comparator; false to reverse that order - * @param comparator the comparator used to order the elements, null - * means use natural order - * @throws IllegalArgumentException - * if capacity is <= 0 - */ - public BinaryHeap(int capacity, boolean isMinHeap, Comparator comparator) { - this(capacity, isMinHeap); - m_comparator = comparator; - } - - //----------------------------------------------------------------------- - /** - * Clears all elements from queue. - */ - public void clear() { - m_elements = new Object[m_elements.length]; // for gc - m_size = 0; - } - - /** - * Tests if queue is empty. - * - * @return true if queue is empty; false - * otherwise. - */ - public boolean isEmpty() { - return m_size == 0; - } - - /** - * Tests if queue is full. - * - * @return true if queue is full; false - * otherwise. - */ - public boolean isFull() { - //+1 as element 0 is noop - return m_elements.length == m_size + 1; - } - - /** - * Inserts an element into queue. - * - * @param element the element to be inserted - */ - public void insert(Object element) { - if (isFull()) { - grow(); - } - //percolate element to it's place in tree - if (m_isMinHeap) { - percolateUpMinHeap(element); - } else { - percolateUpMaxHeap(element); - } - } - - /** - * Returns the element on top of heap but don't remove it. - * - * @return the element at top of heap - * @throws NoSuchElementException if isEmpty() == true - */ - public Object peek() throws NoSuchElementException { - if (isEmpty()) { - throw new NoSuchElementException(); - } else { - return m_elements[1]; - } - } - - /** - * Returns the element on top of heap and remove it. - * - * @return the element at top of heap - * @throws NoSuchElementException if isEmpty() == true - */ - public Object pop() throws NoSuchElementException { - final Object result = peek(); - m_elements[1] = m_elements[m_size--]; - - // set the unused element to 'null' so that the garbage collector - // can free the object if not used anywhere else.(remove reference) - m_elements[m_size + 1] = null; - - if (m_size != 0) { - // percolate top element to it's place in tree - if (m_isMinHeap) { - percolateDownMinHeap(1); - } else { - percolateDownMaxHeap(1); - } - } - - return result; - } - - /** - * Percolates element down heap from the position given by the index. - *

      - * Assumes it is a minimum heap. - * - * @param index the index for the element - */ - protected void percolateDownMinHeap(final int index) { - final Object element = m_elements[index]; - int hole = index; - - while ((hole * 2) <= m_size) { - int child = hole * 2; - - // if we have a right child and that child can not be percolated - // up then move onto other child - if (child != m_size && compare(m_elements[child + 1], m_elements[child]) < 0) { - child++; - } - - // if we found resting place of bubble then terminate search - if (compare(m_elements[child], element) >= 0) { - break; - } - - m_elements[hole] = m_elements[child]; - hole = child; - } - - m_elements[hole] = element; - } - - /** - * Percolates element down heap from the position given by the index. - *

      - * Assumes it is a maximum heap. - * - * @param index the index of the element - */ - protected void percolateDownMaxHeap(final int index) { - final Object element = m_elements[index]; - int hole = index; - - while ((hole * 2) <= m_size) { - int child = hole * 2; - - // if we have a right child and that child can not be percolated - // up then move onto other child - if (child != m_size && compare(m_elements[child + 1], m_elements[child]) > 0) { - child++; - } - - // if we found resting place of bubble then terminate search - if (compare(m_elements[child], element) <= 0) { - break; - } - - m_elements[hole] = m_elements[child]; - hole = child; - } - - m_elements[hole] = element; - } - - /** - * Percolates element up heap from the position given by the index. - *

      - * Assumes it is a minimum heap. - * - * @param index the index of the element to be percolated up - */ - protected void percolateUpMinHeap(final int index) { - int hole = index; - Object element = m_elements[hole]; - while (hole > 1 && compare(element, m_elements[hole / 2]) < 0) { - // save element that is being pushed down - // as the element "bubble" is percolated up - final int next = hole / 2; - m_elements[hole] = m_elements[next]; - hole = next; - } - m_elements[hole] = element; - } - - /** - * Percolates a new element up heap from the bottom. - *

      - * Assumes it is a minimum heap. - * - * @param element the element - */ - protected void percolateUpMinHeap(final Object element) { - m_elements[++m_size] = element; - percolateUpMinHeap(m_size); - } - - /** - * Percolates element up heap from from the position given by the index. - *

      - * Assume it is a maximum heap. - * - * @param index the index of the element to be percolated up - */ - protected void percolateUpMaxHeap(final int index) { - int hole = index; - Object element = m_elements[hole]; - - while (hole > 1 && compare(element, m_elements[hole / 2]) > 0) { - // save element that is being pushed down - // as the element "bubble" is percolated up - final int next = hole / 2; - m_elements[hole] = m_elements[next]; - hole = next; - } - - m_elements[hole] = element; - } - - /** - * Percolates a new element up heap from the bottom. - *

      - * Assume it is a maximum heap. - * - * @param element the element - */ - protected void percolateUpMaxHeap(final Object element) { - m_elements[++m_size] = element; - percolateUpMaxHeap(m_size); - } - - /** - * Compares two objects using the comparator if specified, or the - * natural order otherwise. - * - * @param a the first object - * @param b the second object - * @return -ve if a less than b, 0 if they are equal, +ve if a greater than b - */ - private int compare(Object a, Object b) { - if (m_comparator != null) { - return m_comparator.compare(a, b); - } else { - return ((Comparable) a).compareTo(b); - } - } - - /** - * Increases the size of the heap to support additional elements - */ - protected void grow() { - final Object[] elements = new Object[m_elements.length * 2]; - System.arraycopy(m_elements, 0, elements, 0, m_elements.length); - m_elements = elements; - } - - /** - * Returns a string representation of this heap. The returned string - * is similar to those produced by standard JDK collections. - * - * @return a string representation of this heap - */ - public String toString() { - final StringBuffer sb = new StringBuffer(); - - sb.append("[ "); - - for (int i = 1; i < m_size + 1; i++) { - if (i != 1) { - sb.append(", "); - } - sb.append(m_elements[i]); - } - - sb.append(" ]"); - - return sb.toString(); - } - - - /** - * Returns an iterator over this heap's elements. - * - * @return an iterator over this heap's elements - */ - public Iterator iterator() { - return new Iterator() { - - private int index = 1; - private int lastReturnedIndex = -1; - - public boolean hasNext() { - return index <= m_size; - } - - public Object next() { - if (!hasNext()) throw new NoSuchElementException(); - lastReturnedIndex = index; - index++; - return m_elements[lastReturnedIndex]; - } - - public void remove() { - if (lastReturnedIndex == -1) { - throw new IllegalStateException(); - } - m_elements[ lastReturnedIndex ] = m_elements[ m_size ]; - m_elements[ m_size ] = null; - m_size--; - if( m_size != 0 && lastReturnedIndex <= m_size) { - int compareToParent = 0; - if (lastReturnedIndex > 1) { - compareToParent = compare(m_elements[lastReturnedIndex], - m_elements[lastReturnedIndex / 2]); - } - if (m_isMinHeap) { - if (lastReturnedIndex > 1 && compareToParent < 0) { - percolateUpMinHeap(lastReturnedIndex); - } else { - percolateDownMinHeap(lastReturnedIndex); - } - } else { // max heap - if (lastReturnedIndex > 1 && compareToParent > 0) { - percolateUpMaxHeap(lastReturnedIndex); - } else { - percolateDownMaxHeap(lastReturnedIndex); - } - } - } - index--; - lastReturnedIndex = -1; - } - - }; - } - - - /** - * Adds an object to this heap. Same as {@link #insert(Object)}. - * - * @param object the object to add - * @return true, always - */ - public boolean add(Object object) { - insert(object); - return true; - } - - /** - * Returns the priority element. Same as {@link #peek()}. - * - * @return the priority element - * @throws BufferUnderflowException if this heap is empty - */ - public Object get() { - try { - return peek(); - } catch (NoSuchElementException e) { - throw new BufferUnderflowException(); - } - } - - /** - * Removes the priority element. Same as {@link #pop()}. - * - * @return the removed priority element - * @throws BufferUnderflowException if this heap is empty - */ - public Object remove() { - try { - return pop(); - } catch (NoSuchElementException e) { - throw new BufferUnderflowException(); - } - } - - /** - * Returns the number of elements in this heap. - * - * @return the number of elements in this heap - */ - public int size() { - return m_size; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedCollection.java deleted file mode 100644 index 1f79ed6ce06..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedCollection.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; - -/** - * Defines a collection that is bounded in size. - *

      - * The size of the collection can vary, but it can never exceed a preset - * maximum number of elements. This interface allows the querying of details - * associated with the maximum number of elements. - * - * @see CollectionUtils#isFull - * @see CollectionUtils#maxSize - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Herve Quiroz - * @author Stephen Colebourne - */ -public interface BoundedCollection extends Collection { - - /** - * Returns true if this collection is full and no new elements can be added. - * - * @return true if the collection is full - */ - boolean isFull(); - - /** - * Gets the maximum size of the collection (the bound). - * - * @return the maximum number of elements the collection can hold - */ - int maxSize(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedFifoBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedFifoBuffer.java deleted file mode 100644 index 653fbd56821..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedFifoBuffer.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.AbstractCollection; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * The BoundedFifoBuffer is a very efficient implementation of - * Buffer that does not alter the size of the buffer at runtime. - *

      - * The removal order of a BoundedFifoBuffer is based on the - * insertion order; elements are removed in the same order in which they - * were added. The iteration order is the same as the removal order. - *

      - * The {@link #add(Object)}, {@link #remove()} and {@link #get()} operations - * all perform in constant time. All other operations perform in linear - * time or worse. - *

      - * Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your BoundedFifoBuffer: - *

      - *   Buffer fifo = BufferUtils.synchronizedBuffer(new BoundedFifoBuffer());
      - * 
      - *

      - * This buffer prevents null objects from being added. - * - * @deprecated Moved to buffer subpackage. Due to be removed in v4.0. - * @since 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Berin Loritsch - * @author Paul Jack - * @author Stephen Colebourne - * @author Herve Quiroz - */ -public class BoundedFifoBuffer extends AbstractCollection - implements Buffer, BoundedCollection { - - private final Object[] m_elements; - private int m_start = 0; - private int m_end = 0; - private boolean m_full = false; - private final int maxElements; - - /** - * Constructs a new BoundedFifoBuffer big enough to hold - * 32 elements. - */ - public BoundedFifoBuffer() { - this(32); - } - - /** - * Constructs a new BoundedFifoBuffer big enough to hold - * the specified number of elements. - * - * @param size the maximum number of elements for this fifo - * @throws IllegalArgumentException if the size is less than 1 - */ - public BoundedFifoBuffer(int size) { - if (size <= 0) { - throw new IllegalArgumentException("The size must be greater than 0"); - } - m_elements = new Object[size]; - maxElements = m_elements.length; - } - - /** - * Constructs a new BoundedFifoBuffer big enough to hold all - * of the elements in the specified collection. That collection's - * elements will also be added to the buffer. - * - * @param coll the collection whose elements to add, may not be null - * @throws NullPointerException if the collection is null - */ - public BoundedFifoBuffer(Collection coll) { - this(coll.size()); - addAll(coll); - } - - /** - * Returns the number of elements stored in the buffer. - * - * @return this buffer's size - */ - public int size() { - int size = 0; - - if (m_end < m_start) { - size = maxElements - m_start + m_end; - } else if (m_end == m_start) { - size = (m_full ? maxElements : 0); - } else { - size = m_end - m_start; - } - - return size; - } - - /** - * Returns true if this buffer is empty; false otherwise. - * - * @return true if this buffer is empty - */ - public boolean isEmpty() { - return size() == 0; - } - - /** - * Returns true if this collection is full and no new elements can be added. - * - * @return true if the collection is full - */ - public boolean isFull() { - return size() == maxElements; - } - - /** - * Gets the maximum size of the collection (the bound). - * - * @return the maximum number of elements the collection can hold - */ - public int maxSize() { - return maxElements; - } - - /** - * Clears this buffer. - */ - public void clear() { - m_full = false; - m_start = 0; - m_end = 0; - Arrays.fill(m_elements, null); - } - - /** - * Adds the given element to this buffer. - * - * @param element the element to add - * @return true, always - * @throws NullPointerException if the given element is null - * @throws BufferOverflowException if this buffer is full - */ - public boolean add(Object element) { - if (null == element) { - throw new NullPointerException("Attempted to add null object to buffer"); - } - - if (m_full) { - throw new BufferOverflowException("The buffer cannot hold more than " + maxElements + " objects."); - } - - m_elements[m_end++] = element; - - if (m_end >= maxElements) { - m_end = 0; - } - - if (m_end == m_start) { - m_full = true; - } - - return true; - } - - /** - * Returns the least recently inserted element in this buffer. - * - * @return the least recently inserted element - * @throws BufferUnderflowException if the buffer is empty - */ - public Object get() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - return m_elements[m_start]; - } - - /** - * Removes the least recently inserted element from this buffer. - * - * @return the least recently inserted element - * @throws BufferUnderflowException if the buffer is empty - */ - public Object remove() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - Object element = m_elements[m_start]; - - if (null != element) { - m_elements[m_start++] = null; - - if (m_start >= maxElements) { - m_start = 0; - } - - m_full = false; - } - - return element; - } - - /** - * Increments the internal index. - * - * @param index the index to increment - * @return the updated index - */ - private int increment(int index) { - index++; - if (index >= maxElements) { - index = 0; - } - return index; - } - - /** - * Decrements the internal index. - * - * @param index the index to decrement - * @return the updated index - */ - private int decrement(int index) { - index--; - if (index < 0) { - index = maxElements - 1; - } - return index; - } - - /** - * Returns an iterator over this buffer's elements. - * - * @return an iterator over this buffer's elements - */ - public Iterator iterator() { - return new Iterator() { - - private int index = m_start; - private int lastReturnedIndex = -1; - private boolean isFirst = m_full; - - public boolean hasNext() { - return isFirst || (index != m_end); - - } - - public Object next() { - if (!hasNext()) throw new NoSuchElementException(); - isFirst = false; - lastReturnedIndex = index; - index = increment(index); - return m_elements[lastReturnedIndex]; - } - - public void remove() { - if (lastReturnedIndex == -1) throw new IllegalStateException(); - - // First element can be removed quickly - if (lastReturnedIndex == m_start) { - BoundedFifoBuffer.this.remove(); - lastReturnedIndex = -1; - return; - } - - // Other elements require us to shift the subsequent elements - int i = lastReturnedIndex + 1; - while (i != m_end) { - if (i >= maxElements) { - m_elements[i - 1] = m_elements[0]; - i = 0; - } else { - m_elements[i - 1] = m_elements[i]; - i++; - } - } - - lastReturnedIndex = -1; - m_end = decrement(m_end); - m_elements[m_end] = null; - m_full = false; - index = decrement(index); - } - - }; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedMap.java deleted file mode 100644 index d3eb673b341..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BoundedMap.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Map; - -/** - * Defines a map that is bounded in size. - *

      - * The size of the map can vary, but it can never exceed a preset - * maximum number of elements. This interface allows the querying of details - * associated with the maximum number of elements. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface BoundedMap extends Map { - - /** - * Returns true if this map is full and no new elements can be added. - * - * @return true if the map is full - */ - boolean isFull(); - - /** - * Gets the maximum size of the map (the bound). - * - * @return the maximum number of elements the map can hold - */ - int maxSize(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Buffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Buffer.java deleted file mode 100644 index 16be420c25a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Buffer.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; - -/** - * Defines a collection that allows objects to be removed in some well-defined order. - *

      - * The removal order can be based on insertion order (eg, a FIFO queue or a - * LIFO stack), on access order (eg, an LRU cache), on some arbitrary comparator - * (eg, a priority queue) or on any other well-defined ordering. - *

      - * Note that the removal order is not necessarily the same as the iteration - * order. A Buffer implementation may have equivalent removal - * and iteration orders, but this is not required. - *

      - * This interface does not specify any behavior for - * {@link Object#equals(Object)} and {@link Object#hashCode} methods. It - * is therefore possible for a Buffer implementation to also - * also implement {@link java.util.List}, {@link java.util.Set} or - * {@link Bag}. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Berin Loritsch - * @author Paul Jack - * @author Stephen Colebourne - */ -public interface Buffer extends Collection { - - /** - * Gets and removes the next object from the buffer. - * - * @return the next object in the buffer, which is also removed - * @throws BufferUnderflowException if the buffer is already empty - */ - Object remove(); - - /** - * Gets the next object from the buffer without removing it. - * - * @return the next object in the buffer, which is not removed - * @throws BufferUnderflowException if the buffer is empty - */ - Object get(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferOverflowException.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferOverflowException.java deleted file mode 100644 index 09a19d25a0c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferOverflowException.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * The BufferOverflowException is used when the buffer's capacity has been - * exceeded. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Berin Loritsch - * @author Jeff Turner - * @author Paul Jack - * @author Stephen Colebourne - */ -public class BufferOverflowException extends RuntimeException { - - /** The root cause throwable */ - private final Throwable throwable; - - /** - * Constructs a new BufferOverflowException. - */ - public BufferOverflowException() { - super(); - throwable = null; - } - - /** - * Construct a new BufferOverflowException. - * - * @param message the detail message for this exception - */ - public BufferOverflowException(String message) { - this(message, null); - } - - /** - * Construct a new BufferOverflowException. - * - * @param message the detail message for this exception - * @param exception the root cause of the exception - */ - public BufferOverflowException(String message, Throwable exception) { - super(message); - throwable = exception; - } - - /** - * Gets the root cause of the exception. - * - * @return the root cause - */ - public final Throwable getCause() { - return throwable; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUnderflowException.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUnderflowException.java deleted file mode 100644 index a3fa781daec..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUnderflowException.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.NoSuchElementException; - -/** - * The BufferUnderflowException is used when the buffer is already empty. - *

      - * NOTE: From version 3.0, this exception extends NoSuchElementException. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Berin Loritsch - * @author Jeff Turner - * @author Paul Jack - * @author Stephen Colebourne - */ -public class BufferUnderflowException extends NoSuchElementException { - - /** The root cause throwable */ - private final Throwable throwable; - - /** - * Constructs a new BufferUnderflowException. - */ - public BufferUnderflowException() { - super(); - throwable = null; - } - - /** - * Construct a new BufferUnderflowException. - * - * @param message the detail message for this exception - */ - public BufferUnderflowException(String message) { - this(message, null); - } - - /** - * Construct a new BufferUnderflowException. - * - * @param message the detail message for this exception - * @param exception the root cause of the exception - */ - public BufferUnderflowException(String message, Throwable exception) { - super(message); - throwable = exception; - } - - /** - * Gets the root cause of the exception. - * - * @return the root cause - */ - public final Throwable getCause() { - return throwable; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUtils.java deleted file mode 100644 index 7d61aa7f535..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/BufferUtils.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import org.apache.commons.collections.buffer.BlockingBuffer; -import org.apache.commons.collections.buffer.PredicatedBuffer; -import org.apache.commons.collections.buffer.SynchronizedBuffer; -import org.apache.commons.collections.buffer.TransformedBuffer; -import org.apache.commons.collections.buffer.TypedBuffer; -import org.apache.commons.collections.buffer.UnmodifiableBuffer; -import org.apache.commons.collections.buffer.BoundedBuffer; - -/** - * Provides utility methods and decorators for {@link Buffer} instances. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - * @author Stephen Colebourne - */ -public class BufferUtils { - - /** - * An empty unmodifiable buffer. - */ - public static final Buffer EMPTY_BUFFER = UnmodifiableBuffer.decorate(new ArrayStack(1)); - - /** - * BufferUtils should not normally be instantiated. - */ - public BufferUtils() { - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized buffer backed by the given buffer. - * Much like the synchronized collections returned by - * {@link java.util.Collections}, you must manually synchronize on - * the returned buffer's iterator to avoid non-deterministic behavior: - * - *

      -     * Buffer b = BufferUtils.synchronizedBuffer(myBuffer);
      -     * synchronized (b) {
      -     *     Iterator i = b.iterator();
      -     *     while (i.hasNext()) {
      -     *         process (i.next());
      -     *     }
      -     * }
      -     * 
      - * - * @param buffer the buffer to synchronize, must not be null - * @return a synchronized buffer backed by that buffer - * @throws IllegalArgumentException if the Buffer is null - */ - public static Buffer synchronizedBuffer(Buffer buffer) { - return SynchronizedBuffer.decorate(buffer); - } - - /** - * Returns a synchronized buffer backed by the given buffer that will - * block on {@link Buffer#get()} and {@link Buffer#remove()} operations. - * If the buffer is empty, then the {@link Buffer#get()} and - * {@link Buffer#remove()} operations will block until new elements - * are added to the buffer, rather than immediately throwing a - * BufferUnderflowException. - * - * @param buffer the buffer to synchronize, must not be null - * @return a blocking buffer backed by that buffer - * @throws IllegalArgumentException if the Buffer is null - */ - public static Buffer blockingBuffer(Buffer buffer) { - return BlockingBuffer.decorate(buffer); - } - - /** - * Returns a synchronized buffer backed by the given buffer that will - * block on {@link Buffer#get()} and {@link Buffer#remove()} operations - * until timeout expires. If the buffer is empty, then the - * {@link Buffer#get()} and {@link Buffer#remove()} operations will block - * until new elements are added to the buffer, rather than immediately - * throwing a BufferUnderflowException. - * - * @param buffer the buffer to synchronize, must not be null - * @param timeoutMillis the timeout value in milliseconds, zero or less for no timeout - * @return a blocking buffer backed by that buffer - * @throws IllegalArgumentException if the Buffer is null - * @since Commons Collections 3.2 - */ - public static Buffer blockingBuffer(Buffer buffer, long timeoutMillis) { - return BlockingBuffer.decorate(buffer, timeoutMillis); - } - - /** - * Returns a synchronized buffer backed by the given buffer that will - * block on {@link Buffer#add(Object)} and - * {@link Buffer#addAll(java.util.Collection)} until enough object(s) are - * removed from the buffer to allow the object(s) to be added and still - * maintain the maximum size. - * - * @param buffer the buffer to make bounded, must not be null - * @param maximumSize the maximum size - * @return a bounded buffer backed by the given buffer - * @throws IllegalArgumentException if the given buffer is null - * @since Commons Collections 3.2 - */ - public static Buffer boundedBuffer(Buffer buffer, int maximumSize) { - return BoundedBuffer.decorate(buffer, maximumSize); - } - - /** - * Returns a synchronized buffer backed by the given buffer that will - * block on {@link Buffer#add(Object)} and - * {@link Buffer#addAll(java.util.Collection)} until enough object(s) are - * removed from the buffer to allow the object(s) to be added and still - * maintain the maximum size or the timeout expires. - * - * @param buffer the buffer to make bounded, must not be null - * @param maximumSize the maximum size - * @param timeoutMillis the timeout value in milliseconds, zero or less for no timeout - * @return a bounded buffer backed by the given buffer - * @throws IllegalArgumentException if the given buffer is null - * @since Commons Collections 3.2 - */ - public static Buffer boundedBuffer(Buffer buffer, int maximumSize, long timeoutMillis) { - return BoundedBuffer.decorate(buffer, maximumSize, timeoutMillis); - } - - /** - * Returns an unmodifiable buffer backed by the given buffer. - * - * @param buffer the buffer to make unmodifiable, must not be null - * @return an unmodifiable buffer backed by that buffer - * @throws IllegalArgumentException if the Buffer is null - */ - public static Buffer unmodifiableBuffer(Buffer buffer) { - return UnmodifiableBuffer.decorate(buffer); - } - - /** - * Returns a predicated (validating) buffer backed by the given buffer. - *

      - * Only objects that pass the test in the given predicate can be added to the buffer. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original buffer after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param buffer the buffer to predicate, must not be null - * @param predicate the predicate used to evaluate new elements, must not be null - * @return a predicated buffer - * @throws IllegalArgumentException if the Buffer or Predicate is null - */ - public static Buffer predicatedBuffer(Buffer buffer, Predicate predicate) { - return PredicatedBuffer.decorate(buffer, predicate); - } - - /** - * Returns a typed buffer backed by the given buffer. - *

      - * Only elements of the specified type can be added to the buffer. - * - * @param buffer the buffer to predicate, must not be null - * @param type the type to allow into the buffer, must not be null - * @return a typed buffer - * @throws IllegalArgumentException if the buffer or type is null - */ - public static Buffer typedBuffer(Buffer buffer, Class type) { - return TypedBuffer.decorate(buffer, type); - } - - /** - * Returns a transformed buffer backed by the given buffer. - *

      - * Each object is passed through the transformer as it is added to the - * Buffer. It is important not to use the original buffer after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param buffer the buffer to predicate, must not be null - * @param transformer the transformer for the buffer, must not be null - * @return a transformed buffer backed by the given buffer - * @throws IllegalArgumentException if the Buffer or Transformer is null - */ - public static Buffer transformedBuffer(Buffer buffer, Transformer transformer) { - return TransformedBuffer.decorate(buffer, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Closure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Closure.java deleted file mode 100644 index 6409ddd2a52..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Closure.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a functor interface implemented by classes that do something. - *

      - * A Closure represents a block of code which is executed from - * inside some block, function or iteration. It operates an input object. - *

      - * Standard implementations of common closures are provided by - * {@link ClosureUtils}. These include method invokation and for/while loops. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Nicola Ken Barozzi - * @author Stephen Colebourne - */ -public interface Closure { - - /** - * Performs an action on the specified input object. - * - * @param input the input to execute on - * @throws ClassCastException (runtime) if the input is the wrong class - * @throws IllegalArgumentException (runtime) if the input is invalid - * @throws FunctorException (runtime) if any other error occurs - */ - public void execute(Object input); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ClosureUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ClosureUtils.java deleted file mode 100644 index 78669e5ccb2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ClosureUtils.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.functors.ChainedClosure; -import org.apache.commons.collections.functors.EqualPredicate; -import org.apache.commons.collections.functors.ExceptionClosure; -import org.apache.commons.collections.functors.ForClosure; -import org.apache.commons.collections.functors.IfClosure; -import org.apache.commons.collections.functors.InvokerTransformer; -import org.apache.commons.collections.functors.NOPClosure; -import org.apache.commons.collections.functors.SwitchClosure; -import org.apache.commons.collections.functors.TransformerClosure; -import org.apache.commons.collections.functors.WhileClosure; - -/** - * ClosureUtils provides reference implementations and utilities - * for the Closure functor interface. The supplied closures are: - *

        - *
      • Invoker - invokes a method on the input object - *
      • For - repeatedly calls a closure for a fixed number of times - *
      • While - repeatedly calls a closure while a predicate is true - *
      • DoWhile - repeatedly calls a closure while a predicate is true - *
      • Chained - chains two or more closures together - *
      • Switch - calls one closure based on one or more predicates - *
      • SwitchMap - calls one closure looked up from a Map - *
      • Transformer - wraps a Transformer as a Closure - *
      • NOP - does nothing - *
      • Exception - always throws an exception - *
      - * All the supplied closures are Serializable. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -public class ClosureUtils { - - /** - * This class is not normally instantiated. - */ - public ClosureUtils() { - super(); - } - - /** - * Gets a Closure that always throws an exception. - * This could be useful during testing as a placeholder. - * - * @see org.apache.commons.collections.functors.ExceptionClosure - * - * @return the closure - */ - public static Closure exceptionClosure() { - return ExceptionClosure.INSTANCE; - } - - /** - * Gets a Closure that will do nothing. - * This could be useful during testing as a placeholder. - * - * @see org.apache.commons.collections.functors.NOPClosure - * - * @return the closure - */ - public static Closure nopClosure() { - return NOPClosure.INSTANCE; - } - - /** - * Creates a Closure that calls a Transformer each time it is called. - * The transformer will be called using the closure's input object. - * The transformer's result will be ignored. - * - * @see org.apache.commons.collections.functors.TransformerClosure - * - * @param transformer the transformer to run each time in the closure, null means nop - * @return the closure - */ - public static Closure asClosure(Transformer transformer) { - return TransformerClosure.getInstance(transformer); - } - - /** - * Creates a Closure that will call the closure count times. - *

      - * A null closure or zero count returns the NOPClosure. - * - * @see org.apache.commons.collections.functors.ForClosure - * - * @param count the number of times to loop - * @param closure the closure to call repeatedly - * @return the for closure - */ - public static Closure forClosure(int count, Closure closure) { - return ForClosure.getInstance(count, closure); - } - - /** - * Creates a Closure that will call the closure repeatedly until the - * predicate returns false. - * - * @see org.apache.commons.collections.functors.WhileClosure - * - * @param predicate the predicate to use as an end of loop test, not null - * @param closure the closure to call repeatedly, not null - * @return the while closure - * @throws IllegalArgumentException if either argument is null - */ - public static Closure whileClosure(Predicate predicate, Closure closure) { - return WhileClosure.getInstance(predicate, closure, false); - } - - /** - * Creates a Closure that will call the closure once and then repeatedly - * until the predicate returns false. - * - * @see org.apache.commons.collections.functors.WhileClosure - * - * @param closure the closure to call repeatedly, not null - * @param predicate the predicate to use as an end of loop test, not null - * @return the do-while closure - * @throws IllegalArgumentException if either argument is null - */ - public static Closure doWhileClosure(Closure closure, Predicate predicate) { - return WhileClosure.getInstance(predicate, closure, true); - } - - /** - * Creates a Closure that will invoke a specific method on the closure's - * input object by reflection. - * - * @see org.apache.commons.collections.functors.InvokerTransformer - * @see org.apache.commons.collections.functors.TransformerClosure - * - * @param methodName the name of the method - * @return the invoker closure - * @throws IllegalArgumentException if the method name is null - */ - public static Closure invokerClosure(String methodName) { - // reuse transformer as it has caching - this is lazy really, should have inner class here - return asClosure(InvokerTransformer.getInstance(methodName)); - } - - /** - * Creates a Closure that will invoke a specific method on the closure's - * input object by reflection. - * - * @see org.apache.commons.collections.functors.InvokerTransformer - * @see org.apache.commons.collections.functors.TransformerClosure - * - * @param methodName the name of the method - * @param paramTypes the parameter types - * @param args the arguments - * @return the invoker closure - * @throws IllegalArgumentException if the method name is null - * @throws IllegalArgumentException if the paramTypes and args don't match - */ - public static Closure invokerClosure(String methodName, Class[] paramTypes, Object[] args) { - // reuse transformer as it has caching - this is lazy really, should have inner class here - return asClosure(InvokerTransformer.getInstance(methodName, paramTypes, args)); - } - - /** - * Create a new Closure that calls two Closures, passing the result of - * the first into the second. - * - * @see org.apache.commons.collections.functors.ChainedClosure - * - * @param closure1 the first closure - * @param closure2 the second closure - * @return the chained closure - * @throws IllegalArgumentException if either closure is null - */ - public static Closure chainedClosure(Closure closure1, Closure closure2) { - return ChainedClosure.getInstance(closure1, closure2); - } - - /** - * Create a new Closure that calls each closure in turn, passing the - * result into the next closure. - * - * @see org.apache.commons.collections.functors.ChainedClosure - * - * @param closures an array of closures to chain - * @return the chained closure - * @throws IllegalArgumentException if the closures array is null - * @throws IllegalArgumentException if any closure in the array is null - */ - public static Closure chainedClosure(Closure[] closures) { - return ChainedClosure.getInstance(closures); - } - - /** - * Create a new Closure that calls each closure in turn, passing the - * result into the next closure. The ordering is that of the iterator() - * method on the collection. - * - * @see org.apache.commons.collections.functors.ChainedClosure - * - * @param closures a collection of closures to chain - * @return the chained closure - * @throws IllegalArgumentException if the closures collection is null - * @throws IllegalArgumentException if the closures collection is empty - * @throws IllegalArgumentException if any closure in the collection is null - */ - public static Closure chainedClosure(Collection closures) { - return ChainedClosure.getInstance(closures); - } - - /** - * Create a new Closure that calls another closure based on the - * result of the specified predicate. - * - * @see org.apache.commons.collections.functors.IfClosure - * - * @param predicate the validating predicate - * @param trueClosure the closure called if the predicate is true - * @return the if closure - * @throws IllegalArgumentException if the predicate is null - * @throws IllegalArgumentException if the closure is null - * @since Commons Collections 3.2 - */ - public static Closure ifClosure(Predicate predicate, Closure trueClosure) { - return IfClosure.getInstance(predicate, trueClosure); - } - - /** - * Create a new Closure that calls one of two closures depending - * on the specified predicate. - * - * @see org.apache.commons.collections.functors.IfClosure - * - * @param predicate the predicate to switch on - * @param trueClosure the closure called if the predicate is true - * @param falseClosure the closure called if the predicate is false - * @return the switch closure - * @throws IllegalArgumentException if the predicate is null - * @throws IllegalArgumentException if either closure is null - */ - public static Closure ifClosure(Predicate predicate, Closure trueClosure, Closure falseClosure) { - return IfClosure.getInstance(predicate, trueClosure, falseClosure); - } - - /** - * Create a new Closure that calls one of the closures depending - * on the predicates. - *

      - * The closure at array location 0 is called if the predicate at array - * location 0 returned true. Each predicate is evaluated - * until one returns true. - * - * @see org.apache.commons.collections.functors.SwitchClosure - * - * @param predicates an array of predicates to check, not null - * @param closures an array of closures to call, not null - * @return the switch closure - * @throws IllegalArgumentException if the either array is null - * @throws IllegalArgumentException if any element in the arrays is null - * @throws IllegalArgumentException if the arrays are different sizes - */ - public static Closure switchClosure(Predicate[] predicates, Closure[] closures) { - return SwitchClosure.getInstance(predicates, closures, null); - } - - /** - * Create a new Closure that calls one of the closures depending - * on the predicates. - *

      - * The closure at array location 0 is called if the predicate at array - * location 0 returned true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * closure is called. - * - * @see org.apache.commons.collections.functors.SwitchClosure - * - * @param predicates an array of predicates to check, not null - * @param closures an array of closures to call, not null - * @param defaultClosure the default to call if no predicate matches - * @return the switch closure - * @throws IllegalArgumentException if the either array is null - * @throws IllegalArgumentException if any element in the arrays is null - * @throws IllegalArgumentException if the arrays are different sizes - */ - public static Closure switchClosure(Predicate[] predicates, Closure[] closures, Closure defaultClosure) { - return SwitchClosure.getInstance(predicates, closures, defaultClosure); - } - - /** - * Create a new Closure that calls one of the closures depending - * on the predicates. - *

      - * The Map consists of Predicate keys and Closure values. A closure - * is called if its matching predicate returns true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * closure is called. The default closure is set in the map with a - * null key. The ordering is that of the iterator() method on the entryset - * collection of the map. - * - * @see org.apache.commons.collections.functors.SwitchClosure - * - * @param predicatesAndClosures a map of predicates to closures - * @return the switch closure - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if the map is empty - * @throws IllegalArgumentException if any closure in the map is null - * @throws ClassCastException if the map elements are of the wrong type - */ - public static Closure switchClosure(Map predicatesAndClosures) { - return SwitchClosure.getInstance(predicatesAndClosures); - } - - /** - * Create a new Closure that uses the input object as a key to find the - * closure to call. - *

      - * The Map consists of object keys and Closure values. A closure - * is called if the input object equals the key. If there is no match, the - * default closure is called. The default closure is set in the map - * using a null key. - * - * @see org.apache.commons.collections.functors.SwitchClosure - * - * @param objectsAndClosures a map of objects to closures - * @return the closure - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if the map is empty - * @throws IllegalArgumentException if any closure in the map is null - */ - public static Closure switchMapClosure(Map objectsAndClosures) { - Closure[] trs = null; - Predicate[] preds = null; - if (objectsAndClosures == null) { - throw new IllegalArgumentException("The object and closure map must not be null"); - } - Closure def = (Closure) objectsAndClosures.remove(null); - int size = objectsAndClosures.size(); - trs = new Closure[size]; - preds = new Predicate[size]; - int i = 0; - for (Iterator it = objectsAndClosures.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - preds[i] = EqualPredicate.getInstance(entry.getKey()); - trs[i] = (Closure) entry.getValue(); - i++; - } - return switchClosure(preds, trs, def); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CollectionUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CollectionUtils.java deleted file mode 100644 index 3ba27f1820e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CollectionUtils.java +++ /dev/null @@ -1,1211 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.collection.PredicatedCollection; -import org.apache.commons.collections.collection.SynchronizedCollection; -import org.apache.commons.collections.collection.TransformedCollection; -import org.apache.commons.collections.collection.TypedCollection; -import org.apache.commons.collections.collection.UnmodifiableBoundedCollection; -import org.apache.commons.collections.collection.UnmodifiableCollection; - -/** - * Provides utility methods and decorators for {@link Collection} instances. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - * @author Paul Jack - * @author Stephen Colebourne - * @author Steve Downey - * @author Herve Quiroz - * @author Peter KoBek - * @author Matthew Hawthorne - * @author Janek Bogucki - * @author Phil Steitz - * @author Steven Melzer - * @author Jon Schewe - * @author Neil O'Toole - * @author Stephen Smith - */ -public class CollectionUtils { - - /** Constant to avoid repeated object creation */ - private static Integer INTEGER_ONE = new Integer(1); - - /** - * An empty unmodifiable collection. - * The JDK provides empty Set and List implementations which could be used for - * this purpose. However they could be cast to Set or List which might be - * undesirable. This implementation only implements Collection. - */ - public static final Collection EMPTY_COLLECTION = UnmodifiableCollection.decorate(new ArrayList()); - - /** - * CollectionUtils should not normally be instantiated. - */ - public CollectionUtils() { - } - - /** - * Returns a {@link Collection} containing the union - * of the given {@link Collection}s. - *

      - * The cardinality of each element in the returned {@link Collection} - * will be equal to the maximum of the cardinality of that element - * in the two given {@link Collection}s. - * - * @param a the first collection, must not be null - * @param b the second collection, must not be null - * @return the union of the two collections - * @see Collection#addAll - */ - public static Collection union(final Collection a, final Collection b) { - ArrayList list = new ArrayList(); - Map mapa = getCardinalityMap(a); - Map mapb = getCardinalityMap(b); - Set elts = new HashSet(a); - elts.addAll(b); - Iterator it = elts.iterator(); - while(it.hasNext()) { - Object obj = it.next(); - for(int i=0,m=Math.max(getFreq(obj,mapa),getFreq(obj,mapb));i - * The cardinality of each element in the returned {@link Collection} - * will be equal to the minimum of the cardinality of that element - * in the two given {@link Collection}s. - * - * @param a the first collection, must not be null - * @param b the second collection, must not be null - * @return the intersection of the two collections - * @see Collection#retainAll - * @see #containsAny - */ - public static Collection intersection(final Collection a, final Collection b) { - ArrayList list = new ArrayList(); - Map mapa = getCardinalityMap(a); - Map mapb = getCardinalityMap(b); - Set elts = new HashSet(a); - elts.addAll(b); - Iterator it = elts.iterator(); - while(it.hasNext()) { - Object obj = it.next(); - for(int i=0,m=Math.min(getFreq(obj,mapa),getFreq(obj,mapb));i - * The cardinality of each element e in the returned {@link Collection} - * will be equal to - * max(cardinality(e,a),cardinality(e,b)) - min(cardinality(e,a),cardinality(e,b)). - *

      - * This is equivalent to - * {@link #subtract subtract}({@link #union union(a,b)},{@link #intersection intersection(a,b)}) - * or - * {@link #union union}({@link #subtract subtract(a,b)},{@link #subtract subtract(b,a)}). - * - * @param a the first collection, must not be null - * @param b the second collection, must not be null - * @return the symmetric difference of the two collections - */ - public static Collection disjunction(final Collection a, final Collection b) { - ArrayList list = new ArrayList(); - Map mapa = getCardinalityMap(a); - Map mapb = getCardinalityMap(b); - Set elts = new HashSet(a); - elts.addAll(b); - Iterator it = elts.iterator(); - while(it.hasNext()) { - Object obj = it.next(); - for(int i=0,m=((Math.max(getFreq(obj,mapa),getFreq(obj,mapb)))-(Math.min(getFreq(obj,mapa),getFreq(obj,mapb))));ia - b. - * The cardinality of each element e in the returned {@link Collection} - * will be the cardinality of e in a minus the cardinality - * of e in b, or zero, whichever is greater. - * - * @param a the collection to subtract from, must not be null - * @param b the collection to subtract, must not be null - * @return a new collection with the results - * @see Collection#removeAll - */ - public static Collection subtract(final Collection a, final Collection b) { - ArrayList list = new ArrayList( a ); - for (Iterator it = b.iterator(); it.hasNext();) { - list.remove(it.next()); - } - return list; - } - - /** - * Returns true iff at least one element is in both collections. - *

      - * In other words, this method returns true iff the - * {@link #intersection} of coll1 and coll2 is not empty. - * - * @param coll1 the first collection, must not be null - * @param coll2 the first collection, must not be null - * @return true iff the intersection of the collections is non-empty - * @since 2.1 - * @see #intersection - */ - public static boolean containsAny(final Collection coll1, final Collection coll2) { - if (coll1.size() < coll2.size()) { - for (Iterator it = coll1.iterator(); it.hasNext();) { - if (coll2.contains(it.next())) { - return true; - } - } - } else { - for (Iterator it = coll2.iterator(); it.hasNext();) { - if (coll1.contains(it.next())) { - return true; - } - } - } - return false; - } - - /** - * Returns a {@link Map} mapping each unique element in the given - * {@link Collection} to an {@link Integer} representing the number - * of occurrences of that element in the {@link Collection}. - *

      - * Only those elements present in the collection will appear as - * keys in the map. - * - * @param coll the collection to get the cardinality map for, must not be null - * @return the populated cardinality map - */ - public static Map getCardinalityMap(final Collection coll) { - Map count = new HashMap(); - for (Iterator it = coll.iterator(); it.hasNext();) { - Object obj = it.next(); - Integer c = (Integer) (count.get(obj)); - if (c == null) { - count.put(obj,INTEGER_ONE); - } else { - count.put(obj,new Integer(c.intValue() + 1)); - } - } - return count; - } - - /** - * Returns true iff a is a sub-collection of b, - * that is, iff the cardinality of e in a is less - * than or equal to the cardinality of e in b, - * for each element e in a. - * - * @param a the first (sub?) collection, must not be null - * @param b the second (super?) collection, must not be null - * @return true iff a is a sub-collection of b - * @see #isProperSubCollection - * @see Collection#containsAll - */ - public static boolean isSubCollection(final Collection a, final Collection b) { - Map mapa = getCardinalityMap(a); - Map mapb = getCardinalityMap(b); - Iterator it = a.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - if (getFreq(obj, mapa) > getFreq(obj, mapb)) { - return false; - } - } - return true; - } - - /** - * Returns true iff a is a proper sub-collection of b, - * that is, iff the cardinality of e in a is less - * than or equal to the cardinality of e in b, - * for each element e in a, and there is at least one - * element f such that the cardinality of f in b - * is strictly greater than the cardinality of f in a. - *

      - * The implementation assumes - *

        - *
      • a.size() and b.size() represent the - * total cardinality of a and b, resp.
      • - *
      • a.size() < Integer.MAXVALUE
      • - *
      - * - * @param a the first (sub?) collection, must not be null - * @param b the second (super?) collection, must not be null - * @return true iff a is a proper sub-collection of b - * @see #isSubCollection - * @see Collection#containsAll - */ - public static boolean isProperSubCollection(final Collection a, final Collection b) { - return (a.size() < b.size()) && CollectionUtils.isSubCollection(a,b); - } - - /** - * Returns true iff the given {@link Collection}s contain - * exactly the same elements with exactly the same cardinalities. - *

      - * That is, iff the cardinality of e in a is - * equal to the cardinality of e in b, - * for each element e in a or b. - * - * @param a the first collection, must not be null - * @param b the second collection, must not be null - * @return true iff the collections contain the same elements with the same cardinalities. - */ - public static boolean isEqualCollection(final Collection a, final Collection b) { - if(a.size() != b.size()) { - return false; - } else { - Map mapa = getCardinalityMap(a); - Map mapb = getCardinalityMap(b); - if(mapa.size() != mapb.size()) { - return false; - } else { - Iterator it = mapa.keySet().iterator(); - while(it.hasNext()) { - Object obj = it.next(); - if(getFreq(obj,mapa) != getFreq(obj,mapb)) { - return false; - } - } - return true; - } - } - } - - /** - * Returns the number of occurrences of obj in coll. - * - * @param obj the object to find the cardinality of - * @param coll the collection to search - * @return the the number of occurrences of obj in coll - */ - public static int cardinality(Object obj, final Collection coll) { - if (coll instanceof Set) { - return (coll.contains(obj) ? 1 : 0); - } - if (coll instanceof Bag) { - return ((Bag) coll).getCount(obj); - } - int count = 0; - if (obj == null) { - for (Iterator it = coll.iterator();it.hasNext();) { - if (it.next() == null) { - count++; - } - } - } else { - for (Iterator it = coll.iterator();it.hasNext();) { - if (obj.equals(it.next())) { - count++; - } - } - } - return count; - } - - /** - * Finds the first element in the given collection which matches the given predicate. - *

      - * If the input collection or predicate is null, or no element of the collection - * matches the predicate, null is returned. - * - * @param collection the collection to search, may be null - * @param predicate the predicate to use, may be null - * @return the first element of the collection which matches the predicate or null if none could be found - */ - public static Object find(Collection collection, Predicate predicate) { - if (collection != null && predicate != null) { - for (Iterator iter = collection.iterator(); iter.hasNext();) { - Object item = iter.next(); - if (predicate.evaluate(item)) { - return item; - } - } - } - return null; - } - - /** - * Executes the given closure on each element in the collection. - *

      - * If the input collection or closure is null, there is no change made. - * - * @param collection the collection to get the input from, may be null - * @param closure the closure to perform, may be null - */ - public static void forAllDo(Collection collection, Closure closure) { - if (collection != null && closure != null) { - for (Iterator it = collection.iterator(); it.hasNext();) { - closure.execute(it.next()); - } - } - } - - /** - * Filter the collection by applying a Predicate to each element. If the - * predicate returns false, remove the element. - *

      - * If the input collection or predicate is null, there is no change made. - * - * @param collection the collection to get the input from, may be null - * @param predicate the predicate to use as a filter, may be null - */ - public static void filter(Collection collection, Predicate predicate) { - if (collection != null && predicate != null) { - for (Iterator it = collection.iterator(); it.hasNext();) { - if (predicate.evaluate(it.next()) == false) { - it.remove(); - } - } - } - } - - /** - * Transform the collection by applying a Transformer to each element. - *

      - * If the input collection or transformer is null, there is no change made. - *

      - * This routine is best for Lists, for which set() is used to do the - * transformations "in place." For other Collections, clear() and addAll() - * are used to replace elements. - *

      - * If the input collection controls its input, such as a Set, and the - * Transformer creates duplicates (or are otherwise invalid), the - * collection may reduce in size due to calling this method. - * - * @param collection the collection to get the input from, may be null - * @param transformer the transformer to perform, may be null - */ - public static void transform(Collection collection, Transformer transformer) { - if (collection != null && transformer != null) { - if (collection instanceof List) { - List list = (List) collection; - for (ListIterator it = list.listIterator(); it.hasNext();) { - it.set(transformer.transform(it.next())); - } - } else { - Collection resultCollection = collect(collection, transformer); - collection.clear(); - collection.addAll(resultCollection); - } - } - } - - /** - * Counts the number of elements in the input collection that match the predicate. - *

      - * A null collection or predicate matches no elements. - * - * @param inputCollection the collection to get the input from, may be null - * @param predicate the predicate to use, may be null - * @return the number of matches for the predicate in the collection - */ - public static int countMatches(Collection inputCollection, Predicate predicate) { - int count = 0; - if (inputCollection != null && predicate != null) { - for (Iterator it = inputCollection.iterator(); it.hasNext();) { - if (predicate.evaluate(it.next())) { - count++; - } - } - } - return count; - } - - /** - * Answers true if a predicate is true for at least one element of a collection. - *

      - * A null collection or predicate returns false. - * - * @param collection the collection to get the input from, may be null - * @param predicate the predicate to use, may be null - * @return true if at least one element of the collection matches the predicate - */ - public static boolean exists(Collection collection, Predicate predicate) { - if (collection != null && predicate != null) { - for (Iterator it = collection.iterator(); it.hasNext();) { - if (predicate.evaluate(it.next())) { - return true; - } - } - } - return false; - } - - /** - * Selects all elements from input collection which match the given predicate - * into an output collection. - *

      - * A null predicate matches no elements. - * - * @param inputCollection the collection to get the input from, may not be null - * @param predicate the predicate to use, may be null - * @return the elements matching the predicate (new list) - * @throws NullPointerException if the input collection is null - */ - public static Collection select(Collection inputCollection, Predicate predicate) { - ArrayList answer = new ArrayList(inputCollection.size()); - select(inputCollection, predicate, answer); - return answer; - } - - /** - * Selects all elements from input collection which match the given predicate - * and adds them to outputCollection. - *

      - * If the input collection or predicate is null, there is no change to the - * output collection. - * - * @param inputCollection the collection to get the input from, may be null - * @param predicate the predicate to use, may be null - * @param outputCollection the collection to output into, may not be null - */ - public static void select(Collection inputCollection, Predicate predicate, Collection outputCollection) { - if (inputCollection != null && predicate != null) { - for (Iterator iter = inputCollection.iterator(); iter.hasNext();) { - Object item = iter.next(); - if (predicate.evaluate(item)) { - outputCollection.add(item); - } - } - } - } - - /** - * Selects all elements from inputCollection which don't match the given predicate - * into an output collection. - *

      - * If the input predicate is null, the result is an empty list. - * - * @param inputCollection the collection to get the input from, may not be null - * @param predicate the predicate to use, may be null - * @return the elements not matching the predicate (new list) - * @throws NullPointerException if the input collection is null - */ - public static Collection selectRejected(Collection inputCollection, Predicate predicate) { - ArrayList answer = new ArrayList(inputCollection.size()); - selectRejected(inputCollection, predicate, answer); - return answer; - } - - /** - * Selects all elements from inputCollection which don't match the given predicate - * and adds them to outputCollection. - *

      - * If the input predicate is null, no elements are added to outputCollection. - * - * @param inputCollection the collection to get the input from, may be null - * @param predicate the predicate to use, may be null - * @param outputCollection the collection to output into, may not be null - */ - public static void selectRejected(Collection inputCollection, Predicate predicate, Collection outputCollection) { - if (inputCollection != null && predicate != null) { - for (Iterator iter = inputCollection.iterator(); iter.hasNext();) { - Object item = iter.next(); - if (predicate.evaluate(item) == false) { - outputCollection.add(item); - } - } - } - } - - /** - * Returns a new Collection consisting of the elements of inputCollection transformed - * by the given transformer. - *

      - * If the input transformer is null, the result is an empty list. - * - * @param inputCollection the collection to get the input from, may not be null - * @param transformer the transformer to use, may be null - * @return the transformed result (new list) - * @throws NullPointerException if the input collection is null - */ - public static Collection collect(Collection inputCollection, Transformer transformer) { - ArrayList answer = new ArrayList(inputCollection.size()); - collect(inputCollection, transformer, answer); - return answer; - } - - /** - * Transforms all elements from the inputIterator with the given transformer - * and adds them to the outputCollection. - *

      - * If the input iterator or transformer is null, the result is an empty list. - * - * @param inputIterator the iterator to get the input from, may be null - * @param transformer the transformer to use, may be null - * @return the transformed result (new list) - */ - public static Collection collect(Iterator inputIterator, Transformer transformer) { - ArrayList answer = new ArrayList(); - collect(inputIterator, transformer, answer); - return answer; - } - - /** - * Transforms all elements from inputCollection with the given transformer - * and adds them to the outputCollection. - *

      - * If the input collection or transformer is null, there is no change to the - * output collection. - * - * @param inputCollection the collection to get the input from, may be null - * @param transformer the transformer to use, may be null - * @param outputCollection the collection to output into, may not be null - * @return the outputCollection with the transformed input added - * @throws NullPointerException if the output collection is null - */ - public static Collection collect(Collection inputCollection, final Transformer transformer, final Collection outputCollection) { - if (inputCollection != null) { - return collect(inputCollection.iterator(), transformer, outputCollection); - } - return outputCollection; - } - - /** - * Transforms all elements from the inputIterator with the given transformer - * and adds them to the outputCollection. - *

      - * If the input iterator or transformer is null, there is no change to the - * output collection. - * - * @param inputIterator the iterator to get the input from, may be null - * @param transformer the transformer to use, may be null - * @param outputCollection the collection to output into, may not be null - * @return the outputCollection with the transformed input added - * @throws NullPointerException if the output collection is null - */ - public static Collection collect(Iterator inputIterator, final Transformer transformer, final Collection outputCollection) { - if (inputIterator != null && transformer != null) { - while (inputIterator.hasNext()) { - Object item = inputIterator.next(); - Object value = transformer.transform(item); - outputCollection.add(value); - } - } - return outputCollection; - } - - //----------------------------------------------------------------------- - /** - * Adds an element to the collection unless the element is null. - * - * @param collection the collection to add to, must not be null - * @param object the object to add, if null it will not be added - * @return true if the collection changed - * @throws NullPointerException if the collection is null - * @since Commons Collections 3.2 - */ - public static boolean addIgnoreNull(Collection collection, Object object) { - return (object == null ? false : collection.add(object)); - } - - /** - * Adds all elements in the iteration to the given collection. - * - * @param collection the collection to add to, must not be null - * @param iterator the iterator of elements to add, must not be null - * @throws NullPointerException if the collection or iterator is null - */ - public static void addAll(Collection collection, Iterator iterator) { - while (iterator.hasNext()) { - collection.add(iterator.next()); - } - } - - /** - * Adds all elements in the enumeration to the given collection. - * - * @param collection the collection to add to, must not be null - * @param enumeration the enumeration of elements to add, must not be null - * @throws NullPointerException if the collection or enumeration is null - */ - public static void addAll(Collection collection, Enumeration enumeration) { - while (enumeration.hasMoreElements()) { - collection.add(enumeration.nextElement()); - } - } - - /** - * Adds all elements in the array to the given collection. - * - * @param collection the collection to add to, must not be null - * @param elements the array of elements to add, must not be null - * @throws NullPointerException if the collection or array is null - */ - public static void addAll(Collection collection, Object[] elements) { - for (int i = 0, size = elements.length; i < size; i++) { - collection.add(elements[i]); - } - } - - /** - * Given an Object, and an index, returns the nth value in the - * object. - *

        - *
      • If obj is a Map, returns the nth value from the keySet iterator, unless - * the Map contains an Integer key with integer value = idx, in which case the - * corresponding map entry value is returned. If idx exceeds the number of entries in - * the map, an empty Iterator is returned. - *
      • If obj is a List or an array, returns the nth value, throwing IndexOutOfBoundsException, - * ArrayIndexOutOfBoundsException, resp. if the nth value does not exist. - *
      • If obj is an iterator, enumeration or Collection, returns the nth value from the iterator, - * returning an empty Iterator (resp. Enumeration) if the nth value does not exist. - *
      • Returns the original obj if it is null or not a Collection or Iterator. - *
      - * - * @param obj the object to get an index of, may be null - * @param idx the index to get - * @throws IndexOutOfBoundsException - * @throws ArrayIndexOutOfBoundsException - * - * @deprecated use {@link #get(Object, int)} instead. Will be removed in v4.0 - */ - public static Object index(Object obj, int idx) { - return index(obj, new Integer(idx)); - } - - /** - * Given an Object, and a key (index), returns the value associated with - * that key in the Object. The following checks are made: - *
        - *
      • If obj is a Map, use the index as a key to get a value. If no match continue. - *
      • Check key is an Integer. If not, return the object passed in. - *
      • If obj is a Map, get the nth value from the keySet iterator. - * If the Map has fewer than n entries, return an empty Iterator. - *
      • If obj is a List or an array, get the nth value, throwing IndexOutOfBoundsException, - * ArrayIndexOutOfBoundsException, resp. if the nth value does not exist. - *
      • If obj is an iterator, enumeration or Collection, get the nth value from the iterator, - * returning an empty Iterator (resp. Enumeration) if the nth value does not exist. - *
      • Return the original obj. - *
      - * - * @param obj the object to get an index of - * @param index the index to get - * @return the object at the specified index - * @throws IndexOutOfBoundsException - * @throws ArrayIndexOutOfBoundsException - * - * @deprecated use {@link #get(Object, int)} instead. Will be removed in v4.0 - */ - public static Object index(Object obj, Object index) { - if(obj instanceof Map) { - Map map = (Map)obj; - if(map.containsKey(index)) { - return map.get(index); - } - } - int idx = -1; - if(index instanceof Integer) { - idx = ((Integer)index).intValue(); - } - if(idx < 0) { - return obj; - } - else if(obj instanceof Map) { - Map map = (Map)obj; - Iterator iterator = map.keySet().iterator(); - return index(iterator, idx); - } - else if(obj instanceof List) { - return ((List)obj).get(idx); - } - else if(obj instanceof Object[]) { - return ((Object[])obj)[idx]; - } - else if(obj instanceof Enumeration) { - Enumeration it = (Enumeration)obj; - while(it.hasMoreElements()) { - idx--; - if(idx == -1) { - return it.nextElement(); - } else { - it.nextElement(); - } - } - } - else if(obj instanceof Iterator) { - return index((Iterator)obj, idx); - } - else if(obj instanceof Collection) { - Iterator iterator = ((Collection)obj).iterator(); - return index(iterator, idx); - } - return obj; - } - - private static Object index(Iterator iterator, int idx) { - while(iterator.hasNext()) { - idx--; - if(idx == -1) { - return iterator.next(); - } else { - iterator.next(); - } - } - return iterator; - } - - /** - * Returns the index-th value in object, throwing - * IndexOutOfBoundsException if there is no such element or - * IllegalArgumentException if object is not an - * instance of one of the supported types. - *

      - * The supported types, and associated semantics are: - *

        - *
      • Map -- the value returned is the Map.Entry in position - * index in the map's entrySet iterator, - * if there is such an entry.
      • - *
      • List -- this method is equivalent to the list's get method.
      • - *
      • Array -- the index-th array entry is returned, - * if there is such an entry; otherwise an IndexOutOfBoundsException - * is thrown.
      • - *
      • Collection -- the value returned is the index-th object - * returned by the collection's default iterator, if there is such an element.
      • - *
      • Iterator or Enumeration -- the value returned is the - * index-th object in the Iterator/Enumeration, if there - * is such an element. The Iterator/Enumeration is advanced to - * index (or to the end, if index exceeds the - * number of entries) as a side effect of this method.
      • - *
      - * - * @param object the object to get a value from - * @param index the index to get - * @return the object at the specified index - * @throws IndexOutOfBoundsException if the index is invalid - * @throws IllegalArgumentException if the object type is invalid - */ - public static Object get(Object object, int index) { - if (index < 0) { - throw new IndexOutOfBoundsException("Index cannot be negative: " + index); - } - if (object instanceof Map) { - Map map = (Map) object; - Iterator iterator = map.entrySet().iterator(); - return get(iterator, index); - } else if (object instanceof List) { - return ((List) object).get(index); - } else if (object instanceof Object[]) { - return ((Object[]) object)[index]; - } else if (object instanceof Iterator) { - Iterator it = (Iterator) object; - while (it.hasNext()) { - index--; - if (index == -1) { - return it.next(); - } else { - it.next(); - } - } - throw new IndexOutOfBoundsException("Entry does not exist: " + index); - } else if (object instanceof Collection) { - Iterator iterator = ((Collection) object).iterator(); - return get(iterator, index); - } else if (object instanceof Enumeration) { - Enumeration it = (Enumeration) object; - while (it.hasMoreElements()) { - index--; - if (index == -1) { - return it.nextElement(); - } else { - it.nextElement(); - } - } - throw new IndexOutOfBoundsException("Entry does not exist: " + index); - } else if (object == null) { - throw new IllegalArgumentException("Unsupported object type: null"); - } else { - try { - return Array.get(object, index); - } catch (IllegalArgumentException ex) { - throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName()); - } - } - } - - /** - * Gets the size of the collection/iterator specified. - *

      - * This method can handles objects as follows - *

        - *
      • Collection - the collection size - *
      • Map - the map size - *
      • Array - the array size - *
      • Iterator - the number of elements remaining in the iterator - *
      • Enumeration - the number of elements remaining in the enumeration - *
      - * - * @param object the object to get the size of - * @return the size of the specified collection - * @throws IllegalArgumentException thrown if object is not recognised or null - * @since Commons Collections 3.1 - */ - public static int size(Object object) { - int total = 0; - if (object instanceof Map) { - total = ((Map) object).size(); - } else if (object instanceof Collection) { - total = ((Collection) object).size(); - } else if (object instanceof Object[]) { - total = ((Object[]) object).length; - } else if (object instanceof Iterator) { - Iterator it = (Iterator) object; - while (it.hasNext()) { - total++; - it.next(); - } - } else if (object instanceof Enumeration) { - Enumeration it = (Enumeration) object; - while (it.hasMoreElements()) { - total++; - it.nextElement(); - } - } else if (object == null) { - throw new IllegalArgumentException("Unsupported object type: null"); - } else { - try { - total = Array.getLength(object); - } catch (IllegalArgumentException ex) { - throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName()); - } - } - return total; - } - - /** - * Checks if the specified collection/array/iterator is empty. - *

      - * This method can handles objects as follows - *

        - *
      • Collection - via collection isEmpty - *
      • Map - via map isEmpty - *
      • Array - using array size - *
      • Iterator - via hasNext - *
      • Enumeration - via hasMoreElements - *
      - *

      - * Note: This method is named to avoid clashing with - * {@link #isEmpty(Collection)}. - * - * @param object the object to get the size of, not null - * @return true if empty - * @throws IllegalArgumentException thrown if object is not recognised or null - * @since Commons Collections 3.2 - */ - public static boolean sizeIsEmpty(Object object) { - if (object instanceof Collection) { - return ((Collection) object).isEmpty(); - } else if (object instanceof Map) { - return ((Map) object).isEmpty(); - } else if (object instanceof Object[]) { - return ((Object[]) object).length == 0; - } else if (object instanceof Iterator) { - return ((Iterator) object).hasNext() == false; - } else if (object instanceof Enumeration) { - return ((Enumeration) object).hasMoreElements() == false; - } else if (object == null) { - throw new IllegalArgumentException("Unsupported object type: null"); - } else { - try { - return Array.getLength(object) == 0; - } catch (IllegalArgumentException ex) { - throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName()); - } - } - } - - //----------------------------------------------------------------------- - /** - * Null-safe check if the specified collection is empty. - *

      - * Null returns true. - * - * @param coll the collection to check, may be null - * @return true if empty or null - * @since Commons Collections 3.2 - */ - public static boolean isEmpty(Collection coll) { - return (coll == null || coll.isEmpty()); - } - - /** - * Null-safe check if the specified collection is not empty. - *

      - * Null returns false. - * - * @param coll the collection to check, may be null - * @return true if non-null and non-empty - * @since Commons Collections 3.2 - */ - public static boolean isNotEmpty(Collection coll) { - return !CollectionUtils.isEmpty(coll); - } - - //----------------------------------------------------------------------- - /** - * Reverses the order of the given array. - * - * @param array the array to reverse - */ - public static void reverseArray(Object[] array) { - int i = 0; - int j = array.length - 1; - Object tmp; - - while (j > i) { - tmp = array[j]; - array[j] = array[i]; - array[i] = tmp; - j--; - i++; - } - } - - private static final int getFreq(final Object obj, final Map freqMap) { - Integer count = (Integer) freqMap.get(obj); - if (count != null) { - return count.intValue(); - } - return 0; - } - - /** - * Returns true if no more elements can be added to the Collection. - *

      - * This method uses the {@link BoundedCollection} interface to determine the - * full status. If the collection does not implement this interface then - * false is returned. - *

      - * The collection does not have to implement this interface directly. - * If the collection has been decorated using the decorators subpackage - * then these will be removed to access the BoundedCollection. - * - * @param coll the collection to check - * @return true if the BoundedCollection is full - * @throws NullPointerException if the collection is null - */ - public static boolean isFull(Collection coll) { - if (coll == null) { - throw new NullPointerException("The collection must not be null"); - } - if (coll instanceof BoundedCollection) { - return ((BoundedCollection) coll).isFull(); - } - try { - BoundedCollection bcoll = UnmodifiableBoundedCollection.decorateUsing(coll); - return bcoll.isFull(); - - } catch (IllegalArgumentException ex) { - return false; - } - } - - /** - * Get the maximum number of elements that the Collection can contain. - *

      - * This method uses the {@link BoundedCollection} interface to determine the - * maximum size. If the collection does not implement this interface then - * -1 is returned. - *

      - * The collection does not have to implement this interface directly. - * If the collection has been decorated using the decorators subpackage - * then these will be removed to access the BoundedCollection. - * - * @param coll the collection to check - * @return the maximum size of the BoundedCollection, -1 if no maximum size - * @throws NullPointerException if the collection is null - */ - public static int maxSize(Collection coll) { - if (coll == null) { - throw new NullPointerException("The collection must not be null"); - } - if (coll instanceof BoundedCollection) { - return ((BoundedCollection) coll).maxSize(); - } - try { - BoundedCollection bcoll = UnmodifiableBoundedCollection.decorateUsing(coll); - return bcoll.maxSize(); - - } catch (IllegalArgumentException ex) { - return -1; - } - } - - //----------------------------------------------------------------------- - /** - * Returns a collection containing all the elements in collection - * that are also in retain. The cardinality of an element e - * in the returned collection is the same as the cardinality of e - * in collection unless retain does not contain e, in which - * case the cardinality is zero. This method is useful if you do not wish to modify - * the collection c and thus cannot call c.retainAll(retain);. - * - * @param collection the collection whose contents are the target of the #retailAll operation - * @param retain the collection containing the elements to be retained in the returned collection - * @return a Collection containing all the elements of collection - * that occur at least once in retain. - * @throws NullPointerException if either parameter is null - * @since Commons Collections 3.2 - */ - public static Collection retainAll(Collection collection, Collection retain) { - return ListUtils.retainAll(collection, retain); - } - - /** - * Removes the elements in remove from collection. That is, this - * method returns a collection containing all the elements in c - * that are not in remove. The cardinality of an element e - * in the returned collection is the same as the cardinality of e - * in collection unless remove contains e, in which - * case the cardinality is zero. This method is useful if you do not wish to modify - * the collection c and thus cannot call collection.removeAll(remove);. - * - * @param collection the collection from which items are removed (in the returned collection) - * @param remove the items to be removed from the returned collection - * @return a Collection containing all the elements of collection except - * any elements that also occur in remove. - * @throws NullPointerException if either parameter is null - * @since Commons Collections 3.2 - */ - public static Collection removeAll(Collection collection, Collection remove) { - return ListUtils.retainAll(collection, remove); - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized collection backed by the given collection. - *

      - * You must manually synchronize on the returned buffer's iterator to - * avoid non-deterministic behavior: - * - *

      -     * Collection c = CollectionUtils.synchronizedCollection(myCollection);
      -     * synchronized (c) {
      -     *     Iterator i = c.iterator();
      -     *     while (i.hasNext()) {
      -     *         process (i.next());
      -     *     }
      -     * }
      -     * 
      - * - * This method uses the implementation in the decorators subpackage. - * - * @param collection the collection to synchronize, must not be null - * @return a synchronized collection backed by the given collection - * @throws IllegalArgumentException if the collection is null - */ - public static Collection synchronizedCollection(Collection collection) { - return SynchronizedCollection.decorate(collection); - } - - /** - * Returns an unmodifiable collection backed by the given collection. - *

      - * This method uses the implementation in the decorators subpackage. - * - * @param collection the collection to make unmodifiable, must not be null - * @return an unmodifiable collection backed by the given collection - * @throws IllegalArgumentException if the collection is null - */ - public static Collection unmodifiableCollection(Collection collection) { - return UnmodifiableCollection.decorate(collection); - } - - /** - * Returns a predicated (validating) collection backed by the given collection. - *

      - * Only objects that pass the test in the given predicate can be added to the collection. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original collection after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param collection the collection to predicate, must not be null - * @param predicate the predicate for the collection, must not be null - * @return a predicated collection backed by the given collection - * @throws IllegalArgumentException if the Collection is null - */ - public static Collection predicatedCollection(Collection collection, Predicate predicate) { - return PredicatedCollection.decorate(collection, predicate); - } - - /** - * Returns a typed collection backed by the given collection. - *

      - * Only objects of the specified type can be added to the collection. - * - * @param collection the collection to limit to a specific type, must not be null - * @param type the type of objects which may be added to the collection - * @return a typed collection backed by the specified collection - */ - public static Collection typedCollection(Collection collection, Class type) { - return TypedCollection.decorate(collection, type); - } - - /** - * Returns a transformed bag backed by the given collection. - *

      - * Each object is passed through the transformer as it is added to the - * Collection. It is important not to use the original collection after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param collection the collection to predicate, must not be null - * @param transformer the transformer for the collection, must not be null - * @return a transformed collection backed by the given collection - * @throws IllegalArgumentException if the Collection or Transformer is null - */ - public static Collection transformedCollection(Collection collection, Transformer transformer) { - return TransformedCollection.decorate(collection, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ComparatorUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ComparatorUtils.java deleted file mode 100644 index ca996fe6e83..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ComparatorUtils.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Comparator; - -import org.apache.commons.collections.comparators.BooleanComparator; -import org.apache.commons.collections.comparators.ComparableComparator; -import org.apache.commons.collections.comparators.ComparatorChain; -import org.apache.commons.collections.comparators.NullComparator; -import org.apache.commons.collections.comparators.ReverseComparator; -import org.apache.commons.collections.comparators.TransformingComparator; - -/** - * Provides convenient static utility methods for Comparator - * objects. - *

      - * Most of the functionality in this class can also be found in the - * comparators package. This class merely provides a - * convenient central place if you have use for more than one class - * in the comparators subpackage. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - * @author Stephen Colebourne - */ -public class ComparatorUtils { - - /** - * ComparatorUtils should not normally be instantiated. - */ - public ComparatorUtils() { - } - - /** - * Comparator for natural sort order. - * - * @see ComparableComparator#getInstance - */ - public static final Comparator NATURAL_COMPARATOR = ComparableComparator.getInstance(); - - /** - * Gets a comparator that uses the natural order of the objects. - * - * @return a comparator which uses natural order - */ - public static Comparator naturalComparator() { - return NATURAL_COMPARATOR; - } - - /** - * Gets a comparator that compares using two {@link Comparator}s. - *

      - * The second comparator is used if the first comparator returns equal. - * - * @param comparator1 the first comparator to use, not null - * @param comparator2 the first comparator to use, not null - * @return a {@link ComparatorChain} formed from the two comparators - * @throws NullPointerException if either comparator is null - * @see ComparatorChain - */ - public static Comparator chainedComparator(Comparator comparator1, Comparator comparator2) { - return chainedComparator(new Comparator[] {comparator1, comparator2}); - } - - /** - * Gets a comparator that compares using an array of {@link Comparator}s, applied - * in sequence until one returns not equal or the array is exhausted. - * - * @param comparators the comparators to use, not null or empty or containing nulls - * @return a {@link ComparatorChain} formed from the input comparators - * @throws NullPointerException if comparators array is null or contains a null - * @see ComparatorChain - */ - public static Comparator chainedComparator(Comparator[] comparators) { - ComparatorChain chain = new ComparatorChain(); - for (int i = 0; i < comparators.length; i++) { - if (comparators[i] == null) { - throw new NullPointerException("Comparator cannot be null"); - } - chain.addComparator(comparators[i]); - } - return chain; - } - - /** - * Gets a comparator that compares using a collection of {@link Comparator}s, - * applied in (default iterator) sequence until one returns not equal or the - * collection is exhausted. - * - * @param comparators the comparators to use, not null or empty or containing nulls - * @return a {@link ComparatorChain} formed from the input comparators - * @throws NullPointerException if comparators collection is null or contains a null - * @throws ClassCastException if the comparators collection contains the wrong object type - * @see ComparatorChain - */ - public static Comparator chainedComparator(Collection comparators) { - return chainedComparator( - (Comparator[]) comparators.toArray(new Comparator[comparators.size()]) - ); - } - - /** - * Gets a comparator that reverses the order of the given comparator. - * - * @param comparator the comparator to reverse - * @return a comparator that reverses the order of the input comparator - * @see ReverseComparator - */ - public static Comparator reversedComparator(Comparator comparator) { - if (comparator == null) { - comparator = NATURAL_COMPARATOR; - } - return new ReverseComparator(comparator); - } - - /** - * Gets a Comparator that can sort Boolean objects. - *

      - * The parameter specifies whether true or false is sorted first. - *

      - * The comparator throws NullPointerException if a null value is compared. - * - * @param trueFirst when true, sort - * true {@link Boolean}s before - * false {@link Boolean}s. - * @return a comparator that sorts booleans - */ - public static Comparator booleanComparator(boolean trueFirst) { - return BooleanComparator.getBooleanComparator(trueFirst); - } - - /** - * Gets a Comparator that controls the comparison of null values. - *

      - * The returned comparator will consider a null value to be less than - * any nonnull value, and equal to any other null value. Two nonnull - * values will be evaluated with the given comparator. - * - * @param comparator the comparator that wants to allow nulls - * @return a version of that comparator that allows nulls - * @see NullComparator - */ - public static Comparator nullLowComparator(Comparator comparator) { - if (comparator == null) { - comparator = NATURAL_COMPARATOR; - } - return new NullComparator(comparator, false); - } - - /** - * Gets a Comparator that controls the comparison of null values. - *

      - * The returned comparator will consider a null value to be greater than - * any nonnull value, and equal to any other null value. Two nonnull - * values will be evaluated with the given comparator. - * - * @param comparator the comparator that wants to allow nulls - * @return a version of that comparator that allows nulls - * @see NullComparator - */ - public static Comparator nullHighComparator(Comparator comparator) { - if (comparator == null) { - comparator = NATURAL_COMPARATOR; - } - return new NullComparator(comparator, true); - } - - /** - * Gets a Comparator that passes transformed objects to the given comparator. - *

      - * Objects passed to the returned comparator will first be transformed - * by the given transformer before they are compared by the given - * comparator. - * - * @param comparator the sort order to use - * @param transformer the transformer to use - * @return a comparator that transforms its input objects before comparing them - * @see TransformingComparator - */ - public static Comparator transformedComparator(Comparator comparator, Transformer transformer) { - if (comparator == null) { - comparator = NATURAL_COMPARATOR; - } - return new TransformingComparator(transformer, comparator); - } - - /** - * Returns the smaller of the given objects according to the given - * comparator, returning the second object if the comparator - * returns equal. - * - * @param o1 the first object to compare - * @param o2 the second object to compare - * @param comparator the sort order to use - * @return the smaller of the two objects - */ - public static Object min(Object o1, Object o2, Comparator comparator) { - if (comparator == null) { - comparator = NATURAL_COMPARATOR; - } - int c = comparator.compare(o1, o2); - return (c < 0) ? o1 : o2; - } - - /** - * Returns the larger of the given objects according to the given - * comparator, returning the second object if the comparator - * returns equal. - * - * @param o1 the first object to compare - * @param o2 the second object to compare - * @param comparator the sort order to use - * @return the larger of the two objects - */ - public static Object max(Object o1, Object o2, Comparator comparator) { - if (comparator == null) { - comparator = NATURAL_COMPARATOR; - } - int c = comparator.compare(o1, o2); - return (c > 0) ? o1 : o2; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CursorableLinkedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CursorableLinkedList.java deleted file mode 100644 index 67bbeaa1f79..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/CursorableLinkedList.java +++ /dev/null @@ -1,1468 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; -import java.lang.ref.WeakReference; - -/** - * A doubly-linked list implementation of the {@link List} interface, - * supporting a {@link ListIterator} that allows concurrent modifications - * to the underlying list. - *

      - * Implements all of the optional {@link List} operations, the - * stack/queue/dequeue operations available in {@link java.util.LinkedList} - * and supports a {@link ListIterator} that allows concurrent modifications - * to the underlying list (see {@link #cursor}). - *

      - * Note that this implementation is not synchronized. - * - * @deprecated Use new version in list subpackage, which has been rewritten - * and now returns the cursor from the listIterator method. Will be removed in v4.0 - * @see java.util.LinkedList - * @since Commons Collections 1.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Rodney Waldhoff - * @author Janek Bogucki - * @author Simon Kitching - */ -public class CursorableLinkedList implements List, Serializable { - /** Ensure serialization compatibility */ - private static final long serialVersionUID = 8836393098519411393L; - - //--- public methods --------------------------------------------- - - /** - * Appends the specified element to the end of this list. - * - * @param o element to be appended to this list. - * @return true - */ - public boolean add(Object o) { - insertListable(_head.prev(),null,o); - return true; - } - - /** - * Inserts the specified element at the specified position in this list. - * Shifts the element currently at that position (if any) and any subsequent - * elements to the right (adds one to their indices). - * - * @param index index at which the specified element is to be inserted. - * @param element element to be inserted. - * - * @throws ClassCastException if the class of the specified element - * prevents it from being added to this list. - * @throws IllegalArgumentException if some aspect of the specified - * element prevents it from being added to this list. - * @throws IndexOutOfBoundsException if the index is out of range - * (index < 0 || index > size()). - */ - public void add(int index, Object element) { - if(index == _size) { - add(element); - } else { - if(index < 0 || index > _size) { - throw new IndexOutOfBoundsException(String.valueOf(index) + " < 0 or " + String.valueOf(index) + " > " + _size); - } - Listable succ = (isEmpty() ? null : getListableAt(index)); - Listable pred = (null == succ ? null : succ.prev()); - insertListable(pred,succ,element); - } - } - - /** - * Appends all of the elements in the specified collection to the end of - * this list, in the order that they are returned by the specified - * {@link Collection}'s {@link Iterator}. The behavior of this operation is - * unspecified if the specified collection is modified while - * the operation is in progress. (Note that this will occur if the - * specified collection is this list, and it's nonempty.) - * - * @param c collection whose elements are to be added to this list. - * @return true if this list changed as a result of the call. - * - * @throws ClassCastException if the class of an element in the specified - * collection prevents it from being added to this list. - * @throws IllegalArgumentException if some aspect of an element in the - * specified collection prevents it from being added to this - * list. - */ - public boolean addAll(Collection c) { - if(c.isEmpty()) { - return false; - } - Iterator it = c.iterator(); - while(it.hasNext()) { - insertListable(_head.prev(),null,it.next()); - } - return true; - } - - /** - * Inserts all of the elements in the specified collection into this - * list at the specified position. Shifts the element currently at - * that position (if any) and any subsequent elements to the right - * (increases their indices). The new elements will appear in this - * list in the order that they are returned by the specified - * {@link Collection}'s {@link Iterator}. The behavior of this operation is - * unspecified if the specified collection is modified while the - * operation is in progress. (Note that this will occur if the specified - * collection is this list, and it's nonempty.) - * - * @param index index at which to insert first element from the specified - * collection. - * @param c elements to be inserted into this list. - * @return true if this list changed as a result of the call. - * - * @throws ClassCastException if the class of one of elements of the - * specified collection prevents it from being added to this - * list. - * @throws IllegalArgumentException if some aspect of one of elements of - * the specified collection prevents it from being added to - * this list. - * @throws IndexOutOfBoundsException if the index is out of range (index - * < 0 || index > size()). - */ - public boolean addAll(int index, Collection c) { - if(c.isEmpty()) { - return false; - } else if(_size == index || _size == 0) { - return addAll(c); - } else { - Listable succ = getListableAt(index); - Listable pred = (null == succ) ? null : succ.prev(); - Iterator it = c.iterator(); - while(it.hasNext()) { - pred = insertListable(pred,succ,it.next()); - } - return true; - } - } - - /** - * Inserts the specified element at the beginning of this list. - * (Equivalent to {@link #add(int,java.lang.Object) add(0,o)}). - * - * @param o element to be prepended to this list. - * @return true - */ - public boolean addFirst(Object o) { - insertListable(null,_head.next(),o); - return true; - } - - /** - * Inserts the specified element at the end of this list. - * (Equivalent to {@link #add(java.lang.Object)}). - * - * @param o element to be appended to this list. - * @return true - */ - public boolean addLast(Object o) { - insertListable(_head.prev(),null,o); - return true; - } - - /** - * Removes all of the elements from this list. This - * list will be empty after this call returns (unless - * it throws an exception). - */ - public void clear() { - /* - // this is the quick way, but would force us - // to break all the cursors - _modCount++; - _head.setNext(null); - _head.setPrev(null); - _size = 0; - */ - Iterator it = iterator(); - while(it.hasNext()) { - it.next(); - it.remove(); - } - } - - /** - * Returns true if this list contains the specified element. - * More formally, returns true if and only if this list contains - * at least one element e such that - * (o==null ? e==null : o.equals(e)). - * - * @param o element whose presence in this list is to be tested. - * @return true if this list contains the specified element. - */ - public boolean contains(Object o) { - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - if((null == o && null == elt.value()) || - (o != null && o.equals(elt.value()))) { - return true; - } - } - return false; - } - - /** - * Returns true if this list contains all of the elements of the - * specified collection. - * - * @param c collection to be checked for containment in this list. - * @return true if this list contains all of the elements of the - * specified collection. - */ - public boolean containsAll(Collection c) { - Iterator it = c.iterator(); - while(it.hasNext()) { - if(!this.contains(it.next())) { - return false; - } - } - return true; - } - - /** - * Returns a {@link ListIterator} for iterating through the - * elements of this list. Unlike {@link #iterator}, a cursor - * is not bothered by concurrent modifications to the - * underlying list. - *

      - * Specifically, when elements are added to the list before or - * after the cursor, the cursor simply picks them up automatically. - * When the "current" (i.e., last returned by {@link ListIterator#next} - * or {@link ListIterator#previous}) element of the list is removed, - * the cursor automatically adjusts to the change (invalidating the - * last returned value--i.e., it cannot be removed). - *

      - * Note that the returned {@link ListIterator} does not support the - * {@link ListIterator#nextIndex} and {@link ListIterator#previousIndex} - * methods (they throw {@link UnsupportedOperationException} when invoked. - *

      - * Historical Note: In previous versions of this class, the object - * returned from this method was required to be explicitly closed. This - * is no longer necessary. - * - * @see #cursor(int) - * @see #listIterator - * @see CursorableLinkedList.Cursor - */ - public CursorableLinkedList.Cursor cursor() { - return new Cursor(0); - } - - /** - * Returns a {@link ListIterator} for iterating through the - * elements of this list, initialized such that - * {@link ListIterator#next} will return the element at - * the specified index (if any) and {@link ListIterator#previous} - * will return the element immediately preceding it (if any). - * Unlike {@link #iterator}, a cursor - * is not bothered by concurrent modifications to the - * underlying list. - * - * @see #cursor - * @see #listIterator(int) - * @see CursorableLinkedList.Cursor - * @throws IndexOutOfBoundsException if the index is out of range (index - * < 0 || index > size()). - */ - public CursorableLinkedList.Cursor cursor(int i) { - return new Cursor(i); - } - - /** - * Compares the specified object with this list for equality. Returns - * true if and only if the specified object is also a list, both - * lists have the same size, and all corresponding pairs of elements in - * the two lists are equal. (Two elements e1 and - * e2 are equal if (e1==null ? e2==null : - * e1.equals(e2)).) In other words, two lists are defined to be - * equal if they contain the same elements in the same order. This - * definition ensures that the equals method works properly across - * different implementations of the List interface. - * - * @param o the object to be compared for equality with this list. - * @return true if the specified object is equal to this list. - */ - public boolean equals(Object o) { - if(o == this) { - return true; - } else if(!(o instanceof List)) { - return false; - } - Iterator it = ((List)o).listIterator(); - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - if(!it.hasNext() || (null == elt.value() ? null != it.next() : !(elt.value().equals(it.next()))) ) { - return false; - } - } - return !it.hasNext(); - } - - /** - * Returns the element at the specified position in this list. - * - * @param index index of element to return. - * @return the element at the specified position in this list. - * - * @throws IndexOutOfBoundsException if the index is out of range (index - * < 0 || index >= size()). - */ - public Object get(int index) { - return getListableAt(index).value(); - } - - /** - * Returns the element at the beginning of this list. - */ - public Object getFirst() { - try { - return _head.next().value(); - } catch(NullPointerException e) { - throw new NoSuchElementException(); - } - } - - /** - * Returns the element at the end of this list. - */ - public Object getLast() { - try { - return _head.prev().value(); - } catch(NullPointerException e) { - throw new NoSuchElementException(); - } - } - - /** - * Returns the hash code value for this list. The hash code of a list - * is defined to be the result of the following calculation: - *

      -     *  hashCode = 1;
      -     *  Iterator i = list.iterator();
      -     *  while (i.hasNext()) {
      -     *      Object obj = i.next();
      -     *      hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
      -     *  }
      -     * 
      - * This ensures that list1.equals(list2) implies that - * list1.hashCode()==list2.hashCode() for any two lists, - * list1 and list2, as required by the general - * contract of Object.hashCode. - * - * @return the hash code value for this list. - * @see Object#hashCode() - * @see Object#equals(Object) - * @see #equals(Object) - */ - public int hashCode() { - int hash = 1; - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - hash = 31*hash + (null == elt.value() ? 0 : elt.value().hashCode()); - } - return hash; - } - - /** - * Returns the index in this list of the first occurrence of the specified - * element, or -1 if this list does not contain this element. - * More formally, returns the lowest index i such that - * (o==null ? get(i)==null : o.equals(get(i))), - * or -1 if there is no such index. - * - * @param o element to search for. - * @return the index in this list of the first occurrence of the specified - * element, or -1 if this list does not contain this element. - */ - public int indexOf(Object o) { - int ndx = 0; - - // perform the null check outside of the loop to save checking every - // single time through the loop. - if (null == o) { - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - if (null == elt.value()) { - return ndx; - } - ndx++; - } - } else { - - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - if (o.equals(elt.value())) { - return ndx; - } - ndx++; - } - } - return -1; - } - - /** - * Returns true if this list contains no elements. - * @return true if this list contains no elements. - */ - public boolean isEmpty() { - return(0 == _size); - } - - /** - * Returns a fail-fast iterator. - * @see List#iterator - */ - public Iterator iterator() { - return listIterator(0); - } - - /** - * Returns the index in this list of the last occurrence of the specified - * element, or -1 if this list does not contain this element. - * More formally, returns the highest index i such that - * (o==null ? get(i)==null : o.equals(get(i))), - * or -1 if there is no such index. - * - * @param o element to search for. - * @return the index in this list of the last occurrence of the specified - * element, or -1 if this list does not contain this element. - */ - public int lastIndexOf(Object o) { - int ndx = _size-1; - - // perform the null check outside of the loop to save checking every - // single time through the loop. - if (null == o) { - for(Listable elt = _head.prev(), past = null; null != elt && past != _head.next(); elt = (past = elt).prev()) { - if (null == elt.value()) { - return ndx; - } - ndx--; - } - } else { - for(Listable elt = _head.prev(), past = null; null != elt && past != _head.next(); elt = (past = elt).prev()) { - if (o.equals(elt.value())) { - return ndx; - } - ndx--; - } - } - return -1; - } - - /** - * Returns a fail-fast ListIterator. - * @see List#listIterator - */ - public ListIterator listIterator() { - return listIterator(0); - } - - /** - * Returns a fail-fast ListIterator. - * @see List#listIterator(int) - */ - public ListIterator listIterator(int index) { - if(index<0 || index > _size) { - throw new IndexOutOfBoundsException(index + " < 0 or > " + _size); - } - return new ListIter(index); - } - - /** - * Removes the first occurrence in this list of the specified element. - * If this list does not contain the element, it is - * unchanged. More formally, removes the element with the lowest index i - * such that (o==null ? get(i)==null : o.equals(get(i))) (if - * such an element exists). - * - * @param o element to be removed from this list, if present. - * @return true if this list contained the specified element. - */ - public boolean remove(Object o) { - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - if(null == o && null == elt.value()) { - removeListable(elt); - return true; - } else if(o != null && o.equals(elt.value())) { - removeListable(elt); - return true; - } - } - return false; - } - - /** - * Removes the element at the specified position in this list (optional - * operation). Shifts any subsequent elements to the left (subtracts one - * from their indices). Returns the element that was removed from the - * list. - * - * @param index the index of the element to removed. - * @return the element previously at the specified position. - * - * @throws IndexOutOfBoundsException if the index is out of range (index - * < 0 || index >= size()). - */ - public Object remove(int index) { - Listable elt = getListableAt(index); - Object ret = elt.value(); - removeListable(elt); - return ret; - } - - /** - * Removes from this list all the elements that are contained in the - * specified collection. - * - * @param c collection that defines which elements will be removed from - * this list. - * @return true if this list changed as a result of the call. - */ - public boolean removeAll(Collection c) { - if(0 == c.size() || 0 == _size) { - return false; - } else { - boolean changed = false; - Iterator it = iterator(); - while(it.hasNext()) { - if(c.contains(it.next())) { - it.remove(); - changed = true; - } - } - return changed; - } - } - - /** - * Removes the first element of this list, if any. - */ - public Object removeFirst() { - if(_head.next() != null) { - Object val = _head.next().value(); - removeListable(_head.next()); - return val; - } else { - throw new NoSuchElementException(); - } - } - - /** - * Removes the last element of this list, if any. - */ - public Object removeLast() { - if(_head.prev() != null) { - Object val = _head.prev().value(); - removeListable(_head.prev()); - return val; - } else { - throw new NoSuchElementException(); - } - } - - /** - * Retains only the elements in this list that are contained in the - * specified collection. In other words, removes - * from this list all the elements that are not contained in the specified - * collection. - * - * @param c collection that defines which elements this set will retain. - * - * @return true if this list changed as a result of the call. - */ - public boolean retainAll(Collection c) { - boolean changed = false; - Iterator it = iterator(); - while(it.hasNext()) { - if(!c.contains(it.next())) { - it.remove(); - changed = true; - } - } - return changed; - } - - /** - * Replaces the element at the specified position in this list with the - * specified element. - * - * @param index index of element to replace. - * @param element element to be stored at the specified position. - * @return the element previously at the specified position. - * - * @throws ClassCastException if the class of the specified element - * prevents it from being added to this list. - * @throws IllegalArgumentException if some aspect of the specified - * element prevents it from being added to this list. - * @throws IndexOutOfBoundsException if the index is out of range - * (index < 0 || index >= size()). - */ - public Object set(int index, Object element) { - Listable elt = getListableAt(index); - Object val = elt.setValue(element); - broadcastListableChanged(elt); - return val; - } - - /** - * Returns the number of elements in this list. - * @return the number of elements in this list. - */ - public int size() { - return _size; - } - - /** - * Returns an array containing all of the elements in this list in proper - * sequence. Obeys the general contract of the {@link Collection#toArray} method. - * - * @return an array containing all of the elements in this list in proper - * sequence. - */ - public Object[] toArray() { - Object[] array = new Object[_size]; - int i = 0; - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - array[i++] = elt.value(); - } - return array; - } - - /** - * Returns an array containing all of the elements in this list in proper - * sequence; the runtime type of the returned array is that of the - * specified array. Obeys the general contract of the - * {@link Collection#toArray} method. - * - * @param a the array into which the elements of this list are to - * be stored, if it is big enough; otherwise, a new array of the - * same runtime type is allocated for this purpose. - * @return an array containing the elements of this list. - * @exception ArrayStoreException - * if the runtime type of the specified array - * is not a supertype of the runtime type of every element in - * this list. - */ - public Object[] toArray(Object a[]) { - if(a.length < _size) { - a = (Object[])Array.newInstance(a.getClass().getComponentType(), _size); - } - int i = 0; - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - a[i++] = elt.value(); - } - if(a.length > _size) { - a[_size] = null; // should we null out the rest of the array also? java.util.LinkedList doesn't - } - return a; - } - - /** - * Returns a {@link String} representation of this list, suitable for debugging. - * @return a {@link String} representation of this list, suitable for debugging. - */ - public String toString() { - StringBuffer buf = new StringBuffer(); - buf.append("["); - for(Listable elt = _head.next(), past = null; null != elt && past != _head.prev(); elt = (past = elt).next()) { - if(_head.next() != elt) { - buf.append(", "); - } - buf.append(elt.value()); - } - buf.append("]"); - return buf.toString(); - } - - /** - * Returns a fail-fast sublist. - * @see List#subList(int,int) - */ - public List subList(int i, int j) { - if(i < 0 || j > _size || i > j) { - throw new IndexOutOfBoundsException(); - } else if(i == 0 && j == _size) { - return this; - } else { - return new CursorableSubList(this,i,j); - } - } - - //--- protected methods ------------------------------------------ - - /** - * Inserts a new value into my - * list, after the specified before element, and before the - * specified after element - * - * @return the newly created - * {@link org.apache.commons.collections.CursorableLinkedList.Listable} - */ - protected Listable insertListable(Listable before, Listable after, Object value) { - _modCount++; - _size++; - Listable elt = new Listable(before,after,value); - if(null != before) { - before.setNext(elt); - } else { - _head.setNext(elt); - } - - if(null != after) { - after.setPrev(elt); - } else { - _head.setPrev(elt); - } - broadcastListableInserted(elt); - return elt; - } - - /** - * Removes the given - * {@link org.apache.commons.collections.CursorableLinkedList.Listable} - * from my list. - */ - protected void removeListable(Listable elt) { - _modCount++; - _size--; - if(_head.next() == elt) { - _head.setNext(elt.next()); - } - if(null != elt.next()) { - elt.next().setPrev(elt.prev()); - } - if(_head.prev() == elt) { - _head.setPrev(elt.prev()); - } - if(null != elt.prev()) { - elt.prev().setNext(elt.next()); - } - broadcastListableRemoved(elt); - } - - /** - * Returns the - * {@link org.apache.commons.collections.CursorableLinkedList.Listable} - * at the specified index. - * - * @throws IndexOutOfBoundsException if index is less than zero or - * greater than or equal to the size of this list. - */ - protected Listable getListableAt(int index) { - if(index < 0 || index >= _size) { - throw new IndexOutOfBoundsException(String.valueOf(index) + " < 0 or " + String.valueOf(index) + " >= " + _size); - } - if(index <=_size/2) { - Listable elt = _head.next(); - for(int i = 0; i < index; i++) { - elt = elt.next(); - } - return elt; - } else { - Listable elt = _head.prev(); - for(int i = (_size-1); i > index; i--) { - elt = elt.prev(); - } - return elt; - } - } - - /** - * Registers a {@link CursorableLinkedList.Cursor} to be notified - * of changes to this list. - */ - protected void registerCursor(Cursor cur) { - // We take this opportunity to clean the _cursors list - // of WeakReference objects to garbage-collected cursors. - for (Iterator it = _cursors.iterator(); it.hasNext(); ) { - WeakReference ref = (WeakReference) it.next(); - if (ref.get() == null) { - it.remove(); - } - } - - _cursors.add( new WeakReference(cur) ); - } - - /** - * Removes a {@link CursorableLinkedList.Cursor} from - * the set of cursors to be notified of changes to this list. - */ - protected void unregisterCursor(Cursor cur) { - for (Iterator it = _cursors.iterator(); it.hasNext(); ) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - // some other unrelated cursor object has been - // garbage-collected; let's take the opportunity to - // clean up the cursors list anyway.. - it.remove(); - - } else if (cursor == cur) { - ref.clear(); - it.remove(); - break; - } - } - } - - /** - * Informs all of my registered cursors that they are now - * invalid. - */ - protected void invalidateCursors() { - Iterator it = _cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor != null) { - // cursor is null if object has been garbage-collected - cursor.invalidate(); - ref.clear(); - } - it.remove(); - } - } - - /** - * Informs all of my registered cursors that the specified - * element was changed. - * @see #set(int,java.lang.Object) - */ - protected void broadcastListableChanged(Listable elt) { - Iterator it = _cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - it.remove(); // clean up list - } else { - cursor.listableChanged(elt); - } - } - } - - /** - * Informs all of my registered cursors that the specified - * element was just removed from my list. - */ - protected void broadcastListableRemoved(Listable elt) { - Iterator it = _cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - it.remove(); // clean up list - } else { - cursor.listableRemoved(elt); - } - } - } - - /** - * Informs all of my registered cursors that the specified - * element was just added to my list. - */ - protected void broadcastListableInserted(Listable elt) { - Iterator it = _cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - it.remove(); // clean up list - } else { - cursor.listableInserted(elt); - } - } - } - - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeInt(_size); - Listable cur = _head.next(); - while (cur != null) { - out.writeObject(cur.value()); - cur = cur.next(); - } - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - _size = 0; - _modCount = 0; - _cursors = new ArrayList(); - _head = new Listable(null,null,null); - int size = in.readInt(); - for (int i=0;i - * _head.next() points to the first element in the list, - * _head.prev() to the last. Note that it is possible for - * _head.next().prev() and _head.prev().next() to be - * non-null, as when I am a sublist for some larger list. - * Use == _head.next() and == _head.prev() to determine - * if a given - * {@link org.apache.commons.collections.CursorableLinkedList.Listable} - * is the first or last element in the list. - */ - protected transient Listable _head = new Listable(null,null,null); - - /** Tracks the number of structural modifications to me. */ - protected transient int _modCount = 0; - - /** - * A list of the currently {@link CursorableLinkedList.Cursor}s currently - * open in this list. - */ - protected transient List _cursors = new ArrayList(); - - //--- inner classes ---------------------------------------------- - - static class Listable implements Serializable { - private Listable _prev = null; - private Listable _next = null; - private Object _val = null; - - Listable(Listable prev, Listable next, Object val) { - _prev = prev; - _next = next; - _val = val; - } - - Listable next() { - return _next; - } - - Listable prev() { - return _prev; - } - - Object value() { - return _val; - } - - void setNext(Listable next) { - _next = next; - } - - void setPrev(Listable prev) { - _prev = prev; - } - - Object setValue(Object val) { - Object temp = _val; - _val = val; - return temp; - } - } - - class ListIter implements ListIterator { - Listable _cur = null; - Listable _lastReturned = null; - int _expectedModCount = _modCount; - int _nextIndex = 0; - - ListIter(int index) { - if(index == 0) { - _cur = new Listable(null,_head.next(),null); - _nextIndex = 0; - } else if(index == _size) { - _cur = new Listable(_head.prev(),null,null); - _nextIndex = _size; - } else { - Listable temp = getListableAt(index); - _cur = new Listable(temp.prev(),temp,null); - _nextIndex = index; - } - } - - public Object previous() { - checkForComod(); - if(!hasPrevious()) { - throw new NoSuchElementException(); - } else { - Object ret = _cur.prev().value(); - _lastReturned = _cur.prev(); - _cur.setNext(_cur.prev()); - _cur.setPrev(_cur.prev().prev()); - _nextIndex--; - return ret; - } - } - - public boolean hasNext() { - checkForComod(); - return(null != _cur.next() && _cur.prev() != _head.prev()); - } - - public Object next() { - checkForComod(); - if(!hasNext()) { - throw new NoSuchElementException(); - } else { - Object ret = _cur.next().value(); - _lastReturned = _cur.next(); - _cur.setPrev(_cur.next()); - _cur.setNext(_cur.next().next()); - _nextIndex++; - return ret; - } - } - - public int previousIndex() { - checkForComod(); - if(!hasPrevious()) { - return -1; - } - return _nextIndex-1; - } - - public boolean hasPrevious() { - checkForComod(); - return(null != _cur.prev() && _cur.next() != _head.next()); - } - - public void set(Object o) { - checkForComod(); - try { - _lastReturned.setValue(o); - } catch(NullPointerException e) { - throw new IllegalStateException(); - } - } - - public int nextIndex() { - checkForComod(); - if(!hasNext()) { - return size(); - } - return _nextIndex; - } - - public void remove() { - checkForComod(); - if(null == _lastReturned) { - throw new IllegalStateException(); - } else { - _cur.setNext(_lastReturned == _head.prev() ? null : _lastReturned.next()); - _cur.setPrev(_lastReturned == _head.next() ? null : _lastReturned.prev()); - removeListable(_lastReturned); - _lastReturned = null; - _nextIndex--; - _expectedModCount++; - } - } - - public void add(Object o) { - checkForComod(); - _cur.setPrev(insertListable(_cur.prev(),_cur.next(),o)); - _lastReturned = null; - _nextIndex++; - _expectedModCount++; - } - - protected void checkForComod() { - if(_expectedModCount != _modCount) { - throw new ConcurrentModificationException(); - } - } - } - - public class Cursor extends ListIter implements ListIterator { - boolean _valid = false; - - Cursor(int index) { - super(index); - _valid = true; - registerCursor(this); - } - - public int previousIndex() { - throw new UnsupportedOperationException(); - } - - public int nextIndex() { - throw new UnsupportedOperationException(); - } - - public void add(Object o) { - checkForComod(); - Listable elt = insertListable(_cur.prev(),_cur.next(),o); - _cur.setPrev(elt); - _cur.setNext(elt.next()); - _lastReturned = null; - _nextIndex++; - _expectedModCount++; - } - - protected void listableRemoved(Listable elt) { - if(null == _head.prev()) { - _cur.setNext(null); - } else if(_cur.next() == elt) { - _cur.setNext(elt.next()); - } - if(null == _head.next()) { - _cur.setPrev(null); - } else if(_cur.prev() == elt) { - _cur.setPrev(elt.prev()); - } - if(_lastReturned == elt) { - _lastReturned = null; - } - } - - protected void listableInserted(Listable elt) { - if(null == _cur.next() && null == _cur.prev()) { - _cur.setNext(elt); - } else if(_cur.prev() == elt.prev()) { - _cur.setNext(elt); - } - if(_cur.next() == elt.next()) { - _cur.setPrev(elt); - } - if(_lastReturned == elt) { - _lastReturned = null; - } - } - - protected void listableChanged(Listable elt) { - if(_lastReturned == elt) { - _lastReturned = null; - } - } - - protected void checkForComod() { - if(!_valid) { - throw new ConcurrentModificationException(); - } - } - - protected void invalidate() { - _valid = false; - } - - /** - * Mark this cursor as no longer being needed. Any resources - * associated with this cursor are immediately released. - * In previous versions of this class, it was mandatory to close - * all cursor objects to avoid memory leaks. It is no longer - * necessary to call this close method; an instance of this class - * can now be treated exactly like a normal iterator. - */ - public void close() { - if(_valid) { - _valid = false; - unregisterCursor(this); - } - } - } - -} - -/** - * @deprecated Use new version in list subpackage, which has been rewritten - * and now returns the cursor from the listIterator method. Will be removed in v4.0 - */ -class CursorableSubList extends CursorableLinkedList implements List { - - //--- constructors ----------------------------------------------- - - CursorableSubList(CursorableLinkedList list, int from, int to) { - if(0 > from || list.size() < to) { - throw new IndexOutOfBoundsException(); - } else if(from > to) { - throw new IllegalArgumentException(); - } - _list = list; - if(from < list.size()) { - _head.setNext(_list.getListableAt(from)); - _pre = (null == _head.next()) ? null : _head.next().prev(); - } else { - _pre = _list.getListableAt(from-1); - } - if(from == to) { - _head.setNext(null); - _head.setPrev(null); - if(to < list.size()) { - _post = _list.getListableAt(to); - } else { - _post = null; - } - } else { - _head.setPrev(_list.getListableAt(to-1)); - _post = _head.prev().next(); - } - _size = to - from; - _modCount = _list._modCount; - } - - //--- public methods ------------------------------------------ - - public void clear() { - checkForComod(); - Iterator it = iterator(); - while(it.hasNext()) { - it.next(); - it.remove(); - } - } - - public Iterator iterator() { - checkForComod(); - return super.iterator(); - } - - public int size() { - checkForComod(); - return super.size(); - } - - public boolean isEmpty() { - checkForComod(); - return super.isEmpty(); - } - - public Object[] toArray() { - checkForComod(); - return super.toArray(); - } - - public Object[] toArray(Object a[]) { - checkForComod(); - return super.toArray(a); - } - - public boolean contains(Object o) { - checkForComod(); - return super.contains(o); - } - - public boolean remove(Object o) { - checkForComod(); - return super.remove(o); - } - - public Object removeFirst() { - checkForComod(); - return super.removeFirst(); - } - - public Object removeLast() { - checkForComod(); - return super.removeLast(); - } - - public boolean addAll(Collection c) { - checkForComod(); - return super.addAll(c); - } - - public boolean add(Object o) { - checkForComod(); - return super.add(o); - } - - public boolean addFirst(Object o) { - checkForComod(); - return super.addFirst(o); - } - - public boolean addLast(Object o) { - checkForComod(); - return super.addLast(o); - } - - public boolean removeAll(Collection c) { - checkForComod(); - return super.removeAll(c); - } - - public boolean containsAll(Collection c) { - checkForComod(); - return super.containsAll(c); - } - - public boolean addAll(int index, Collection c) { - checkForComod(); - return super.addAll(index,c); - } - - public int hashCode() { - checkForComod(); - return super.hashCode(); - } - - public boolean retainAll(Collection c) { - checkForComod(); - return super.retainAll(c); - } - - public Object set(int index, Object element) { - checkForComod(); - return super.set(index,element); - } - - public boolean equals(Object o) { - checkForComod(); - return super.equals(o); - } - - public Object get(int index) { - checkForComod(); - return super.get(index); - } - - public Object getFirst() { - checkForComod(); - return super.getFirst(); - } - - public Object getLast() { - checkForComod(); - return super.getLast(); - } - - public void add(int index, Object element) { - checkForComod(); - super.add(index,element); - } - - public ListIterator listIterator(int index) { - checkForComod(); - return super.listIterator(index); - } - - public Object remove(int index) { - checkForComod(); - return super.remove(index); - } - - public int indexOf(Object o) { - checkForComod(); - return super.indexOf(o); - } - - public int lastIndexOf(Object o) { - checkForComod(); - return super.lastIndexOf(o); - } - - public ListIterator listIterator() { - checkForComod(); - return super.listIterator(); - } - - public List subList(int fromIndex, int toIndex) { - checkForComod(); - return super.subList(fromIndex,toIndex); - } - - //--- protected methods ------------------------------------------ - - /** - * Inserts a new value into my - * list, after the specified before element, and before the - * specified after element - * - * @return the newly created {@link CursorableLinkedList.Listable} - */ - protected Listable insertListable(Listable before, Listable after, Object value) { - _modCount++; - _size++; - Listable elt = _list.insertListable((null == before ? _pre : before), (null == after ? _post : after),value); - if(null == _head.next()) { - _head.setNext(elt); - _head.setPrev(elt); - } - if(before == _head.prev()) { - _head.setPrev(elt); - } - if(after == _head.next()) { - _head.setNext(elt); - } - broadcastListableInserted(elt); - return elt; - } - - /** - * Removes the given {@link CursorableLinkedList.Listable} from my list. - */ - protected void removeListable(Listable elt) { - _modCount++; - _size--; - if(_head.next() == elt && _head.prev() == elt) { - _head.setNext(null); - _head.setPrev(null); - } - if(_head.next() == elt) { - _head.setNext(elt.next()); - } - if(_head.prev() == elt) { - _head.setPrev(elt.prev()); - } - _list.removeListable(elt); - broadcastListableRemoved(elt); - } - - /** - * Test to see if my underlying list has been modified - * by some other process. If it has, throws a - * {@link ConcurrentModificationException}, otherwise - * quietly returns. - * - * @throws ConcurrentModificationException - */ - protected void checkForComod() throws ConcurrentModificationException { - if(_modCount != _list._modCount) { - throw new ConcurrentModificationException(); - } - } - - //--- protected attributes --------------------------------------- - - /** My underlying list */ - protected CursorableLinkedList _list = null; - - /** The element in my underlying list preceding the first element in my list. */ - protected Listable _pre = null; - - /** The element in my underlying list following the last element in my list. */ - protected Listable _post = null; - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapBag.java deleted file mode 100644 index a0619d13755..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapBag.java +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * A skeletal implementation of the {@link Bag} - * interface to minimize the effort required for target implementations. - * Subclasses need only to call setMap(Map) in their constructor - * (or invoke the Map constructor) specifying a map instance that will be used - * to store the contents of the bag. - *

      - * The map will be used to map bag elements to a number; the number represents - * the number of occurrences of that element in the bag. - * - * @deprecated Moved to bag subpackage as AbstractMapBag. Due to be removed in v4.0. - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - * @author Michael A. Smith - * @author Stephen Colebourne - * @author Janek Bogucki - */ -public abstract class DefaultMapBag implements Bag { - private Map _map = null; - private int _total = 0; - private int _mods = 0; - - /** - * No-argument constructor. - * Subclasses should invoke setMap(Map) in - * their constructors. - */ - public DefaultMapBag() { - } - - /** - * Constructor that assigns the specified Map as the backing store. - * The map must be empty. - * - * @param map the map to assign - */ - protected DefaultMapBag(Map map) { - setMap(map); - } - - /** - * Adds a new element to the bag by incrementing its count in the - * underlying map. - * - * @param object the object to add - * @return true if the object was not already in the uniqueSet - */ - public boolean add(Object object) { - return add(object, 1); - } - - /** - * Adds a new element to the bag by incrementing its count in the map. - * - * @param object the object to search for - * @param nCopies the number of copies to add - * @return true if the object was not already in the uniqueSet - */ - public boolean add(Object object, int nCopies) { - _mods++; - if (nCopies > 0) { - int count = (nCopies + getCount(object)); - _map.put(object, new Integer(count)); - _total += nCopies; - return (count == nCopies); - } else { - return false; - } - } - - /** - * Invokes {@link #add(Object)} for each element in the given collection. - * - * @param coll the collection to add - * @return true if this call changed the bag - */ - public boolean addAll(Collection coll) { - boolean changed = false; - Iterator i = coll.iterator(); - while (i.hasNext()) { - boolean added = add(i.next()); - changed = changed || added; - } - return changed; - } - - /** - * Clears the bag by clearing the underlying map. - */ - public void clear() { - _mods++; - _map.clear(); - _total = 0; - } - - /** - * Determines if the bag contains the given element by checking if the - * underlying map contains the element as a key. - * - * @param object the object to search for - * @return true if the bag contains the given element - */ - public boolean contains(Object object) { - return _map.containsKey(object); - } - - /** - * Determines if the bag contains the given elements. - * - * @param coll the collection to check against - * @return true if the Bag contains all the collection - */ - public boolean containsAll(Collection coll) { - return containsAll(new HashBag(coll)); - } - - /** - * Returns true if the bag contains all elements in - * the given collection, respecting cardinality. - * - * @param other the bag to check against - * @return true if the Bag contains all the collection - */ - public boolean containsAll(Bag other) { - boolean result = true; - Iterator i = other.uniqueSet().iterator(); - while (i.hasNext()) { - Object current = i.next(); - boolean contains = getCount(current) >= other.getCount(current); - result = result && contains; - } - return result; - } - - /** - * Returns true if the given object is not null, has the precise type - * of this bag, and contains the same number of occurrences of all the - * same elements. - * - * @param object the object to test for equality - * @return true if that object equals this bag - */ - public boolean equals(Object object) { - if (object == this) { - return true; - } - if (object instanceof Bag == false) { - return false; - } - Bag other = (Bag) object; - if (other.size() != size()) { - return false; - } - for (Iterator it = _map.keySet().iterator(); it.hasNext();) { - Object element = it.next(); - if (other.getCount(element) != getCount(element)) { - return false; - } - } - return true; - } - - /** - * Returns the hash code of the underlying map. - * - * @return the hash code of the underlying map - */ - public int hashCode() { - return _map.hashCode(); - } - - /** - * Returns true if the underlying map is empty. - * - * @return true if there are no elements in this bag - */ - public boolean isEmpty() { - return _map.isEmpty(); - } - - public Iterator iterator() { - return new BagIterator(this, extractList().iterator()); - } - - static class BagIterator implements Iterator { - private DefaultMapBag _parent = null; - private Iterator _support = null; - private Object _current = null; - private int _mods = 0; - - public BagIterator(DefaultMapBag parent, Iterator support) { - _parent = parent; - _support = support; - _current = null; - _mods = parent.modCount(); - } - - public boolean hasNext() { - return _support.hasNext(); - } - - public Object next() { - if (_parent.modCount() != _mods) { - throw new ConcurrentModificationException(); - } - _current = _support.next(); - return _current; - } - - public void remove() { - if (_parent.modCount() != _mods) { - throw new ConcurrentModificationException(); - } - _support.remove(); - _parent.remove(_current, 1); - _mods++; - } - } - - public boolean remove(Object object) { - return remove(object, getCount(object)); - } - - public boolean remove(Object object, int nCopies) { - _mods++; - boolean result = false; - int count = getCount(object); - if (nCopies <= 0) { - result = false; - } else if (count > nCopies) { - _map.put(object, new Integer(count - nCopies)); - result = true; - _total -= nCopies; - } else { // count > 0 && count <= i - // need to remove all - result = (_map.remove(object) != null); - _total -= count; - } - return result; - } - - public boolean removeAll(Collection coll) { - boolean result = false; - if (coll != null) { - Iterator i = coll.iterator(); - while (i.hasNext()) { - boolean changed = remove(i.next(), 1); - result = result || changed; - } - } - return result; - } - - /** - * Remove any members of the bag that are not in the given - * bag, respecting cardinality. - * - * @param coll the collection to retain - * @return true if this call changed the collection - */ - public boolean retainAll(Collection coll) { - return retainAll(new HashBag(coll)); - } - - /** - * Remove any members of the bag that are not in the given - * bag, respecting cardinality. - * @see #retainAll(Collection) - * - * @param other the bag to retain - * @return true if this call changed the collection - */ - public boolean retainAll(Bag other) { - boolean result = false; - Bag excess = new HashBag(); - Iterator i = uniqueSet().iterator(); - while (i.hasNext()) { - Object current = i.next(); - int myCount = getCount(current); - int otherCount = other.getCount(current); - if (1 <= otherCount && otherCount <= myCount) { - excess.add(current, myCount - otherCount); - } else { - excess.add(current, myCount); - } - } - if (!excess.isEmpty()) { - result = removeAll(excess); - } - return result; - } - - /** - * Returns an array of all of this bag's elements. - * - * @return an array of all of this bag's elements - */ - public Object[] toArray() { - return extractList().toArray(); - } - - /** - * Returns an array of all of this bag's elements. - * - * @param array the array to populate - * @return an array of all of this bag's elements - */ - public Object[] toArray(Object[] array) { - return extractList().toArray(array); - } - - /** - * Returns the number of occurrence of the given element in this bag - * by looking up its count in the underlying map. - * - * @param object the object to search for - * @return the number of occurrences of the object, zero if not found - */ - public int getCount(Object object) { - int result = 0; - Integer count = MapUtils.getInteger(_map, object); - if (count != null) { - result = count.intValue(); - } - return result; - } - - /** - * Returns an unmodifiable view of the underlying map's key set. - * - * @return the set of unique elements in this bag - */ - public Set uniqueSet() { - return UnmodifiableSet.decorate(_map.keySet()); - } - - /** - * Returns the number of elements in this bag. - * - * @return the number of elements in this bag - */ - public int size() { - return _total; - } - - /** - * Actually walks the bag to make sure the count is correct and - * resets the running total - * - * @return the current total size - */ - protected int calcTotalSize() { - _total = extractList().size(); - return _total; - } - - /** - * Utility method for implementations to set the map that backs - * this bag. Not intended for interactive use outside of - * subclasses. - */ - protected void setMap(Map map) { - if (map == null || map.isEmpty() == false) { - throw new IllegalArgumentException("The map must be non-null and empty"); - } - _map = map; - } - - /** - * Utility method for implementations to access the map that backs - * this bag. Not intended for interactive use outside of - * subclasses. - */ - protected Map getMap() { - return _map; - } - - /** - * Create a list for use in iteration, etc. - */ - private List extractList() { - List result = new ArrayList(); - Iterator i = uniqueSet().iterator(); - while (i.hasNext()) { - Object current = i.next(); - for (int index = getCount(current); index > 0; index--) { - result.add(current); - } - } - return result; - } - - /** - * Return number of modifications for iterator. - * - * @return the modification count - */ - private int modCount() { - return _mods; - } - - /** - * Implement a toString() method suitable for debugging. - * - * @return a debugging toString - */ - public String toString() { - StringBuffer buf = new StringBuffer(); - buf.append("["); - Iterator i = uniqueSet().iterator(); - while (i.hasNext()) { - Object current = i.next(); - int count = getCount(current); - buf.append(count); - buf.append(":"); - buf.append(current); - if (i.hasNext()) { - buf.append(","); - } - } - buf.append("]"); - return buf.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapEntry.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapEntry.java deleted file mode 100644 index a12480f0cc0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DefaultMapEntry.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Map; - -/** - * A default implementation of {@link java.util.Map.Entry} - * - * @deprecated Use the version in the keyvalue subpackage. Will be removed in v4.0 - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public class DefaultMapEntry implements Map.Entry, KeyValue { - - /** The key */ - private Object key; - /** The value */ - private Object value; - - /** - * Constructs a new DefaultMapEntry with a null key - * and null value. - */ - public DefaultMapEntry() { - super(); - } - - /** - * Constructs a new DefaultMapEntry with the given - * key and given value. - * - * @param entry the entry to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultMapEntry(Map.Entry entry) { - super(); - this.key = entry.getKey(); - this.value = entry.getValue(); - } - - /** - * Constructs a new DefaultMapEntry with the given - * key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - public DefaultMapEntry(Object key, Object value) { - super(); - this.key = key; - this.value = value; - } - - // Map.Entry interface - //------------------------------------------------------------------------- - /** - * Gets the key from the Map Entry. - * - * @return the key - */ - public Object getKey() { - return key; - } - - /** - * Sets the key stored in this Map Entry. - *

      - * This Map Entry is not connected to a Map, so only the local data is changed. - * - * @param key the new key - */ - public void setKey(Object key) { - this.key = key; - } - - /** - * Gets the value from the Map Entry. - * - * @return the value - */ - public Object getValue() { - return value; - } - - /** - * Sets the value stored in this Map Entry. - *

      - * This Map Entry is not connected to a Map, so only the local data is changed. - * - * @param value the new value - * @return the previous value - */ - public Object setValue(Object value) { - Object answer = this.value; - this.value = value; - return answer; - } - - // Basics - //----------------------------------------------------------------------- - /** - * Compares this Map Entry with another Map Entry. - *

      - * Implemented per API documentation of {@link java.util.Map.Entry#equals(Object)} - * - * @param obj the object to compare to - * @return true if equal key and value - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - return - (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) && - (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue())); - } - - /** - * Gets a hashCode compatible with the equals method. - *

      - * Implemented per API documentation of {@link java.util.Map.Entry#hashCode()} - * - * @return a suitable hash code - */ - public int hashCode() { - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (getValue() == null ? 0 : getValue().hashCode()); - } - - /** - * Written to match the output of the Map.Entry's used in - * a {@link java.util.HashMap}. - * @since 3.0 - */ - public String toString() { - return ""+getKey()+"="+getValue(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DoubleOrderedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DoubleOrderedMap.java deleted file mode 100644 index c22c17079e6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/DoubleOrderedMap.java +++ /dev/null @@ -1,1995 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.AbstractCollection; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -/** - * Red-Black tree-based implementation of Map. This class guarantees - * that the map will be in both ascending key order and ascending - * value order, sorted according to the natural order for the key's - * and value's classes. - *

      - * This Map is intended for applications that need to be able to look - * up a key-value pairing by either key or value, and need to do so - * with equal efficiency. - *

      - * While that goal could be accomplished by taking a pair of TreeMaps - * and redirecting requests to the appropriate TreeMap (e.g., - * containsKey would be directed to the TreeMap that maps values to - * keys, containsValue would be directed to the TreeMap that maps keys - * to values), there are problems with that implementation, - * particularly when trying to keep the two TreeMaps synchronized with - * each other. And if the data contained in the TreeMaps is large, the - * cost of redundant storage becomes significant. (See also the new - * {@link org.apache.commons.collections.bidimap.DualTreeBidiMap DualTreeBidiMap} and - * {@link org.apache.commons.collections.bidimap.DualHashBidiMap DualHashBidiMap} - * implementations.) - *

      - * This solution keeps the data properly synchronized and minimizes - * the data storage. The red-black algorithm is based on TreeMap's, - * but has been modified to simultaneously map a tree node by key and - * by value. This doubles the cost of put operations (but so does - * using two TreeMaps), and nearly doubles the cost of remove - * operations (there is a savings in that the lookup of the node to be - * removed only has to be performed once). And since only one node - * contains the key and value, storage is significantly less than that - * required by two TreeMaps. - *

      - * There are some limitations placed on data kept in this Map. The - * biggest one is this: - *

      - * When performing a put operation, neither the key nor the value may - * already exist in the Map. In the java.util Map implementations - * (HashMap, TreeMap), you can perform a put with an already mapped - * key, and neither cares about duplicate values at all ... but this - * implementation's put method with throw an IllegalArgumentException - * if either the key or the value is already in the Map. - *

      - * Obviously, that same restriction (and consequence of failing to - * heed that restriction) applies to the putAll method. - *

      - * The Map.Entry instances returned by the appropriate methods will - * not allow setValue() and will throw an - * UnsupportedOperationException on attempts to call that method. - *

      - * New methods are added to take advantage of the fact that values are - * kept sorted independently of their keys: - *

      - * Object getKeyForValue(Object value) is the opposite of get; it - * takes a value and returns its key, if any. - *

      - * Object removeValue(Object value) finds and removes the specified - * value and returns the now un-used key. - *

      - * Set entrySetByValue() returns the Map.Entry's in a Set whose - * iterator will iterate over the Map.Entry's in ascending order by - * their corresponding values. - *

      - * Set keySetByValue() returns the keys in a Set whose iterator will - * iterate over the keys in ascending order by their corresponding - * values. - *

      - * Collection valuesByValue() returns the values in a Collection whose - * iterator will iterate over the values in ascending order. - * - * @deprecated Replaced by TreeBidiMap in bidimap subpackage. Due to be removed in v4.0. - * @see BidiMap - * @see org.apache.commons.collections.bidimap.DualTreeBidiMap - * @see org.apache.commons.collections.bidimap.DualHashBidiMap - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Marc Johnson - */ -public final class DoubleOrderedMap extends AbstractMap { -// final for performance - - private static final int KEY = 0; - private static final int VALUE = 1; - private static final int SUM_OF_INDICES = KEY + VALUE; - private static final int FIRST_INDEX = 0; - private static final int NUMBER_OF_INDICES = 2; - private static final String[] dataName = new String[] { "key", "value" }; - - private Node[] rootNode = new Node[] { null, null }; - private int nodeCount = 0; - private int modifications = 0; - private Set[] setOfKeys = new Set[] { null, null }; - private Set[] setOfEntries = new Set[] { null, null }; - private Collection[] collectionOfValues = new Collection[] { null, null }; - - /** - * Construct a new DoubleOrderedMap - */ - public DoubleOrderedMap() { - } - - /** - * Constructs a new DoubleOrderedMap from an existing Map, with keys and - * values sorted - * - * @param map the map whose mappings are to be placed in this map. - * - * @throws ClassCastException if the keys in the map are not - * Comparable, or are not mutually - * comparable; also if the values in - * the map are not Comparable, or - * are not mutually Comparable - * @throws NullPointerException if any key or value in the map - * is null - * @throws IllegalArgumentException if there are duplicate keys - * or duplicate values in the - * map - */ - public DoubleOrderedMap(final Map map) - throws ClassCastException, NullPointerException, - IllegalArgumentException { - putAll(map); - } - - /** - * Returns the key to which this map maps the specified value. - * Returns null if the map contains no mapping for this value. - * - * @param value value whose associated key is to be returned. - * - * @return the key to which this map maps the specified value, or - * null if the map contains no mapping for this value. - * - * @throws ClassCastException if the value is of an - * inappropriate type for this map. - * @throws NullPointerException if the value is null - */ - public Object getKeyForValue(final Object value) - throws ClassCastException, NullPointerException { - return doGet((Comparable) value, VALUE); - } - - /** - * Removes the mapping for this value from this map if present - * - * @param value value whose mapping is to be removed from the map. - * - * @return previous key associated with specified value, or null - * if there was no mapping for value. - */ - public Object removeValue(final Object value) { - return doRemove((Comparable) value, VALUE); - } - - /** - * Returns a set view of the mappings contained in this map. Each - * element in the returned set is a Map.Entry. The set is backed - * by the map, so changes to the map are reflected in the set, and - * vice-versa. If the map is modified while an iteration over the - * set is in progress, the results of the iteration are - * undefined. The set supports element removal, which removes the - * corresponding mapping from the map, via the Iterator.remove, - * Set.remove, removeAll, retainAll and clear operations. It does - * not support the add or addAll operations.

      - * - * The difference between this method and entrySet is that - * entrySet's iterator() method returns an iterator that iterates - * over the mappings in ascending order by key. This method's - * iterator method iterates over the mappings in ascending order - * by value. - * - * @return a set view of the mappings contained in this map. - */ - public Set entrySetByValue() { - - if (setOfEntries[VALUE] == null) { - setOfEntries[VALUE] = new AbstractSet() { - - public Iterator iterator() { - - return new DoubleOrderedMapIterator(VALUE) { - - protected Object doGetNext() { - return lastReturnedNode; - } - }; - } - - public boolean contains(Object o) { - - if (!(o instanceof Map.Entry)) { - return false; - } - - Map.Entry entry = (Map.Entry) o; - Object key = entry.getKey(); - Node node = lookup((Comparable) entry.getValue(), - VALUE); - - return (node != null) && node.getData(KEY).equals(key); - } - - public boolean remove(Object o) { - - if (!(o instanceof Map.Entry)) { - return false; - } - - Map.Entry entry = (Map.Entry) o; - Object key = entry.getKey(); - Node node = lookup((Comparable) entry.getValue(), - VALUE); - - if ((node != null) && node.getData(KEY).equals(key)) { - doRedBlackDelete(node); - - return true; - } - - return false; - } - - public int size() { - return DoubleOrderedMap.this.size(); - } - - public void clear() { - DoubleOrderedMap.this.clear(); - } - }; - } - - return setOfEntries[VALUE]; - } - - /** - * Returns a set view of the keys contained in this map. The set - * is backed by the map, so changes to the map are reflected in - * the set, and vice-versa. If the map is modified while an - * iteration over the set is in progress, the results of the - * iteration are undefined. The set supports element removal, - * which removes the corresponding mapping from the map, via the - * Iterator.remove, Set.remove, removeAll, retainAll, and clear - * operations. It does not support the add or addAll - * operations.

      - * - * The difference between this method and keySet is that keySet's - * iterator() method returns an iterator that iterates over the - * keys in ascending order by key. This method's iterator method - * iterates over the keys in ascending order by value. - * - * @return a set view of the keys contained in this map. - */ - public Set keySetByValue() { - - if (setOfKeys[VALUE] == null) { - setOfKeys[VALUE] = new AbstractSet() { - - public Iterator iterator() { - - return new DoubleOrderedMapIterator(VALUE) { - - protected Object doGetNext() { - return lastReturnedNode.getData(KEY); - } - }; - } - - public int size() { - return DoubleOrderedMap.this.size(); - } - - public boolean contains(Object o) { - return containsKey(o); - } - - public boolean remove(Object o) { - - int oldnodeCount = nodeCount; - - DoubleOrderedMap.this.remove(o); - - return nodeCount != oldnodeCount; - } - - public void clear() { - DoubleOrderedMap.this.clear(); - } - }; - } - - return setOfKeys[VALUE]; - } - - /** - * Returns a collection view of the values contained in this - * map. The collection is backed by the map, so changes to the map - * are reflected in the collection, and vice-versa. If the map is - * modified while an iteration over the collection is in progress, - * the results of the iteration are undefined. The collection - * supports element removal, which removes the corresponding - * mapping from the map, via the Iterator.remove, - * Collection.remove, removeAll, retainAll and clear operations. - * It does not support the add or addAll operations.

      - * - * The difference between this method and values is that values's - * iterator() method returns an iterator that iterates over the - * values in ascending order by key. This method's iterator method - * iterates over the values in ascending order by key. - * - * @return a collection view of the values contained in this map. - */ - public Collection valuesByValue() { - - if (collectionOfValues[VALUE] == null) { - collectionOfValues[VALUE] = new AbstractCollection() { - - public Iterator iterator() { - - return new DoubleOrderedMapIterator(VALUE) { - - protected Object doGetNext() { - return lastReturnedNode.getData(VALUE); - } - }; - } - - public int size() { - return DoubleOrderedMap.this.size(); - } - - public boolean contains(Object o) { - return containsValue(o); - } - - public boolean remove(Object o) { - - int oldnodeCount = nodeCount; - - removeValue(o); - - return nodeCount != oldnodeCount; - } - - public boolean removeAll(Collection c) { - - boolean modified = false; - Iterator iter = c.iterator(); - - while (iter.hasNext()) { - if (removeValue(iter.next()) != null) { - modified = true; - } - } - - return modified; - } - - public void clear() { - DoubleOrderedMap.this.clear(); - } - }; - } - - return collectionOfValues[VALUE]; - } - - /** - * common remove logic (remove by key or remove by value) - * - * @param o the key, or value, that we're looking for - * @param index KEY or VALUE - * - * @return the key, if remove by value, or the value, if remove by - * key. null if the specified key or value could not be - * found - */ - private Object doRemove(final Comparable o, final int index) { - - Node node = lookup(o, index); - Object rval = null; - - if (node != null) { - rval = node.getData(oppositeIndex(index)); - - doRedBlackDelete(node); - } - - return rval; - } - - /** - * common get logic, used to get by key or get by value - * - * @param o the key or value that we're looking for - * @param index KEY or VALUE - * - * @return the key (if the value was mapped) or the value (if the - * key was mapped); null if we couldn't find the specified - * object - */ - private Object doGet(final Comparable o, final int index) { - - checkNonNullComparable(o, index); - - Node node = lookup(o, index); - - return ((node == null) - ? null - : node.getData(oppositeIndex(index))); - } - - /** - * Get the opposite index of the specified index - * - * @param index KEY or VALUE - * - * @return VALUE (if KEY was specified), else KEY - */ - private int oppositeIndex(final int index) { - - // old trick ... to find the opposite of a value, m or n, - // subtract the value from the sum of the two possible - // values. (m + n) - m = n; (m + n) - n = m - return SUM_OF_INDICES - index; - } - - /** - * do the actual lookup of a piece of data - * - * @param data the key or value to be looked up - * @param index KEY or VALUE - * - * @return the desired Node, or null if there is no mapping of the - * specified data - */ - private Node lookup(final Comparable data, final int index) { - - Node rval = null; - Node node = rootNode[index]; - - while (node != null) { - int cmp = compare(data, node.getData(index)); - - if (cmp == 0) { - rval = node; - - break; - } else { - node = (cmp < 0) - ? node.getLeft(index) - : node.getRight(index); - } - } - - return rval; - } - - /** - * Compare two objects - * - * @param o1 the first object - * @param o2 the second object - * - * @return negative value if o1 < o2; 0 if o1 == o2; positive - * value if o1 > o2 - */ - private static int compare(final Comparable o1, final Comparable o2) { - return o1.compareTo(o2); - } - - /** - * find the least node from a given node. very useful for starting - * a sorting iterator ... - * - * @param node the node from which we will start searching - * @param index KEY or VALUE - * - * @return the smallest node, from the specified node, in the - * specified mapping - */ - private static Node leastNode(final Node node, final int index) { - - Node rval = node; - - if (rval != null) { - while (rval.getLeft(index) != null) { - rval = rval.getLeft(index); - } - } - - return rval; - } - - /** - * get the next larger node from the specified node - * - * @param node the node to be searched from - * @param index KEY or VALUE - * - * @return the specified node - */ - private Node nextGreater(final Node node, final int index) { - - Node rval = null; - - if (node == null) { - rval = null; - } else if (node.getRight(index) != null) { - - // everything to the node's right is larger. The least of - // the right node's descendants is the next larger node - rval = leastNode(node.getRight(index), index); - } else { - - // traverse up our ancestry until we find an ancestor that - // is null or one whose left child is our ancestor. If we - // find a null, then this node IS the largest node in the - // tree, and there is no greater node. Otherwise, we are - // the largest node in the subtree on that ancestor's left - // ... and that ancestor is the next greatest node - Node parent = node.getParent(index); - Node child = node; - - while ((parent != null) && (child == parent.getRight(index))) { - child = parent; - parent = parent.getParent(index); - } - - rval = parent; - } - - return rval; - } - - /** - * copy the color from one node to another, dealing with the fact - * that one or both nodes may, in fact, be null - * - * @param from the node whose color we're copying; may be null - * @param to the node whose color we're changing; may be null - * @param index KEY or VALUE - */ - private static void copyColor(final Node from, final Node to, - final int index) { - - if (to != null) { - if (from == null) { - - // by default, make it black - to.setBlack(index); - } else { - to.copyColor(from, index); - } - } - } - - /** - * is the specified node red? if the node does not exist, no, it's - * black, thank you - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static boolean isRed(final Node node, final int index) { - - return ((node == null) - ? false - : node.isRed(index)); - } - - /** - * is the specified black red? if the node does not exist, sure, - * it's black, thank you - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static boolean isBlack(final Node node, final int index) { - - return ((node == null) - ? true - : node.isBlack(index)); - } - - /** - * force a node (if it exists) red - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static void makeRed(final Node node, final int index) { - - if (node != null) { - node.setRed(index); - } - } - - /** - * force a node (if it exists) black - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static void makeBlack(final Node node, final int index) { - - if (node != null) { - node.setBlack(index); - } - } - - /** - * get a node's grandparent. mind you, the node, its parent, or - * its grandparent may not exist. no problem - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static Node getGrandParent(final Node node, final int index) { - return getParent(getParent(node, index), index); - } - - /** - * get a node's parent. mind you, the node, or its parent, may not - * exist. no problem - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static Node getParent(final Node node, final int index) { - - return ((node == null) - ? null - : node.getParent(index)); - } - - /** - * get a node's right child. mind you, the node may not exist. no - * problem - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static Node getRightChild(final Node node, final int index) { - - return (node == null) - ? null - : node.getRight(index); - } - - /** - * get a node's left child. mind you, the node may not exist. no - * problem - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static Node getLeftChild(final Node node, final int index) { - - return (node == null) - ? null - : node.getLeft(index); - } - - /** - * is this node its parent's left child? mind you, the node, or - * its parent, may not exist. no problem. if the node doesn't - * exist ... it's its non-existent parent's left child. If the - * node does exist but has no parent ... no, we're not the - * non-existent parent's left child. Otherwise (both the specified - * node AND its parent exist), check. - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static boolean isLeftChild(final Node node, final int index) { - - return (node == null) - ? true - : ((node.getParent(index) == null) - ? false - : (node == node.getParent(index).getLeft(index))); - } - - /** - * is this node its parent's right child? mind you, the node, or - * its parent, may not exist. no problem. if the node doesn't - * exist ... it's its non-existent parent's right child. If the - * node does exist but has no parent ... no, we're not the - * non-existent parent's right child. Otherwise (both the - * specified node AND its parent exist), check. - * - * @param node the node (may be null) in question - * @param index KEY or VALUE - */ - private static boolean isRightChild(final Node node, final int index) { - - return (node == null) - ? true - : ((node.getParent(index) == null) - ? false - : (node == node.getParent(index).getRight(index))); - } - - /** - * do a rotate left. standard fare in the world of balanced trees - * - * @param node the node to be rotated - * @param index KEY or VALUE - */ - private void rotateLeft(final Node node, final int index) { - - Node rightChild = node.getRight(index); - - node.setRight(rightChild.getLeft(index), index); - - if (rightChild.getLeft(index) != null) { - rightChild.getLeft(index).setParent(node, index); - } - - rightChild.setParent(node.getParent(index), index); - - if (node.getParent(index) == null) { - - // node was the root ... now its right child is the root - rootNode[index] = rightChild; - } else if (node.getParent(index).getLeft(index) == node) { - node.getParent(index).setLeft(rightChild, index); - } else { - node.getParent(index).setRight(rightChild, index); - } - - rightChild.setLeft(node, index); - node.setParent(rightChild, index); - } - - /** - * do a rotate right. standard fare in the world of balanced trees - * - * @param node the node to be rotated - * @param index KEY or VALUE - */ - private void rotateRight(final Node node, final int index) { - - Node leftChild = node.getLeft(index); - - node.setLeft(leftChild.getRight(index), index); - - if (leftChild.getRight(index) != null) { - leftChild.getRight(index).setParent(node, index); - } - - leftChild.setParent(node.getParent(index), index); - - if (node.getParent(index) == null) { - - // node was the root ... now its left child is the root - rootNode[index] = leftChild; - } else if (node.getParent(index).getRight(index) == node) { - node.getParent(index).setRight(leftChild, index); - } else { - node.getParent(index).setLeft(leftChild, index); - } - - leftChild.setRight(node, index); - node.setParent(leftChild, index); - } - - /** - * complicated red-black insert stuff. Based on Sun's TreeMap - * implementation, though it's barely recognizable any more - * - * @param insertedNode the node to be inserted - * @param index KEY or VALUE - */ - private void doRedBlackInsert(final Node insertedNode, final int index) { - - Node currentNode = insertedNode; - - makeRed(currentNode, index); - - while ((currentNode != null) && (currentNode != rootNode[index]) - && (isRed(currentNode.getParent(index), index))) { - if (isLeftChild(getParent(currentNode, index), index)) { - Node y = getRightChild(getGrandParent(currentNode, index), - index); - - if (isRed(y, index)) { - makeBlack(getParent(currentNode, index), index); - makeBlack(y, index); - makeRed(getGrandParent(currentNode, index), index); - - currentNode = getGrandParent(currentNode, index); - } else { - if (isRightChild(currentNode, index)) { - currentNode = getParent(currentNode, index); - - rotateLeft(currentNode, index); - } - - makeBlack(getParent(currentNode, index), index); - makeRed(getGrandParent(currentNode, index), index); - - if (getGrandParent(currentNode, index) != null) { - rotateRight(getGrandParent(currentNode, index), - index); - } - } - } else { - - // just like clause above, except swap left for right - Node y = getLeftChild(getGrandParent(currentNode, index), - index); - - if (isRed(y, index)) { - makeBlack(getParent(currentNode, index), index); - makeBlack(y, index); - makeRed(getGrandParent(currentNode, index), index); - - currentNode = getGrandParent(currentNode, index); - } else { - if (isLeftChild(currentNode, index)) { - currentNode = getParent(currentNode, index); - - rotateRight(currentNode, index); - } - - makeBlack(getParent(currentNode, index), index); - makeRed(getGrandParent(currentNode, index), index); - - if (getGrandParent(currentNode, index) != null) { - rotateLeft(getGrandParent(currentNode, index), index); - } - } - } - } - - makeBlack(rootNode[index], index); - } - - /** - * complicated red-black delete stuff. Based on Sun's TreeMap - * implementation, though it's barely recognizable any more - * - * @param deletedNode the node to be deleted - */ - private void doRedBlackDelete(final Node deletedNode) { - - for (int index = FIRST_INDEX; index < NUMBER_OF_INDICES; index++) { - - // if deleted node has both left and children, swap with - // the next greater node - if ((deletedNode.getLeft(index) != null) - && (deletedNode.getRight(index) != null)) { - swapPosition(nextGreater(deletedNode, index), deletedNode, - index); - } - - Node replacement = ((deletedNode.getLeft(index) != null) - ? deletedNode.getLeft(index) - : deletedNode.getRight(index)); - - if (replacement != null) { - replacement.setParent(deletedNode.getParent(index), index); - - if (deletedNode.getParent(index) == null) { - rootNode[index] = replacement; - } else if (deletedNode - == deletedNode.getParent(index).getLeft(index)) { - deletedNode.getParent(index).setLeft(replacement, index); - } else { - deletedNode.getParent(index).setRight(replacement, index); - } - - deletedNode.setLeft(null, index); - deletedNode.setRight(null, index); - deletedNode.setParent(null, index); - - if (isBlack(deletedNode, index)) { - doRedBlackDeleteFixup(replacement, index); - } - } else { - - // replacement is null - if (deletedNode.getParent(index) == null) { - - // empty tree - rootNode[index] = null; - } else { - - // deleted node had no children - if (isBlack(deletedNode, index)) { - doRedBlackDeleteFixup(deletedNode, index); - } - - if (deletedNode.getParent(index) != null) { - if (deletedNode - == deletedNode.getParent(index) - .getLeft(index)) { - deletedNode.getParent(index).setLeft(null, index); - } else { - deletedNode.getParent(index).setRight(null, - index); - } - - deletedNode.setParent(null, index); - } - } - } - } - - shrink(); - } - - /** - * complicated red-black delete stuff. Based on Sun's TreeMap - * implementation, though it's barely recognizable any more. This - * rebalances the tree (somewhat, as red-black trees are not - * perfectly balanced -- perfect balancing takes longer) - * - * @param replacementNode the node being replaced - * @param index KEY or VALUE - */ - private void doRedBlackDeleteFixup(final Node replacementNode, - final int index) { - - Node currentNode = replacementNode; - - while ((currentNode != rootNode[index]) - && (isBlack(currentNode, index))) { - if (isLeftChild(currentNode, index)) { - Node siblingNode = - getRightChild(getParent(currentNode, index), index); - - if (isRed(siblingNode, index)) { - makeBlack(siblingNode, index); - makeRed(getParent(currentNode, index), index); - rotateLeft(getParent(currentNode, index), index); - - siblingNode = getRightChild(getParent(currentNode, index), index); - } - - if (isBlack(getLeftChild(siblingNode, index), index) - && isBlack(getRightChild(siblingNode, index), - index)) { - makeRed(siblingNode, index); - - currentNode = getParent(currentNode, index); - } else { - if (isBlack(getRightChild(siblingNode, index), index)) { - makeBlack(getLeftChild(siblingNode, index), index); - makeRed(siblingNode, index); - rotateRight(siblingNode, index); - - siblingNode = - getRightChild(getParent(currentNode, index), index); - } - - copyColor(getParent(currentNode, index), siblingNode, - index); - makeBlack(getParent(currentNode, index), index); - makeBlack(getRightChild(siblingNode, index), index); - rotateLeft(getParent(currentNode, index), index); - - currentNode = rootNode[index]; - } - } else { - Node siblingNode = getLeftChild(getParent(currentNode, index), index); - - if (isRed(siblingNode, index)) { - makeBlack(siblingNode, index); - makeRed(getParent(currentNode, index), index); - rotateRight(getParent(currentNode, index), index); - - siblingNode = getLeftChild(getParent(currentNode, index), index); - } - - if (isBlack(getRightChild(siblingNode, index), index) - && isBlack(getLeftChild(siblingNode, index), index)) { - makeRed(siblingNode, index); - - currentNode = getParent(currentNode, index); - } else { - if (isBlack(getLeftChild(siblingNode, index), index)) { - makeBlack(getRightChild(siblingNode, index), index); - makeRed(siblingNode, index); - rotateLeft(siblingNode, index); - - siblingNode = - getLeftChild(getParent(currentNode, index), index); - } - - copyColor(getParent(currentNode, index), siblingNode, - index); - makeBlack(getParent(currentNode, index), index); - makeBlack(getLeftChild(siblingNode, index), index); - rotateRight(getParent(currentNode, index), index); - - currentNode = rootNode[index]; - } - } - } - - makeBlack(currentNode, index); - } - - /** - * swap two nodes (except for their content), taking care of - * special cases where one is the other's parent ... hey, it - * happens. - * - * @param x one node - * @param y another node - * @param index KEY or VALUE - */ - private void swapPosition(final Node x, final Node y, final int index) { - - // Save initial values. - Node xFormerParent = x.getParent(index); - Node xFormerLeftChild = x.getLeft(index); - Node xFormerRightChild = x.getRight(index); - Node yFormerParent = y.getParent(index); - Node yFormerLeftChild = y.getLeft(index); - Node yFormerRightChild = y.getRight(index); - boolean xWasLeftChild = - (x.getParent(index) != null) - && (x == x.getParent(index).getLeft(index)); - boolean yWasLeftChild = - (y.getParent(index) != null) - && (y == y.getParent(index).getLeft(index)); - - // Swap, handling special cases of one being the other's parent. - if (x == yFormerParent) { // x was y's parent - x.setParent(y, index); - - if (yWasLeftChild) { - y.setLeft(x, index); - y.setRight(xFormerRightChild, index); - } else { - y.setRight(x, index); - y.setLeft(xFormerLeftChild, index); - } - } else { - x.setParent(yFormerParent, index); - - if (yFormerParent != null) { - if (yWasLeftChild) { - yFormerParent.setLeft(x, index); - } else { - yFormerParent.setRight(x, index); - } - } - - y.setLeft(xFormerLeftChild, index); - y.setRight(xFormerRightChild, index); - } - - if (y == xFormerParent) { // y was x's parent - y.setParent(x, index); - - if (xWasLeftChild) { - x.setLeft(y, index); - x.setRight(yFormerRightChild, index); - } else { - x.setRight(y, index); - x.setLeft(yFormerLeftChild, index); - } - } else { - y.setParent(xFormerParent, index); - - if (xFormerParent != null) { - if (xWasLeftChild) { - xFormerParent.setLeft(y, index); - } else { - xFormerParent.setRight(y, index); - } - } - - x.setLeft(yFormerLeftChild, index); - x.setRight(yFormerRightChild, index); - } - - // Fix children's parent pointers - if (x.getLeft(index) != null) { - x.getLeft(index).setParent(x, index); - } - - if (x.getRight(index) != null) { - x.getRight(index).setParent(x, index); - } - - if (y.getLeft(index) != null) { - y.getLeft(index).setParent(y, index); - } - - if (y.getRight(index) != null) { - y.getRight(index).setParent(y, index); - } - - x.swapColors(y, index); - - // Check if root changed - if (rootNode[index] == x) { - rootNode[index] = y; - } else if (rootNode[index] == y) { - rootNode[index] = x; - } - } - - /** - * check if an object is fit to be proper input ... has to be - * Comparable and non-null - * - * @param o the object being checked - * @param index KEY or VALUE (used to put the right word in the - * exception message) - * - * @throws NullPointerException if o is null - * @throws ClassCastException if o is not Comparable - */ - private static void checkNonNullComparable(final Object o, - final int index) { - - if (o == null) { - throw new NullPointerException(dataName[index] - + " cannot be null"); - } - - if (!(o instanceof Comparable)) { - throw new ClassCastException(dataName[index] - + " must be Comparable"); - } - } - - /** - * check a key for validity (non-null and implements Comparable) - * - * @param key the key to be checked - * - * @throws NullPointerException if key is null - * @throws ClassCastException if key is not Comparable - */ - private static void checkKey(final Object key) { - checkNonNullComparable(key, KEY); - } - - /** - * check a value for validity (non-null and implements Comparable) - * - * @param value the value to be checked - * - * @throws NullPointerException if value is null - * @throws ClassCastException if value is not Comparable - */ - private static void checkValue(final Object value) { - checkNonNullComparable(value, VALUE); - } - - /** - * check a key and a value for validity (non-null and implements - * Comparable) - * - * @param key the key to be checked - * @param value the value to be checked - * - * @throws NullPointerException if key or value is null - * @throws ClassCastException if key or value is not Comparable - */ - private static void checkKeyAndValue(final Object key, - final Object value) { - checkKey(key); - checkValue(value); - } - - /** - * increment the modification count -- used to check for - * concurrent modification of the map through the map and through - * an Iterator from one of its Set or Collection views - */ - private void modify() { - modifications++; - } - - /** - * bump up the size and note that the map has changed - */ - private void grow() { - - modify(); - - nodeCount++; - } - - /** - * decrement the size and note that the map has changed - */ - private void shrink() { - - modify(); - - nodeCount--; - } - - /** - * insert a node by its value - * - * @param newNode the node to be inserted - * - * @throws IllegalArgumentException if the node already exists - * in the value mapping - */ - private void insertValue(final Node newNode) - throws IllegalArgumentException { - - Node node = rootNode[VALUE]; - - while (true) { - int cmp = compare(newNode.getData(VALUE), node.getData(VALUE)); - - if (cmp == 0) { - throw new IllegalArgumentException( - "Cannot store a duplicate value (\"" - + newNode.getData(VALUE) + "\") in this Map"); - } else if (cmp < 0) { - if (node.getLeft(VALUE) != null) { - node = node.getLeft(VALUE); - } else { - node.setLeft(newNode, VALUE); - newNode.setParent(node, VALUE); - doRedBlackInsert(newNode, VALUE); - - break; - } - } else { // cmp > 0 - if (node.getRight(VALUE) != null) { - node = node.getRight(VALUE); - } else { - node.setRight(newNode, VALUE); - newNode.setParent(node, VALUE); - doRedBlackInsert(newNode, VALUE); - - break; - } - } - } - } - - /* ********** START implementation of Map ********** */ - - /** - * Returns the number of key-value mappings in this map. If the - * map contains more than Integer.MAXVALUE elements, returns - * Integer.MAXVALUE. - * - * @return the number of key-value mappings in this map. - */ - public int size() { - return nodeCount; - } - - /** - * Returns true if this map contains a mapping for the specified - * key. - * - * @param key key whose presence in this map is to be tested. - * - * @return true if this map contains a mapping for the specified - * key. - * - * @throws ClassCastException if the key is of an inappropriate - * type for this map. - * @throws NullPointerException if the key is null - */ - public boolean containsKey(final Object key) - throws ClassCastException, NullPointerException { - - checkKey(key); - - return lookup((Comparable) key, KEY) != null; - } - - /** - * Returns true if this map maps one or more keys to the - * specified value. - * - * @param value value whose presence in this map is to be tested. - * - * @return true if this map maps one or more keys to the specified - * value. - */ - public boolean containsValue(final Object value) { - - checkValue(value); - - return lookup((Comparable) value, VALUE) != null; - } - - /** - * Returns the value to which this map maps the specified - * key. Returns null if the map contains no mapping for this key. - * - * @param key key whose associated value is to be returned. - * - * @return the value to which this map maps the specified key, or - * null if the map contains no mapping for this key. - * - * @throws ClassCastException if the key is of an inappropriate - * type for this map. - * @throws NullPointerException if the key is null - */ - public Object get(final Object key) - throws ClassCastException, NullPointerException { - return doGet((Comparable) key, KEY); - } - - /** - * Associates the specified value with the specified key in this - * map. - * - * @param key key with which the specified value is to be - * associated. - * @param value value to be associated with the specified key. - * - * @return null - * - * @throws ClassCastException if the class of the specified key - * or value prevents it from being - * stored in this map. - * @throws NullPointerException if the specified key or value - * is null - * @throws IllegalArgumentException if the key duplicates an - * existing key, or if the - * value duplicates an - * existing value - */ - public Object put(final Object key, final Object value) - throws ClassCastException, NullPointerException, - IllegalArgumentException { - - checkKeyAndValue(key, value); - - Node node = rootNode[KEY]; - - if (node == null) { - Node root = new Node((Comparable) key, (Comparable) value); - - rootNode[KEY] = root; - rootNode[VALUE] = root; - - grow(); - } else { - while (true) { - int cmp = compare((Comparable) key, node.getData(KEY)); - - if (cmp == 0) { - throw new IllegalArgumentException( - "Cannot store a duplicate key (\"" + key - + "\") in this Map"); - } else if (cmp < 0) { - if (node.getLeft(KEY) != null) { - node = node.getLeft(KEY); - } else { - Node newNode = new Node((Comparable) key, - (Comparable) value); - - insertValue(newNode); - node.setLeft(newNode, KEY); - newNode.setParent(node, KEY); - doRedBlackInsert(newNode, KEY); - grow(); - - break; - } - } else { // cmp > 0 - if (node.getRight(KEY) != null) { - node = node.getRight(KEY); - } else { - Node newNode = new Node((Comparable) key, - (Comparable) value); - - insertValue(newNode); - node.setRight(newNode, KEY); - newNode.setParent(node, KEY); - doRedBlackInsert(newNode, KEY); - grow(); - - break; - } - } - } - } - - return null; - } - - /** - * Removes the mapping for this key from this map if present - * - * @param key key whose mapping is to be removed from the map. - * - * @return previous value associated with specified key, or null - * if there was no mapping for key. - */ - public Object remove(final Object key) { - return doRemove((Comparable) key, KEY); - } - - /** - * Removes all mappings from this map - */ - public void clear() { - - modify(); - - nodeCount = 0; - rootNode[KEY] = null; - rootNode[VALUE] = null; - } - - /** - * Returns a set view of the keys contained in this map. The set - * is backed by the map, so changes to the map are reflected in - * the set, and vice-versa. If the map is modified while an - * iteration over the set is in progress, the results of the - * iteration are undefined. The set supports element removal, - * which removes the corresponding mapping from the map, via the - * Iterator.remove, Set.remove, removeAll, retainAll, and clear - * operations. It does not support the add or addAll operations. - * - * @return a set view of the keys contained in this map. - */ - public Set keySet() { - - if (setOfKeys[KEY] == null) { - setOfKeys[KEY] = new AbstractSet() { - - public Iterator iterator() { - - return new DoubleOrderedMapIterator(KEY) { - - protected Object doGetNext() { - return lastReturnedNode.getData(KEY); - } - }; - } - - public int size() { - return DoubleOrderedMap.this.size(); - } - - public boolean contains(Object o) { - return containsKey(o); - } - - public boolean remove(Object o) { - - int oldNodeCount = nodeCount; - - DoubleOrderedMap.this.remove(o); - - return nodeCount != oldNodeCount; - } - - public void clear() { - DoubleOrderedMap.this.clear(); - } - }; - } - - return setOfKeys[KEY]; - } - - /** - * Returns a collection view of the values contained in this - * map. The collection is backed by the map, so changes to the map - * are reflected in the collection, and vice-versa. If the map is - * modified while an iteration over the collection is in progress, - * the results of the iteration are undefined. The collection - * supports element removal, which removes the corresponding - * mapping from the map, via the Iterator.remove, - * Collection.remove, removeAll, retainAll and clear operations. - * It does not support the add or addAll operations. - * - * @return a collection view of the values contained in this map. - */ - public Collection values() { - - if (collectionOfValues[KEY] == null) { - collectionOfValues[KEY] = new AbstractCollection() { - - public Iterator iterator() { - - return new DoubleOrderedMapIterator(KEY) { - - protected Object doGetNext() { - return lastReturnedNode.getData(VALUE); - } - }; - } - - public int size() { - return DoubleOrderedMap.this.size(); - } - - public boolean contains(Object o) { - return containsValue(o); - } - - public boolean remove(Object o) { - - int oldNodeCount = nodeCount; - - removeValue(o); - - return nodeCount != oldNodeCount; - } - - public boolean removeAll(Collection c) { - - boolean modified = false; - Iterator iter = c.iterator(); - - while (iter.hasNext()) { - if (removeValue(iter.next()) != null) { - modified = true; - } - } - - return modified; - } - - public void clear() { - DoubleOrderedMap.this.clear(); - } - }; - } - - return collectionOfValues[KEY]; - } - - /** - * Returns a set view of the mappings contained in this map. Each - * element in the returned set is a Map.Entry. The set is backed - * by the map, so changes to the map are reflected in the set, and - * vice-versa. If the map is modified while an iteration over the - * set is in progress, the results of the iteration are - * undefined. - *

      - * The set supports element removal, which removes the corresponding - * mapping from the map, via the Iterator.remove, Set.remove, removeAll, - * retainAll and clear operations. - * It does not support the add or addAll operations. - * The setValue method is not supported on the Map Entry. - * - * @return a set view of the mappings contained in this map. - */ - public Set entrySet() { - - if (setOfEntries[KEY] == null) { - setOfEntries[KEY] = new AbstractSet() { - - public Iterator iterator() { - - return new DoubleOrderedMapIterator(KEY) { - - protected Object doGetNext() { - return lastReturnedNode; - } - }; - } - - public boolean contains(Object o) { - - if (!(o instanceof Map.Entry)) { - return false; - } - - Map.Entry entry = (Map.Entry) o; - Object value = entry.getValue(); - Node node = lookup((Comparable) entry.getKey(), - KEY); - - return (node != null) - && node.getData(VALUE).equals(value); - } - - public boolean remove(Object o) { - - if (!(o instanceof Map.Entry)) { - return false; - } - - Map.Entry entry = (Map.Entry) o; - Object value = entry.getValue(); - Node node = lookup((Comparable) entry.getKey(), - KEY); - - if ((node != null) && node.getData(VALUE).equals(value)) { - doRedBlackDelete(node); - - return true; - } - - return false; - } - - public int size() { - return DoubleOrderedMap.this.size(); - } - - public void clear() { - DoubleOrderedMap.this.clear(); - } - }; - } - - return setOfEntries[KEY]; - } - - /* ********** END implementation of Map ********** */ - private abstract class DoubleOrderedMapIterator implements Iterator { - - private int expectedModifications; - protected Node lastReturnedNode; - private Node nextNode; - private int iteratorType; - - /** - * Constructor - * - * @param type - */ - DoubleOrderedMapIterator(final int type) { - - iteratorType = type; - expectedModifications = DoubleOrderedMap.this.modifications; - lastReturnedNode = null; - nextNode = leastNode(rootNode[iteratorType], - iteratorType); - } - - /** - * @return 'next', whatever that means for a given kind of - * DoubleOrderedMapIterator - */ - protected abstract Object doGetNext(); - - /* ********** START implementation of Iterator ********** */ - - /** - * @return true if the iterator has more elements. - */ - public final boolean hasNext() { - return nextNode != null; - } - - /** - * @return the next element in the iteration. - * - * @throws NoSuchElementException if iteration has no more - * elements. - * @throws ConcurrentModificationException if the - * DoubleOrderedMap is - * modified behind - * the iterator's - * back - */ - public final Object next() - throws NoSuchElementException, - ConcurrentModificationException { - - if (nextNode == null) { - throw new NoSuchElementException(); - } - - if (modifications != expectedModifications) { - throw new ConcurrentModificationException(); - } - - lastReturnedNode = nextNode; - nextNode = nextGreater(nextNode, iteratorType); - - return doGetNext(); - } - - /** - * Removes from the underlying collection the last element - * returned by the iterator. This method can be called only - * once per call to next. The behavior of an iterator is - * unspecified if the underlying collection is modified while - * the iteration is in progress in any way other than by - * calling this method. - * - * @throws IllegalStateException if the next method has not - * yet been called, or the - * remove method has already - * been called after the last - * call to the next method. - * @throws ConcurrentModificationException if the - * DoubleOrderedMap is - * modified behind - * the iterator's - * back - */ - public final void remove() - throws IllegalStateException, - ConcurrentModificationException { - - if (lastReturnedNode == null) { - throw new IllegalStateException(); - } - - if (modifications != expectedModifications) { - throw new ConcurrentModificationException(); - } - - doRedBlackDelete(lastReturnedNode); - - expectedModifications++; - - lastReturnedNode = null; - } - - /* ********** END implementation of Iterator ********** */ - } // end private abstract class DoubleOrderedMapIterator - - // final for performance - private static final class Node implements Map.Entry, KeyValue { - - private Comparable[] data; - private Node[] leftNode; - private Node[] rightNode; - private Node[] parentNode; - private boolean[] blackColor; - private int hashcodeValue; - private boolean calculatedHashCode; - - /** - * Make a new cell with given key and value, and with null - * links, and black (true) colors. - * - * @param key - * @param value - */ - Node(final Comparable key, final Comparable value) { - - data = new Comparable[]{ key, value }; - leftNode = new Node[]{ null, null }; - rightNode = new Node[]{ null, null }; - parentNode = new Node[]{ null, null }; - blackColor = new boolean[]{ true, true }; - calculatedHashCode = false; - } - - /** - * get the specified data - * - * @param index KEY or VALUE - * - * @return the key or value - */ - private Comparable getData(final int index) { - return data[index]; - } - - /** - * Set this node's left node - * - * @param node the new left node - * @param index KEY or VALUE - */ - private void setLeft(final Node node, final int index) { - leftNode[index] = node; - } - - /** - * get the left node - * - * @param index KEY or VALUE - * - * @return the left node -- may be null - */ - private Node getLeft(final int index) { - return leftNode[index]; - } - - /** - * Set this node's right node - * - * @param node the new right node - * @param index KEY or VALUE - */ - private void setRight(final Node node, final int index) { - rightNode[index] = node; - } - - /** - * get the right node - * - * @param index KEY or VALUE - * - * @return the right node -- may be null - */ - private Node getRight(final int index) { - return rightNode[index]; - } - - /** - * Set this node's parent node - * - * @param node the new parent node - * @param index KEY or VALUE - */ - private void setParent(final Node node, final int index) { - parentNode[index] = node; - } - - /** - * get the parent node - * - * @param index KEY or VALUE - * - * @return the parent node -- may be null - */ - private Node getParent(final int index) { - return parentNode[index]; - } - - /** - * exchange colors with another node - * - * @param node the node to swap with - * @param index KEY or VALUE - */ - private void swapColors(final Node node, final int index) { - - // Swap colors -- old hacker's trick - blackColor[index] ^= node.blackColor[index]; - node.blackColor[index] ^= blackColor[index]; - blackColor[index] ^= node.blackColor[index]; - } - - /** - * is this node black? - * - * @param index KEY or VALUE - * - * @return true if black (which is represented as a true boolean) - */ - private boolean isBlack(final int index) { - return blackColor[index]; - } - - /** - * is this node red? - * - * @param index KEY or VALUE - * - * @return true if non-black - */ - private boolean isRed(final int index) { - return !blackColor[index]; - } - - /** - * make this node black - * - * @param index KEY or VALUE - */ - private void setBlack(final int index) { - blackColor[index] = true; - } - - /** - * make this node red - * - * @param index KEY or VALUE - */ - private void setRed(final int index) { - blackColor[index] = false; - } - - /** - * make this node the same color as another - * - * @param node the node whose color we're adopting - * @param index KEY or VALUE - */ - private void copyColor(final Node node, final int index) { - blackColor[index] = node.blackColor[index]; - } - - /* ********** START implementation of Map.Entry ********** */ - - /** - * @return the key corresponding to this entry. - */ - public Object getKey() { - return data[KEY]; - } - - /** - * @return the value corresponding to this entry. - */ - public Object getValue() { - return data[VALUE]; - } - - /** - * Optional operation that is not permitted in this - * implementation - * - * @param ignored - * - * @return does not return - * - * @throws UnsupportedOperationException - */ - public Object setValue(Object ignored) - throws UnsupportedOperationException { - throw new UnsupportedOperationException( - "Map.Entry.setValue is not supported"); - } - - /** - * Compares the specified object with this entry for equality. - * Returns true if the given object is also a map entry and - * the two entries represent the same mapping. - * - * @param o object to be compared for equality with this map - * entry. - * @return true if the specified object is equal to this map - * entry. - */ - public boolean equals(Object o) { - - if (this == o) { - return true; - } - - if (!(o instanceof Map.Entry)) { - return false; - } - - Map.Entry e = (Map.Entry) o; - - return data[KEY].equals(e.getKey()) - && data[VALUE].equals(e.getValue()); - } - - /** - * @return the hash code value for this map entry. - */ - public int hashCode() { - - if (!calculatedHashCode) { - hashcodeValue = data[KEY].hashCode() - ^ data[VALUE].hashCode(); - calculatedHashCode = true; - } - - return hashcodeValue; - } - - /* ********** END implementation of Map.Entry ********** */ - } -} // end public class DoubleOrderedMap diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/EnumerationUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/EnumerationUtils.java deleted file mode 100644 index 2a4b6047c25..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/EnumerationUtils.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Enumeration; -import java.util.List; - -import org.apache.commons.collections.iterators.EnumerationIterator; - -/** - * Provides utility methods for {@link Enumeration} instances. - * - * @since Commons Collections 3.0 - * @version $Id: EnumerationUtils.java 646777 2008-04-10 12:33:15Z niallp $ - * - * @author Gary Gregory - */ -public class EnumerationUtils { - - /** - * EnumerationUtils is not normally instantiated. - */ - public EnumerationUtils() { - // no init. - } - - /** - * Creates a list based on an enumeration. - * - *

      As the enumeration is traversed, an ArrayList of its values is - * created. The new list is returned.

      - * - * @param enumeration the enumeration to traverse, which should not be null. - * @throws NullPointerException if the enumeration parameter is null. - */ - public static List toList(Enumeration enumeration) { - return IteratorUtils.toList(new EnumerationIterator(enumeration)); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ExtendedProperties.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ExtendedProperties.java deleted file mode 100644 index 89a5070e35d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ExtendedProperties.java +++ /dev/null @@ -1,1686 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.Vector; - -/** - * This class extends normal Java properties by adding the possibility - * to use the same key many times concatenating the value strings - * instead of overwriting them. - *

      - * Please consider using the PropertiesConfiguration class in - * Commons-Configuration as soon as it is released. - *

      - * The Extended Properties syntax is explained here: - * - *

        - *
      • - * Each property has the syntax key = value - *
      • - *
      • - * The key may use any character but the equal sign '='. - *
      • - *
      • - * value may be separated on different lines if a backslash - * is placed at the end of the line that continues below. - *
      • - *
      • - * If value is a list of strings, each token is separated - * by a comma ','. - *
      • - *
      • - * Commas in each token are escaped placing a backslash right before - * the comma. - *
      • - *
      • - * Backslashes are escaped by using two consecutive backslashes i.e. \\ - *
      • - *
      • - * If a key is used more than once, the values are appended - * as if they were on the same line separated with commas. - *
      • - *
      • - * Blank lines and lines starting with character '#' are skipped. - *
      • - *
      • - * If a property is named "include" (or whatever is defined by - * setInclude() and getInclude() and the value of that property is - * the full path to a file on disk, that file will be included into - * the ConfigurationsRepository. You can also pull in files relative - * to the parent configuration file. So if you have something - * like the following: - * - * include = additional.properties - * - * Then "additional.properties" is expected to be in the same - * directory as the parent configuration file. - * - * Duplicate name values will be replaced, so be careful. - * - *
      • - *
      - * - *

      Here is an example of a valid extended properties file: - * - *

      - *      # lines starting with # are comments
      - *
      - *      # This is the simplest property
      - *      key = value
      - *
      - *      # A long property may be separated on multiple lines
      - *      longvalue = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
      - *                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      - *
      - *      # This is a property with many tokens
      - *      tokens_on_a_line = first token, second token
      - *
      - *      # This sequence generates exactly the same result
      - *      tokens_on_multiple_lines = first token
      - *      tokens_on_multiple_lines = second token
      - *
      - *      # commas may be escaped in tokens
      - *      commas.escaped = Hi\, what'up?
      - * 
      - * - *

      NOTE: this class has not been written for - * performance nor low memory usage. In fact, it's way slower than it - * could be and generates too much memory garbage. But since - * performance is not an issue during intialization (and there is not - * much time to improve it), I wrote it this way. If you don't like - * it, go ahead and tune it up! - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stefano Mazzocchi - * @author Jon S. Stevens - * @author Dave Bryson - * @author Jason van Zyl - * @author Geir Magnusson Jr. - * @author Leon Messerschmidt - * @author Kent Johnson - * @author Daniel Rall - * @author Ilkka Priha - * @author Janek Bogucki - * @author Mohan Kishore - * @author Stephen Colebourne - * @author Shinobu Kawai - * @author Henning P. Schmiedehausen - */ -public class ExtendedProperties extends Hashtable { - - /** - * Default configurations repository. - */ - private ExtendedProperties defaults; - - /** - * The file connected to this repository (holding comments and - * such). - * - * @serial - */ - protected String file; - - /** - * Base path of the configuration file used to create - * this ExtendedProperties object. - */ - protected String basePath; - - /** - * File separator. - */ - protected String fileSeparator = System.getProperty("file.separator"); - - /** - * Has this configuration been intialized. - */ - protected boolean isInitialized = false; - - /** - * This is the name of the property that can point to other - * properties file for including other properties files. - */ - protected static String include = "include"; - - /** - * These are the keys in the order they listed - * in the configuration file. This is useful when - * you wish to perform operations with configuration - * information in a particular order. - */ - protected ArrayList keysAsListed = new ArrayList(); - - protected final static String START_TOKEN="${"; - protected final static String END_TOKEN="}"; - - - /** - * Interpolate key names to handle ${key} stuff - * - * @param base string to interpolate - * @return returns the key name with the ${key} substituted - */ - protected String interpolate(String base) { - // COPIED from [configuration] 2003-12-29 - return (interpolateHelper(base, null)); - } - - /** - * Recursive handler for multiple levels of interpolation. - * - * When called the first time, priorVariables should be null. - * - * @param base string with the ${key} variables - * @param priorVariables serves two purposes: to allow checking for - * loops, and creating a meaningful exception message should a loop - * occur. It's 0'th element will be set to the value of base from - * the first call. All subsequent interpolated variables are added - * afterward. - * - * @return the string with the interpolation taken care of - */ - protected String interpolateHelper(String base, List priorVariables) { - // COPIED from [configuration] 2003-12-29 - if (base == null) { - return null; - } - - // on the first call initialize priorVariables - // and add base as the first element - if (priorVariables == null) { - priorVariables = new ArrayList(); - priorVariables.add(base); - } - - int begin = -1; - int end = -1; - int prec = 0 - END_TOKEN.length(); - String variable = null; - StringBuffer result = new StringBuffer(); - - // FIXME: we should probably allow the escaping of the start token - while (((begin = base.indexOf(START_TOKEN, prec + END_TOKEN.length())) > -1) - && ((end = base.indexOf(END_TOKEN, begin)) > -1)) { - result.append(base.substring(prec + END_TOKEN.length(), begin)); - variable = base.substring(begin + START_TOKEN.length(), end); - - // if we've got a loop, create a useful exception message and throw - if (priorVariables.contains(variable)) { - String initialBase = priorVariables.remove(0).toString(); - priorVariables.add(variable); - StringBuffer priorVariableSb = new StringBuffer(); - - // create a nice trace of interpolated variables like so: - // var1->var2->var3 - for (Iterator it = priorVariables.iterator(); it.hasNext();) { - priorVariableSb.append(it.next()); - if (it.hasNext()) { - priorVariableSb.append("->"); - } - } - - throw new IllegalStateException( - "infinite loop in property interpolation of " + initialBase + ": " + priorVariableSb.toString()); - } - // otherwise, add this variable to the interpolation list. - else { - priorVariables.add(variable); - } - - //QUESTION: getProperty or getPropertyDirect - Object value = getProperty(variable); - if (value != null) { - result.append(interpolateHelper(value.toString(), priorVariables)); - - // pop the interpolated variable off the stack - // this maintains priorVariables correctness for - // properties with multiple interpolations, e.g. - // prop.name=${some.other.prop1}/blahblah/${some.other.prop2} - priorVariables.remove(priorVariables.size() - 1); - } else if (defaults != null && defaults.getString(variable, null) != null) { - result.append(defaults.getString(variable)); - } else { - //variable not defined - so put it back in the value - result.append(START_TOKEN).append(variable).append(END_TOKEN); - } - prec = end; - } - result.append(base.substring(prec + END_TOKEN.length(), base.length())); - - return result.toString(); - } - - /** - * Inserts a backslash before every comma and backslash. - */ - private static String escape(String s) { - StringBuffer buf = new StringBuffer(s); - for (int i = 0; i < buf.length(); i++) { - char c = buf.charAt(i); - if (c == ',' || c == '\\') { - buf.insert(i, '\\'); - i++; - } - } - return buf.toString(); - } - - /** - * Removes a backslash from every pair of backslashes. - */ - private static String unescape(String s) { - StringBuffer buf = new StringBuffer(s); - for (int i = 0; i < buf.length() - 1; i++) { - char c1 = buf.charAt(i); - char c2 = buf.charAt(i + 1); - if (c1 == '\\' && c2 == '\\') { - buf.deleteCharAt(i); - } - } - return buf.toString(); - } - - /** - * Counts the number of successive times 'ch' appears in the - * 'line' before the position indicated by the 'index'. - */ - private static int countPreceding(String line, int index, char ch) { - int i; - for (i = index - 1; i >= 0; i--) { - if (line.charAt(i) != ch) { - break; - } - } - return index - 1 - i; - } - - /** - * Checks if the line ends with odd number of backslashes - */ - private static boolean endsWithSlash(String line) { - if (!line.endsWith("\\")) { - return false; - } - return (countPreceding(line, line.length() - 1, '\\') % 2 == 0); - } - - /** - * This class is used to read properties lines. These lines do - * not terminate with new-line chars but rather when there is no - * backslash sign a the end of the line. This is used to - * concatenate multiple lines for readability. - */ - static class PropertiesReader extends LineNumberReader { - /** - * Constructor. - * - * @param reader A Reader. - */ - public PropertiesReader(Reader reader) { - super(reader); - } - - /** - * Read a property. - * - * @return a String property - * @throws IOException if there is difficulty reading the source. - */ - public String readProperty() throws IOException { - StringBuffer buffer = new StringBuffer(); - String line = readLine(); - while (line != null) { - line = line.trim(); - if ((line.length() != 0) && (line.charAt(0) != '#')) { - if (endsWithSlash(line)) { - line = line.substring(0, line.length() - 1); - buffer.append(line); - } else { - buffer.append(line); - return buffer.toString(); // normal method end - } - } - line = readLine(); - } - return null; // EOF reached - } - } - - /** - * This class divides into tokens a property value. Token - * separator is "," but commas into the property value are escaped - * using the backslash in front. - */ - static class PropertiesTokenizer extends StringTokenizer { - /** - * The property delimiter used while parsing (a comma). - */ - static final String DELIMITER = ","; - - /** - * Constructor. - * - * @param string A String. - */ - public PropertiesTokenizer(String string) { - super(string, DELIMITER); - } - - /** - * Check whether the object has more tokens. - * - * @return True if the object has more tokens. - */ - public boolean hasMoreTokens() { - return super.hasMoreTokens(); - } - - /** - * Get next token. - * - * @return A String. - */ - public String nextToken() { - StringBuffer buffer = new StringBuffer(); - - while (hasMoreTokens()) { - String token = super.nextToken(); - if (endsWithSlash(token)) { - buffer.append(token.substring(0, token.length() - 1)); - buffer.append(DELIMITER); - } else { - buffer.append(token); - break; - } - } - - return buffer.toString().trim(); - } - } - - /** - * Creates an empty extended properties object. - */ - public ExtendedProperties() { - super(); - } - - /** - * Creates and loads the extended properties from the specified file. - * - * @param file the filename to load - * @throws IOException if a file error occurs - */ - public ExtendedProperties(String file) throws IOException { - this(file, null); - } - - /** - * Creates and loads the extended properties from the specified file. - * - * @param file the filename to load - * @param defaultFile a second filename to load default values from - * @throws IOException if a file error occurs - */ - public ExtendedProperties(String file, String defaultFile) throws IOException { - this.file = file; - - basePath = new File(file).getAbsolutePath(); - basePath = basePath.substring(0, basePath.lastIndexOf(fileSeparator) + 1); - - FileInputStream in = null; - try { - in = new FileInputStream(file); - this.load(in); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (IOException ex) {} - } - - if (defaultFile != null) { - defaults = new ExtendedProperties(defaultFile); - } - } - - /** - * Indicate to client code whether property - * resources have been initialized or not. - */ - public boolean isInitialized() { - return isInitialized; - } - - /** - * Gets the property value for including other properties files. - * By default it is "include". - * - * @return A String. - */ - public String getInclude() { - return include; - } - - /** - * Sets the property value for including other properties files. - * By default it is "include". - * - * @param inc A String. - */ - public void setInclude(String inc) { - include = inc; - } - - /** - * Load the properties from the given input stream. - * - * @param input the InputStream to load from - * @throws IOException if an IO error occurs - */ - public void load(InputStream input) throws IOException { - load(input, null); - } - - /** - * Load the properties from the given input stream - * and using the specified encoding. - * - * @param input the InputStream to load from - * @param enc the encoding to use - * @throws IOException if an IO error occurs - */ - public synchronized void load(InputStream input, String enc) throws IOException { - PropertiesReader reader = null; - if (enc != null) { - try { - reader = new PropertiesReader(new InputStreamReader(input, enc)); - - } catch (UnsupportedEncodingException ex) { - // Another try coming up.... - } - } - - if (reader == null) { - try { - reader = new PropertiesReader(new InputStreamReader(input, "8859_1")); - - } catch (UnsupportedEncodingException ex) { - // ISO8859-1 support is required on java platforms but.... - // If it's not supported, use the system default encoding - reader = new PropertiesReader(new InputStreamReader(input)); - } - } - - try { - while (true) { - String line = reader.readProperty(); - if (line == null) { - return; // EOF - } - int equalSign = line.indexOf('='); - - if (equalSign > 0) { - String key = line.substring(0, equalSign).trim(); - String value = line.substring(equalSign + 1).trim(); - - // Configure produces lines like this ... just ignore them - if ("".equals(value)) { - continue; - } - - if (getInclude() != null && key.equalsIgnoreCase(getInclude())) { - // Recursively load properties files. - File file = null; - - if (value.startsWith(fileSeparator)) { - // We have an absolute path so we'll use this - file = new File(value); - - } else { - // We have a relative path, and we have two - // possible forms here. If we have the "./" form - // then just strip that off first before continuing. - if (value.startsWith("." + fileSeparator)) { - value = value.substring(2); - } - - file = new File(basePath + value); - } - - if (file != null && file.exists() && file.canRead()) { - load(new FileInputStream(file)); - } - } else { - addProperty(key, value); - } - } - } - } finally { - // Loading is initializing - isInitialized = true; - } - } - - /** - * Gets a property from the configuration. - * - * @param key property to retrieve - * @return value as object. Will return user value if exists, - * if not then default value if exists, otherwise null - */ - public Object getProperty(String key) { - // first, try to get from the 'user value' store - Object obj = this.get(key); - - if (obj == null) { - // if there isn't a value there, get it from the - // defaults if we have them - if (defaults != null) { - obj = defaults.get(key); - } - } - - return obj; - } - - /** - * Add a property to the configuration. If it already - * exists then the value stated here will be added - * to the configuration entry. For example, if - * - * resource.loader = file - * - * is already present in the configuration and you - * - * addProperty("resource.loader", "classpath") - * - * Then you will end up with a Vector like the - * following: - * - * ["file", "classpath"] - * - * @param key the key to add - * @param value the value to add - */ - public void addProperty(String key, Object value) { - if (value instanceof String) { - String str = (String) value; - if (str.indexOf(PropertiesTokenizer.DELIMITER) > 0) { - // token contains commas, so must be split apart then added - PropertiesTokenizer tokenizer = new PropertiesTokenizer(str); - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken(); - addPropertyInternal(key, unescape(token)); - } - } else { - // token contains no commas, so can be simply added - addPropertyInternal(key, unescape(str)); - } - } else { - addPropertyInternal(key, value); - } - - // Adding a property connotes initialization - isInitialized = true; - } - - /** - * Adds a key/value pair to the map. This routine does - * no magic morphing. It ensures the keylist is maintained - * - * @param key the key to store at - * @param value the decoded object to store - */ - private void addPropertyDirect(String key, Object value) { - // safety check - if (!containsKey(key)) { - keysAsListed.add(key); - } - put(key, value); - } - - /** - * Adds a decoded property to the map w/o checking for commas - used - * internally when a property has been broken up into - * strings that could contain escaped commas to prevent - * the inadvertent vectorization. - *

      - * Thanks to Leon Messerschmidt for this one. - * - * @param key the key to store at - * @param value the decoded object to store - */ - private void addPropertyInternal(String key, Object value) { - Object current = this.get(key); - - if (current instanceof String) { - // one object already in map - convert it to a vector - List values = new Vector(2); - values.add(current); - values.add(value); - put(key, values); - - } else if (current instanceof List) { - // already a list - just add the new token - ((List) current).add(value); - - } else { - // brand new key - store in keysAsListed to retain order - if (!containsKey(key)) { - keysAsListed.add(key); - } - put(key, value); - } - } - - /** - * Set a property, this will replace any previously - * set values. Set values is implicitly a call - * to clearProperty(key), addProperty(key,value). - * - * @param key the key to set - * @param value the value to set - */ - public void setProperty(String key, Object value) { - clearProperty(key); - addProperty(key, value); - } - - /** - * Save the properties to the given output stream. - *

      - * The stream is not closed, but it is flushed. - * - * @param output an OutputStream, may be null - * @param header a textual comment to act as a file header - * @throws IOException if an IO error occurs - */ - public synchronized void save(OutputStream output, String header) throws IOException { - if (output == null) { - return; - } - PrintWriter theWrtr = new PrintWriter(output); - if (header != null) { - theWrtr.println(header); - } - - Enumeration theKeys = keys(); - while (theKeys.hasMoreElements()) { - String key = (String) theKeys.nextElement(); - Object value = get(key); - if (value != null) { - if (value instanceof String) { - StringBuffer currentOutput = new StringBuffer(); - currentOutput.append(key); - currentOutput.append("="); - currentOutput.append(escape((String) value)); - theWrtr.println(currentOutput.toString()); - - } else if (value instanceof List) { - List values = (List) value; - for (Iterator it = values.iterator(); it.hasNext(); ) { - String currentElement = (String) it.next(); - StringBuffer currentOutput = new StringBuffer(); - currentOutput.append(key); - currentOutput.append("="); - currentOutput.append(escape(currentElement)); - theWrtr.println(currentOutput.toString()); - } - } - } - theWrtr.println(); - theWrtr.flush(); - } - } - - /** - * Combines an existing Hashtable with this Hashtable. - *

      - * Warning: It will overwrite previous entries without warning. - * - * @param props the properties to combine - */ - public void combine(ExtendedProperties props) { - for (Iterator it = props.getKeys(); it.hasNext();) { - String key = (String) it.next(); - setProperty(key, props.get(key)); - } - } - - /** - * Clear a property in the configuration. - * - * @param key the property key to remove along with corresponding value - */ - public void clearProperty(String key) { - if (containsKey(key)) { - // we also need to rebuild the keysAsListed or else - // things get *very* confusing - for (int i = 0; i < keysAsListed.size(); i++) { - if (( keysAsListed.get(i)).equals(key)) { - keysAsListed.remove(i); - break; - } - } - remove(key); - } - } - - /** - * Get the list of the keys contained in the configuration - * repository. - * - * @return an Iterator over the keys - */ - public Iterator getKeys() { - return keysAsListed.iterator(); - } - - /** - * Get the list of the keys contained in the configuration - * repository that match the specified prefix. - * - * @param prefix the prefix to match - * @return an Iterator of keys that match the prefix - */ - public Iterator getKeys(String prefix) { - Iterator keys = getKeys(); - ArrayList matchingKeys = new ArrayList(); - - while (keys.hasNext()) { - Object key = keys.next(); - - if (key instanceof String && ((String) key).startsWith(prefix)) { - matchingKeys.add(key); - } - } - return matchingKeys.iterator(); - } - - /** - * Create an ExtendedProperties object that is a subset - * of this one. Take into account duplicate keys - * by using the setProperty() in ExtendedProperties. - * - * @param prefix the prefix to get a subset for - * @return a new independent ExtendedProperties - */ - public ExtendedProperties subset(String prefix) { - ExtendedProperties c = new ExtendedProperties(); - Iterator keys = getKeys(); - boolean validSubset = false; - - while (keys.hasNext()) { - Object key = keys.next(); - - if (key instanceof String && ((String) key).startsWith(prefix)) { - if (!validSubset) { - validSubset = true; - } - - /* - * Check to make sure that c.subset(prefix) doesn't - * blow up when there is only a single property - * with the key prefix. This is not a useful - * subset but it is a valid subset. - */ - String newKey = null; - if (((String) key).length() == prefix.length()) { - newKey = prefix; - } else { - newKey = ((String) key).substring(prefix.length() + 1); - } - - /* - * use addPropertyDirect() - this will plug the data as - * is into the Map, but will also do the right thing - * re key accounting - */ - c.addPropertyDirect(newKey, get(key)); - } - } - - if (validSubset) { - return c; - } else { - return null; - } - } - - /** - * Display the configuration for debugging purposes to System.out. - */ - public void display() { - Iterator i = getKeys(); - - while (i.hasNext()) { - String key = (String) i.next(); - Object value = get(key); - System.out.println(key + " => " + value); - } - } - - /** - * Get a string associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated string. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String. - */ - public String getString(String key) { - return getString(key, null); - } - - /** - * Get a string associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated string if key is found, - * default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String. - */ - public String getString(String key, String defaultValue) { - Object value = get(key); - - if (value instanceof String) { - return interpolate((String) value); - - } else if (value == null) { - if (defaults != null) { - return interpolate(defaults.getString(key, defaultValue)); - } else { - return interpolate(defaultValue); - } - } else if (value instanceof List) { - return interpolate((String) ((List) value).get(0)); - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a String object"); - } - } - - /** - * Get a list of properties associated with the given - * configuration key. - * - * @param key The configuration key. - * @return The associated properties if key is found. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String/List. - * @throws IllegalArgumentException if one of the tokens is - * malformed (does not contain an equals sign). - */ - public Properties getProperties(String key) { - return getProperties(key, new Properties()); - } - - /** - * Get a list of properties associated with the given - * configuration key. - * - * @param key The configuration key. - * @return The associated properties if key is found. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String/List. - * @throws IllegalArgumentException if one of the tokens is - * malformed (does not contain an equals sign). - */ - public Properties getProperties(String key, Properties defaults) { - /* - * Grab an array of the tokens for this key. - */ - String[] tokens = getStringArray(key); - - // Each token is of the form 'key=value'. - Properties props = new Properties(defaults); - for (int i = 0; i < tokens.length; i++) { - String token = tokens[i]; - int equalSign = token.indexOf('='); - if (equalSign > 0) { - String pkey = token.substring(0, equalSign).trim(); - String pvalue = token.substring(equalSign + 1).trim(); - props.put(pkey, pvalue); - } else { - throw new IllegalArgumentException('\'' + token + "' does not contain " + "an equals sign"); - } - } - return props; - } - - /** - * Get an array of strings associated with the given configuration - * key. - * - * @param key The configuration key. - * @return The associated string array if key is found. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String/List. - */ - public String[] getStringArray(String key) { - Object value = get(key); - - List values; - if (value instanceof String) { - values = new Vector(1); - values.add(value); - - } else if (value instanceof List) { - values = (List) value; - - } else if (value == null) { - if (defaults != null) { - return defaults.getStringArray(key); - } else { - return new String[0]; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a String/List object"); - } - - String[] tokens = new String[values.size()]; - for (int i = 0; i < tokens.length; i++) { - tokens[i] = (String) values.get(i); - } - - return tokens; - } - - /** - * Get a Vector of strings associated with the given configuration - * key. - * - * @param key The configuration key. - * @return The associated Vector. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Vector. - */ - public Vector getVector(String key) { - return getVector(key, null); - } - - /** - * Get a Vector of strings associated with the given configuration key. - *

      - * The list is a copy of the internal data of this object, and as - * such you may alter it freely. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated Vector. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Vector. - */ - public Vector getVector(String key, Vector defaultValue) { - Object value = get(key); - - if (value instanceof List) { - return new Vector((List) value); - - } else if (value instanceof String) { - Vector values = new Vector(1); - values.add(value); - put(key, values); - return values; - - } else if (value == null) { - if (defaults != null) { - return defaults.getVector(key, defaultValue); - } else { - return ((defaultValue == null) ? new Vector() : defaultValue); - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Vector object"); - } - } - - /** - * Get a List of strings associated with the given configuration key. - *

      - * The list is a copy of the internal data of this object, and as - * such you may alter it freely. - * - * @param key The configuration key. - * @return The associated List object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a List. - * @since Commons Collections 3.2 - */ - public List getList(String key) { - return getList(key, null); - } - - /** - * Get a List of strings associated with the given configuration key. - *

      - * The list is a copy of the internal data of this object, and as - * such you may alter it freely. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated List. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a List. - * @since Commons Collections 3.2 - */ - public List getList(String key, List defaultValue) { - Object value = get(key); - - if (value instanceof List) { - return new ArrayList((List) value); - - } else if (value instanceof String) { - List values = new ArrayList(1); - values.add(value); - put(key, values); - return values; - - } else if (value == null) { - if (defaults != null) { - return defaults.getList(key, defaultValue); - } else { - return ((defaultValue == null) ? new ArrayList() : defaultValue); - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a List object"); - } - } - - /** - * Get a boolean associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated boolean. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Boolean. - */ - public boolean getBoolean(String key) { - Boolean b = getBoolean(key, null); - if (b != null) { - return b.booleanValue(); - } else { - throw new NoSuchElementException('\'' + key + "' doesn't map to an existing object"); - } - } - - /** - * Get a boolean associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated boolean. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Boolean. - */ - public boolean getBoolean(String key, boolean defaultValue) { - return getBoolean(key, new Boolean(defaultValue)).booleanValue(); - } - - /** - * Get a boolean associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated boolean if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Boolean. - */ - public Boolean getBoolean(String key, Boolean defaultValue) { - - Object value = get(key); - - if (value instanceof Boolean) { - return (Boolean) value; - - } else if (value instanceof String) { - String s = testBoolean((String) value); - Boolean b = new Boolean(s); - put(key, b); - return b; - - } else if (value == null) { - if (defaults != null) { - return defaults.getBoolean(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Boolean object"); - } - } - - /** - * Test whether the string represent by value maps to a boolean - * value or not. We will allow true, on, - * and yes for a true boolean value, and - * false, off, and no for - * false boolean values. Case of value to test for - * boolean status is ignored. - * - * @param value the value to test for boolean state - * @return true or false if the supplied - * text maps to a boolean value, or null otherwise. - */ - public String testBoolean(String value) { - String s = value.toLowerCase(); - - if (s.equals("true") || s.equals("on") || s.equals("yes")) { - return "true"; - } else if (s.equals("false") || s.equals("off") || s.equals("no")) { - return "false"; - } else { - return null; - } - } - - /** - * Get a byte associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated byte. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Byte. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public byte getByte(String key) { - Byte b = getByte(key, null); - if (b != null) { - return b.byteValue(); - } else { - throw new NoSuchElementException('\'' + key + " doesn't map to an existing object"); - } - } - - /** - * Get a byte associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated byte. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Byte. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public byte getByte(String key, byte defaultValue) { - return getByte(key, new Byte(defaultValue)).byteValue(); - } - - /** - * Get a byte associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated byte if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Byte. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Byte getByte(String key, Byte defaultValue) { - Object value = get(key); - - if (value instanceof Byte) { - return (Byte) value; - - } else if (value instanceof String) { - Byte b = new Byte((String) value); - put(key, b); - return b; - - } else if (value == null) { - if (defaults != null) { - return defaults.getByte(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Byte object"); - } - } - - /** - * Get a short associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated short. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Short. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public short getShort(String key) { - Short s = getShort(key, null); - if (s != null) { - return s.shortValue(); - } else { - throw new NoSuchElementException('\'' + key + "' doesn't map to an existing object"); - } - } - - /** - * Get a short associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated short. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Short. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public short getShort(String key, short defaultValue) { - return getShort(key, new Short(defaultValue)).shortValue(); - } - - /** - * Get a short associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated short if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Short. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Short getShort(String key, Short defaultValue) { - Object value = get(key); - - if (value instanceof Short) { - return (Short) value; - - } else if (value instanceof String) { - Short s = new Short((String) value); - put(key, s); - return s; - - } else if (value == null) { - if (defaults != null) { - return defaults.getShort(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Short object"); - } - } - - /** - * The purpose of this method is to get the configuration resource - * with the given name as an integer. - * - * @param name The resource name. - * @return The value of the resource as an integer. - */ - public int getInt(String name) { - return getInteger(name); - } - - /** - * The purpose of this method is to get the configuration resource - * with the given name as an integer, or a default value. - * - * @param name The resource name - * @param def The default value of the resource. - * @return The value of the resource as an integer. - */ - public int getInt(String name, int def) { - return getInteger(name, def); - } - - /** - * Get a int associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated int. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Integer. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public int getInteger(String key) { - Integer i = getInteger(key, null); - if (i != null) { - return i.intValue(); - } else { - throw new NoSuchElementException('\'' + key + "' doesn't map to an existing object"); - } - } - - /** - * Get a int associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated int. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Integer. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public int getInteger(String key, int defaultValue) { - Integer i = getInteger(key, null); - - if (i == null) { - return defaultValue; - } - return i.intValue(); - } - - /** - * Get a int associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated int if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Integer. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Integer getInteger(String key, Integer defaultValue) { - Object value = get(key); - - if (value instanceof Integer) { - return (Integer) value; - - } else if (value instanceof String) { - Integer i = new Integer((String) value); - put(key, i); - return i; - - } else if (value == null) { - if (defaults != null) { - return defaults.getInteger(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Integer object"); - } - } - - /** - * Get a long associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated long. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Long. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public long getLong(String key) { - Long l = getLong(key, null); - if (l != null) { - return l.longValue(); - } else { - throw new NoSuchElementException('\'' + key + "' doesn't map to an existing object"); - } - } - - /** - * Get a long associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated long. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Long. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public long getLong(String key, long defaultValue) { - return getLong(key, new Long(defaultValue)).longValue(); - } - - /** - * Get a long associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated long if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Long. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Long getLong(String key, Long defaultValue) { - Object value = get(key); - - if (value instanceof Long) { - return (Long) value; - - } else if (value instanceof String) { - Long l = new Long((String) value); - put(key, l); - return l; - - } else if (value == null) { - if (defaults != null) { - return defaults.getLong(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Long object"); - } - } - - /** - * Get a float associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated float. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Float. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public float getFloat(String key) { - Float f = getFloat(key, null); - if (f != null) { - return f.floatValue(); - } else { - throw new NoSuchElementException('\'' + key + "' doesn't map to an existing object"); - } - } - - /** - * Get a float associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated float. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Float. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public float getFloat(String key, float defaultValue) { - return getFloat(key, new Float(defaultValue)).floatValue(); - } - - /** - * Get a float associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated float if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Float. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Float getFloat(String key, Float defaultValue) { - Object value = get(key); - - if (value instanceof Float) { - return (Float) value; - - } else if (value instanceof String) { - Float f = new Float((String) value); - put(key, f); - return f; - - } else if (value == null) { - if (defaults != null) { - return defaults.getFloat(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Float object"); - } - } - - /** - * Get a double associated with the given configuration key. - * - * @param key The configuration key. - * @return The associated double. - * @throws NoSuchElementException is thrown if the key doesn't - * map to an existing object. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Double. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public double getDouble(String key) { - Double d = getDouble(key, null); - if (d != null) { - return d.doubleValue(); - } else { - throw new NoSuchElementException('\'' + key + "' doesn't map to an existing object"); - } - } - - /** - * Get a double associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated double. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Double. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public double getDouble(String key, double defaultValue) { - return getDouble(key, new Double(defaultValue)).doubleValue(); - } - - /** - * Get a double associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated double if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Double. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Double getDouble(String key, Double defaultValue) { - Object value = get(key); - - if (value instanceof Double) { - return (Double) value; - - } else if (value instanceof String) { - Double d = new Double((String) value); - put(key, d); - return d; - - } else if (value == null) { - if (defaults != null) { - return defaults.getDouble(key, defaultValue); - } else { - return defaultValue; - } - } else { - throw new ClassCastException('\'' + key + "' doesn't map to a Double object"); - } - } - - /** - * Convert a standard properties class into a configuration class. - *

      - * NOTE: From Commons Collections 3.2 this method will pick up - * any default parent Properties of the specified input object. - * - * @param props the properties object to convert - * @return new ExtendedProperties created from props - */ - public static ExtendedProperties convertProperties(Properties props) { - ExtendedProperties c = new ExtendedProperties(); - - for (Enumeration e = props.propertyNames(); e.hasMoreElements();) { - String s = (String) e.nextElement(); - c.setProperty(s, props.getProperty(s)); - } - - return c; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Factory.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Factory.java deleted file mode 100644 index 9e4f82117d2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Factory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a functor interface implemented by classes that create objects. - *

      - * A Factory creates an object without using an input parameter. - * If an input parameter is required, then {@link Transformer} is more appropriate. - *

      - * Standard implementations of common factories are provided by - * {@link FactoryUtils}. These include factories that return a constant, - * a copy of a prototype or a new instance. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Arron Bates - * @author Stephen Colebourne - */ -public interface Factory { - - /** - * Create a new object. - * - * @return a new object - * @throws FunctorException (runtime) if the factory cannot create an object - */ - public Object create(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FactoryUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FactoryUtils.java deleted file mode 100644 index a6477e0b988..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FactoryUtils.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import org.apache.commons.collections.functors.ConstantFactory; -import org.apache.commons.collections.functors.InstantiateFactory; -import org.apache.commons.collections.functors.ExceptionFactory; -import org.apache.commons.collections.functors.PrototypeFactory; - -/** - * FactoryUtils provides reference implementations and utilities - * for the Factory functor interface. The supplied factories are: - *

        - *
      • Prototype - clones a specified object - *
      • Reflection - creates objects using reflection - *
      • Constant - always returns the same object - *
      • Null - always returns null - *
      • Exception - always throws an exception - *
      - * All the supplied factories are Serializable. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class FactoryUtils { - - /** - * This class is not normally instantiated. - */ - public FactoryUtils() { - super(); - } - - /** - * Gets a Factory that always throws an exception. - * This could be useful during testing as a placeholder. - * - * @see org.apache.commons.collections.functors.ExceptionFactory - * - * @return the factory - */ - public static Factory exceptionFactory() { - return ExceptionFactory.INSTANCE; - } - - /** - * Gets a Factory that will return null each time the factory is used. - * This could be useful during testing as a placeholder. - * - * @see org.apache.commons.collections.functors.ConstantFactory - * - * @return the factory - */ - public static Factory nullFactory() { - return ConstantFactory.NULL_INSTANCE; - } - - /** - * Creates a Factory that will return the same object each time the factory - * is used. No check is made that the object is immutable. In general, only - * immutable objects should use the constant factory. Mutable objects should - * use the prototype factory. - * - * @see org.apache.commons.collections.functors.ConstantFactory - * - * @param constantToReturn the constant object to return each time in the factory - * @return the constant factory. - */ - public static Factory constantFactory(Object constantToReturn) { - return ConstantFactory.getInstance(constantToReturn); - } - - /** - * Creates a Factory that will return a clone of the same prototype object - * each time the factory is used. The prototype will be cloned using one of these - * techniques (in order): - *
        - *
      • public clone method - *
      • public copy constructor - *
      • serialization clone - *
          - * - * @see org.apache.commons.collections.functors.PrototypeFactory - * - * @param prototype the object to clone each time in the factory - * @return the prototype factory - * @throws IllegalArgumentException if the prototype is null - * @throws IllegalArgumentException if the prototype cannot be cloned - */ - public static Factory prototypeFactory(Object prototype) { - return PrototypeFactory.getInstance(prototype); - } - - /** - * Creates a Factory that can create objects of a specific type using - * a no-args constructor. - * - * @see org.apache.commons.collections.functors.InstantiateFactory - * - * @param classToInstantiate the Class to instantiate each time in the factory - * @return the reflection factory - * @throws IllegalArgumentException if the classToInstantiate is null - */ - public static Factory instantiateFactory(Class classToInstantiate) { - return InstantiateFactory.getInstance(classToInstantiate, null, null); - } - - /** - * Creates a Factory that can create objects of a specific type using - * the arguments specified to this method. - * - * @see org.apache.commons.collections.functors.InstantiateFactory - * - * @param classToInstantiate the Class to instantiate each time in the factory - * @param paramTypes parameter types for the constructor, can be null - * @param args the arguments to pass to the constructor, can be null - * @return the reflection factory - * @throws IllegalArgumentException if the classToInstantiate is null - * @throws IllegalArgumentException if the paramTypes and args don't match - * @throws IllegalArgumentException if the constructor doesn't exist - */ - public static Factory instantiateFactory(Class classToInstantiate, Class[] paramTypes, Object[] args) { - return InstantiateFactory.getInstance(classToInstantiate, paramTypes, args); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastArrayList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastArrayList.java deleted file mode 100644 index dc631103d5d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastArrayList.java +++ /dev/null @@ -1,1333 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -/** - *

          A customized implementation of java.util.ArrayList designed - * to operate in a multithreaded environment where the large majority of - * method calls are read-only, instead of structural changes. When operating - * in "fast" mode, read calls are non-synchronized and write calls perform the - * following steps:

          - *
            - *
          • Clone the existing collection - *
          • Perform the modification on the clone - *
          • Replace the existing collection with the (modified) clone - *
          - *

          When first created, objects of this class default to "slow" mode, where - * all accesses of any type are synchronized but no cloning takes place. This - * is appropriate for initially populating the collection, followed by a switch - * to "fast" mode (by calling setFast(true)) after initialization - * is complete.

          - * - *

          NOTE: If you are creating and accessing an - * ArrayList only within a single thread, you should use - * java.util.ArrayList directly (with no synchronization), for - * maximum performance.

          - * - *

          NOTE: This class is not cross-platform. - * Using it may cause unexpected failures on some architectures. - * It suffers from the same problems as the double-checked locking idiom. - * In particular, the instruction that clones the internal collection and the - * instruction that sets the internal reference to the clone can be executed - * or perceived out-of-order. This means that any read operation might fail - * unexpectedly, as it may be reading the state of the internal collection - * before the internal collection is fully formed. - * For more information on the double-checked locking idiom, see the - * - * Double-Checked Locking Idiom Is Broken Declaration.

          - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Craig R. McClanahan - * @author Stephen Colebourne - */ -public class FastArrayList extends ArrayList { - - - // ----------------------------------------------------------- Constructors - - - /** - * Construct a an empty list. - */ - public FastArrayList() { - - super(); - this.list = new ArrayList(); - - } - - - /** - * Construct an empty list with the specified capacity. - * - * @param capacity The initial capacity of the empty list - */ - public FastArrayList(int capacity) { - - super(); - this.list = new ArrayList(capacity); - - } - - - /** - * Construct a list containing the elements of the specified collection, - * in the order they are returned by the collection's iterator. - * - * @param collection The collection whose elements initialize the contents - * of this list - */ - public FastArrayList(Collection collection) { - - super(); - this.list = new ArrayList(collection); - - } - - - // ----------------------------------------------------- Instance Variables - - - /** - * The underlying list we are managing. - */ - protected ArrayList list = null; - - - // ------------------------------------------------------------- Properties - - - /** - * Are we operating in "fast" mode? - */ - protected boolean fast = false; - - - /** - * Returns true if this list is operating in fast mode. - * - * @return true if this list is operating in fast mode - */ - public boolean getFast() { - return (this.fast); - } - - /** - * Sets whether this list will operate in fast mode. - * - * @param fast true if the list should operate in fast mode - */ - public void setFast(boolean fast) { - this.fast = fast; - } - - - // --------------------------------------------------------- Public Methods - - - /** - * Appends the specified element to the end of this list. - * - * @param element The element to be appended - */ - public boolean add(Object element) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - boolean result = temp.add(element); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.add(element)); - } - } - - } - - - /** - * Insert the specified element at the specified position in this list, - * and shift all remaining elements up one position. - * - * @param index Index at which to insert this element - * @param element The element to be inserted - * - * @exception IndexOutOfBoundsException if the index is out of range - */ - public void add(int index, Object element) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - temp.add(index, element); - list = temp; - } - } else { - synchronized (list) { - list.add(index, element); - } - } - - } - - - /** - * Append all of the elements in the specified Collection to the end - * of this list, in the order that they are returned by the specified - * Collection's Iterator. - * - * @param collection The collection to be appended - */ - public boolean addAll(Collection collection) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - boolean result = temp.addAll(collection); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.addAll(collection)); - } - } - - } - - - /** - * Insert all of the elements in the specified Collection at the specified - * position in this list, and shift any previous elements upwards as - * needed. - * - * @param index Index at which insertion takes place - * @param collection The collection to be added - * - * @exception IndexOutOfBoundsException if the index is out of range - */ - public boolean addAll(int index, Collection collection) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - boolean result = temp.addAll(index, collection); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.addAll(index, collection)); - } - } - - } - - - /** - * Remove all of the elements from this list. The list will be empty - * after this call returns. - * - * @exception UnsupportedOperationException if clear() - * is not supported by this list - */ - public void clear() { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - temp.clear(); - list = temp; - } - } else { - synchronized (list) { - list.clear(); - } - } - - } - - - /** - * Return a shallow copy of this FastArrayList instance. - * The elements themselves are not copied. - */ - public Object clone() { - - FastArrayList results = null; - if (fast) { - results = new FastArrayList(list); - } else { - synchronized (list) { - results = new FastArrayList(list); - } - } - results.setFast(getFast()); - return (results); - - } - - - /** - * Return true if this list contains the specified element. - * - * @param element The element to test for - */ - public boolean contains(Object element) { - - if (fast) { - return (list.contains(element)); - } else { - synchronized (list) { - return (list.contains(element)); - } - } - - } - - - /** - * Return true if this list contains all of the elements - * in the specified Collection. - * - * @param collection Collection whose elements are to be checked - */ - public boolean containsAll(Collection collection) { - - if (fast) { - return (list.containsAll(collection)); - } else { - synchronized (list) { - return (list.containsAll(collection)); - } - } - - } - - - /** - * Increase the capacity of this ArrayList instance, if - * necessary, to ensure that it can hold at least the number of elements - * specified by the minimum capacity argument. - * - * @param capacity The new minimum capacity - */ - public void ensureCapacity(int capacity) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - temp.ensureCapacity(capacity); - list = temp; - } - } else { - synchronized (list) { - list.ensureCapacity(capacity); - } - } - - } - - - /** - * Compare the specified object with this list for equality. This - * implementation uses exactly the code that is used to define the - * list equals function in the documentation for the - * List.equals method. - * - * @param o Object to be compared to this list - */ - public boolean equals(Object o) { - - // Simple tests that require no synchronization - if (o == this) - return (true); - else if (!(o instanceof List)) - return (false); - List lo = (List) o; - - // Compare the sets of elements for equality - if (fast) { - ListIterator li1 = list.listIterator(); - ListIterator li2 = lo.listIterator(); - while (li1.hasNext() && li2.hasNext()) { - Object o1 = li1.next(); - Object o2 = li2.next(); - if (!(o1 == null ? o2 == null : o1.equals(o2))) - return (false); - } - return (!(li1.hasNext() || li2.hasNext())); - } else { - synchronized (list) { - ListIterator li1 = list.listIterator(); - ListIterator li2 = lo.listIterator(); - while (li1.hasNext() && li2.hasNext()) { - Object o1 = li1.next(); - Object o2 = li2.next(); - if (!(o1 == null ? o2 == null : o1.equals(o2))) - return (false); - } - return (!(li1.hasNext() || li2.hasNext())); - } - } - - } - - - /** - * Return the element at the specified position in the list. - * - * @param index The index of the element to return - * - * @exception IndexOutOfBoundsException if the index is out of range - */ - public Object get(int index) { - - if (fast) { - return (list.get(index)); - } else { - synchronized (list) { - return (list.get(index)); - } - } - - } - - - /** - * Return the hash code value for this list. This implementation uses - * exactly the code that is used to define the list hash function in the - * documentation for the List.hashCode method. - */ - public int hashCode() { - - if (fast) { - int hashCode = 1; - java.util.Iterator i = list.iterator(); - while (i.hasNext()) { - Object o = i.next(); - hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode()); - } - return (hashCode); - } else { - synchronized (list) { - int hashCode = 1; - java.util.Iterator i = list.iterator(); - while (i.hasNext()) { - Object o = i.next(); - hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode()); - } - return (hashCode); - } - } - - } - - - /** - * Search for the first occurrence of the given argument, testing - * for equality using the equals() method, and return - * the corresponding index, or -1 if the object is not found. - * - * @param element The element to search for - */ - public int indexOf(Object element) { - - if (fast) { - return (list.indexOf(element)); - } else { - synchronized (list) { - return (list.indexOf(element)); - } - } - - } - - - /** - * Test if this list has no elements. - */ - public boolean isEmpty() { - - if (fast) { - return (list.isEmpty()); - } else { - synchronized (list) { - return (list.isEmpty()); - } - } - - } - - - /** - * Return an iterator over the elements in this list in proper sequence. - *

          - * Thread safety
          - * The iterator returned is thread-safe ONLY in FAST mode. - * In slow mode there is no way to synchronize, or make the iterator thread-safe. - *

          - * In fast mode iteration and modification may occur in parallel on different threads, - * however there is a restriction. Modification must be EITHER via the Iterator - * interface methods OR the List interface. If a mixture of modification - * methods is used a ConcurrentModificationException is thrown from the iterator - * modification method. If the List modification methods are used the changes are - * NOT visible in the iterator (it shows the list contents at the time the iterator - * was created). - * - * @return the iterator - */ - public Iterator iterator() { - if (fast) { - return new ListIter(0); - } else { - return list.iterator(); - } - } - - - /** - * Search for the last occurrence of the given argument, testing - * for equality using the equals() method, and return - * the corresponding index, or -1 if the object is not found. - * - * @param element The element to search for - */ - public int lastIndexOf(Object element) { - - if (fast) { - return (list.lastIndexOf(element)); - } else { - synchronized (list) { - return (list.lastIndexOf(element)); - } - } - - } - - - /** - * Return an iterator of the elements of this list, in proper sequence. - *

          - * Thread safety
          - * The iterator returned is thread-safe ONLY in FAST mode. - * In slow mode there is no way to synchronize, or make the iterator thread-safe. - *

          - * In fast mode iteration and modification may occur in parallel on different threads, - * however there is a restriction. Modification must be EITHER via the Iterator - * interface methods OR the List interface. If a mixture of modification - * methods is used a ConcurrentModificationException is thrown from the iterator - * modification method. If the List modification methods are used the changes are - * NOT visible in the iterator (it shows the list contents at the time the iterator - * was created). - * - * @return the list iterator - */ - public ListIterator listIterator() { - if (fast) { - return new ListIter(0); - } else { - return list.listIterator(); - } - } - - - /** - * Return an iterator of the elements of this list, in proper sequence, - * starting at the specified position. - *

          - * Thread safety
          - * The iterator returned is thread-safe ONLY in FAST mode. - * In slow mode there is no way to synchronize, or make the iterator thread-safe. - *

          - * In fast mode iteration and modification may occur in parallel on different threads, - * however there is a restriction. Modification must be EITHER via the Iterator - * interface methods OR the List interface. If a mixture of modification - * methods is used a ConcurrentModificationException is thrown from the iterator - * modification method. If the List modification methods are used the changes are - * NOT visible in the iterator (it shows the list contents at the time the iterator - * was created). - * - * @param index The starting position of the iterator to return - * @return the list iterator - * @exception IndexOutOfBoundsException if the index is out of range - */ - public ListIterator listIterator(int index) { - if (fast) { - return new ListIter(index); - } else { - return list.listIterator(index); - } - } - - - /** - * Remove the element at the specified position in the list, and shift - * any subsequent elements down one position. - * - * @param index Index of the element to be removed - * - * @exception IndexOutOfBoundsException if the index is out of range - */ - public Object remove(int index) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - Object result = temp.remove(index); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.remove(index)); - } - } - - } - - - /** - * Remove the first occurrence of the specified element from the list, - * and shift any subsequent elements down one position. - * - * @param element Element to be removed - */ - public boolean remove(Object element) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - boolean result = temp.remove(element); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.remove(element)); - } - } - - } - - - /** - * Remove from this collection all of its elements that are contained - * in the specified collection. - * - * @param collection Collection containing elements to be removed - * - * @exception UnsupportedOperationException if this optional operation - * is not supported by this list - */ - public boolean removeAll(Collection collection) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - boolean result = temp.removeAll(collection); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.removeAll(collection)); - } - } - - } - - - /** - * Remove from this collection all of its elements except those that are - * contained in the specified collection. - * - * @param collection Collection containing elements to be retained - * - * @exception UnsupportedOperationException if this optional operation - * is not supported by this list - */ - public boolean retainAll(Collection collection) { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - boolean result = temp.retainAll(collection); - list = temp; - return (result); - } - } else { - synchronized (list) { - return (list.retainAll(collection)); - } - } - - } - - - /** - * Replace the element at the specified position in this list with - * the specified element. Returns the previous object at that position. - *

          - * IMPLEMENTATION NOTE - This operation is specifically - * documented to not be a structural change, so it is safe to be performed - * without cloning. - * - * @param index Index of the element to replace - * @param element The new element to be stored - * - * @exception IndexOutOfBoundsException if the index is out of range - */ - public Object set(int index, Object element) { - - if (fast) { - return (list.set(index, element)); - } else { - synchronized (list) { - return (list.set(index, element)); - } - } - - } - - - /** - * Return the number of elements in this list. - */ - public int size() { - - if (fast) { - return (list.size()); - } else { - synchronized (list) { - return (list.size()); - } - } - - } - - - /** - * Return a view of the portion of this list between fromIndex - * (inclusive) and toIndex (exclusive). The returned list is backed - * by this list, so non-structural changes in the returned list are - * reflected in this list. The returned list supports - * all of the optional list operations supported by this list. - * - * @param fromIndex The starting index of the sublist view - * @param toIndex The index after the end of the sublist view - * - * @exception IndexOutOfBoundsException if an index is out of range - */ - public List subList(int fromIndex, int toIndex) { - if (fast) { - return new SubList(fromIndex, toIndex); - } else { - return list.subList(fromIndex, toIndex); - } - } - - - /** - * Return an array containing all of the elements in this list in the - * correct order. - */ - public Object[] toArray() { - - if (fast) { - return (list.toArray()); - } else { - synchronized (list) { - return (list.toArray()); - } - } - - } - - - /** - * Return an array containing all of the elements in this list in the - * correct order. The runtime type of the returned array is that of - * the specified array. If the list fits in the specified array, it is - * returned therein. Otherwise, a new array is allocated with the - * runtime type of the specified array, and the size of this list. - * - * @param array Array defining the element type of the returned list - * - * @exception ArrayStoreException if the runtime type of array - * is not a supertype of the runtime type of every element in this list - */ - public Object[] toArray(Object array[]) { - - if (fast) { - return (list.toArray(array)); - } else { - synchronized (list) { - return (list.toArray(array)); - } - } - - } - - - /** - * Return a String representation of this object. - */ - public String toString() { - - StringBuffer sb = new StringBuffer("FastArrayList["); - sb.append(list.toString()); - sb.append("]"); - return (sb.toString()); - - } - - - /** - * Trim the capacity of this ArrayList instance to be the - * list's current size. An application can use this operation to minimize - * the storage of an ArrayList instance. - */ - public void trimToSize() { - - if (fast) { - synchronized (this) { - ArrayList temp = (ArrayList) list.clone(); - temp.trimToSize(); - list = temp; - } - } else { - synchronized (list) { - list.trimToSize(); - } - } - - } - - - - private class SubList implements List { - - private int first; - private int last; - private List expected; - - - public SubList(int first, int last) { - this.first = first; - this.last = last; - this.expected = list; - } - - private List get(List l) { - if (list != expected) { - throw new ConcurrentModificationException(); - } - return l.subList(first, last); - } - - public void clear() { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - get(temp).clear(); - last = first; - list = temp; - expected = temp; - } - } else { - synchronized (list) { - get(expected).clear(); - } - } - } - - public boolean remove(Object o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - boolean r = get(temp).remove(o); - if (r) last--; - list = temp; - expected = temp; - return r; - } - } else { - synchronized (list) { - return get(expected).remove(o); - } - } - } - - public boolean removeAll(Collection o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - List sub = get(temp); - boolean r = sub.removeAll(o); - if (r) last = first + sub.size(); - list = temp; - expected = temp; - return r; - } - } else { - synchronized (list) { - return get(expected).removeAll(o); - } - } - } - - public boolean retainAll(Collection o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - List sub = get(temp); - boolean r = sub.retainAll(o); - if (r) last = first + sub.size(); - list = temp; - expected = temp; - return r; - } - } else { - synchronized (list) { - return get(expected).retainAll(o); - } - } - } - - public int size() { - if (fast) { - return get(expected).size(); - } else { - synchronized (list) { - return get(expected).size(); - } - } - } - - - public boolean isEmpty() { - if (fast) { - return get(expected).isEmpty(); - } else { - synchronized (list) { - return get(expected).isEmpty(); - } - } - } - - public boolean contains(Object o) { - if (fast) { - return get(expected).contains(o); - } else { - synchronized (list) { - return get(expected).contains(o); - } - } - } - - public boolean containsAll(Collection o) { - if (fast) { - return get(expected).containsAll(o); - } else { - synchronized (list) { - return get(expected).containsAll(o); - } - } - } - - public Object[] toArray(Object[] o) { - if (fast) { - return get(expected).toArray(o); - } else { - synchronized (list) { - return get(expected).toArray(o); - } - } - } - - public Object[] toArray() { - if (fast) { - return get(expected).toArray(); - } else { - synchronized (list) { - return get(expected).toArray(); - } - } - } - - - public boolean equals(Object o) { - if (o == this) return true; - if (fast) { - return get(expected).equals(o); - } else { - synchronized (list) { - return get(expected).equals(o); - } - } - } - - public int hashCode() { - if (fast) { - return get(expected).hashCode(); - } else { - synchronized (list) { - return get(expected).hashCode(); - } - } - } - - public boolean add(Object o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - boolean r = get(temp).add(o); - if (r) last++; - list = temp; - expected = temp; - return r; - } - } else { - synchronized (list) { - return get(expected).add(o); - } - } - } - - public boolean addAll(Collection o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - boolean r = get(temp).addAll(o); - if (r) last += o.size(); - list = temp; - expected = temp; - return r; - } - } else { - synchronized (list) { - return get(expected).addAll(o); - } - } - } - - public void add(int i, Object o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - get(temp).add(i, o); - last++; - list = temp; - expected = temp; - } - } else { - synchronized (list) { - get(expected).add(i, o); - } - } - } - - public boolean addAll(int i, Collection o) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - boolean r = get(temp).addAll(i, o); - list = temp; - if (r) last += o.size(); - expected = temp; - return r; - } - } else { - synchronized (list) { - return get(expected).addAll(i, o); - } - } - } - - public Object remove(int i) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - Object o = get(temp).remove(i); - last--; - list = temp; - expected = temp; - return o; - } - } else { - synchronized (list) { - return get(expected).remove(i); - } - } - } - - public Object set(int i, Object a) { - if (fast) { - synchronized (FastArrayList.this) { - ArrayList temp = (ArrayList) list.clone(); - Object o = get(temp).set(i, a); - list = temp; - expected = temp; - return o; - } - } else { - synchronized (list) { - return get(expected).set(i, a); - } - } - } - - - public Iterator iterator() { - return new SubListIter(0); - } - - public ListIterator listIterator() { - return new SubListIter(0); - } - - public ListIterator listIterator(int i) { - return new SubListIter(i); - } - - - public Object get(int i) { - if (fast) { - return get(expected).get(i); - } else { - synchronized (list) { - return get(expected).get(i); - } - } - } - - public int indexOf(Object o) { - if (fast) { - return get(expected).indexOf(o); - } else { - synchronized (list) { - return get(expected).indexOf(o); - } - } - } - - - public int lastIndexOf(Object o) { - if (fast) { - return get(expected).lastIndexOf(o); - } else { - synchronized (list) { - return get(expected).lastIndexOf(o); - } - } - } - - - public List subList(int f, int l) { - if (list != expected) { - throw new ConcurrentModificationException(); - } - return new SubList(first + f, f + l); - } - - - private class SubListIter implements ListIterator { - - private List expected; - private ListIterator iter; - private int lastReturnedIndex = -1; - - - public SubListIter(int i) { - this.expected = list; - this.iter = SubList.this.get(expected).listIterator(i); - } - - private void checkMod() { - if (list != expected) { - throw new ConcurrentModificationException(); - } - } - - List get() { - return SubList.this.get(expected); - } - - public boolean hasNext() { - checkMod(); - return iter.hasNext(); - } - - public Object next() { - checkMod(); - lastReturnedIndex = iter.nextIndex(); - return iter.next(); - } - - public boolean hasPrevious() { - checkMod(); - return iter.hasPrevious(); - } - - public Object previous() { - checkMod(); - lastReturnedIndex = iter.previousIndex(); - return iter.previous(); - } - - public int previousIndex() { - checkMod(); - return iter.previousIndex(); - } - - public int nextIndex() { - checkMod(); - return iter.nextIndex(); - } - - public void remove() { - checkMod(); - if (lastReturnedIndex < 0) { - throw new IllegalStateException(); - } - get().remove(lastReturnedIndex); - last--; - expected = list; - iter = get().listIterator(lastReturnedIndex); - lastReturnedIndex = -1; - } - - public void set(Object o) { - checkMod(); - if (lastReturnedIndex < 0) { - throw new IllegalStateException(); - } - get().set(lastReturnedIndex, o); - expected = list; - iter = get().listIterator(previousIndex() + 1); - } - - public void add(Object o) { - checkMod(); - int i = nextIndex(); - get().add(i, o); - last++; - expected = list; - iter = get().listIterator(i + 1); - lastReturnedIndex = -1; - } - - } - - - } - - - - private class ListIter implements ListIterator { - - private List expected; - private ListIterator iter; - private int lastReturnedIndex = -1; - - - public ListIter(int i) { - this.expected = list; - this.iter = get().listIterator(i); - } - - private void checkMod() { - if (list != expected) { - throw new ConcurrentModificationException(); - } - } - - List get() { - return expected; - } - - public boolean hasNext() { - return iter.hasNext(); - } - - public Object next() { - lastReturnedIndex = iter.nextIndex(); - return iter.next(); - } - - public boolean hasPrevious() { - return iter.hasPrevious(); - } - - public Object previous() { - lastReturnedIndex = iter.previousIndex(); - return iter.previous(); - } - - public int previousIndex() { - return iter.previousIndex(); - } - - public int nextIndex() { - return iter.nextIndex(); - } - - public void remove() { - checkMod(); - if (lastReturnedIndex < 0) { - throw new IllegalStateException(); - } - get().remove(lastReturnedIndex); - expected = list; - iter = get().listIterator(lastReturnedIndex); - lastReturnedIndex = -1; - } - - public void set(Object o) { - checkMod(); - if (lastReturnedIndex < 0) { - throw new IllegalStateException(); - } - get().set(lastReturnedIndex, o); - expected = list; - iter = get().listIterator(previousIndex() + 1); - } - - public void add(Object o) { - checkMod(); - int i = nextIndex(); - get().add(i, o); - expected = list; - iter = get().listIterator(i + 1); - lastReturnedIndex = -1; - } - - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastHashMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastHashMap.java deleted file mode 100644 index bd405a1ad24..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastHashMap.java +++ /dev/null @@ -1,715 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -/** - *

          A customized implementation of java.util.HashMap designed - * to operate in a multithreaded environment where the large majority of - * method calls are read-only, instead of structural changes. When operating - * in "fast" mode, read calls are non-synchronized and write calls perform the - * following steps:

          - *
            - *
          • Clone the existing collection - *
          • Perform the modification on the clone - *
          • Replace the existing collection with the (modified) clone - *
          - *

          When first created, objects of this class default to "slow" mode, where - * all accesses of any type are synchronized but no cloning takes place. This - * is appropriate for initially populating the collection, followed by a switch - * to "fast" mode (by calling setFast(true)) after initialization - * is complete.

          - * - *

          NOTE: If you are creating and accessing a - * HashMap only within a single thread, you should use - * java.util.HashMap directly (with no synchronization), for - * maximum performance.

          - * - *

          NOTE: This class is not cross-platform. - * Using it may cause unexpected failures on some architectures. - * It suffers from the same problems as the double-checked locking idiom. - * In particular, the instruction that clones the internal collection and the - * instruction that sets the internal reference to the clone can be executed - * or perceived out-of-order. This means that any read operation might fail - * unexpectedly, as it may be reading the state of the internal collection - * before the internal collection is fully formed. - * For more information on the double-checked locking idiom, see the - * - * Double-Checked Locking Idiom Is Broken Declaration.

          - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Craig R. McClanahan - * @author Stephen Colebourne - */ -public class FastHashMap extends HashMap { - - /** - * The underlying map we are managing. - */ - protected HashMap map = null; - - /** - * Are we currently operating in "fast" mode? - */ - protected boolean fast = false; - - // Constructors - // ---------------------------------------------------------------------- - - /** - * Construct an empty map. - */ - public FastHashMap() { - super(); - this.map = new HashMap(); - } - - /** - * Construct an empty map with the specified capacity. - * - * @param capacity the initial capacity of the empty map - */ - public FastHashMap(int capacity) { - super(); - this.map = new HashMap(capacity); - } - - /** - * Construct an empty map with the specified capacity and load factor. - * - * @param capacity the initial capacity of the empty map - * @param factor the load factor of the new map - */ - public FastHashMap(int capacity, float factor) { - super(); - this.map = new HashMap(capacity, factor); - } - - /** - * Construct a new map with the same mappings as the specified map. - * - * @param map the map whose mappings are to be copied - */ - public FastHashMap(Map map) { - super(); - this.map = new HashMap(map); - } - - - // Property access - // ---------------------------------------------------------------------- - - /** - * Returns true if this map is operating in fast mode. - * - * @return true if this map is operating in fast mode - */ - public boolean getFast() { - return (this.fast); - } - - /** - * Sets whether this map is operating in fast mode. - * - * @param fast true if this map should operate in fast mode - */ - public void setFast(boolean fast) { - this.fast = fast; - } - - - // Map access - // ---------------------------------------------------------------------- - // These methods can forward straight to the wrapped Map in 'fast' mode. - // (because they are query methods) - - /** - * Return the value to which this map maps the specified key. Returns - * null if the map contains no mapping for this key, or if - * there is a mapping with a value of null. Use the - * containsKey() method to disambiguate these cases. - * - * @param key the key whose value is to be returned - * @return the value mapped to that key, or null - */ - public Object get(Object key) { - if (fast) { - return (map.get(key)); - } else { - synchronized (map) { - return (map.get(key)); - } - } - } - - /** - * Return the number of key-value mappings in this map. - * - * @return the current size of the map - */ - public int size() { - if (fast) { - return (map.size()); - } else { - synchronized (map) { - return (map.size()); - } - } - } - - /** - * Return true if this map contains no mappings. - * - * @return is the map currently empty - */ - public boolean isEmpty() { - if (fast) { - return (map.isEmpty()); - } else { - synchronized (map) { - return (map.isEmpty()); - } - } - } - - /** - * Return true if this map contains a mapping for the - * specified key. - * - * @param key the key to be searched for - * @return true if the map contains the key - */ - public boolean containsKey(Object key) { - if (fast) { - return (map.containsKey(key)); - } else { - synchronized (map) { - return (map.containsKey(key)); - } - } - } - - /** - * Return true if this map contains one or more keys mapping - * to the specified value. - * - * @param value the value to be searched for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - if (fast) { - return (map.containsValue(value)); - } else { - synchronized (map) { - return (map.containsValue(value)); - } - } - } - - // Map modification - // ---------------------------------------------------------------------- - // These methods perform special behaviour in 'fast' mode. - // The map is cloned, updated and then assigned back. - // See the comments at the top as to why this won't always work. - - /** - * Associate the specified value with the specified key in this map. - * If the map previously contained a mapping for this key, the old - * value is replaced and returned. - * - * @param key the key with which the value is to be associated - * @param value the value to be associated with this key - * @return the value previously mapped to the key, or null - */ - public Object put(Object key, Object value) { - if (fast) { - synchronized (this) { - HashMap temp = (HashMap) map.clone(); - Object result = temp.put(key, value); - map = temp; - return (result); - } - } else { - synchronized (map) { - return (map.put(key, value)); - } - } - } - - /** - * Copy all of the mappings from the specified map to this one, replacing - * any mappings with the same keys. - * - * @param in the map whose mappings are to be copied - */ - public void putAll(Map in) { - if (fast) { - synchronized (this) { - HashMap temp = (HashMap) map.clone(); - temp.putAll(in); - map = temp; - } - } else { - synchronized (map) { - map.putAll(in); - } - } - } - - /** - * Remove any mapping for this key, and return any previously - * mapped value. - * - * @param key the key whose mapping is to be removed - * @return the value removed, or null - */ - public Object remove(Object key) { - if (fast) { - synchronized (this) { - HashMap temp = (HashMap) map.clone(); - Object result = temp.remove(key); - map = temp; - return (result); - } - } else { - synchronized (map) { - return (map.remove(key)); - } - } - } - - /** - * Remove all mappings from this map. - */ - public void clear() { - if (fast) { - synchronized (this) { - map = new HashMap(); - } - } else { - synchronized (map) { - map.clear(); - } - } - } - - // Basic object methods - // ---------------------------------------------------------------------- - - /** - * Compare the specified object with this list for equality. This - * implementation uses exactly the code that is used to define the - * list equals function in the documentation for the - * Map.equals method. - * - * @param o the object to be compared to this list - * @return true if the two maps are equal - */ - public boolean equals(Object o) { - // Simple tests that require no synchronization - if (o == this) { - return (true); - } else if (!(o instanceof Map)) { - return (false); - } - Map mo = (Map) o; - - // Compare the two maps for equality - if (fast) { - if (mo.size() != map.size()) { - return (false); - } - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry e = (Map.Entry) i.next(); - Object key = e.getKey(); - Object value = e.getValue(); - if (value == null) { - if (!(mo.get(key) == null && mo.containsKey(key))) { - return (false); - } - } else { - if (!value.equals(mo.get(key))) { - return (false); - } - } - } - return (true); - - } else { - synchronized (map) { - if (mo.size() != map.size()) { - return (false); - } - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry e = (Map.Entry) i.next(); - Object key = e.getKey(); - Object value = e.getValue(); - if (value == null) { - if (!(mo.get(key) == null && mo.containsKey(key))) { - return (false); - } - } else { - if (!value.equals(mo.get(key))) { - return (false); - } - } - } - return (true); - } - } - } - - /** - * Return the hash code value for this map. This implementation uses - * exactly the code that is used to define the list hash function in the - * documentation for the Map.hashCode method. - * - * @return suitable integer hash code - */ - public int hashCode() { - if (fast) { - int h = 0; - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - h += i.next().hashCode(); - } - return (h); - } else { - synchronized (map) { - int h = 0; - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - h += i.next().hashCode(); - } - return (h); - } - } - } - - /** - * Return a shallow copy of this FastHashMap instance. - * The keys and values themselves are not copied. - * - * @return a clone of this map - */ - public Object clone() { - FastHashMap results = null; - if (fast) { - results = new FastHashMap(map); - } else { - synchronized (map) { - results = new FastHashMap(map); - } - } - results.setFast(getFast()); - return (results); - } - - // Map views - // ---------------------------------------------------------------------- - - /** - * Return a collection view of the mappings contained in this map. Each - * element in the returned collection is a Map.Entry. - */ - public Set entrySet() { - return new EntrySet(); - } - - /** - * Return a set view of the keys contained in this map. - */ - public Set keySet() { - return new KeySet(); - } - - /** - * Return a collection view of the values contained in this map. - */ - public Collection values() { - return new Values(); - } - - // Map view inner classes - // ---------------------------------------------------------------------- - - /** - * Abstract collection implementation shared by keySet(), values() and entrySet(). - */ - private abstract class CollectionView implements Collection { - - public CollectionView() { - } - - protected abstract Collection get(Map map); - protected abstract Object iteratorNext(Map.Entry entry); - - - public void clear() { - if (fast) { - synchronized (FastHashMap.this) { - map = new HashMap(); - } - } else { - synchronized (map) { - get(map).clear(); - } - } - } - - public boolean remove(Object o) { - if (fast) { - synchronized (FastHashMap.this) { - HashMap temp = (HashMap) map.clone(); - boolean r = get(temp).remove(o); - map = temp; - return r; - } - } else { - synchronized (map) { - return get(map).remove(o); - } - } - } - - public boolean removeAll(Collection o) { - if (fast) { - synchronized (FastHashMap.this) { - HashMap temp = (HashMap) map.clone(); - boolean r = get(temp).removeAll(o); - map = temp; - return r; - } - } else { - synchronized (map) { - return get(map).removeAll(o); - } - } - } - - public boolean retainAll(Collection o) { - if (fast) { - synchronized (FastHashMap.this) { - HashMap temp = (HashMap) map.clone(); - boolean r = get(temp).retainAll(o); - map = temp; - return r; - } - } else { - synchronized (map) { - return get(map).retainAll(o); - } - } - } - - public int size() { - if (fast) { - return get(map).size(); - } else { - synchronized (map) { - return get(map).size(); - } - } - } - - - public boolean isEmpty() { - if (fast) { - return get(map).isEmpty(); - } else { - synchronized (map) { - return get(map).isEmpty(); - } - } - } - - public boolean contains(Object o) { - if (fast) { - return get(map).contains(o); - } else { - synchronized (map) { - return get(map).contains(o); - } - } - } - - public boolean containsAll(Collection o) { - if (fast) { - return get(map).containsAll(o); - } else { - synchronized (map) { - return get(map).containsAll(o); - } - } - } - - public Object[] toArray(Object[] o) { - if (fast) { - return get(map).toArray(o); - } else { - synchronized (map) { - return get(map).toArray(o); - } - } - } - - public Object[] toArray() { - if (fast) { - return get(map).toArray(); - } else { - synchronized (map) { - return get(map).toArray(); - } - } - } - - - public boolean equals(Object o) { - if (o == this) return true; - if (fast) { - return get(map).equals(o); - } else { - synchronized (map) { - return get(map).equals(o); - } - } - } - - public int hashCode() { - if (fast) { - return get(map).hashCode(); - } else { - synchronized (map) { - return get(map).hashCode(); - } - } - } - - public boolean add(Object o) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection c) { - throw new UnsupportedOperationException(); - } - - public Iterator iterator() { - return new CollectionViewIterator(); - } - - private class CollectionViewIterator implements Iterator { - - private Map expected; - private Map.Entry lastReturned = null; - private Iterator iterator; - - public CollectionViewIterator() { - this.expected = map; - this.iterator = expected.entrySet().iterator(); - } - - public boolean hasNext() { - if (expected != map) { - throw new ConcurrentModificationException(); - } - return iterator.hasNext(); - } - - public Object next() { - if (expected != map) { - throw new ConcurrentModificationException(); - } - lastReturned = (Map.Entry)iterator.next(); - return iteratorNext(lastReturned); - } - - public void remove() { - if (lastReturned == null) { - throw new IllegalStateException(); - } - if (fast) { - synchronized (FastHashMap.this) { - if (expected != map) { - throw new ConcurrentModificationException(); - } - FastHashMap.this.remove(lastReturned.getKey()); - lastReturned = null; - expected = map; - } - } else { - iterator.remove(); - lastReturned = null; - } - } - } - } - - /** - * Set implementation over the keys of the FastHashMap - */ - private class KeySet extends CollectionView implements Set { - - protected Collection get(Map map) { - return map.keySet(); - } - - protected Object iteratorNext(Map.Entry entry) { - return entry.getKey(); - } - - } - - /** - * Collection implementation over the values of the FastHashMap - */ - private class Values extends CollectionView { - - protected Collection get(Map map) { - return map.values(); - } - - protected Object iteratorNext(Map.Entry entry) { - return entry.getValue(); - } - } - - /** - * Set implementation over the entries of the FastHashMap - */ - private class EntrySet extends CollectionView implements Set { - - protected Collection get(Map map) { - return map.entrySet(); - } - - protected Object iteratorNext(Map.Entry entry) { - return entry; - } - - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastTreeMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastTreeMap.java deleted file mode 100644 index ad5f91ed718..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FastTreeMap.java +++ /dev/null @@ -1,824 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Comparator; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; - -/** - *

          A customized implementation of java.util.TreeMap designed - * to operate in a multithreaded environment where the large majority of - * method calls are read-only, instead of structural changes. When operating - * in "fast" mode, read calls are non-synchronized and write calls perform the - * following steps:

          - *
            - *
          • Clone the existing collection - *
          • Perform the modification on the clone - *
          • Replace the existing collection with the (modified) clone - *
          - *

          When first created, objects of this class default to "slow" mode, where - * all accesses of any type are synchronized but no cloning takes place. This - * is appropriate for initially populating the collection, followed by a switch - * to "fast" mode (by calling setFast(true)) after initialization - * is complete.

          - * - *

          NOTE: If you are creating and accessing a - * TreeMap only within a single thread, you should use - * java.util.TreeMap directly (with no synchronization), for - * maximum performance.

          - * - *

          NOTE: This class is not cross-platform. - * Using it may cause unexpected failures on some architectures. - * It suffers from the same problems as the double-checked locking idiom. - * In particular, the instruction that clones the internal collection and the - * instruction that sets the internal reference to the clone can be executed - * or perceived out-of-order. This means that any read operation might fail - * unexpectedly, as it may be reading the state of the internal collection - * before the internal collection is fully formed. - * For more information on the double-checked locking idiom, see the - * - * Double-Checked Locking Idiom Is Broken Declaration.

          - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Craig R. McClanahan - * @author Stephen Colebourne - */ -public class FastTreeMap extends TreeMap { - - /** - * The underlying map we are managing. - */ - protected TreeMap map = null; - - /** - * Are we operating in "fast" mode? - */ - protected boolean fast = false; - - - // Constructors - // ---------------------------------------------------------------------- - - /** - * Construct a an empty map. - */ - public FastTreeMap() { - super(); - this.map = new TreeMap(); - } - - /** - * Construct an empty map with the specified comparator. - * - * @param comparator the comparator to use for ordering tree elements - */ - public FastTreeMap(Comparator comparator) { - super(); - this.map = new TreeMap(comparator); - } - - /** - * Construct a new map with the same mappings as the specified map, - * sorted according to the keys's natural order - * - * @param map the map whose mappings are to be copied - */ - public FastTreeMap(Map map) { - super(); - this.map = new TreeMap(map); - } - - /** - * Construct a new map with the same mappings as the specified map, - * sorted according to the same ordering - * - * @param map the map whose mappings are to be copied - */ - public FastTreeMap(SortedMap map) { - super(); - this.map = new TreeMap(map); - } - - - // Property access - // ---------------------------------------------------------------------- - - /** - * Returns true if this map is operating in fast mode. - * - * @return true if this map is operating in fast mode - */ - public boolean getFast() { - return (this.fast); - } - - /** - * Sets whether this map is operating in fast mode. - * - * @param fast true if this map should operate in fast mode - */ - public void setFast(boolean fast) { - this.fast = fast; - } - - - // Map access - // ---------------------------------------------------------------------- - // These methods can forward straight to the wrapped Map in 'fast' mode. - // (because they are query methods) - - /** - * Return the value to which this map maps the specified key. Returns - * null if the map contains no mapping for this key, or if - * there is a mapping with a value of null. Use the - * containsKey() method to disambiguate these cases. - * - * @param key the key whose value is to be returned - * @return the value mapped to that key, or null - */ - public Object get(Object key) { - if (fast) { - return (map.get(key)); - } else { - synchronized (map) { - return (map.get(key)); - } - } - } - - /** - * Return the number of key-value mappings in this map. - * - * @return the current size of the map - */ - public int size() { - if (fast) { - return (map.size()); - } else { - synchronized (map) { - return (map.size()); - } - } - } - - /** - * Return true if this map contains no mappings. - * - * @return is the map currently empty - */ - public boolean isEmpty() { - if (fast) { - return (map.isEmpty()); - } else { - synchronized (map) { - return (map.isEmpty()); - } - } - } - - /** - * Return true if this map contains a mapping for the - * specified key. - * - * @param key the key to be searched for - * @return true if the map contains the key - */ - public boolean containsKey(Object key) { - if (fast) { - return (map.containsKey(key)); - } else { - synchronized (map) { - return (map.containsKey(key)); - } - } - } - - /** - * Return true if this map contains one or more keys mapping - * to the specified value. - * - * @param value the value to be searched for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - if (fast) { - return (map.containsValue(value)); - } else { - synchronized (map) { - return (map.containsValue(value)); - } - } - } - - /** - * Return the comparator used to order this map, or null - * if this map uses its keys' natural order. - * - * @return the comparator used to order the map, or null if natural order - */ - public Comparator comparator() { - if (fast) { - return (map.comparator()); - } else { - synchronized (map) { - return (map.comparator()); - } - } - } - - /** - * Return the first (lowest) key currently in this sorted map. - * - * @return the first key in the map - */ - public Object firstKey() { - if (fast) { - return (map.firstKey()); - } else { - synchronized (map) { - return (map.firstKey()); - } - } - } - - /** - * Return the last (highest) key currently in this sorted map. - * - * @return the last key in the map - */ - public Object lastKey() { - if (fast) { - return (map.lastKey()); - } else { - synchronized (map) { - return (map.lastKey()); - } - } - } - - - // Map modification - // ---------------------------------------------------------------------- - // These methods perform special behaviour in 'fast' mode. - // The map is cloned, updated and then assigned back. - // See the comments at the top as to why this won't always work. - - /** - * Associate the specified value with the specified key in this map. - * If the map previously contained a mapping for this key, the old - * value is replaced and returned. - * - * @param key the key with which the value is to be associated - * @param value the value to be associated with this key - * @return the value previously mapped to the key, or null - */ - public Object put(Object key, Object value) { - if (fast) { - synchronized (this) { - TreeMap temp = (TreeMap) map.clone(); - Object result = temp.put(key, value); - map = temp; - return (result); - } - } else { - synchronized (map) { - return (map.put(key, value)); - } - } - } - - /** - * Copy all of the mappings from the specified map to this one, replacing - * any mappings with the same keys. - * - * @param in the map whose mappings are to be copied - */ - public void putAll(Map in) { - if (fast) { - synchronized (this) { - TreeMap temp = (TreeMap) map.clone(); - temp.putAll(in); - map = temp; - } - } else { - synchronized (map) { - map.putAll(in); - } - } - } - - /** - * Remove any mapping for this key, and return any previously - * mapped value. - * - * @param key the key whose mapping is to be removed - * @return the value removed, or null - */ - public Object remove(Object key) { - if (fast) { - synchronized (this) { - TreeMap temp = (TreeMap) map.clone(); - Object result = temp.remove(key); - map = temp; - return (result); - } - } else { - synchronized (map) { - return (map.remove(key)); - } - } - } - - /** - * Remove all mappings from this map. - */ - public void clear() { - if (fast) { - synchronized (this) { - map = new TreeMap(); - } - } else { - synchronized (map) { - map.clear(); - } - } - } - - - // Basic object methods - // ---------------------------------------------------------------------- - - /** - * Compare the specified object with this list for equality. This - * implementation uses exactly the code that is used to define the - * list equals function in the documentation for the - * Map.equals method. - * - * @param o the object to be compared to this list - * @return true if the two maps are equal - */ - public boolean equals(Object o) { - // Simple tests that require no synchronization - if (o == this) { - return (true); - } else if (!(o instanceof Map)) { - return (false); - } - Map mo = (Map) o; - - // Compare the two maps for equality - if (fast) { - if (mo.size() != map.size()) { - return (false); - } - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry e = (Map.Entry) i.next(); - Object key = e.getKey(); - Object value = e.getValue(); - if (value == null) { - if (!(mo.get(key) == null && mo.containsKey(key))) { - return (false); - } - } else { - if (!value.equals(mo.get(key))) { - return (false); - } - } - } - return (true); - } else { - synchronized (map) { - if (mo.size() != map.size()) { - return (false); - } - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry e = (Map.Entry) i.next(); - Object key = e.getKey(); - Object value = e.getValue(); - if (value == null) { - if (!(mo.get(key) == null && mo.containsKey(key))) { - return (false); - } - } else { - if (!value.equals(mo.get(key))) { - return (false); - } - } - } - return (true); - } - } - } - - /** - * Return the hash code value for this map. This implementation uses - * exactly the code that is used to define the list hash function in the - * documentation for the Map.hashCode method. - * - * @return a suitable integer hash code - */ - public int hashCode() { - if (fast) { - int h = 0; - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - h += i.next().hashCode(); - } - return (h); - } else { - synchronized (map) { - int h = 0; - Iterator i = map.entrySet().iterator(); - while (i.hasNext()) { - h += i.next().hashCode(); - } - return (h); - } - } - } - - /** - * Return a shallow copy of this FastTreeMap instance. - * The keys and values themselves are not copied. - * - * @return a clone of this map - */ - public Object clone() { - FastTreeMap results = null; - if (fast) { - results = new FastTreeMap(map); - } else { - synchronized (map) { - results = new FastTreeMap(map); - } - } - results.setFast(getFast()); - return (results); - } - - - // Sub map views - // ---------------------------------------------------------------------- - - /** - * Return a view of the portion of this map whose keys are strictly - * less than the specified key. - * - * @param key Key higher than any in the returned map - * @return a head map - */ - public SortedMap headMap(Object key) { - if (fast) { - return (map.headMap(key)); - } else { - synchronized (map) { - return (map.headMap(key)); - } - } - } - - /** - * Return a view of the portion of this map whose keys are in the - * range fromKey (inclusive) to toKey (exclusive). - * - * @param fromKey Lower limit of keys for the returned map - * @param toKey Upper limit of keys for the returned map - * @return a sub map - */ - public SortedMap subMap(Object fromKey, Object toKey) { - if (fast) { - return (map.subMap(fromKey, toKey)); - } else { - synchronized (map) { - return (map.subMap(fromKey, toKey)); - } - } - } - - /** - * Return a view of the portion of this map whose keys are greater than - * or equal to the specified key. - * - * @param key Key less than or equal to any in the returned map - * @return a tail map - */ - public SortedMap tailMap(Object key) { - if (fast) { - return (map.tailMap(key)); - } else { - synchronized (map) { - return (map.tailMap(key)); - } - } - } - - - // Map views - // ---------------------------------------------------------------------- - - /** - * Return a collection view of the mappings contained in this map. Each - * element in the returned collection is a Map.Entry. - */ - public Set entrySet() { - return new EntrySet(); - } - - /** - * Return a set view of the keys contained in this map. - */ - public Set keySet() { - return new KeySet(); - } - - /** - * Return a collection view of the values contained in this map. - */ - public Collection values() { - return new Values(); - } - - // Map view inner classes - // ---------------------------------------------------------------------- - - /** - * Abstract collection implementation shared by keySet(), values() and entrySet(). - */ - private abstract class CollectionView implements Collection { - - public CollectionView() { - } - - protected abstract Collection get(Map map); - protected abstract Object iteratorNext(Map.Entry entry); - - - public void clear() { - if (fast) { - synchronized (FastTreeMap.this) { - map = new TreeMap(); - } - } else { - synchronized (map) { - get(map).clear(); - } - } - } - - public boolean remove(Object o) { - if (fast) { - synchronized (FastTreeMap.this) { - TreeMap temp = (TreeMap) map.clone(); - boolean r = get(temp).remove(o); - map = temp; - return r; - } - } else { - synchronized (map) { - return get(map).remove(o); - } - } - } - - public boolean removeAll(Collection o) { - if (fast) { - synchronized (FastTreeMap.this) { - TreeMap temp = (TreeMap) map.clone(); - boolean r = get(temp).removeAll(o); - map = temp; - return r; - } - } else { - synchronized (map) { - return get(map).removeAll(o); - } - } - } - - public boolean retainAll(Collection o) { - if (fast) { - synchronized (FastTreeMap.this) { - TreeMap temp = (TreeMap) map.clone(); - boolean r = get(temp).retainAll(o); - map = temp; - return r; - } - } else { - synchronized (map) { - return get(map).retainAll(o); - } - } - } - - public int size() { - if (fast) { - return get(map).size(); - } else { - synchronized (map) { - return get(map).size(); - } - } - } - - - public boolean isEmpty() { - if (fast) { - return get(map).isEmpty(); - } else { - synchronized (map) { - return get(map).isEmpty(); - } - } - } - - public boolean contains(Object o) { - if (fast) { - return get(map).contains(o); - } else { - synchronized (map) { - return get(map).contains(o); - } - } - } - - public boolean containsAll(Collection o) { - if (fast) { - return get(map).containsAll(o); - } else { - synchronized (map) { - return get(map).containsAll(o); - } - } - } - - public Object[] toArray(Object[] o) { - if (fast) { - return get(map).toArray(o); - } else { - synchronized (map) { - return get(map).toArray(o); - } - } - } - - public Object[] toArray() { - if (fast) { - return get(map).toArray(); - } else { - synchronized (map) { - return get(map).toArray(); - } - } - } - - - public boolean equals(Object o) { - if (o == this) return true; - if (fast) { - return get(map).equals(o); - } else { - synchronized (map) { - return get(map).equals(o); - } - } - } - - public int hashCode() { - if (fast) { - return get(map).hashCode(); - } else { - synchronized (map) { - return get(map).hashCode(); - } - } - } - - public boolean add(Object o) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection c) { - throw new UnsupportedOperationException(); - } - - public Iterator iterator() { - return new CollectionViewIterator(); - } - - private class CollectionViewIterator implements Iterator { - - private Map expected; - private Map.Entry lastReturned = null; - private Iterator iterator; - - public CollectionViewIterator() { - this.expected = map; - this.iterator = expected.entrySet().iterator(); - } - - public boolean hasNext() { - if (expected != map) { - throw new ConcurrentModificationException(); - } - return iterator.hasNext(); - } - - public Object next() { - if (expected != map) { - throw new ConcurrentModificationException(); - } - lastReturned = (Map.Entry)iterator.next(); - return iteratorNext(lastReturned); - } - - public void remove() { - if (lastReturned == null) { - throw new IllegalStateException(); - } - if (fast) { - synchronized (FastTreeMap.this) { - if (expected != map) { - throw new ConcurrentModificationException(); - } - FastTreeMap.this.remove(lastReturned.getKey()); - lastReturned = null; - expected = map; - } - } else { - iterator.remove(); - lastReturned = null; - } - } - } - } - - /** - * Set implementation over the keys of the FastTreeMap - */ - private class KeySet extends CollectionView implements Set { - - protected Collection get(Map map) { - return map.keySet(); - } - - protected Object iteratorNext(Map.Entry entry) { - return entry.getKey(); - } - - } - - /** - * Collection implementation over the values of the FastTreeMap - */ - private class Values extends CollectionView { - - protected Collection get(Map map) { - return map.values(); - } - - protected Object iteratorNext(Map.Entry entry) { - return entry.getValue(); - } - } - - /** - * Set implementation over the entries of the FastTreeMap - */ - private class EntrySet extends CollectionView implements Set { - - protected Collection get(Map map) { - return map.entrySet(); - } - - - protected Object iteratorNext(Map.Entry entry) { - return entry; - } - - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FunctorException.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FunctorException.java deleted file mode 100644 index 9522cc11af5..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/FunctorException.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.PrintStream; -import java.io.PrintWriter; - -/** - * Runtime exception thrown from functors. - * If required, a root cause error can be wrapped within this one. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class FunctorException extends RuntimeException { - - /** - * Does JDK support nested exceptions - */ - private static final boolean JDK_SUPPORTS_NESTED; - - static { - boolean flag = false; - try { - Throwable.class.getDeclaredMethod("getCause", new Class[0]); - flag = true; - } catch (NoSuchMethodException ex) { - flag = false; - } - JDK_SUPPORTS_NESTED = flag; - } - - /** - * Root cause of the exception - */ - private final Throwable rootCause; - - /** - * Constructs a new FunctorException without specified - * detail message. - */ - public FunctorException() { - super(); - this.rootCause = null; - } - - /** - * Constructs a new FunctorException with specified - * detail message. - * - * @param msg the error message. - */ - public FunctorException(String msg) { - super(msg); - this.rootCause = null; - } - - /** - * Constructs a new FunctorException with specified - * nested Throwable root cause. - * - * @param rootCause the exception or error that caused this exception - * to be thrown. - */ - public FunctorException(Throwable rootCause) { - super((rootCause == null ? null : rootCause.getMessage())); - this.rootCause = rootCause; - } - - /** - * Constructs a new FunctorException with specified - * detail message and nested Throwable root cause. - * - * @param msg the error message. - * @param rootCause the exception or error that caused this exception - * to be thrown. - */ - public FunctorException(String msg, Throwable rootCause) { - super(msg); - this.rootCause = rootCause; - } - - /** - * Gets the cause of this throwable. - * - * @return the cause of this throwable, or null - */ - public Throwable getCause() { - return rootCause; - } - - /** - * Prints the stack trace of this exception to the standard error stream. - */ - public void printStackTrace() { - printStackTrace(System.err); - } - - /** - * Prints the stack trace of this exception to the specified stream. - * - * @param out the PrintStream to use for output - */ - public void printStackTrace(PrintStream out) { - synchronized (out) { - PrintWriter pw = new PrintWriter(out, false); - printStackTrace(pw); - // Flush the PrintWriter before it's GC'ed. - pw.flush(); - } - } - - /** - * Prints the stack trace of this exception to the specified writer. - * - * @param out the PrintWriter to use for output - */ - public void printStackTrace(PrintWriter out) { - synchronized (out) { - super.printStackTrace(out); - if (rootCause != null && JDK_SUPPORTS_NESTED == false) { - out.print("Caused by: "); - rootCause.printStackTrace(out); - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/HashBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/HashBag.java deleted file mode 100644 index 4409794db36..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/HashBag.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.HashMap; - -/** - * A {@link Bag} that is backed by a {@link HashMap}. - * - * @deprecated Moved to bag subpackage and rewritten internally. Due to be removed in v4.0. - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - */ -public class HashBag extends DefaultMapBag implements Bag { - - /** - * Constructs an empty HashBag. - */ - public HashBag() { - super(new HashMap()); - } - - /** - * Constructs a {@link Bag} containing all the members of the given - * collection. - * - * @param coll a collection to copy into this bag - */ - public HashBag(Collection coll) { - this(); - addAll(coll); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IterableMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IterableMap.java deleted file mode 100644 index b409c85c7ae..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IterableMap.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Map; - -/** - * Defines a map that can be iterated directly without needing to create an entry set. - *

          - * A map iterator is an efficient way of iterating over maps. - * There is no need to access the entry set or cast to Map Entry objects. - *

          - * IterableMap map = new HashedMap();
          - * MapIterator it = map.mapIterator();
          - * while (it.hasNext()) {
          - *   Object key = it.next();
          - *   Object value = it.getValue();
          - *   it.setValue("newValue");
          - * }
          - * 
          - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface IterableMap extends Map { - - /** - * Obtains a MapIterator over the map. - *

          - * A map iterator is an efficient way of iterating over maps. - * There is no need to access the entry set or cast to Map Entry objects. - *

          -     * IterableMap map = new HashedMap();
          -     * MapIterator it = map.mapIterator();
          -     * while (it.hasNext()) {
          -     *   Object key = it.next();
          -     *   Object value = it.getValue();
          -     *   it.setValue("newValue");
          -     * }
          -     * 
          - * - * @return a map iterator - */ - MapIterator mapIterator(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IteratorUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IteratorUtils.java deleted file mode 100644 index 55ae316640c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/IteratorUtils.java +++ /dev/null @@ -1,914 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.lang.reflect.Array; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -import org.apache.commons.collections.iterators.ArrayIterator; -import org.apache.commons.collections.iterators.ArrayListIterator; -import org.apache.commons.collections.iterators.CollatingIterator; -import org.apache.commons.collections.iterators.EmptyIterator; -import org.apache.commons.collections.iterators.EmptyListIterator; -import org.apache.commons.collections.iterators.EmptyMapIterator; -import org.apache.commons.collections.iterators.EmptyOrderedIterator; -import org.apache.commons.collections.iterators.EmptyOrderedMapIterator; -import org.apache.commons.collections.iterators.EnumerationIterator; -import org.apache.commons.collections.iterators.FilterIterator; -import org.apache.commons.collections.iterators.FilterListIterator; -import org.apache.commons.collections.iterators.IteratorChain; -import org.apache.commons.collections.iterators.IteratorEnumeration; -import org.apache.commons.collections.iterators.ListIteratorWrapper; -import org.apache.commons.collections.iterators.LoopingIterator; -import org.apache.commons.collections.iterators.LoopingListIterator; -import org.apache.commons.collections.iterators.ObjectArrayIterator; -import org.apache.commons.collections.iterators.ObjectArrayListIterator; -import org.apache.commons.collections.iterators.ObjectGraphIterator; -import org.apache.commons.collections.iterators.SingletonIterator; -import org.apache.commons.collections.iterators.SingletonListIterator; -import org.apache.commons.collections.iterators.TransformIterator; -import org.apache.commons.collections.iterators.UnmodifiableIterator; -import org.apache.commons.collections.iterators.UnmodifiableListIterator; -import org.apache.commons.collections.iterators.UnmodifiableMapIterator; - -/** - * Provides static utility methods and decorators for {@link Iterator} - * instances. The implementations are provided in the iterators subpackage. - *

          - * WARNING: Due to human error certain binary incompatabilities were introduced - * between Commons Collections 2.1 and 3.0. The class remained source and test - * compatible, so if you can recompile all your classes and dependencies - * everything is OK. Those methods which are binary incompatible are marked as - * such, together with alternate solutions that are binary compatible - * against versions 2.1.1 and 3.1. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Phil Steitz - */ -public class IteratorUtils { - // validation is done in this class in certain cases because the - // public classes allow invalid states - - /** - * An iterator over no elements. - *

          - * WARNING: This constant is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use EmptyIterator.INSTANCE for compatability with Commons Collections 2.1.1. - */ - public static final ResettableIterator EMPTY_ITERATOR = EmptyIterator.RESETTABLE_INSTANCE; - /** - * A list iterator over no elements. - *

          - * WARNING: This constant is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use EmptyListIterator.INSTANCE for compatability with Commons Collections 2.1.1. - */ - public static final ResettableListIterator EMPTY_LIST_ITERATOR = EmptyListIterator.RESETTABLE_INSTANCE; - /** - * An ordered iterator over no elements. - */ - public static final OrderedIterator EMPTY_ORDERED_ITERATOR = EmptyOrderedIterator.INSTANCE; - /** - * A map iterator over no elements. - */ - public static final MapIterator EMPTY_MAP_ITERATOR = EmptyMapIterator.INSTANCE; - /** - * An ordered map iterator over no elements. - */ - public static final OrderedMapIterator EMPTY_ORDERED_MAP_ITERATOR = EmptyOrderedMapIterator.INSTANCE; - - /** - * IteratorUtils is not normally instantiated. - */ - public IteratorUtils() { - } - - // Empty - //----------------------------------------------------------------------- - /** - * Gets an empty iterator. - *

          - * This iterator is a valid iterator object that will iterate over - * nothing. - *

          - * WARNING: This method is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use EmptyIterator.INSTANCE for compatability with Commons Collections 2.1.1. - * - * @return an iterator over nothing - */ - public static ResettableIterator emptyIterator() { - return EMPTY_ITERATOR; - } - - /** - * Gets an empty list iterator. - *

          - * This iterator is a valid list iterator object that will iterate - * over nothing. - *

          - * WARNING: This method is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use EmptyListIterator.INSTANCE for compatability with Commons Collections 2.1.1. - * - * @return a list iterator over nothing - */ - public static ResettableListIterator emptyListIterator() { - return EMPTY_LIST_ITERATOR; - } - - /** - * Gets an empty ordered iterator. - *

          - * This iterator is a valid iterator object that will iterate - * over nothing. - * - * @return an ordered iterator over nothing - */ - public static OrderedIterator emptyOrderedIterator() { - return EMPTY_ORDERED_ITERATOR; - } - - /** - * Gets an empty map iterator. - *

          - * This iterator is a valid map iterator object that will iterate - * over nothing. - * - * @return a map iterator over nothing - */ - public static MapIterator emptyMapIterator() { - return EMPTY_MAP_ITERATOR; - } - - /** - * Gets an empty ordered map iterator. - *

          - * This iterator is a valid map iterator object that will iterate - * over nothing. - * - * @return a map iterator over nothing - */ - public static OrderedMapIterator emptyOrderedMapIterator() { - return EMPTY_ORDERED_MAP_ITERATOR; - } - - // Singleton - //----------------------------------------------------------------------- - /** - * Gets a singleton iterator. - *

          - * This iterator is a valid iterator object that will iterate over - * the specified object. - *

          - * WARNING: This method is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use new SingletonIterator(object) for compatability. - * - * @param object the single object over which to iterate - * @return a singleton iterator over the object - */ - public static ResettableIterator singletonIterator(Object object) { - return new SingletonIterator(object); - } - - /** - * Gets a singleton list iterator. - *

          - * This iterator is a valid list iterator object that will iterate over - * the specified object. - * - * @param object the single object over which to iterate - * @return a singleton list iterator over the object - */ - public static ListIterator singletonListIterator(Object object) { - return new SingletonListIterator(object); - } - - // Arrays - //----------------------------------------------------------------------- - /** - * Gets an iterator over an object array. - *

          - * WARNING: This method is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use new ArrayIterator(array) for compatability. - * - * @param array the array over which to iterate - * @return an iterator over the array - * @throws NullPointerException if array is null - */ - public static ResettableIterator arrayIterator(Object[] array) { - return new ObjectArrayIterator(array); - } - - /** - * Gets an iterator over an object or primitive array. - *

          - * This method will handle primitive arrays as well as object arrays. - * The primitives will be wrapped in the appropriate wrapper class. - * - * @param array the array over which to iterate - * @return an iterator over the array - * @throws IllegalArgumentException if the array is not an array - * @throws NullPointerException if array is null - */ - public static ResettableIterator arrayIterator(Object array) { - return new ArrayIterator(array); - } - - /** - * Gets an iterator over the end part of an object array. - *

          - * WARNING: This method is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use new ArrayIterator(array,start) for compatability. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @return an iterator over part of the array - * @throws IndexOutOfBoundsException if start is less than zero or greater - * than the length of the array - * @throws NullPointerException if array is null - */ - public static ResettableIterator arrayIterator(Object[] array, int start) { - return new ObjectArrayIterator(array, start); - } - - /** - * Gets an iterator over the end part of an object or primitive array. - *

          - * This method will handle primitive arrays as well as object arrays. - * The primitives will be wrapped in the appropriate wrapper class. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @return an iterator over part of the array - * @throws IllegalArgumentException if the array is not an array - * @throws IndexOutOfBoundsException if start is less than zero or greater - * than the length of the array - * @throws NullPointerException if array is null - */ - public static ResettableIterator arrayIterator(Object array, int start) { - return new ArrayIterator(array, start); - } - - /** - * Gets an iterator over part of an object array. - *

          - * WARNING: This method is binary incompatible with Commons Collections 2.1 and 2.1.1. - * Use new ArrayIterator(array,start,end) for compatability. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @param end the index to finish iterating at - * @return an iterator over part of the array - * @throws IndexOutOfBoundsException if array bounds are invalid - * @throws IllegalArgumentException if end is before start - * @throws NullPointerException if array is null - */ - public static ResettableIterator arrayIterator(Object[] array, int start, int end) { - return new ObjectArrayIterator(array, start, end); - } - - /** - * Gets an iterator over part of an object or primitive array. - *

          - * This method will handle primitive arrays as well as object arrays. - * The primitives will be wrapped in the appropriate wrapper class. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @param end the index to finish iterating at - * @return an iterator over part of the array - * @throws IllegalArgumentException if the array is not an array - * @throws IndexOutOfBoundsException if array bounds are invalid - * @throws IllegalArgumentException if end is before start - * @throws NullPointerException if array is null - */ - public static ResettableIterator arrayIterator(Object array, int start, int end) { - return new ArrayIterator(array, start, end); - } - - //----------------------------------------------------------------------- - /** - * Gets a list iterator over an object array. - * - * @param array the array over which to iterate - * @return a list iterator over the array - * @throws NullPointerException if array is null - */ - public static ResettableListIterator arrayListIterator(Object[] array) { - return new ObjectArrayListIterator(array); - } - - /** - * Gets a list iterator over an object or primitive array. - *

          - * This method will handle primitive arrays as well as object arrays. - * The primitives will be wrapped in the appropriate wrapper class. - * - * @param array the array over which to iterate - * @return a list iterator over the array - * @throws IllegalArgumentException if the array is not an array - * @throws NullPointerException if array is null - */ - public static ResettableListIterator arrayListIterator(Object array) { - return new ArrayListIterator(array); - } - - /** - * Gets a list iterator over the end part of an object array. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @return a list iterator over part of the array - * @throws IndexOutOfBoundsException if start is less than zero - * @throws NullPointerException if array is null - */ - public static ResettableListIterator arrayListIterator(Object[] array, int start) { - return new ObjectArrayListIterator(array, start); - } - - /** - * Gets a list iterator over the end part of an object or primitive array. - *

          - * This method will handle primitive arrays as well as object arrays. - * The primitives will be wrapped in the appropriate wrapper class. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @return a list iterator over part of the array - * @throws IllegalArgumentException if the array is not an array - * @throws IndexOutOfBoundsException if start is less than zero - * @throws NullPointerException if array is null - */ - public static ResettableListIterator arrayListIterator(Object array, int start) { - return new ArrayListIterator(array, start); - } - - /** - * Gets a list iterator over part of an object array. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @param end the index to finish iterating at - * @return a list iterator over part of the array - * @throws IndexOutOfBoundsException if array bounds are invalid - * @throws IllegalArgumentException if end is before start - * @throws NullPointerException if array is null - */ - public static ResettableListIterator arrayListIterator(Object[] array, int start, int end) { - return new ObjectArrayListIterator(array, start, end); - } - - /** - * Gets a list iterator over part of an object or primitive array. - *

          - * This method will handle primitive arrays as well as object arrays. - * The primitives will be wrapped in the appropriate wrapper class. - * - * @param array the array over which to iterate - * @param start the index to start iterating at - * @param end the index to finish iterating at - * @return a list iterator over part of the array - * @throws IllegalArgumentException if the array is not an array - * @throws IndexOutOfBoundsException if array bounds are invalid - * @throws IllegalArgumentException if end is before start - * @throws NullPointerException if array is null - */ - public static ResettableListIterator arrayListIterator(Object array, int start, int end) { - return new ArrayListIterator(array, start, end); - } - - // Unmodifiable - //----------------------------------------------------------------------- - /** - * Gets an immutable version of an {@link Iterator}. The returned object - * will always throw an {@link UnsupportedOperationException} for - * the {@link Iterator#remove} method. - * - * @param iterator the iterator to make immutable - * @return an immutable version of the iterator - */ - public static Iterator unmodifiableIterator(Iterator iterator) { - return UnmodifiableIterator.decorate(iterator); - } - - /** - * Gets an immutable version of a {@link ListIterator}. The returned object - * will always throw an {@link UnsupportedOperationException} for - * the {@link Iterator#remove}, {@link ListIterator#add} and - * {@link ListIterator#set} methods. - * - * @param listIterator the iterator to make immutable - * @return an immutable version of the iterator - */ - public static ListIterator unmodifiableListIterator(ListIterator listIterator) { - return UnmodifiableListIterator.decorate(listIterator); - } - - /** - * Gets an immutable version of a {@link MapIterator}. The returned object - * will always throw an {@link UnsupportedOperationException} for - * the {@link Iterator#remove}, {@link MapIterator#setValue(Object)} methods. - * - * @param mapIterator the iterator to make immutable - * @return an immutable version of the iterator - */ - public static MapIterator unmodifiableMapIterator(MapIterator mapIterator) { - return UnmodifiableMapIterator.decorate(mapIterator); - } - - // Chained - //----------------------------------------------------------------------- - /** - * Gets an iterator that iterates through two {@link Iterator}s - * one after another. - * - * @param iterator1 the first iterators to use, not null - * @param iterator2 the first iterators to use, not null - * @return a combination iterator over the iterators - * @throws NullPointerException if either iterator is null - */ - public static Iterator chainedIterator(Iterator iterator1, Iterator iterator2) { - return new IteratorChain(iterator1, iterator2); - } - - /** - * Gets an iterator that iterates through an array of {@link Iterator}s - * one after another. - * - * @param iterators the iterators to use, not null or empty or contain nulls - * @return a combination iterator over the iterators - * @throws NullPointerException if iterators array is null or contains a null - */ - public static Iterator chainedIterator(Iterator[] iterators) { - return new IteratorChain(iterators); - } - - /** - * Gets an iterator that iterates through a collections of {@link Iterator}s - * one after another. - * - * @param iterators the iterators to use, not null or empty or contain nulls - * @return a combination iterator over the iterators - * @throws NullPointerException if iterators collection is null or contains a null - * @throws ClassCastException if the iterators collection contains the wrong object type - */ - public static Iterator chainedIterator(Collection iterators) { - return new IteratorChain(iterators); - } - - // Collated - //----------------------------------------------------------------------- - /** - * Gets an iterator that provides an ordered iteration over the elements - * contained in a collection of ordered {@link Iterator}s. - *

          - * Given two ordered {@link Iterator}s A and B, - * the {@link Iterator#next()} method will return the lesser of - * A.next() and B.next(). - *

          - * The comparator is optional. If null is specified then natural order is used. - * - * @param comparator the comparator to use, may be null for natural order - * @param iterator1 the first iterators to use, not null - * @param iterator2 the first iterators to use, not null - * @return a combination iterator over the iterators - * @throws NullPointerException if either iterator is null - */ - public static Iterator collatedIterator(Comparator comparator, Iterator iterator1, Iterator iterator2) { - return new CollatingIterator(comparator, iterator1, iterator2); - } - - /** - * Gets an iterator that provides an ordered iteration over the elements - * contained in an array of {@link Iterator}s. - *

          - * Given two ordered {@link Iterator}s A and B, - * the {@link Iterator#next()} method will return the lesser of - * A.next() and B.next() and so on. - *

          - * The comparator is optional. If null is specified then natural order is used. - * - * @param comparator the comparator to use, may be null for natural order - * @param iterators the iterators to use, not null or empty or contain nulls - * @return a combination iterator over the iterators - * @throws NullPointerException if iterators array is null or contains a null - */ - public static Iterator collatedIterator(Comparator comparator, Iterator[] iterators) { - return new CollatingIterator(comparator, iterators); - } - - /** - * Gets an iterator that provides an ordered iteration over the elements - * contained in a collection of {@link Iterator}s. - *

          - * Given two ordered {@link Iterator}s A and B, - * the {@link Iterator#next()} method will return the lesser of - * A.next() and B.next() and so on. - *

          - * The comparator is optional. If null is specified then natural order is used. - * - * @param comparator the comparator to use, may be null for natural order - * @param iterators the iterators to use, not null or empty or contain nulls - * @return a combination iterator over the iterators - * @throws NullPointerException if iterators collection is null or contains a null - * @throws ClassCastException if the iterators collection contains the wrong object type - */ - public static Iterator collatedIterator(Comparator comparator, Collection iterators) { - return new CollatingIterator(comparator, iterators); - } - - // Object Graph - //----------------------------------------------------------------------- - /** - * Gets an iterator that operates over an object graph. - *

          - * This iterator can extract multiple objects from a complex tree-like object graph. - * The iteration starts from a single root object. - * It uses a Transformer to extract the iterators and elements. - * Its main benefit is that no intermediate List is created. - *

          - * For example, consider an object graph: - *

          -     *                 |- Branch -- Leaf
          -     *                 |         \- Leaf
          -     *         |- Tree |         /- Leaf
          -     *         |       |- Branch -- Leaf
          -     *  Forest |                 \- Leaf
          -     *         |       |- Branch -- Leaf
          -     *         |       |         \- Leaf
          -     *         |- Tree |         /- Leaf
          -     *                 |- Branch -- Leaf
          -     *                 |- Branch -- Leaf
          - * The following Transformer, used in this class, will extract all - * the Leaf objects without creating a combined intermediate list: - *
          -     * public Object transform(Object input) {
          -     *   if (input instanceof Forest) {
          -     *     return ((Forest) input).treeIterator();
          -     *   }
          -     *   if (input instanceof Tree) {
          -     *     return ((Tree) input).branchIterator();
          -     *   }
          -     *   if (input instanceof Branch) {
          -     *     return ((Branch) input).leafIterator();
          -     *   }
          -     *   if (input instanceof Leaf) {
          -     *     return input;
          -     *   }
          -     *   throw new ClassCastException();
          -     * }
          - *

          - * Internally, iteration starts from the root object. When next is called, - * the transformer is called to examine the object. The transformer will return - * either an iterator or an object. If the object is an Iterator, the next element - * from that iterator is obtained and the process repeats. If the element is an object - * it is returned. - *

          - * Under many circumstances, linking Iterators together in this manner is - * more efficient (and convenient) than using nested for loops to extract a list. - * - * @param root the root object to start iterating from, null results in an empty iterator - * @param transformer the transformer to use, see above, null uses no effect transformer - * @return a new object graph iterator - * @since Commons Collections 3.1 - */ - public static Iterator objectGraphIterator(Object root, Transformer transformer) { - return new ObjectGraphIterator(root, transformer); - } - - // Transformed - //----------------------------------------------------------------------- - /** - * Gets an iterator that transforms the elements of another iterator. - *

          - * The transformation occurs during the next() method and the underlying - * iterator is unaffected by the transformation. - * - * @param iterator the iterator to use, not null - * @param transform the transform to use, not null - * @return a new transforming iterator - * @throws NullPointerException if either parameter is null - */ - public static Iterator transformedIterator(Iterator iterator, Transformer transform) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - if (transform == null) { - throw new NullPointerException("Transformer must not be null"); - } - return new TransformIterator(iterator, transform); - } - - // Filtered - //----------------------------------------------------------------------- - /** - * Gets an iterator that filters another iterator. - *

          - * The returned iterator will only return objects that match the specified - * filtering predicate. - * - * @param iterator the iterator to use, not null - * @param predicate the predicate to use as a filter, not null - * @return a new filtered iterator - * @throws NullPointerException if either parameter is null - */ - public static Iterator filteredIterator(Iterator iterator, Predicate predicate) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - if (predicate == null) { - throw new NullPointerException("Predicate must not be null"); - } - return new FilterIterator(iterator, predicate); - } - - /** - * Gets a list iterator that filters another list iterator. - *

          - * The returned iterator will only return objects that match the specified - * filtering predicate. - * - * @param listIterator the list iterator to use, not null - * @param predicate the predicate to use as a filter, not null - * @return a new filtered iterator - * @throws NullPointerException if either parameter is null - */ - public static ListIterator filteredListIterator(ListIterator listIterator, Predicate predicate) { - if (listIterator == null) { - throw new NullPointerException("ListIterator must not be null"); - } - if (predicate == null) { - throw new NullPointerException("Predicate must not be null"); - } - return new FilterListIterator(listIterator, predicate); - } - - // Looping - //----------------------------------------------------------------------- - /** - * Gets an iterator that loops continuously over the supplied collection. - *

          - * The iterator will only stop looping if the remove method is called - * enough times to empty the collection, or if the collection is empty - * to start with. - * - * @param coll the collection to iterate over, not null - * @return a new looping iterator - * @throws NullPointerException if the collection is null - */ - public static ResettableIterator loopingIterator(Collection coll) { - if (coll == null) { - throw new NullPointerException("Collection must not be null"); - } - return new LoopingIterator(coll); - } - - /** - * Gets an iterator that loops continuously over the supplied list. - *

          - * The iterator will only stop looping if the remove method is called - * enough times to empty the list, or if the list is empty to start with. - * - * @param list the list to iterate over, not null - * @return a new looping iterator - * @throws NullPointerException if the list is null - * @since Commons Collections 3.2 - */ - public static ResettableListIterator loopingListIterator(List list) { - if (list == null) { - throw new NullPointerException("List must not be null"); - } - return new LoopingListIterator(list); - } - - // Views - //----------------------------------------------------------------------- - /** - * Gets an iterator that provides an iterator view of the given enumeration. - * - * @param enumeration the enumeration to use - * @return a new iterator - */ - public static Iterator asIterator(Enumeration enumeration) { - if (enumeration == null) { - throw new NullPointerException("Enumeration must not be null"); - } - return new EnumerationIterator(enumeration); - } - - /** - * Gets an iterator that provides an iterator view of the given enumeration - * that will remove elements from the specified collection. - * - * @param enumeration the enumeration to use - * @param removeCollection the collection to remove elements from - * @return a new iterator - */ - public static Iterator asIterator(Enumeration enumeration, Collection removeCollection) { - if (enumeration == null) { - throw new NullPointerException("Enumeration must not be null"); - } - if (removeCollection == null) { - throw new NullPointerException("Collection must not be null"); - } - return new EnumerationIterator(enumeration, removeCollection); - } - - /** - * Gets an enumeration that wraps an iterator. - * - * @param iterator the iterator to use, not null - * @return a new enumeration - * @throws NullPointerException if iterator is null - */ - public static Enumeration asEnumeration(Iterator iterator) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - return new IteratorEnumeration(iterator); - } - - /** - * Gets a list iterator based on a simple iterator. - *

          - * As the wrapped Iterator is traversed, a LinkedList of its values is - * cached, permitting all required operations of ListIterator. - * - * @param iterator the iterator to use, not null - * @return a new iterator - * @throws NullPointerException if iterator parameter is null - */ - public static ListIterator toListIterator(Iterator iterator) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - return new ListIteratorWrapper(iterator); - } - - /** - * Gets an array based on an iterator. - *

          - * As the wrapped Iterator is traversed, an ArrayList of its values is - * created. At the end, this is converted to an array. - * - * @param iterator the iterator to use, not null - * @return an array of the iterator contents - * @throws NullPointerException if iterator parameter is null - */ - public static Object[] toArray(Iterator iterator) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - List list = toList(iterator, 100); - return list.toArray(); - } - - /** - * Gets an array based on an iterator. - *

          - * As the wrapped Iterator is traversed, an ArrayList of its values is - * created. At the end, this is converted to an array. - * - * @param iterator the iterator to use, not null - * @param arrayClass the class of array to create - * @return an array of the iterator contents - * @throws NullPointerException if iterator parameter is null - * @throws NullPointerException if arrayClass is null - * @throws ClassCastException if the arrayClass is invalid - */ - public static Object[] toArray(Iterator iterator, Class arrayClass) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - if (arrayClass == null) { - throw new NullPointerException("Array class must not be null"); - } - List list = toList(iterator, 100); - return list.toArray((Object[]) Array.newInstance(arrayClass, list.size())); - } - - /** - * Gets a list based on an iterator. - *

          - * As the wrapped Iterator is traversed, an ArrayList of its values is - * created. At the end, the list is returned. - * - * @param iterator the iterator to use, not null - * @return a list of the iterator contents - * @throws NullPointerException if iterator parameter is null - */ - public static List toList(Iterator iterator) { - return toList(iterator, 10); - } - - /** - * Gets a list based on an iterator. - *

          - * As the wrapped Iterator is traversed, an ArrayList of its values is - * created. At the end, the list is returned. - * - * @param iterator the iterator to use, not null - * @param estimatedSize the initial size of the ArrayList - * @return a list of the iterator contents - * @throws NullPointerException if iterator parameter is null - * @throws IllegalArgumentException if the size is less than 1 - */ - public static List toList(Iterator iterator, int estimatedSize) { - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - if (estimatedSize < 1) { - throw new IllegalArgumentException("Estimated size must be greater than 0"); - } - List list = new ArrayList(estimatedSize); - while (iterator.hasNext()) { - list.add(iterator.next()); - } - return list; - } - - /** - * Gets a suitable Iterator for the given object. - *

          - * This method can handles objects as follows - *

            - *
          • null - empty iterator - *
          • Iterator - returned directly - *
          • Enumeration - wrapped - *
          • Collection - iterator from collection returned - *
          • Map - values iterator returned - *
          • Dictionary - values (elements) enumeration returned as iterator - *
          • array - iterator over array returned - *
          • object with iterator() public method accessed by reflection - *
          • object - singleton iterator - *
          - * - * @param obj the object to convert to an iterator - * @return a suitable iterator, never null - */ - public static Iterator getIterator(Object obj) { - if (obj == null) { - return emptyIterator(); - - } else if (obj instanceof Iterator) { - return (Iterator) obj; - - } else if (obj instanceof Collection) { - return ((Collection) obj).iterator(); - - } else if (obj instanceof Object[]) { - return new ObjectArrayIterator((Object[]) obj); - - } else if (obj instanceof Enumeration) { - return new EnumerationIterator((Enumeration) obj); - - } else if (obj instanceof Map) { - return ((Map) obj).values().iterator(); - - } else if (obj instanceof Dictionary) { - return new EnumerationIterator(((Dictionary) obj).elements()); - - } else if (obj != null && obj.getClass().isArray()) { - return new ArrayIterator(obj); - - } else { - try { - Method method = obj.getClass().getMethod("iterator", (Class[]) null); - if (Iterator.class.isAssignableFrom(method.getReturnType())) { - Iterator it = (Iterator) method.invoke(obj, (Object[]) null); - if (it != null) { - return it; - } - } - } catch (Exception ex) { - // ignore - } - return singletonIterator(obj); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/KeyValue.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/KeyValue.java deleted file mode 100644 index e38c3aba8cd..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/KeyValue.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a simple key value pair. - *

          - * A Map Entry has considerable additional semantics over and above a simple - * key-value pair. This interface defines the minimum key value, with just the - * two get methods. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface KeyValue { - - /** - * Gets the key from the pair. - * - * @return the key - */ - Object getKey(); - - /** - * Gets the value from the pair. - * - * @return the value - */ - Object getValue(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/LRUMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/LRUMap.java deleted file mode 100644 index 1e5be48b8fe..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/LRUMap.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.util.Iterator; - -/** - *

          - * An implementation of a Map which has a maximum size and uses a Least Recently Used - * algorithm to remove items from the Map when the maximum size is reached and new items are added. - *

          - * - *

          - * A synchronized version can be obtained with: - * Collections.synchronizedMap( theMapToSynchronize ) - * If it will be accessed by multiple threads, you _must_ synchronize access - * to this Map. Even concurrent get(Object) operations produce indeterminate - * behaviour. - *

          - * - *

          - * Unlike the Collections 1.0 version, this version of LRUMap does use a true - * LRU algorithm. The keys for all gets and puts are moved to the front of - * the list. LRUMap is now a subclass of SequencedHashMap, and the "LRU" - * key is now equivalent to LRUMap.getFirst(). - *

          - * - * @deprecated Moved to map subpackage. Due to be removed in v4.0. - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Morgan Delagrange - */ -public class LRUMap extends SequencedHashMap implements Externalizable { - - private int maximumSize = 0; - - /** - * Default constructor, primarily for the purpose of - * de-externalization. This constructors sets a default - * LRU limit of 100 keys, but this value may be overridden - * internally as a result of de-externalization. - */ - public LRUMap() { - this( 100 ); - } - - /** - * Create a new LRUMap with a maximum capacity of i. - * Once i capacity is achieved, subsequent gets - * and puts will push keys out of the map. See . - * - * @param i Maximum capacity of the LRUMap - */ - public LRUMap(int i) { - super( i ); - maximumSize = i; - } - - /** - *

          Get the value for a key from the Map. The key - * will be promoted to the Most Recently Used position. - * Note that get(Object) operations will modify - * the underlying Collection. Calling get(Object) - * inside of an iteration over keys, values, etc. is - * currently unsupported.

          - * - * @param key Key to retrieve - * @return Returns the value. Returns null if the key has a - * null value or if the key has no value. - */ - public Object get(Object key) { - if(!containsKey(key)) return null; - - Object value = remove(key); - super.put(key,value); - return value; - } - - /** - *

          Removes the key and its Object from the Map.

          - * - *

          (Note: this may result in the "Least Recently Used" - * object being removed from the Map. In that case, - * the removeLRU() method is called. See javadoc for - * removeLRU() for more details.)

          - * - * @param key Key of the Object to add. - * @param value Object to add - * @return Former value of the key - */ - public Object put( Object key, Object value ) { - - int mapSize = size(); - Object retval = null; - - if ( mapSize >= maximumSize ) { - - // don't retire LRU if you are just - // updating an existing key - if (!containsKey(key)) { - // lets retire the least recently used item in the cache - removeLRU(); - } - } - - retval = super.put(key,value); - - return retval; - } - - /** - * This method is used internally by the class for - * finding and removing the LRU Object. - */ - protected void removeLRU() { - Object key = getFirstKey(); - // be sure to call super.get(key), or you're likely to - // get infinite promotion recursion - Object value = super.get(key); - - remove(key); - - processRemovedLRU(key,value); - } - - /** - * Subclasses of LRUMap may hook into this method to - * provide specialized actions whenever an Object is - * automatically removed from the cache. By default, - * this method does nothing. - * - * @param key key that was removed - * @param value value of that key (can be null) - */ - protected void processRemovedLRU(Object key, Object value) { - } - - // Externalizable interface - //------------------------------------------------------------------------- - public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException { - maximumSize = in.readInt(); - int size = in.readInt(); - - for( int i = 0; i < size; i++ ) { - Object key = in.readObject(); - Object value = in.readObject(); - put(key,value); - } - } - - public void writeExternal( ObjectOutput out ) throws IOException { - out.writeInt( maximumSize ); - out.writeInt( size() ); - for( Iterator iterator = keySet().iterator(); iterator.hasNext(); ) { - Object key = iterator.next(); - out.writeObject( key ); - // be sure to call super.get(key), or you're likely to - // get infinite promotion recursion - Object value = super.get( key ); - out.writeObject( value ); - } - } - - - // Properties - //------------------------------------------------------------------------- - /** Getter for property maximumSize. - * @return Value of property maximumSize. - */ - public int getMaximumSize() { - return maximumSize; - } - /** Setter for property maximumSize. - * @param maximumSize New value of property maximumSize. - */ - public void setMaximumSize(int maximumSize) { - this.maximumSize = maximumSize; - while (size() > maximumSize) { - removeLRU(); - } - } - - - // add a serial version uid, so that if we change things in the future - // without changing the format, we can still deserialize properly. - private static final long serialVersionUID = 2197433140769957051L; -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ListUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ListUtils.java deleted file mode 100644 index 6c65dc04e85..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ListUtils.java +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import org.apache.commons.collections.list.FixedSizeList; -import org.apache.commons.collections.list.LazyList; -import org.apache.commons.collections.list.PredicatedList; -import org.apache.commons.collections.list.SynchronizedList; -import org.apache.commons.collections.list.TransformedList; -import org.apache.commons.collections.list.TypedList; -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * Provides utility methods and decorators for {@link List} instances. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Federico Barbieri - * @author Peter Donald - * @author Paul Jack - * @author Stephen Colebourne - * @author Neil O'Toole - * @author Matthew Hawthorne - */ -public class ListUtils { - - /** - * An empty unmodifiable list. - * This uses the {@link Collections Collections} implementation - * and is provided for completeness. - */ - public static final List EMPTY_LIST = Collections.EMPTY_LIST; - - /** - * ListUtils should not normally be instantiated. - */ - public ListUtils() { - } - - //----------------------------------------------------------------------- - /** - * Returns a new list containing all elements that are contained in - * both given lists. - * - * @param list1 the first list - * @param list2 the second list - * @return the intersection of those two lists - * @throws NullPointerException if either list is null - */ - public static List intersection(final List list1, final List list2) { - final ArrayList result = new ArrayList(); - final Iterator iterator = list2.iterator(); - - while (iterator.hasNext()) { - final Object o = iterator.next(); - - if (list1.contains(o)) { - result.add(o); - } - } - - return result; - } - - /** - * Subtracts all elements in the second list from the first list, - * placing the results in a new list. - *

          - * This differs from {@link List#removeAll(Collection)} in that - * cardinality is respected; if list1 contains two - * occurrences of null and list2 only - * contains one occurrence, then the returned list will still contain - * one occurrence. - * - * @param list1 the list to subtract from - * @param list2 the list to subtract - * @return a new list containing the results - * @throws NullPointerException if either list is null - */ - public static List subtract(final List list1, final List list2) { - final ArrayList result = new ArrayList(list1); - final Iterator iterator = list2.iterator(); - - while (iterator.hasNext()) { - result.remove(iterator.next()); - } - - return result; - } - - /** - * Returns the sum of the given lists. This is their intersection - * subtracted from their union. - * - * @param list1 the first list - * @param list2 the second list - * @return a new list containing the sum of those lists - * @throws NullPointerException if either list is null - */ - public static List sum(final List list1, final List list2) { - return subtract(union(list1, list2), intersection(list1, list2)); - } - - /** - * Returns a new list containing the second list appended to the - * first list. The {@link List#addAll(Collection)} operation is - * used to append the two given lists into a new list. - * - * @param list1 the first list - * @param list2 the second list - * @return a new list containing the union of those lists - * @throws NullPointerException if either list is null - */ - public static List union(final List list1, final List list2) { - final ArrayList result = new ArrayList(list1); - result.addAll(list2); - return result; - } - - /** - * Tests two lists for value-equality as per the equality contract in - * {@link java.util.List#equals(java.lang.Object)}. - *

          - * This method is useful for implementing List when you cannot - * extend AbstractList. The method takes Collection instances to enable other - * collection types to use the List implementation algorithm. - *

          - * The relevant text (slightly paraphrased as this is a static method) is: - *

          - * Compares the two list objects for equality. Returns - * true if and only if both - * lists have the same size, and all corresponding pairs of elements in - * the two lists are equal. (Two elements e1 and - * e2 are equal if (e1==null ? e2==null : - * e1.equals(e2)).) In other words, two lists are defined to be - * equal if they contain the same elements in the same order. This - * definition ensures that the equals method works properly across - * different implementations of the List interface. - *
          - * - * Note: The behaviour of this method is undefined if the lists are - * modified during the equals comparison. - * - * @see java.util.List - * @param list1 the first list, may be null - * @param list2 the second list, may be null - * @return whether the lists are equal by value comparison - */ - public static boolean isEqualList(final Collection list1, final Collection list2) { - if (list1 == list2) { - return true; - } - if (list1 == null || list2 == null || list1.size() != list2.size()) { - return false; - } - - Iterator it1 = list1.iterator(); - Iterator it2 = list2.iterator(); - Object obj1 = null; - Object obj2 = null; - - while (it1.hasNext() && it2.hasNext()) { - obj1 = it1.next(); - obj2 = it2.next(); - - if (!(obj1 == null ? obj2 == null : obj1.equals(obj2))) { - return false; - } - } - - return !(it1.hasNext() || it2.hasNext()); - } - - /** - * Generates a hash code using the algorithm specified in - * {@link java.util.List#hashCode()}. - *

          - * This method is useful for implementing List when you cannot - * extend AbstractList. The method takes Collection instances to enable other - * collection types to use the List implementation algorithm. - * - * @see java.util.List#hashCode() - * @param list the list to generate the hashCode for, may be null - * @return the hash code - */ - public static int hashCodeForList(final Collection list) { - if (list == null) { - return 0; - } - int hashCode = 1; - Iterator it = list.iterator(); - Object obj = null; - - while (it.hasNext()) { - obj = it.next(); - hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode()); - } - return hashCode; - } - - //----------------------------------------------------------------------- - /** - * Returns a List containing all the elements in collection - * that are also in retain. The cardinality of an element e - * in the returned list is the same as the cardinality of e - * in collection unless retain does not contain e, in which - * case the cardinality is zero. This method is useful if you do not wish to modify - * the collection c and thus cannot call collection.retainAll(retain);. - * - * @param collection the collection whose contents are the target of the #retailAll operation - * @param retain the collection containing the elements to be retained in the returned collection - * @return a List containing all the elements of c - * that occur at least once in retain. - * @throws NullPointerException if either parameter is null - * @since Commons Collections 3.2 - */ - public static List retainAll(Collection collection, Collection retain) { - List list = new ArrayList(Math.min(collection.size(), retain.size())); - - for (Iterator iter = collection.iterator(); iter.hasNext();) { - Object obj = iter.next(); - if (retain.contains(obj)) { - list.add(obj); - } - } - return list; - } - - /** - * Removes the elements in remove from collection. That is, this - * method returns a list containing all the elements in c - * that are not in remove. The cardinality of an element e - * in the returned collection is the same as the cardinality of e - * in collection unless remove contains e, in which - * case the cardinality is zero. This method is useful if you do not wish to modify - * collection and thus cannot call collection.removeAll(remove);. - * - * @param collection the collection from which items are removed (in the returned collection) - * @param remove the items to be removed from the returned collection - * @return a List containing all the elements of c except - * any elements that also occur in remove. - * @throws NullPointerException if either parameter is null - * @since Commons Collections 3.2 - */ - public static List removeAll(Collection collection, Collection remove) { - List list = new ArrayList(); - for (Iterator iter = collection.iterator(); iter.hasNext();) { - Object obj = iter.next(); - if (remove.contains(obj) == false) { - list.add(obj); - } - } - return list; - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized list backed by the given list. - *

          - * You must manually synchronize on the returned buffer's iterator to - * avoid non-deterministic behavior: - * - *

          -     * List list = ListUtils.synchronizedList(myList);
          -     * synchronized (list) {
          -     *     Iterator i = list.iterator();
          -     *     while (i.hasNext()) {
          -     *         process (i.next());
          -     *     }
          -     * }
          -     * 
          - * - * This method uses the implementation in the decorators subpackage. - * - * @param list the list to synchronize, must not be null - * @return a synchronized list backed by the given list - * @throws IllegalArgumentException if the list is null - */ - public static List synchronizedList(List list) { - return SynchronizedList.decorate(list); - } - - /** - * Returns an unmodifiable list backed by the given list. - *

          - * This method uses the implementation in the decorators subpackage. - * - * @param list the list to make unmodifiable, must not be null - * @return an unmodifiable list backed by the given list - * @throws IllegalArgumentException if the list is null - */ - public static List unmodifiableList(List list) { - return UnmodifiableList.decorate(list); - } - - /** - * Returns a predicated (validating) list backed by the given list. - *

          - * Only objects that pass the test in the given predicate can be added to the list. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original list after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param list the list to predicate, must not be null - * @param predicate the predicate for the list, must not be null - * @return a predicated list backed by the given list - * @throws IllegalArgumentException if the List or Predicate is null - */ - public static List predicatedList(List list, Predicate predicate) { - return PredicatedList.decorate(list, predicate); - } - - /** - * Returns a typed list backed by the given list. - *

          - * Only objects of the specified type can be added to the list. - * - * @param list the list to limit to a specific type, must not be null - * @param type the type of objects which may be added to the list - * @return a typed list backed by the specified list - */ - public static List typedList(List list, Class type) { - return TypedList.decorate(list, type); - } - - /** - * Returns a transformed list backed by the given list. - *

          - * Each object is passed through the transformer as it is added to the - * List. It is important not to use the original list after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param list the list to predicate, must not be null - * @param transformer the transformer for the list, must not be null - * @return a transformed list backed by the given list - * @throws IllegalArgumentException if the List or Transformer is null - */ - public static List transformedList(List list, Transformer transformer) { - return TransformedList.decorate(list, transformer); - } - - /** - * Returns a "lazy" list whose elements will be created on demand. - *

          - * When the index passed to the returned list's {@link List#get(int) get} - * method is greater than the list's size, then the factory will be used - * to create a new object and that object will be inserted at that index. - *

          - * For instance: - * - *

          -     * Factory factory = new Factory() {
          -     *     public Object create() {
          -     *         return new Date();
          -     *     }
          -     * }
          -     * List lazy = ListUtils.lazyList(new ArrayList(), factory);
          -     * Object obj = lazy.get(3);
          -     * 
          - * - * After the above code is executed, obj will contain - * a new Date instance. Furthermore, that Date - * instance is the fourth element in the list. The first, second, - * and third element are all set to null. - * - * @param list the list to make lazy, must not be null - * @param factory the factory for creating new objects, must not be null - * @return a lazy list backed by the given list - * @throws IllegalArgumentException if the List or Factory is null - */ - public static List lazyList(List list, Factory factory) { - return LazyList.decorate(list, factory); - } - - /** - * Returns a fixed-sized list backed by the given list. - * Elements may not be added or removed from the returned list, but - * existing elements can be changed (for instance, via the - * {@link List#set(int,Object)} method). - * - * @param list the list whose size to fix, must not be null - * @return a fixed-size list backed by that list - * @throws IllegalArgumentException if the List is null - */ - public static List fixedSizeList(List list) { - return FixedSizeList.decorate(list); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapIterator.java deleted file mode 100644 index a886189b598..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapIterator.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Iterator; - -/** - * Defines an iterator that operates over a Map. - *

          - * This iterator is a special version designed for maps. It can be more - * efficient to use this rather than an entry set iterator where the option - * is available, and it is certainly more convenient. - *

          - * A map that provides this interface may not hold the data internally using - * Map Entry objects, thus this interface can avoid lots of object creation. - *

          - * In use, this iterator iterates through the keys in the map. After each call - * to next(), the getValue() method provides direct - * access to the value. The value can also be set using setValue(). - *

          - * MapIterator it = map.mapIterator();
          - * while (it.hasNext()) {
          - *   Object key = it.next();
          - *   Object value = it.getValue();
          - *   it.setValue(newValue);
          - * }
          - * 
          - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface MapIterator extends Iterator { - - /** - * Checks to see if there are more entries still to be iterated. - * - * @return true if the iterator has more elements - */ - boolean hasNext(); - - /** - * Gets the next key from the Map. - * - * @return the next key in the iteration - * @throws java.util.NoSuchElementException if the iteration is finished - */ - Object next(); - - //----------------------------------------------------------------------- - /** - * Gets the current key, which is the key returned by the last call - * to next(). - * - * @return the current key - * @throws IllegalStateException if next() has not yet been called - */ - Object getKey(); - - /** - * Gets the current value, which is the value associated with the last key - * returned by next(). - * - * @return the current value - * @throws IllegalStateException if next() has not yet been called - */ - Object getValue(); - - //----------------------------------------------------------------------- - /** - * Removes the last returned key from the underlying Map (optional operation). - *

          - * This method can be called once per call to next(). - * - * @throws UnsupportedOperationException if remove is not supported by the map - * @throws IllegalStateException if next() has not yet been called - * @throws IllegalStateException if remove() has already been called - * since the last call to next() - */ - void remove(); - - /** - * Sets the value associated with the current key (optional operation). - * - * @param value the new value - * @return the previous value - * @throws UnsupportedOperationException if setValue is not supported by the map - * @throws IllegalStateException if next() has not yet been called - * @throws IllegalStateException if remove() has been called since the - * last call to next() - */ - Object setValue(Object value); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapUtils.java deleted file mode 100644 index e38dbc9e654..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MapUtils.java +++ /dev/null @@ -1,1645 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.PrintStream; -import java.text.NumberFormat; -import java.text.ParseException; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Properties; -import java.util.ResourceBundle; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.apache.commons.collections.map.FixedSizeMap; -import org.apache.commons.collections.map.FixedSizeSortedMap; -import org.apache.commons.collections.map.LazyMap; -import org.apache.commons.collections.map.LazySortedMap; -import org.apache.commons.collections.map.ListOrderedMap; -import org.apache.commons.collections.map.MultiValueMap; -import org.apache.commons.collections.map.PredicatedMap; -import org.apache.commons.collections.map.PredicatedSortedMap; -import org.apache.commons.collections.map.TransformedMap; -import org.apache.commons.collections.map.TransformedSortedMap; -import org.apache.commons.collections.map.TypedMap; -import org.apache.commons.collections.map.TypedSortedMap; -import org.apache.commons.collections.map.UnmodifiableMap; -import org.apache.commons.collections.map.UnmodifiableSortedMap; - -/** - * Provides utility methods and decorators for - * {@link Map} and {@link SortedMap} instances. - *

          - * It contains various type safe methods - * as well as other useful features like deep copying. - *

          - * It also provides the following decorators: - * - *

            - *
          • {@link #fixedSizeMap(Map)} - *
          • {@link #fixedSizeSortedMap(SortedMap)} - *
          • {@link #lazyMap(Map,Factory)} - *
          • {@link #lazyMap(Map,Transformer)} - *
          • {@link #lazySortedMap(SortedMap,Factory)} - *
          • {@link #lazySortedMap(SortedMap,Transformer)} - *
          • {@link #predicatedMap(Map,Predicate,Predicate)} - *
          • {@link #predicatedSortedMap(SortedMap,Predicate,Predicate)} - *
          • {@link #transformedMap(Map, Transformer, Transformer)} - *
          • {@link #transformedSortedMap(SortedMap, Transformer, Transformer)} - *
          • {@link #typedMap(Map, Class, Class)} - *
          • {@link #typedSortedMap(SortedMap, Class, Class)} - *
          • {@link #multiValueMap( Map )} - *
          • {@link #multiValueMap( Map, Class )} - *
          • {@link #multiValueMap( Map, Factory )} - *
          - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Nissim Karpenstein - * @author Kasper Nielsen - * @author Paul Jack - * @author Stephen Colebourne - * @author Matthew Hawthorne - * @author Arun Mammen Thomas - * @author Janek Bogucki - * @author Max Rydahl Andersen - * @author Ashwin S - * @author James Carman - * @author Neil O'Toole - */ -public class MapUtils { - - /** - * An empty unmodifiable map. - * This was not provided in JDK1.2. - */ - public static final Map EMPTY_MAP = UnmodifiableMap.decorate(new HashMap(1)); - /** - * An empty unmodifiable sorted map. - * This is not provided in the JDK. - */ - public static final SortedMap EMPTY_SORTED_MAP = UnmodifiableSortedMap.decorate(new TreeMap()); - /** - * String used to indent the verbose and debug Map prints. - */ - private static final String INDENT_STRING = " "; - - /** - * MapUtils should not normally be instantiated. - */ - public MapUtils() { - } - - // Type safe getters - //------------------------------------------------------------------------- - /** - * Gets from a Map in a null-safe manner. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map, null if null map input - */ - public static Object getObject(final Map map, final Object key) { - if (map != null) { - return map.get(key); - } - return null; - } - - /** - * Gets a String from a Map in a null-safe manner. - *

          - * The String is obtained via toString. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a String, null if null map input - */ - public static String getString(final Map map, final Object key) { - if (map != null) { - Object answer = map.get(key); - if (answer != null) { - return answer.toString(); - } - } - return null; - } - - /** - * Gets a Boolean from a Map in a null-safe manner. - *

          - * If the value is a Boolean it is returned directly. - * If the value is a String and it equals 'true' ignoring case - * then true is returned, otherwise false. - * If the value is a Number an integer zero value returns - * false and non-zero returns true. - * Otherwise, null is returned. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Boolean, null if null map input - */ - public static Boolean getBoolean(final Map map, final Object key) { - if (map != null) { - Object answer = map.get(key); - if (answer != null) { - if (answer instanceof Boolean) { - return (Boolean) answer; - - } else if (answer instanceof String) { - return new Boolean((String) answer); - - } else if (answer instanceof Number) { - Number n = (Number) answer; - return (n.intValue() != 0) ? Boolean.TRUE : Boolean.FALSE; - } - } - } - return null; - } - - /** - * Gets a Number from a Map in a null-safe manner. - *

          - * If the value is a Number it is returned directly. - * If the value is a String it is converted using - * {@link NumberFormat#parse(String)} on the system default formatter - * returning null if the conversion fails. - * Otherwise, null is returned. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Number, null if null map input - */ - public static Number getNumber(final Map map, final Object key) { - if (map != null) { - Object answer = map.get(key); - if (answer != null) { - if (answer instanceof Number) { - return (Number) answer; - - } else if (answer instanceof String) { - try { - String text = (String) answer; - return NumberFormat.getInstance().parse(text); - - } catch (ParseException e) { - logInfo(e); - } - } - } - } - return null; - } - - /** - * Gets a Byte from a Map in a null-safe manner. - *

          - * The Byte is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Byte, null if null map input - */ - public static Byte getByte(final Map map, final Object key) { - Number answer = getNumber(map, key); - if (answer == null) { - return null; - } else if (answer instanceof Byte) { - return (Byte) answer; - } - return new Byte(answer.byteValue()); - } - - /** - * Gets a Short from a Map in a null-safe manner. - *

          - * The Short is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Short, null if null map input - */ - public static Short getShort(final Map map, final Object key) { - Number answer = getNumber(map, key); - if (answer == null) { - return null; - } else if (answer instanceof Short) { - return (Short) answer; - } - return new Short(answer.shortValue()); - } - - /** - * Gets a Integer from a Map in a null-safe manner. - *

          - * The Integer is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Integer, null if null map input - */ - public static Integer getInteger(final Map map, final Object key) { - Number answer = getNumber(map, key); - if (answer == null) { - return null; - } else if (answer instanceof Integer) { - return (Integer) answer; - } - return new Integer(answer.intValue()); - } - - /** - * Gets a Long from a Map in a null-safe manner. - *

          - * The Long is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Long, null if null map input - */ - public static Long getLong(final Map map, final Object key) { - Number answer = getNumber(map, key); - if (answer == null) { - return null; - } else if (answer instanceof Long) { - return (Long) answer; - } - return new Long(answer.longValue()); - } - - /** - * Gets a Float from a Map in a null-safe manner. - *

          - * The Float is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Float, null if null map input - */ - public static Float getFloat(final Map map, final Object key) { - Number answer = getNumber(map, key); - if (answer == null) { - return null; - } else if (answer instanceof Float) { - return (Float) answer; - } - return new Float(answer.floatValue()); - } - - /** - * Gets a Double from a Map in a null-safe manner. - *

          - * The Double is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Double, null if null map input - */ - public static Double getDouble(final Map map, final Object key) { - Number answer = getNumber(map, key); - if (answer == null) { - return null; - } else if (answer instanceof Double) { - return (Double) answer; - } - return new Double(answer.doubleValue()); - } - - /** - * Gets a Map from a Map in a null-safe manner. - *

          - * If the value returned from the specified map is not a Map then - * null is returned. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Map, null if null map input - */ - public static Map getMap(final Map map, final Object key) { - if (map != null) { - Object answer = map.get(key); - if (answer != null && answer instanceof Map) { - return (Map) answer; - } - } - return null; - } - - // Type safe getters with default values - //------------------------------------------------------------------------- - /** - * Looks up the given key in the given map, converting null into the - * given default value. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null - * @return the value in the map, or defaultValue if the original value - * is null or the map is null - */ - public static Object getObject( Map map, Object key, Object defaultValue ) { - if ( map != null ) { - Object answer = map.get( key ); - if ( answer != null ) { - return answer; - } - } - return defaultValue; - } - - /** - * Looks up the given key in the given map, converting the result into - * a string, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a string, or defaultValue if the - * original value is null, the map is null or the string conversion - * fails - */ - public static String getString( Map map, Object key, String defaultValue ) { - String answer = getString( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a boolean, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a boolean, or defaultValue if the - * original value is null, the map is null or the boolean conversion - * fails - */ - public static Boolean getBoolean( Map map, Object key, Boolean defaultValue ) { - Boolean answer = getBoolean( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a number, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Number getNumber( Map map, Object key, Number defaultValue ) { - Number answer = getNumber( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a byte, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Byte getByte( Map map, Object key, Byte defaultValue ) { - Byte answer = getByte( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a short, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Short getShort( Map map, Object key, Short defaultValue ) { - Short answer = getShort( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * an integer, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Integer getInteger( Map map, Object key, Integer defaultValue ) { - Integer answer = getInteger( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a long, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Long getLong( Map map, Object key, Long defaultValue ) { - Long answer = getLong( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a float, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Float getFloat( Map map, Object key, Float defaultValue ) { - Float answer = getFloat( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a double, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the number conversion - * fails - */ - public static Double getDouble( Map map, Object key, Double defaultValue ) { - Double answer = getDouble( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - /** - * Looks up the given key in the given map, converting the result into - * a map, using the default value if the the conversion fails. - * - * @param map the map whose value to look up - * @param key the key of the value to look up in that map - * @param defaultValue what to return if the value is null or if the - * conversion fails - * @return the value in the map as a number, or defaultValue if the - * original value is null, the map is null or the map conversion - * fails - */ - public static Map getMap( Map map, Object key, Map defaultValue ) { - Map answer = getMap( map, key ); - if ( answer == null ) { - answer = defaultValue; - } - return answer; - } - - - // Type safe primitive getters - //------------------------------------------------------------------------- - /** - * Gets a boolean from a Map in a null-safe manner. - *

          - * If the value is a Boolean its value is returned. - * If the value is a String and it equals 'true' ignoring case - * then true is returned, otherwise false. - * If the value is a Number an integer zero value returns - * false and non-zero returns true. - * Otherwise, false is returned. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a Boolean, false if null map input - */ - public static boolean getBooleanValue(final Map map, final Object key) { - Boolean booleanObject = getBoolean(map, key); - if (booleanObject == null) { - return false; - } - return booleanObject.booleanValue(); - } - - /** - * Gets a byte from a Map in a null-safe manner. - *

          - * The byte is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a byte, 0 if null map input - */ - public static byte getByteValue(final Map map, final Object key) { - Byte byteObject = getByte(map, key); - if (byteObject == null) { - return 0; - } - return byteObject.byteValue(); - } - - /** - * Gets a short from a Map in a null-safe manner. - *

          - * The short is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a short, 0 if null map input - */ - public static short getShortValue(final Map map, final Object key) { - Short shortObject = getShort(map, key); - if (shortObject == null) { - return 0; - } - return shortObject.shortValue(); - } - - /** - * Gets an int from a Map in a null-safe manner. - *

          - * The int is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as an int, 0 if null map input - */ - public static int getIntValue(final Map map, final Object key) { - Integer integerObject = getInteger(map, key); - if (integerObject == null) { - return 0; - } - return integerObject.intValue(); - } - - /** - * Gets a long from a Map in a null-safe manner. - *

          - * The long is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a long, 0L if null map input - */ - public static long getLongValue(final Map map, final Object key) { - Long longObject = getLong(map, key); - if (longObject == null) { - return 0L; - } - return longObject.longValue(); - } - - /** - * Gets a float from a Map in a null-safe manner. - *

          - * The float is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a float, 0.0F if null map input - */ - public static float getFloatValue(final Map map, final Object key) { - Float floatObject = getFloat(map, key); - if (floatObject == null) { - return 0f; - } - return floatObject.floatValue(); - } - - /** - * Gets a double from a Map in a null-safe manner. - *

          - * The double is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @return the value in the Map as a double, 0.0 if null map input - */ - public static double getDoubleValue(final Map map, final Object key) { - Double doubleObject = getDouble(map, key); - if (doubleObject == null) { - return 0d; - } - return doubleObject.doubleValue(); - } - - // Type safe primitive getters with default values - //------------------------------------------------------------------------- - /** - * Gets a boolean from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * If the value is a Boolean its value is returned. - * If the value is a String and it equals 'true' ignoring case - * then true is returned, otherwise false. - * If the value is a Number an integer zero value returns - * false and non-zero returns true. - * Otherwise, defaultValue is returned. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as a Boolean, defaultValue if null map input - */ - public static boolean getBooleanValue(final Map map, final Object key, boolean defaultValue) { - Boolean booleanObject = getBoolean(map, key); - if (booleanObject == null) { - return defaultValue; - } - return booleanObject.booleanValue(); - } - - /** - * Gets a byte from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * The byte is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as a byte, defaultValue if null map input - */ - public static byte getByteValue(final Map map, final Object key, byte defaultValue) { - Byte byteObject = getByte(map, key); - if (byteObject == null) { - return defaultValue; - } - return byteObject.byteValue(); - } - - /** - * Gets a short from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * The short is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as a short, defaultValue if null map input - */ - public static short getShortValue(final Map map, final Object key, short defaultValue) { - Short shortObject = getShort(map, key); - if (shortObject == null) { - return defaultValue; - } - return shortObject.shortValue(); - } - - /** - * Gets an int from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * The int is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as an int, defaultValue if null map input - */ - public static int getIntValue(final Map map, final Object key, int defaultValue) { - Integer integerObject = getInteger(map, key); - if (integerObject == null) { - return defaultValue; - } - return integerObject.intValue(); - } - - /** - * Gets a long from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * The long is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as a long, defaultValue if null map input - */ - public static long getLongValue(final Map map, final Object key, long defaultValue) { - Long longObject = getLong(map, key); - if (longObject == null) { - return defaultValue; - } - return longObject.longValue(); - } - - /** - * Gets a float from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * The float is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as a float, defaultValue if null map input - */ - public static float getFloatValue(final Map map, final Object key, float defaultValue) { - Float floatObject = getFloat(map, key); - if (floatObject == null) { - return defaultValue; - } - return floatObject.floatValue(); - } - - /** - * Gets a double from a Map in a null-safe manner, - * using the default value if the the conversion fails. - *

          - * The double is obtained from the results of {@link #getNumber(Map,Object)}. - * - * @param map the map to use - * @param key the key to look up - * @param defaultValue return if the value is null or if the - * conversion fails - * @return the value in the Map as a double, defaultValue if null map input - */ - public static double getDoubleValue(final Map map, final Object key, double defaultValue) { - Double doubleObject = getDouble(map, key); - if (doubleObject == null) { - return defaultValue; - } - return doubleObject.doubleValue(); - } - - // Conversion methods - //------------------------------------------------------------------------- - /** - * Gets a new Properties object initialised with the values from a Map. - * A null input will return an empty properties object. - * - * @param map the map to convert to a Properties object, may not be null - * @return the properties object - */ - public static Properties toProperties(final Map map) { - Properties answer = new Properties(); - if (map != null) { - for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { - Map.Entry entry = (Map.Entry) iter.next(); - Object key = entry.getKey(); - Object value = entry.getValue(); - answer.put(key, value); - } - } - return answer; - } - - /** - * Creates a new HashMap using data copied from a ResourceBundle. - * - * @param resourceBundle the resource bundle to convert, may not be null - * @return the hashmap containing the data - * @throws NullPointerException if the bundle is null - */ - public static Map toMap(final ResourceBundle resourceBundle) { - Enumeration enumeration = resourceBundle.getKeys(); - Map map = new HashMap(); - - while (enumeration.hasMoreElements()) { - String key = (String) enumeration.nextElement(); - Object value = resourceBundle.getObject(key); - map.put(key, value); - } - - return map; - } - - // Printing methods - //------------------------------------------------------------------------- - /** - * Prints the given map with nice line breaks. - *

          - * This method prints a nicely formatted String describing the Map. - * Each map entry will be printed with key and value. - * When the value is a Map, recursive behaviour occurs. - *

          - * This method is NOT thread-safe in any special way. You must manually - * synchronize on either this class or the stream as required. - * - * @param out the stream to print to, must not be null - * @param label The label to be used, may be null. - * If null, the label is not output. - * It typically represents the name of the property in a bean or similar. - * @param map The map to print, may be null. - * If null, the text 'null' is output. - * @throws NullPointerException if the stream is null - */ - public static void verbosePrint( - final PrintStream out, - final Object label, - final Map map) { - - verbosePrintInternal(out, label, map, new ArrayStack(), false); - } - - /** - * Prints the given map with nice line breaks. - *

          - * This method prints a nicely formatted String describing the Map. - * Each map entry will be printed with key, value and value classname. - * When the value is a Map, recursive behaviour occurs. - *

          - * This method is NOT thread-safe in any special way. You must manually - * synchronize on either this class or the stream as required. - * - * @param out the stream to print to, must not be null - * @param label The label to be used, may be null. - * If null, the label is not output. - * It typically represents the name of the property in a bean or similar. - * @param map The map to print, may be null. - * If null, the text 'null' is output. - * @throws NullPointerException if the stream is null - */ - public static void debugPrint( - final PrintStream out, - final Object label, - final Map map) { - - verbosePrintInternal(out, label, map, new ArrayStack(), true); - } - - // Implementation methods - //------------------------------------------------------------------------- - /** - * Logs the given exception to System.out. - *

          - * This method exists as Jakarta Collections does not depend on logging. - * - * @param ex the exception to log - */ - protected static void logInfo(final Exception ex) { - System.out.println("INFO: Exception: " + ex); - } - - /** - * Implementation providing functionality for {@link #debugPrint} and for - * {@link #verbosePrint}. This prints the given map with nice line breaks. - * If the debug flag is true, it additionally prints the type of the object - * value. If the contents of a map include the map itself, then the text - * (this Map) is printed out. If the contents include a - * parent container of the map, the the text (ancestor[i] Map) is - * printed, where i actually indicates the number of levels which must be - * traversed in the sequential list of ancestors (e.g. father, grandfather, - * great-grandfather, etc). - * - * @param out the stream to print to - * @param label the label to be used, may be null. - * If null, the label is not output. - * It typically represents the name of the property in a bean or similar. - * @param map the map to print, may be null. - * If null, the text 'null' is output - * @param lineage a stack consisting of any maps in which the previous - * argument is contained. This is checked to avoid infinite recursion when - * printing the output - * @param debug flag indicating whether type names should be output. - * @throws NullPointerException if the stream is null - */ - private static void verbosePrintInternal( - final PrintStream out, - final Object label, - final Map map, - final ArrayStack lineage, - final boolean debug) { - - printIndent(out, lineage.size()); - - if (map == null) { - if (label != null) { - out.print(label); - out.print(" = "); - } - out.println("null"); - return; - } - if (label != null) { - out.print(label); - out.println(" = "); - } - - printIndent(out, lineage.size()); - out.println("{"); - - lineage.push(map); - - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - Object childKey = entry.getKey(); - Object childValue = entry.getValue(); - if (childValue instanceof Map && !lineage.contains(childValue)) { - verbosePrintInternal( - out, - (childKey == null ? "null" : childKey), - (Map) childValue, - lineage, - debug); - } else { - printIndent(out, lineage.size()); - out.print(childKey); - out.print(" = "); - - final int lineageIndex = lineage.indexOf(childValue); - if (lineageIndex == -1) { - out.print(childValue); - } else if (lineage.size() - 1 == lineageIndex) { - out.print("(this Map)"); - } else { - out.print( - "(ancestor[" - + (lineage.size() - 1 - lineageIndex - 1) - + "] Map)"); - } - - if (debug && childValue != null) { - out.print(' '); - out.println(childValue.getClass().getName()); - } else { - out.println(); - } - } - } - - lineage.pop(); - - printIndent(out, lineage.size()); - out.println(debug ? "} " + map.getClass().getName() : "}"); - } - - /** - * Writes indentation to the given stream. - * - * @param out the stream to indent - */ - private static void printIndent(final PrintStream out, final int indent) { - for (int i = 0; i < indent; i++) { - out.print(INDENT_STRING); - } - } - - // Misc - //----------------------------------------------------------------------- - /** - * Inverts the supplied map returning a new HashMap such that the keys of - * the input are swapped with the values. - *

          - * This operation assumes that the inverse mapping is well defined. - * If the input map had multiple entries with the same value mapped to - * different keys, the returned map will map one of those keys to the - * value, but the exact key which will be mapped is undefined. - * - * @param map the map to invert, may not be null - * @return a new HashMap containing the inverted data - * @throws NullPointerException if the map is null - */ - public static Map invertMap(Map map) { - Map out = new HashMap(map.size()); - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - out.put(entry.getValue(), entry.getKey()); - } - return out; - } - - //----------------------------------------------------------------------- - /** - * Protects against adding null values to a map. - *

          - * This method checks the value being added to the map, and if it is null - * it is replaced by an empty string. - *

          - * This could be useful if the map does not accept null values, or for - * receiving data from a source that may provide null or empty string - * which should be held in the same way in the map. - *

          - * Keys are not validated. - * - * @param map the map to add to, may not be null - * @param key the key - * @param value the value, null converted to "" - * @throws NullPointerException if the map is null - */ - public static void safeAddToMap(Map map, Object key, Object value) throws NullPointerException { - if (value == null) { - map.put(key, ""); - } else { - map.put(key, value); - } - } - - //----------------------------------------------------------------------- - /** - * Puts all the keys and values from the specified array into the map. - *

          - * This method is an alternative to the {@link java.util.Map#putAll(java.util.Map)} - * method and constructors. It allows you to build a map from an object array - * of various possible styles. - *

          - * If the first entry in the object array implements {@link java.util.Map.Entry} - * or {@link KeyValue} then the key and value are added from that object. - * If the first entry in the object array is an object array itself, then - * it is assumed that index 0 in the sub-array is the key and index 1 is the value. - * Otherwise, the array is treated as keys and values in alternate indices. - *

          - * For example, to create a color map: - *

          -     * Map colorMap = MapUtils.putAll(new HashMap(), new String[][] {
          -     *     {"RED", "#FF0000"},
          -     *     {"GREEN", "#00FF00"},
          -     *     {"BLUE", "#0000FF"}
          -     * });
          -     * 
          - * or: - *
          -     * Map colorMap = MapUtils.putAll(new HashMap(), new String[] {
          -     *     "RED", "#FF0000",
          -     *     "GREEN", "#00FF00",
          -     *     "BLUE", "#0000FF"
          -     * });
          -     * 
          - * or: - *
          -     * Map colorMap = MapUtils.putAll(new HashMap(), new Map.Entry[] {
          -     *     new DefaultMapEntry("RED", "#FF0000"),
          -     *     new DefaultMapEntry("GREEN", "#00FF00"),
          -     *     new DefaultMapEntry("BLUE", "#0000FF")
          -     * });
          -     * 
          - * - * @param map the map to populate, must not be null - * @param array an array to populate from, null ignored - * @return the input map - * @throws NullPointerException if map is null - * @throws IllegalArgumentException if sub-array or entry matching used and an - * entry is invalid - * @throws ClassCastException if the array contents is mixed - * @since Commons Collections 3.2 - */ - public static Map putAll(Map map, Object[] array) { - map.size(); // force NPE - if (array == null || array.length == 0) { - return map; - } - Object obj = array[0]; - if (obj instanceof Map.Entry) { - for (int i = 0; i < array.length; i++) { - Map.Entry entry = (Map.Entry) array[i]; - map.put(entry.getKey(), entry.getValue()); - } - } else if (obj instanceof KeyValue) { - for (int i = 0; i < array.length; i++) { - KeyValue keyval = (KeyValue) array[i]; - map.put(keyval.getKey(), keyval.getValue()); - } - } else if (obj instanceof Object[]) { - for (int i = 0; i < array.length; i++) { - Object[] sub = (Object[]) array[i]; - if (sub == null || sub.length < 2) { - throw new IllegalArgumentException("Invalid array element: " + i); - } - map.put(sub[0], sub[1]); - } - } else { - for (int i = 0; i < array.length - 1;) { - map.put(array[i++], array[i++]); - } - } - return map; - } - - //----------------------------------------------------------------------- - /** - * Null-safe check if the specified map is empty. - *

          - * Null returns true. - * - * @param map the map to check, may be null - * @return true if empty or null - * @since Commons Collections 3.2 - */ - public static boolean isEmpty(Map map) { - return (map == null || map.isEmpty()); - } - - /** - * Null-safe check if the specified map is not empty. - *

          - * Null returns false. - * - * @param map the map to check, may be null - * @return true if non-null and non-empty - * @since Commons Collections 3.2 - */ - public static boolean isNotEmpty(Map map) { - return !MapUtils.isEmpty(map); - } - - // Map decorators - //----------------------------------------------------------------------- - /** - * Returns a synchronized map backed by the given map. - *

          - * You must manually synchronize on the returned buffer's iterator to - * avoid non-deterministic behavior: - * - *

          -     * Map m = MapUtils.synchronizedMap(myMap);
          -     * Set s = m.keySet();  // outside synchronized block
          -     * synchronized (m) {  // synchronized on MAP!
          -     *     Iterator i = s.iterator();
          -     *     while (i.hasNext()) {
          -     *         process (i.next());
          -     *     }
          -     * }
          -     * 
          - * - * This method uses the implementation in {@link java.util.Collections Collections}. - * - * @param map the map to synchronize, must not be null - * @return a synchronized map backed by the given map - * @throws IllegalArgumentException if the map is null - */ - public static Map synchronizedMap(Map map) { - return Collections.synchronizedMap(map); - } - - /** - * Returns an unmodifiable map backed by the given map. - *

          - * This method uses the implementation in the decorators subpackage. - * - * @param map the map to make unmodifiable, must not be null - * @return an unmodifiable map backed by the given map - * @throws IllegalArgumentException if the map is null - */ - public static Map unmodifiableMap(Map map) { - return UnmodifiableMap.decorate(map); - } - - /** - * Returns a predicated (validating) map backed by the given map. - *

          - * Only objects that pass the tests in the given predicates can be added to the map. - * Trying to add an invalid object results in an IllegalArgumentException. - * Keys must pass the key predicate, values must pass the value predicate. - * It is important not to use the original map after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param map the map to predicate, must not be null - * @param keyPred the predicate for keys, null means no check - * @param valuePred the predicate for values, null means no check - * @return a predicated map backed by the given map - * @throws IllegalArgumentException if the Map is null - */ - public static Map predicatedMap(Map map, Predicate keyPred, Predicate valuePred) { - return PredicatedMap.decorate(map, keyPred, valuePred); - } - - /** - * Returns a typed map backed by the given map. - *

          - * Only keys and values of the specified types can be added to the map. - * - * @param map the map to limit to a specific type, must not be null - * @param keyType the type of keys which may be added to the map, must not be null - * @param valueType the type of values which may be added to the map, must not be null - * @return a typed map backed by the specified map - * @throws IllegalArgumentException if the Map or Class is null - */ - public static Map typedMap(Map map, Class keyType, Class valueType) { - return TypedMap.decorate(map, keyType, valueType); - } - - /** - * Returns a transformed map backed by the given map. - *

          - * This method returns a new map (decorating the specified map) that - * will transform any new entries added to it. - * Existing entries in the specified map will not be transformed. - * If you want that behaviour, see {@link TransformedMap#decorateTransform}. - *

          - * Each object is passed through the transformers as it is added to the - * Map. It is important not to use the original map after invoking this - * method, as it is a backdoor for adding untransformed objects. - *

          - * If there are any elements already in the map being decorated, they - * are NOT transformed. - * - * @param map the map to transform, must not be null, typically empty - * @param keyTransformer the transformer for the map keys, null means no transformation - * @param valueTransformer the transformer for the map values, null means no transformation - * @return a transformed map backed by the given map - * @throws IllegalArgumentException if the Map is null - */ - public static Map transformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) { - return TransformedMap.decorate(map, keyTransformer, valueTransformer); - } - - /** - * Returns a fixed-sized map backed by the given map. - * Elements may not be added or removed from the returned map, but - * existing elements can be changed (for instance, via the - * {@link Map#put(Object,Object)} method). - * - * @param map the map whose size to fix, must not be null - * @return a fixed-size map backed by that map - * @throws IllegalArgumentException if the Map is null - */ - public static Map fixedSizeMap(Map map) { - return FixedSizeMap.decorate(map); - } - - /** - * Returns a "lazy" map whose values will be created on demand. - *

          - * When the key passed to the returned map's {@link Map#get(Object)} - * method is not present in the map, then the factory will be used - * to create a new object and that object will become the value - * associated with that key. - *

          - * For instance: - *

          -     * Factory factory = new Factory() {
          -     *     public Object create() {
          -     *         return new Date();
          -     *     }
          -     * }
          -     * Map lazyMap = MapUtils.lazyMap(new HashMap(), factory);
          -     * Object obj = lazyMap.get("test");
          -     * 
          - * - * After the above code is executed, obj will contain - * a new Date instance. Furthermore, that Date - * instance is the value for the "test" key in the map. - * - * @param map the map to make lazy, must not be null - * @param factory the factory for creating new objects, must not be null - * @return a lazy map backed by the given map - * @throws IllegalArgumentException if the Map or Factory is null - */ - public static Map lazyMap(Map map, Factory factory) { - return LazyMap.decorate(map, factory); - } - - /** - * Returns a "lazy" map whose values will be created on demand. - *

          - * When the key passed to the returned map's {@link Map#get(Object)} - * method is not present in the map, then the factory will be used - * to create a new object and that object will become the value - * associated with that key. The factory is a {@link Transformer} - * that will be passed the key which it must transform into the value. - *

          - * For instance: - *

          -     * Transformer factory = new Transformer() {
          -     *     public Object transform(Object mapKey) {
          -     *         return new File(mapKey);
          -     *     }
          -     * }
          -     * Map lazyMap = MapUtils.lazyMap(new HashMap(), factory);
          -     * Object obj = lazyMap.get("C:/dev");
          -     * 
          - * - * After the above code is executed, obj will contain - * a new File instance for the C drive dev directory. - * Furthermore, that File instance is the value for the - * "C:/dev" key in the map. - *

          - * If a lazy map is wrapped by a synchronized map, the result is a simple - * synchronized cache. When an object is not is the cache, the cache itself - * calls back to the factory Transformer to populate itself, all within the - * same synchronized block. - * - * @param map the map to make lazy, must not be null - * @param transformerFactory the factory for creating new objects, must not be null - * @return a lazy map backed by the given map - * @throws IllegalArgumentException if the Map or Transformer is null - */ - public static Map lazyMap(Map map, Transformer transformerFactory) { - return LazyMap.decorate(map, transformerFactory); - } - - /** - * Returns a map that maintains the order of keys that are added - * backed by the given map. - *

          - * If a key is added twice, the order is determined by the first add. - * The order is observed through the keySet, values and entrySet. - * - * @param map the map to order, must not be null - * @return an ordered map backed by the given map - * @throws IllegalArgumentException if the Map is null - */ - public static Map orderedMap(Map map) { - return ListOrderedMap.decorate(map); - } - - /** - * Creates a mult-value map backed by the given map which returns - * collections of type ArrayList. - * - * @param map the map to decorate - * @return a multi-value map backed by the given map which returns ArrayLists of values. - * @see MultiValueMap - * @since Commons Collections 3.2 - */ - public static Map multiValueMap(Map map) { - return MultiValueMap.decorate(map); - } - - /** - * Creates a multi-value map backed by the given map which returns - * collections of the specified type. - * - * @param map the map to decorate - * @param collectionClass the type of collections to return from the map (must contain public no-arg constructor - * and extend Collection). - * @return a multi-value map backed by the given map which returns collections of the specified type - * @see MultiValueMap - * @since Commons Collections 3.2 - */ - public static Map multiValueMap(Map map, Class collectionClass) { - return MultiValueMap.decorate(map, collectionClass); - } - - /** - * Creates a multi-value map backed by the given map which returns - * collections created by the specified collection factory. - * - * @param map the map to decorate - * @param collectionFactory a factor which creates collection objects - * @return a multi-value map backed by the given map which returns collections - * created by the specified collection factory - * @see MultiValueMap - * @since Commons Collections 3.2 - */ - public static Map multiValueMap(Map map, Factory collectionFactory) { - return MultiValueMap.decorate(map, collectionFactory); - } - - // SortedMap decorators - //----------------------------------------------------------------------- - /** - * Returns a synchronized sorted map backed by the given sorted map. - *

          - * You must manually synchronize on the returned buffer's iterator to - * avoid non-deterministic behavior: - * - *

          -     * Map m = MapUtils.synchronizedSortedMap(myMap);
          -     * Set s = m.keySet();  // outside synchronized block
          -     * synchronized (m) {  // synchronized on MAP!
          -     *     Iterator i = s.iterator();
          -     *     while (i.hasNext()) {
          -     *         process (i.next());
          -     *     }
          -     * }
          -     * 
          - * - * This method uses the implementation in {@link java.util.Collections Collections}. - * - * @param map the map to synchronize, must not be null - * @return a synchronized map backed by the given map - * @throws IllegalArgumentException if the map is null - */ - public static Map synchronizedSortedMap(SortedMap map) { - return Collections.synchronizedSortedMap(map); - } - - /** - * Returns an unmodifiable sorted map backed by the given sorted map. - *

          - * This method uses the implementation in the decorators subpackage. - * - * @param map the sorted map to make unmodifiable, must not be null - * @return an unmodifiable map backed by the given map - * @throws IllegalArgumentException if the map is null - */ - public static Map unmodifiableSortedMap(SortedMap map) { - return UnmodifiableSortedMap.decorate(map); - } - - /** - * Returns a predicated (validating) sorted map backed by the given map. - *

          - * Only objects that pass the tests in the given predicates can be added to the map. - * Trying to add an invalid object results in an IllegalArgumentException. - * Keys must pass the key predicate, values must pass the value predicate. - * It is important not to use the original map after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param map the map to predicate, must not be null - * @param keyPred the predicate for keys, null means no check - * @param valuePred the predicate for values, null means no check - * @return a predicated map backed by the given map - * @throws IllegalArgumentException if the SortedMap is null - */ - public static SortedMap predicatedSortedMap(SortedMap map, Predicate keyPred, Predicate valuePred) { - return PredicatedSortedMap.decorate(map, keyPred, valuePred); - } - - /** - * Returns a typed sorted map backed by the given map. - *

          - * Only keys and values of the specified types can be added to the map. - * - * @param map the map to limit to a specific type, must not be null - * @param keyType the type of keys which may be added to the map, must not be null - * @param valueType the type of values which may be added to the map, must not be null - * @return a typed map backed by the specified map - */ - public static SortedMap typedSortedMap(SortedMap map, Class keyType, Class valueType) { - return TypedSortedMap.decorate(map, keyType, valueType); - } - - /** - * Returns a transformed sorted map backed by the given map. - *

          - * This method returns a new sorted map (decorating the specified map) that - * will transform any new entries added to it. - * Existing entries in the specified map will not be transformed. - * If you want that behaviour, see {@link TransformedSortedMap#decorateTransform}. - *

          - * Each object is passed through the transformers as it is added to the - * Map. It is important not to use the original map after invoking this - * method, as it is a backdoor for adding untransformed objects. - *

          - * If there are any elements already in the map being decorated, they - * are NOT transformed. - * - * @param map the map to transform, must not be null, typically empty - * @param keyTransformer the transformer for the map keys, null means no transformation - * @param valueTransformer the transformer for the map values, null means no transformation - * @return a transformed map backed by the given map - * @throws IllegalArgumentException if the SortedMap is null - */ - public static SortedMap transformedSortedMap(SortedMap map, Transformer keyTransformer, Transformer valueTransformer) { - return TransformedSortedMap.decorate(map, keyTransformer, valueTransformer); - } - - /** - * Returns a fixed-sized sorted map backed by the given sorted map. - * Elements may not be added or removed from the returned map, but - * existing elements can be changed (for instance, via the - * {@link Map#put(Object,Object)} method). - * - * @param map the map whose size to fix, must not be null - * @return a fixed-size map backed by that map - * @throws IllegalArgumentException if the SortedMap is null - */ - public static SortedMap fixedSizeSortedMap(SortedMap map) { - return FixedSizeSortedMap.decorate(map); - } - - /** - * Returns a "lazy" sorted map whose values will be created on demand. - *

          - * When the key passed to the returned map's {@link Map#get(Object)} - * method is not present in the map, then the factory will be used - * to create a new object and that object will become the value - * associated with that key. - *

          - * For instance: - * - *

          -     * Factory factory = new Factory() {
          -     *     public Object create() {
          -     *         return new Date();
          -     *     }
          -     * }
          -     * SortedMap lazy = MapUtils.lazySortedMap(new TreeMap(), factory);
          -     * Object obj = lazy.get("test");
          -     * 
          - * - * After the above code is executed, obj will contain - * a new Date instance. Furthermore, that Date - * instance is the value for the "test" key. - * - * @param map the map to make lazy, must not be null - * @param factory the factory for creating new objects, must not be null - * @return a lazy map backed by the given map - * @throws IllegalArgumentException if the SortedMap or Factory is null - */ - public static SortedMap lazySortedMap(SortedMap map, Factory factory) { - return LazySortedMap.decorate(map, factory); - } - - /** - * Returns a "lazy" sorted map whose values will be created on demand. - *

          - * When the key passed to the returned map's {@link Map#get(Object)} - * method is not present in the map, then the factory will be used - * to create a new object and that object will become the value - * associated with that key. The factory is a {@link Transformer} - * that will be passed the key which it must transform into the value. - *

          - * For instance: - *

          -     * Transformer factory = new Transformer() {
          -     *     public Object transform(Object mapKey) {
          -     *         return new File(mapKey);
          -     *     }
          -     * }
          -     * SortedMap lazy = MapUtils.lazySortedMap(new TreeMap(), factory);
          -     * Object obj = lazy.get("C:/dev");
          -     * 
          - * - * After the above code is executed, obj will contain - * a new File instance for the C drive dev directory. - * Furthermore, that File instance is the value for the - * "C:/dev" key in the map. - *

          - * If a lazy map is wrapped by a synchronized map, the result is a simple - * synchronized cache. When an object is not is the cache, the cache itself - * calls back to the factory Transformer to populate itself, all within the - * same synchronized block. - * - * @param map the map to make lazy, must not be null - * @param transformerFactory the factory for creating new objects, must not be null - * @return a lazy map backed by the given map - * @throws IllegalArgumentException if the Map or Transformer is null - */ - public static SortedMap lazySortedMap(SortedMap map, Transformer transformerFactory) { - return LazySortedMap.decorate(map, transformerFactory); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiHashMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiHashMap.java deleted file mode 100644 index 2b500174d38..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiHashMap.java +++ /dev/null @@ -1,493 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.util.AbstractCollection; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.iterators.EmptyIterator; - -/** - * MultiHashMap is the default implementation of the - * {@link org.apache.commons.collections.MultiMap MultiMap} interface. - *

          - * A MultiMap is a Map with slightly different semantics. - * Putting a value into the map will add the value to a Collection at that key. - * Getting a value will return a Collection, holding all the values put to that key. - *

          - * This implementation uses an ArrayList as the collection. - * The internal storage list is made available without cloning via the - * get(Object) and entrySet() methods. - * The implementation returns null when there are no values mapped to a key. - *

          - * For example: - *

          - * MultiMap mhm = new MultiHashMap();
          - * mhm.put(key, "A");
          - * mhm.put(key, "B");
          - * mhm.put(key, "C");
          - * List list = (List) mhm.get(key);
          - *

          - * list will be a list containing "A", "B", "C". - * - * @deprecated Class now available as MultiValueMap in map subpackage. - * This version is due to be removed in collections v4.0. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Christopher Berry - * @author James Strachan - * @author Steve Downey - * @author Stephen Colebourne - * @author Julien Buret - * @author Serhiy Yevtushenko - * @author Robert Ribnitz - */ -public class MultiHashMap extends HashMap implements MultiMap { - - // backed values collection - private transient Collection values = null; - - // compatibility with commons-collection releases 2.0/2.1 - private static final long serialVersionUID = 1943563828307035349L; - - /** - * Constructor. - */ - public MultiHashMap() { - super(); - } - - /** - * Constructor. - * - * @param initialCapacity the initial map capacity - */ - public MultiHashMap(int initialCapacity) { - super(initialCapacity); - } - - /** - * Constructor. - * - * @param initialCapacity the initial map capacity - * @param loadFactor the amount 0.0-1.0 at which to resize the map - */ - public MultiHashMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - /** - * Constructor that copies the input map creating an independent copy. - *

          - * This method performs different behaviour depending on whether the map - * specified is a MultiMap or not. If a MultiMap is specified, each internal - * collection is also cloned. If the specified map only implements Map, then - * the values are not cloned. - *

          - * NOTE: From Commons Collections 3.1 this method correctly copies a MultiMap - * to form a truly independent new map. - * NOTE: From Commons Collections 3.2 this method delegates to the newly - * added putAll(Map) override method. - * - * @param mapToCopy a Map to copy - */ - public MultiHashMap(Map mapToCopy) { - // be careful of JDK 1.3 vs 1.4 differences - super((int) (mapToCopy.size() * 1.4f)); - putAll(mapToCopy); - } - - /** - * Read the object during deserialization. - */ - private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { - // This method is needed because the 1.2/1.3 Java deserialisation called - // put and thus messed up that method - - // default read object - s.defaultReadObject(); - - // problem only with jvm <1.4 - String version = "1.2"; - try { - version = System.getProperty("java.version"); - } catch (SecurityException ex) { - // ignore and treat as 1.2/1.3 - } - - if (version.startsWith("1.2") || version.startsWith("1.3")) { - for (Iterator iterator = entrySet().iterator(); iterator.hasNext();) { - Map.Entry entry = (Map.Entry) iterator.next(); - // put has created a extra collection level, remove it - super.put(entry.getKey(), ((Collection) entry.getValue()).iterator().next()); - } - } - } - - //----------------------------------------------------------------------- - /** - * Gets the total size of the map by counting all the values. - * - * @return the total size of the map counting all values - * @since Commons Collections 3.1 - */ - public int totalSize() { - int total = 0; - Collection values = super.values(); - for (Iterator it = values.iterator(); it.hasNext();) { - Collection coll = (Collection) it.next(); - total += coll.size(); - } - return total; - } - - /** - * Gets the collection mapped to the specified key. - * This method is a convenience method to typecast the result of get(key). - * - * @param key the key to retrieve - * @return the collection mapped to the key, null if no mapping - * @since Commons Collections 3.1 - */ - public Collection getCollection(Object key) { - return (Collection) get(key); - } - - /** - * Gets the size of the collection mapped to the specified key. - * - * @param key the key to get size for - * @return the size of the collection at the key, zero if key not in map - * @since Commons Collections 3.1 - */ - public int size(Object key) { - Collection coll = getCollection(key); - if (coll == null) { - return 0; - } - return coll.size(); - } - - /** - * Gets an iterator for the collection mapped to the specified key. - * - * @param key the key to get an iterator for - * @return the iterator of the collection at the key, empty iterator if key not in map - * @since Commons Collections 3.1 - */ - public Iterator iterator(Object key) { - Collection coll = getCollection(key); - if (coll == null) { - return EmptyIterator.INSTANCE; - } - return coll.iterator(); - } - - /** - * Adds the value to the collection associated with the specified key. - *

          - * Unlike a normal Map the previous value is not replaced. - * Instead the new value is added to the collection stored against the key. - * - * @param key the key to store against - * @param value the value to add to the collection at the key - * @return the value added if the map changed and null if the map did not change - */ - public Object put(Object key, Object value) { - // NOTE:: put is called during deserialization in JDK < 1.4 !!!!!! - // so we must have a readObject() - Collection coll = getCollection(key); - if (coll == null) { - coll = createCollection(null); - super.put(key, coll); - } - boolean results = coll.add(value); - return (results ? value : null); - } - - /** - * Override superclass to ensure that MultiMap instances are - * correctly handled. - *

          - * NOTE: Prior to version 3.2, putAll(map) did not work properly - * when passed a MultiMap. - * - * @param map the map to copy (either a normal or multi map) - */ - public void putAll(Map map) { - if (map instanceof MultiMap) { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - Collection coll = (Collection) entry.getValue(); - putAll(entry.getKey(), coll); - } - } else { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - } - - /** - * Adds a collection of values to the collection associated with the specified key. - * - * @param key the key to store against - * @param values the values to add to the collection at the key, null ignored - * @return true if this map changed - * @since Commons Collections 3.1 - */ - public boolean putAll(Object key, Collection values) { - if (values == null || values.size() == 0) { - return false; - } - Collection coll = getCollection(key); - if (coll == null) { - coll = createCollection(values); - if (coll.size() == 0) { - return false; - } - super.put(key, coll); - return true; - } else { - return coll.addAll(values); - } - } - - /** - * Checks whether the map contains the value specified. - *

          - * This checks all collections against all keys for the value, and thus could be slow. - * - * @param value the value to search for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - Set pairs = super.entrySet(); - - if (pairs == null) { - return false; - } - Iterator pairsIterator = pairs.iterator(); - while (pairsIterator.hasNext()) { - Map.Entry keyValuePair = (Map.Entry) pairsIterator.next(); - Collection coll = (Collection) keyValuePair.getValue(); - if (coll.contains(value)) { - return true; - } - } - return false; - } - - /** - * Checks whether the collection at the specified key contains the value. - * - * @param value the value to search for - * @return true if the map contains the value - * @since Commons Collections 3.1 - */ - public boolean containsValue(Object key, Object value) { - Collection coll = getCollection(key); - if (coll == null) { - return false; - } - return coll.contains(value); - } - - /** - * Removes a specific value from map. - *

          - * The item is removed from the collection mapped to the specified key. - * Other values attached to that key are unaffected. - *

          - * If the last value for a key is removed, null will be returned - * from a subsequant get(key). - * - * @param key the key to remove from - * @param item the value to remove - * @return the value removed (which was passed in), null if nothing removed - */ - public Object remove(Object key, Object item) { - Collection valuesForKey = getCollection(key); - if (valuesForKey == null) { - return null; - } - boolean removed = valuesForKey.remove(item); - if (removed == false) { - return null; - } - // remove the list if it is now empty - // (saves space, and allows equals to work) - if (valuesForKey.isEmpty()){ - remove(key); - } - return item; - } - - /** - * Clear the map. - *

          - * This clears each collection in the map, and so may be slow. - */ - public void clear() { - // For gc, clear each list in the map - Set pairs = super.entrySet(); - Iterator pairsIterator = pairs.iterator(); - while (pairsIterator.hasNext()) { - Map.Entry keyValuePair = (Map.Entry) pairsIterator.next(); - Collection coll = (Collection) keyValuePair.getValue(); - coll.clear(); - } - super.clear(); - } - - /** - * Gets a collection containing all the values in the map. - *

          - * This returns a collection containing the combination of values from all keys. - * - * @return a collection view of the values contained in this map - */ - public Collection values() { - Collection vs = values; - return (vs != null ? vs : (values = new Values())); - } - - /** - * Gets the values iterator from the superclass, as used by inner class. - * - * @return iterator - */ - Iterator superValuesIterator() { - return super.values().iterator(); - } - - //----------------------------------------------------------------------- - /** - * Inner class to view the elements. - */ - private class Values extends AbstractCollection { - - public Iterator iterator() { - return new ValueIterator(); - } - - public int size() { - int compt = 0; - Iterator it = iterator(); - while (it.hasNext()) { - it.next(); - compt++; - } - return compt; - } - - public void clear() { - MultiHashMap.this.clear(); - } - - } - - /** - * Inner iterator to view the elements. - */ - private class ValueIterator implements Iterator { - private Iterator backedIterator; - private Iterator tempIterator; - - private ValueIterator() { - backedIterator = MultiHashMap.this.superValuesIterator(); - } - - private boolean searchNextIterator() { - while (tempIterator == null || tempIterator.hasNext() == false) { - if (backedIterator.hasNext() == false) { - return false; - } - tempIterator = ((Collection) backedIterator.next()).iterator(); - } - return true; - } - - public boolean hasNext() { - return searchNextIterator(); - } - - public Object next() { - if (searchNextIterator() == false) { - throw new NoSuchElementException(); - } - return tempIterator.next(); - } - - public void remove() { - if (tempIterator == null) { - throw new IllegalStateException(); - } - tempIterator.remove(); - } - - } - - //----------------------------------------------------------------------- - /** - * Clones the map creating an independent copy. - *

          - * The clone will shallow clone the collections as well as the map. - * - * @return the cloned map - */ - public Object clone() { - MultiHashMap cloned = (MultiHashMap) super.clone(); - - // clone each Collection container - for (Iterator it = cloned.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - Collection coll = (Collection) entry.getValue(); - Collection newColl = createCollection(coll); - entry.setValue(newColl); - } - return cloned; - } - - /** - * Creates a new instance of the map value Collection container. - *

          - * This method can be overridden to use your own collection type. - * - * @param coll the collection to copy, may be null - * @return the new collection - */ - protected Collection createCollection(Collection coll) { - if (coll == null) { - return new ArrayList(); - } else { - return new ArrayList(coll); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiMap.java deleted file mode 100644 index 276183916b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/MultiMap.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Map; - -/** - * Defines a map that holds a collection of values against each key. - *

          - * A MultiMap is a Map with slightly different semantics. - * Putting a value into the map will add the value to a Collection at that key. - * Getting a value will return a Collection, holding all the values put to that key. - *

          - * For example: - *

          - * MultiMap mhm = new MultiHashMap();
          - * mhm.put(key, "A");
          - * mhm.put(key, "B");
          - * mhm.put(key, "C");
          - * Collection coll = (Collection) mhm.get(key);
          - *

          - * coll will be a collection containing "A", "B", "C". - *

          - * NOTE: Additional methods were added to this interface in Commons Collections 3.1. - * These were added solely for documentation purposes and do not change the interface - * as they were defined in the superinterface Map anyway. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Christopher Berry - * @author James Strachan - * @author Stephen Colebourne - */ -public interface MultiMap extends Map { - - /** - * Removes a specific value from map. - *

          - * The item is removed from the collection mapped to the specified key. - * Other values attached to that key are unaffected. - *

          - * If the last value for a key is removed, implementations typically - * return null from a subsequant get(Object), however - * they may choose to return an empty collection. - * - * @param key the key to remove from - * @param item the item to remove - * @return the value removed (which was passed in), null if nothing removed - * @throws UnsupportedOperationException if the map is unmodifiable - * @throws ClassCastException if the key or value is of an invalid type - * @throws NullPointerException if the key or value is null and null is invalid - */ - public Object remove(Object key, Object item); - - //----------------------------------------------------------------------- - /** - * Gets the number of keys in this map. - *

          - * Implementations typically return only the count of keys in the map - * This cannot be mandated due to backwards compatability of this interface. - * - * @return the number of key-collection mappings in this map - */ - int size(); - - /** - * Gets the collection of values associated with the specified key. - *

          - * The returned value will implement Collection. Implementations - * are free to declare that they return Collection subclasses - * such as List or Set. - *

          - * Implementations typically return null if no values have - * been mapped to the key, however the implementation may choose to - * return an empty collection. - *

          - * Implementations may choose to return a clone of the internal collection. - * - * @param key the key to retrieve - * @return the Collection of values, implementations should - * return null for no mapping, but may return an empty collection - * @throws ClassCastException if the key is of an invalid type - * @throws NullPointerException if the key is null and null keys are invalid - */ - Object get(Object key); - - /** - * Checks whether the map contains the value specified. - *

          - * Implementations typically check all collections against all keys for the value. - * This cannot be mandated due to backwards compatability of this interface. - * - * @param value the value to search for - * @return true if the map contains the value - * @throws ClassCastException if the value is of an invalid type - * @throws NullPointerException if the value is null and null value are invalid - */ - boolean containsValue(Object value); - - /** - * Adds the value to the collection associated with the specified key. - *

          - * Unlike a normal Map the previous value is not replaced. - * Instead the new value is added to the collection stored against the key. - * The collection may be a List, Set or other - * collection dependent on implementation. - * - * @param key the key to store against - * @param value the value to add to the collection at the key - * @return typically the value added if the map changed and null if the map did not change - * @throws UnsupportedOperationException if the map is unmodifiable - * @throws ClassCastException if the key or value is of an invalid type - * @throws NullPointerException if the key or value is null and null is invalid - * @throws IllegalArgumentException if the key or value is invalid - */ - Object put(Object key, Object value); - - /** - * Removes all values associated with the specified key. - *

          - * Implementations typically return null from a subsequant - * get(Object), however they may choose to return an empty collection. - * - * @param key the key to remove values from - * @return the Collection of values removed, implementations should - * return null for no mapping found, but may return an empty collection - * @throws UnsupportedOperationException if the map is unmodifiable - * @throws ClassCastException if the key is of an invalid type - * @throws NullPointerException if the key is null and null keys are invalid - */ - Object remove(Object key); - - /** - * Gets a collection containing all the values in the map. - *

          - * Inplementations typically return a collection containing the combination - * of values from all keys. - * This cannot be mandated due to backwards compatability of this interface. - * - * @return a collection view of the values contained in this map - */ - Collection values(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedBidiMap.java deleted file mode 100644 index ecd9e3d6891..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedBidiMap.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a map that allows bidirectional lookup between key and values - * and retains and provides access to an ordering. - *

          - * Implementations should allow a value to be looked up from a key and - * a key to be looked up from a value with equal performance. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface OrderedBidiMap extends BidiMap, OrderedMap { - - /** - * Gets a view of this map where the keys and values are reversed. - *

          - * Changes to one map will be visible in the other and vice versa. - * This enables both directions of the map to be accessed equally. - *

          - * Implementations should seek to avoid creating a new object every time this - * method is called. See AbstractMap.values() etc. Calling this - * method on the inverse map should return the original. - *

          - * Implementations must return an OrderedBidiMap instance, - * usually by forwarding to inverseOrderedBidiMap(). - * - * @return an inverted bidirectional map - */ - public BidiMap inverseBidiMap(); - - /** - * Gets a view of this map where the keys and values are reversed. - *

          - * Changes to one map will be visible in the other and vice versa. - * This enables both directions of the map to be accessed equally. - *

          - * Implementations should seek to avoid creating a new object every time this - * method is called. See AbstractMap.values() etc. Calling this - * method on the inverse map should return the original. - * - * @return an inverted bidirectional map - */ - public OrderedBidiMap inverseOrderedBidiMap(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedIterator.java deleted file mode 100644 index 8dc6b9ac40e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedIterator.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Iterator; - -/** - * Defines an iterator that operates over an ordered collection. - *

          - * This iterator allows both forward and reverse iteration through the collection. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface OrderedIterator extends Iterator { - - /** - * Checks to see if there is a previous element that can be iterated to. - * - * @return true if the iterator has a previous element - */ - boolean hasPrevious(); - - /** - * Gets the previous element from the collection. - * - * @return the previous element in the iteration - * @throws java.util.NoSuchElementException if the iteration is finished - */ - Object previous(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMap.java deleted file mode 100644 index 7b7e81b96cd..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMap.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a map that maintains order and allows both forward and backward - * iteration through that order. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface OrderedMap extends IterableMap { - - /** - * Obtains an OrderedMapIterator over the map. - *

          - * A ordered map iterator is an efficient way of iterating over maps - * in both directions. - *

          -     * BidiMap map = new TreeBidiMap();
          -     * MapIterator it = map.mapIterator();
          -     * while (it.hasNext()) {
          -     *   Object key = it.next();
          -     *   Object value = it.getValue();
          -     *   it.setValue("newValue");
          -     *   Object previousKey = it.previous();
          -     * }
          -     * 
          - * - * @return a map iterator - */ - OrderedMapIterator orderedMapIterator(); - - /** - * Gets the first key currently in this map. - * - * @return the first key currently in this map - * @throws java.util.NoSuchElementException if this map is empty - */ - public Object firstKey(); - - /** - * Gets the last key currently in this map. - * - * @return the last key currently in this map - * @throws java.util.NoSuchElementException if this map is empty - */ - public Object lastKey(); - - /** - * Gets the next key after the one specified. - * - * @param key the key to search for next from - * @return the next key, null if no match or at end - */ - public Object nextKey(Object key); - - /** - * Gets the previous key before the one specified. - * - * @param key the key to search for previous from - * @return the previous key, null if no match or at start - */ - public Object previousKey(Object key); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMapIterator.java deleted file mode 100644 index a67ad569599..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/OrderedMapIterator.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines an iterator that operates over an ordered Map. - *

          - * This iterator allows both forward and reverse iteration through the map. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface OrderedMapIterator extends MapIterator, OrderedIterator { - - /** - * Checks to see if there is a previous entry that can be iterated to. - * - * @return true if the iterator has a previous element - */ - boolean hasPrevious(); - - /** - * Gets the previous key from the Map. - * - * @return the previous key in the iteration - * @throws java.util.NoSuchElementException if the iteration is finished - */ - Object previous(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Predicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Predicate.java deleted file mode 100644 index 63da369f159..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Predicate.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a functor interface implemented by classes that perform a predicate - * test on an object. - *

          - * A Predicate is the object equivalent of an if statement. - * It uses the input object to return a true or false value, and is often used in - * validation or filtering. - *

          - * Standard implementations of common predicates are provided by - * {@link PredicateUtils}. These include true, false, instanceof, equals, and, - * or, not, method invokation and null testing. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Stephen Colebourne - */ -public interface Predicate { - - /** - * Use the specified parameter to perform a test that returns true or false. - * - * @param object the object to evaluate, should not be changed - * @return true or false - * @throws ClassCastException (runtime) if the input is the wrong class - * @throws IllegalArgumentException (runtime) if the input is invalid - * @throws FunctorException (runtime) if the predicate encounters a problem - */ - public boolean evaluate(Object object); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PredicateUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PredicateUtils.java deleted file mode 100644 index 0701bd1822b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PredicateUtils.java +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; - -import org.apache.commons.collections.functors.AllPredicate; -import org.apache.commons.collections.functors.AndPredicate; -import org.apache.commons.collections.functors.AnyPredicate; -import org.apache.commons.collections.functors.EqualPredicate; -import org.apache.commons.collections.functors.ExceptionPredicate; -import org.apache.commons.collections.functors.FalsePredicate; -import org.apache.commons.collections.functors.IdentityPredicate; -import org.apache.commons.collections.functors.InstanceofPredicate; -import org.apache.commons.collections.functors.InvokerTransformer; -import org.apache.commons.collections.functors.NonePredicate; -import org.apache.commons.collections.functors.NotNullPredicate; -import org.apache.commons.collections.functors.NotPredicate; -import org.apache.commons.collections.functors.NullIsExceptionPredicate; -import org.apache.commons.collections.functors.NullIsFalsePredicate; -import org.apache.commons.collections.functors.NullIsTruePredicate; -import org.apache.commons.collections.functors.NullPredicate; -import org.apache.commons.collections.functors.OnePredicate; -import org.apache.commons.collections.functors.OrPredicate; -import org.apache.commons.collections.functors.TransformedPredicate; -import org.apache.commons.collections.functors.TransformerPredicate; -import org.apache.commons.collections.functors.TruePredicate; -import org.apache.commons.collections.functors.UniquePredicate; - -/** - * PredicateUtils provides reference implementations and utilities - * for the Predicate functor interface. The supplied predicates are: - *

            - *
          • Invoker - returns the result of a method call on the input object - *
          • InstanceOf - true if the object is an instanceof a class - *
          • Equal - true if the object equals() a specified object - *
          • Identity - true if the object == a specified object - *
          • Null - true if the object is null - *
          • NotNull - true if the object is not null - *
          • Unique - true if the object has not already been evaluated - *
          • And/All - true if all of the predicates are true - *
          • Or/Any - true if any of the predicates is true - *
          • Either/One - true if only one of the predicate is true - *
          • Neither/None - true if none of the predicates are true - *
          • Not - true if the predicate is false, and vice versa - *
          • Transformer - wraps a Transformer as a Predicate - *
          • True - always return true - *
          • False - always return false - *
          • Exception - always throws an exception - *
          • NullIsException/NullIsFalse/NullIsTrue - check for null input - *
          • Transformed - transforms the input before calling the predicate - *
          - * All the supplied predicates are Serializable. - * - * @since Commons Collections 3.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Ola Berg - */ -public class PredicateUtils { - - /** - * This class is not normally instantiated. - */ - public PredicateUtils() { - super(); - } - - // Simple predicates - //----------------------------------------------------------------------------- - - /** - * Gets a Predicate that always throws an exception. - * This could be useful during testing as a placeholder. - * - * @see org.apache.commons.collections.functors.ExceptionPredicate - * - * @return the predicate - */ - public static Predicate exceptionPredicate() { - return ExceptionPredicate.INSTANCE; - } - - /** - * Gets a Predicate that always returns true. - * - * @see org.apache.commons.collections.functors.TruePredicate - * - * @return the predicate - */ - public static Predicate truePredicate() { - return TruePredicate.INSTANCE; - } - - /** - * Gets a Predicate that always returns false. - * - * @see org.apache.commons.collections.functors.FalsePredicate - * - * @return the predicate - */ - public static Predicate falsePredicate() { - return FalsePredicate.INSTANCE; - } - - /** - * Gets a Predicate that checks if the input object passed in is null. - * - * @see org.apache.commons.collections.functors.NullPredicate - * - * @return the predicate - */ - public static Predicate nullPredicate() { - return NullPredicate.INSTANCE; - } - - /** - * Gets a Predicate that checks if the input object passed in is not null. - * - * @see org.apache.commons.collections.functors.NotNullPredicate - * - * @return the predicate - */ - public static Predicate notNullPredicate() { - return NotNullPredicate.INSTANCE; - } - - /** - * Creates a Predicate that checks if the input object is equal to the - * specified object using equals(). - * - * @see org.apache.commons.collections.functors.EqualPredicate - * - * @param value the value to compare against - * @return the predicate - */ - public static Predicate equalPredicate(Object value) { - return EqualPredicate.getInstance(value); - } - - /** - * Creates a Predicate that checks if the input object is equal to the - * specified object by identity. - * - * @see org.apache.commons.collections.functors.IdentityPredicate - * - * @param value the value to compare against - * @return the predicate - */ - public static Predicate identityPredicate(Object value) { - return IdentityPredicate.getInstance(value); - } - - /** - * Creates a Predicate that checks if the object passed in is of - * a particular type, using instanceof. A null input - * object will return false. - * - * @see org.apache.commons.collections.functors.InstanceofPredicate - * - * @param type the type to check for, may not be null - * @return the predicate - * @throws IllegalArgumentException if the class is null - */ - public static Predicate instanceofPredicate(Class type) { - return InstanceofPredicate.getInstance(type); - } - - /** - * Creates a Predicate that returns true the first time an object is - * encountered, and false if the same object is received - * again. The comparison is by equals(). A null input object - * is accepted and will return true the first time, and false subsequently - * as well. - * - * @see org.apache.commons.collections.functors.UniquePredicate - * - * @return the predicate - */ - public static Predicate uniquePredicate() { - // must return new instance each time - return UniquePredicate.getInstance(); - } - - /** - * Creates a Predicate that invokes a method on the input object. - * The method must return either a boolean or a non-null Boolean, - * and have no parameters. If the input object is null, a - * PredicateException is thrown. - *

          - * For example, PredicateUtils.invokerPredicate("isEmpty"); - * will call the isEmpty method on the input object to - * determine the predicate result. - * - * @see org.apache.commons.collections.functors.InvokerTransformer - * @see org.apache.commons.collections.functors.TransformerPredicate - * - * @param methodName the method name to call on the input object, may not be null - * @return the predicate - * @throws IllegalArgumentException if the methodName is null. - */ - public static Predicate invokerPredicate(String methodName){ - // reuse transformer as it has caching - this is lazy really, should have inner class here - return asPredicate(InvokerTransformer.getInstance(methodName)); - } - - /** - * Creates a Predicate that invokes a method on the input object. - * The method must return either a boolean or a non-null Boolean, - * and have no parameters. If the input object is null, a - * PredicateException is thrown. - *

          - * For example, PredicateUtils.invokerPredicate("isEmpty"); - * will call the isEmpty method on the input object to - * determine the predicate result. - * - * @see org.apache.commons.collections.functors.InvokerTransformer - * @see org.apache.commons.collections.functors.TransformerPredicate - * - * @param methodName the method name to call on the input object, may not be null - * @param paramTypes the parameter types - * @param args the arguments - * @return the predicate - * @throws IllegalArgumentException if the method name is null - * @throws IllegalArgumentException if the paramTypes and args don't match - */ - public static Predicate invokerPredicate(String methodName, Class[] paramTypes, Object[] args){ - // reuse transformer as it has caching - this is lazy really, should have inner class here - return asPredicate(InvokerTransformer.getInstance(methodName, paramTypes, args)); - } - - // Boolean combinations - //----------------------------------------------------------------------------- - - /** - * Create a new Predicate that returns true only if both of the specified - * predicates are true. - * - * @see org.apache.commons.collections.functors.AndPredicate - * - * @param predicate1 the first predicate, may not be null - * @param predicate2 the second predicate, may not be null - * @return the and predicate - * @throws IllegalArgumentException if either predicate is null - */ - public static Predicate andPredicate(Predicate predicate1, Predicate predicate2) { - return AndPredicate.getInstance(predicate1, predicate2); - } - - /** - * Create a new Predicate that returns true only if all of the specified - * predicates are true. - * If the array of predicates is empty, then this predicate returns true. - * - * @see org.apache.commons.collections.functors.AllPredicate - * - * @param predicates an array of predicates to check, may not be null - * @return the all predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate allPredicate(Predicate[] predicates) { - return AllPredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true only if all of the specified - * predicates are true. The predicates are checked in iterator order. - * If the collection of predicates is empty, then this predicate returns true. - * - * @see org.apache.commons.collections.functors.AllPredicate - * - * @param predicates a collection of predicates to check, may not be null - * @return the all predicate - * @throws IllegalArgumentException if the predicates collection is null - * @throws IllegalArgumentException if any predicate in the collection is null - */ - public static Predicate allPredicate(Collection predicates) { - return AllPredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if either of the specified - * predicates are true. - * - * @see org.apache.commons.collections.functors.OrPredicate - * - * @param predicate1 the first predicate, may not be null - * @param predicate2 the second predicate, may not be null - * @return the or predicate - * @throws IllegalArgumentException if either predicate is null - */ - public static Predicate orPredicate(Predicate predicate1, Predicate predicate2) { - return OrPredicate.getInstance(predicate1, predicate2); - } - - /** - * Create a new Predicate that returns true if any of the specified - * predicates are true. - * If the array of predicates is empty, then this predicate returns false. - * - * @see org.apache.commons.collections.functors.AnyPredicate - * - * @param predicates an array of predicates to check, may not be null - * @return the any predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate anyPredicate(Predicate[] predicates) { - return AnyPredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if any of the specified - * predicates are true. The predicates are checked in iterator order. - * If the collection of predicates is empty, then this predicate returns false. - * - * @see org.apache.commons.collections.functors.AnyPredicate - * - * @param predicates a collection of predicates to check, may not be null - * @return the any predicate - * @throws IllegalArgumentException if the predicates collection is null - * @throws IllegalArgumentException if any predicate in the collection is null - */ - public static Predicate anyPredicate(Collection predicates) { - return AnyPredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if one, but not both, of the - * specified predicates are true. - * - * @see org.apache.commons.collections.functors.OnePredicate - * - * @param predicate1 the first predicate, may not be null - * @param predicate2 the second predicate, may not be null - * @return the either predicate - * @throws IllegalArgumentException if either predicate is null - */ - public static Predicate eitherPredicate(Predicate predicate1, Predicate predicate2) { - return onePredicate(new Predicate[] { predicate1, predicate2 }); - } - - /** - * Create a new Predicate that returns true if only one of the specified - * predicates are true. - * If the array of predicates is empty, then this predicate returns false. - * - * @see org.apache.commons.collections.functors.OnePredicate - * - * @param predicates an array of predicates to check, may not be null - * @return the one predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate onePredicate(Predicate[] predicates) { - return OnePredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if only one of the specified - * predicates are true. The predicates are checked in iterator order. - * If the collection of predicates is empty, then this predicate returns false. - * - * @see org.apache.commons.collections.functors.OnePredicate - * - * @param predicates a collection of predicates to check, may not be null - * @return the one predicate - * @throws IllegalArgumentException if the predicates collection is null - * @throws IllegalArgumentException if any predicate in the collection is null - */ - public static Predicate onePredicate(Collection predicates) { - return OnePredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if neither of the specified - * predicates are true. - * - * @see org.apache.commons.collections.functors.NonePredicate - * - * @param predicate1 the first predicate, may not be null - * @param predicate2 the second predicate, may not be null - * @return the neither predicate - * @throws IllegalArgumentException if either predicate is null - */ - public static Predicate neitherPredicate(Predicate predicate1, Predicate predicate2) { - return nonePredicate(new Predicate[] { predicate1, predicate2 }); - } - - /** - * Create a new Predicate that returns true if none of the specified - * predicates are true. - * If the array of predicates is empty, then this predicate returns true. - * - * @see org.apache.commons.collections.functors.NonePredicate - * - * @param predicates an array of predicates to check, may not be null - * @return the none predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate nonePredicate(Predicate[] predicates) { - return NonePredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if none of the specified - * predicates are true. The predicates are checked in iterator order. - * If the collection of predicates is empty, then this predicate returns true. - * - * @see org.apache.commons.collections.functors.NonePredicate - * - * @param predicates a collection of predicates to check, may not be null - * @return the none predicate - * @throws IllegalArgumentException if the predicates collection is null - * @throws IllegalArgumentException if any predicate in the collection is null - */ - public static Predicate nonePredicate(Collection predicates) { - return NonePredicate.getInstance(predicates); - } - - /** - * Create a new Predicate that returns true if the specified predicate - * returns false and vice versa. - * - * @see org.apache.commons.collections.functors.NotPredicate - * - * @param predicate the predicate to not - * @return the not predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate notPredicate(Predicate predicate) { - return NotPredicate.getInstance(predicate); - } - - // Adaptors - //----------------------------------------------------------------------------- - - /** - * Create a new Predicate that wraps a Transformer. The Transformer must - * return either Boolean.TRUE or Boolean.FALSE otherwise a PredicateException - * will be thrown. - * - * @see org.apache.commons.collections.functors.TransformerPredicate - * - * @param transformer the transformer to wrap, may not be null - * @return the transformer wrapping predicate - * @throws IllegalArgumentException if the transformer is null - */ - public static Predicate asPredicate(Transformer transformer) { - return TransformerPredicate.getInstance(transformer); - } - - // Null handlers - //----------------------------------------------------------------------------- - - /** - * Gets a Predicate that throws an exception if the input object is null, - * otherwise it calls the specified Predicate. This allows null handling - * behaviour to be added to Predicates that don't support nulls. - * - * @see org.apache.commons.collections.functors.NullIsExceptionPredicate - * - * @param predicate the predicate to wrap, may not be null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null. - */ - public static Predicate nullIsExceptionPredicate(Predicate predicate){ - return NullIsExceptionPredicate.getInstance(predicate); - } - - /** - * Gets a Predicate that returns false if the input object is null, otherwise - * it calls the specified Predicate. This allows null handling behaviour to - * be added to Predicates that don't support nulls. - * - * @see org.apache.commons.collections.functors.NullIsFalsePredicate - * - * @param predicate the predicate to wrap, may not be null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null. - */ - public static Predicate nullIsFalsePredicate(Predicate predicate){ - return NullIsFalsePredicate.getInstance(predicate); - } - - /** - * Gets a Predicate that returns true if the input object is null, otherwise - * it calls the specified Predicate. This allows null handling behaviour to - * be added to Predicates that don't support nulls. - * - * @see org.apache.commons.collections.functors.NullIsTruePredicate - * - * @param predicate the predicate to wrap, may not be null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null. - */ - public static Predicate nullIsTruePredicate(Predicate predicate){ - return NullIsTruePredicate.getInstance(predicate); - } - - // Transformed - //----------------------------------------------------------------------- - /** - * Creates a predicate that transforms the input object before passing it - * to the predicate. - * - * @see org.apache.commons.collections.functors.TransformedPredicate - * - * @param transformer the transformer to call first - * @param predicate the predicate to call with the result of the transform - * @return the predicate - * @throws IllegalArgumentException if the transformer or the predicate is null - * @since Commons Collections 3.1 - */ - public static Predicate transformedPredicate(Transformer transformer, Predicate predicate) { - return TransformedPredicate.getInstance(transformer, predicate); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PriorityQueue.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PriorityQueue.java deleted file mode 100644 index decaae833fa..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/PriorityQueue.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a collection for priority queues, which can insert, peek and pop. - *

          - * This interface is now replaced by the Buffer interface. - * - * @deprecated Replaced by the Buffer interface and implementations in buffer subpackage. - * Due to be removed in v4.0. - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Peter Donald - */ -public interface PriorityQueue { - - /** - * Clear all elements from queue. - */ - void clear(); - - /** - * Test if queue is empty. - * - * @return true if queue is empty else false. - */ - boolean isEmpty(); - - /** - * Insert an element into queue. - * - * @param element the element to be inserted - * - * @throws ClassCastException if the specified element's - * type prevents it from being compared to other items in the queue to - * determine its relative priority. - */ - void insert(Object element); - - /** - * Return element on top of heap but don't remove it. - * - * @return the element at top of heap - * @throws java.util.NoSuchElementException if isEmpty() == true - */ - Object peek(); - - /** - * Return element on top of heap and remove it. - * - * @return the element at top of heap - * @throws java.util.NoSuchElementException if isEmpty() == true - */ - Object pop(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ProxyMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ProxyMap.java deleted file mode 100644 index fb7323678c6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ProxyMap.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -/** - *

          This Map wraps another Map - * implementation, using the wrapped instance for its default - * implementation. This class is used as a framework on which to - * build to extensions for its wrapped Map object which - * would be unavailable or inconvenient via sub-classing (but usable - * via composition).

          - * - *

          This implementation does not perform any special processing with - * {@link #entrySet()}, {@link #keySet()} or {@link #values()}. Instead - * it simply returns the set/collection from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating - * implementation it would provide a loophole around the validation. But, - * you might want that loophole, so this class is kept simple.

          - * - * @deprecated Moved to map subpackage as AbstractMapDecorator. It will be removed in v4.0. - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Daniel Rall - * @author Stephen Colebourne - */ -public abstract class ProxyMap implements Map { - - /** - * The Map to delegate to. - */ - protected Map map; - - /** - * Constructor that uses the specified map to delegate to. - *

          - * Note that the map is used for delegation, and is not copied. This is - * different to the normal use of a Map parameter in - * collections constructors. - * - * @param map the Map to delegate to - */ - public ProxyMap(Map map) { - this.map = map; - } - - /** - * Invokes the underlying {@link Map#clear()} method. - */ - public void clear() { - map.clear(); - } - - /** - * Invokes the underlying {@link Map#containsKey(Object)} method. - */ - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - /** - * Invokes the underlying {@link Map#containsValue(Object)} method. - */ - public boolean containsValue(Object value) { - return map.containsValue(value); - } - - /** - * Invokes the underlying {@link Map#entrySet()} method. - */ - public Set entrySet() { - return map.entrySet(); - } - - /** - * Invokes the underlying {@link Map#equals(Object)} method. - */ - public boolean equals(Object m) { - return map.equals(m); - } - - /** - * Invokes the underlying {@link Map#get(Object)} method. - */ - public Object get(Object key) { - return map.get(key); - } - - /** - * Invokes the underlying {@link Map#hashCode()} method. - */ - public int hashCode() { - return map.hashCode(); - } - - /** - * Invokes the underlying {@link Map#isEmpty()} method. - */ - public boolean isEmpty() { - return map.isEmpty(); - } - - /** - * Invokes the underlying {@link Map#keySet()} method. - */ - public Set keySet() { - return map.keySet(); - } - - /** - * Invokes the underlying {@link Map#put(Object,Object)} method. - */ - public Object put(Object key, Object value) { - return map.put(key, value); - } - - /** - * Invokes the underlying {@link Map#putAll(Map)} method. - */ - public void putAll(Map t) { - map.putAll(t); - } - - /** - * Invokes the underlying {@link Map#remove(Object)} method. - */ - public Object remove(Object key) { - return map.remove(key); - } - - /** - * Invokes the underlying {@link Map#size()} method. - */ - public int size() { - return map.size(); - } - - /** - * Invokes the underlying {@link Map#values()} method. - */ - public Collection values() { - return map.values(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ReferenceMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ReferenceMap.java deleted file mode 100644 index 7d78e3b7793..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ReferenceMap.java +++ /dev/null @@ -1,958 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.ref.Reference; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; -import java.lang.ref.WeakReference; -import java.util.AbstractCollection; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.keyvalue.DefaultMapEntry; - -/** - * Hash-based {@link Map} implementation that allows - * mappings to be removed by the garbage collector.

          - * - * When you construct a ReferenceMap, you can - * specify what kind of references are used to store the - * map's keys and values. If non-hard references are - * used, then the garbage collector can remove mappings - * if a key or value becomes unreachable, or if the - * JVM's memory is running low. For information on how - * the different reference types behave, see - * {@link Reference}.

          - * - * Different types of references can be specified for keys - * and values. The keys can be configured to be weak but - * the values hard, in which case this class will behave - * like a - * WeakHashMap. However, you - * can also specify hard keys and weak values, or any other - * combination. The default constructor uses hard keys - * and soft values, providing a memory-sensitive cache.

          - * - * The algorithms used are basically the same as those - * in {@link java.util.HashMap}. In particular, you - * can specify a load factor and capacity to suit your - * needs. All optional {@link Map} operations are - * supported.

          - * - * However, this {@link Map} implementation does not - * allow null elements. Attempting to add a null key or - * or a null value to the map will raise a - * NullPointerException.

          - * - * As usual, this implementation is not synchronized. You - * can use {@link java.util.Collections#synchronizedMap} to - * provide synchronized access to a ReferenceMap. - * - * @see java.lang.ref.Reference - * - * @deprecated Moved to map subpackage. Due to be removed in v4.0. - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - */ -public class ReferenceMap extends AbstractMap { - - /** - * For serialization. - */ - private static final long serialVersionUID = -3370601314380922368L; - - - /** - * Constant indicating that hard references should be used. - */ - final public static int HARD = 0; - - - /** - * Constant indicating that soft references should be used. - */ - final public static int SOFT = 1; - - - /** - * Constant indicating that weak references should be used. - */ - final public static int WEAK = 2; - - - // --- serialized instance variables: - - - /** - * The reference type for keys. Must be HARD, SOFT, WEAK. - * Note: I originally marked this field as final, but then this class - * didn't compile under JDK1.2.2. - * @serial - */ - private int keyType; - - - /** - * The reference type for values. Must be HARD, SOFT, WEAK. - * Note: I originally marked this field as final, but then this class - * didn't compile under JDK1.2.2. - * @serial - */ - private int valueType; - - - /** - * The threshold variable is calculated by multiplying - * table.length and loadFactor. - * Note: I originally marked this field as final, but then this class - * didn't compile under JDK1.2.2. - * @serial - */ - private float loadFactor; - - /** - * Should the value be automatically purged when the associated key has been collected? - */ - private boolean purgeValues = false; - - - // -- Non-serialized instance variables - - /** - * ReferenceQueue used to eliminate stale mappings. - * See purge. - */ - private transient ReferenceQueue queue = new ReferenceQueue(); - - - /** - * The hash table. Its length is always a power of two. - */ - private transient Entry[] table; - - - /** - * Number of mappings in this map. - */ - private transient int size; - - - /** - * When size reaches threshold, the map is resized. - * See resize(). - */ - private transient int threshold; - - - /** - * Number of times this map has been modified. - */ - private transient volatile int modCount; - - - /** - * Cached key set. May be null if key set is never accessed. - */ - private transient Set keySet; - - - /** - * Cached entry set. May be null if entry set is never accessed. - */ - private transient Set entrySet; - - - /** - * Cached values. May be null if values() is never accessed. - */ - private transient Collection values; - - - /** - * Constructs a new ReferenceMap that will - * use hard references to keys and soft references to values. - */ - public ReferenceMap() { - this(HARD, SOFT); - } - - /** - * Constructs a new ReferenceMap that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceMap(int keyType, int valueType, boolean purgeValues) { - this(keyType, valueType); - this.purgeValues = purgeValues; - } - - /** - * Constructs a new ReferenceMap that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - */ - public ReferenceMap(int keyType, int valueType) { - this(keyType, valueType, 16, 0.75f); - } - - /** - * Constructs a new ReferenceMap with the - * specified reference types, load factor and initial - * capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceMap( - int keyType, - int valueType, - int capacity, - float loadFactor, - boolean purgeValues) { - this(keyType, valueType, capacity, loadFactor); - this.purgeValues = purgeValues; - } - - /** - * Constructs a new ReferenceMap with the - * specified reference types, load factor and initial - * capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - */ - public ReferenceMap(int keyType, int valueType, int capacity, float loadFactor) { - super(); - - verify("keyType", keyType); - verify("valueType", valueType); - - if (capacity <= 0) { - throw new IllegalArgumentException("capacity must be positive"); - } - if ((loadFactor <= 0.0f) || (loadFactor >= 1.0f)) { - throw new IllegalArgumentException("Load factor must be greater than 0 and less than 1."); - } - - this.keyType = keyType; - this.valueType = valueType; - - int v = 1; - while (v < capacity) v *= 2; - - this.table = new Entry[v]; - this.loadFactor = loadFactor; - this.threshold = (int)(v * loadFactor); - } - - - // used by constructor - private static void verify(String name, int type) { - if ((type < HARD) || (type > WEAK)) { - throw new IllegalArgumentException(name + - " must be HARD, SOFT, WEAK."); - } - } - - - /** - * Writes this object to the given output stream. - * - * @param out the output stream to write to - * @throws IOException if the stream raises it - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeInt(table.length); - - // Have to use null-terminated list because size might shrink - // during iteration - - for (Iterator iter = entrySet().iterator(); iter.hasNext();) { - Map.Entry entry = (Map.Entry)iter.next(); - out.writeObject(entry.getKey()); - out.writeObject(entry.getValue()); - } - out.writeObject(null); - } - - - /** - * Reads the contents of this object from the given input stream. - * - * @param inp the input stream to read from - * @throws IOException if the stream raises it - * @throws ClassNotFoundException if the stream raises it - */ - private void readObject(ObjectInputStream inp) throws IOException, ClassNotFoundException { - inp.defaultReadObject(); - table = new Entry[inp.readInt()]; - threshold = (int)(table.length * loadFactor); - queue = new ReferenceQueue(); - Object key = inp.readObject(); - while (key != null) { - Object value = inp.readObject(); - put(key, value); - key = inp.readObject(); - } - } - - - /** - * Constructs a reference of the given type to the given - * referent. The reference is registered with the queue - * for later purging. - * - * @param type HARD, SOFT or WEAK - * @param referent the object to refer to - * @param hash the hash code of the key of the mapping; - * this number might be different from referent.hashCode() if - * the referent represents a value and not a key - */ - private Object toReference(int type, Object referent, int hash) { - switch (type) { - case HARD: return referent; - case SOFT: return new SoftRef(hash, referent, queue); - case WEAK: return new WeakRef(hash, referent, queue); - default: throw new Error(); - } - } - - - /** - * Returns the entry associated with the given key. - * - * @param key the key of the entry to look up - * @return the entry associated with that key, or null - * if the key is not in this map - */ - private Entry getEntry(Object key) { - if (key == null) return null; - int hash = key.hashCode(); - int index = indexFor(hash); - for (Entry entry = table[index]; entry != null; entry = entry.next) { - if ((entry.hash == hash) && key.equals(entry.getKey())) { - return entry; - } - } - return null; - } - - - /** - * Converts the given hash code into an index into the - * hash table. - */ - private int indexFor(int hash) { - // mix the bits to avoid bucket collisions... - hash += ~(hash << 15); - hash ^= (hash >>> 10); - hash += (hash << 3); - hash ^= (hash >>> 6); - hash += ~(hash << 11); - hash ^= (hash >>> 16); - return hash & (table.length - 1); - } - - - - /** - * Resizes this hash table by doubling its capacity. - * This is an expensive operation, as entries must - * be copied from the old smaller table to the new - * bigger table. - */ - private void resize() { - Entry[] old = table; - table = new Entry[old.length * 2]; - - for (int i = 0; i < old.length; i++) { - Entry next = old[i]; - while (next != null) { - Entry entry = next; - next = next.next; - int index = indexFor(entry.hash); - entry.next = table[index]; - table[index] = entry; - } - old[i] = null; - } - threshold = (int)(table.length * loadFactor); - } - - - - /** - * Purges stale mappings from this map. - *

          - * Ordinarily, stale mappings are only removed during - * a write operation, although this method is called for both - * read and write operations to maintain a consistent state. - *

          - * Note that this method is not synchronized! Special - * care must be taken if, for instance, you want stale - * mappings to be removed on a periodic basis by some - * background thread. - */ - private void purge() { - Reference ref = queue.poll(); - while (ref != null) { - purge(ref); - ref = queue.poll(); - } - } - - - private void purge(Reference ref) { - // The hashCode of the reference is the hashCode of the - // mapping key, even if the reference refers to the - // mapping value... - int hash = ref.hashCode(); - int index = indexFor(hash); - Entry previous = null; - Entry entry = table[index]; - while (entry != null) { - if (entry.purge(ref)) { - if (previous == null) table[index] = entry.next; - else previous.next = entry.next; - this.size--; - return; - } - previous = entry; - entry = entry.next; - } - - } - - - /** - * Returns the size of this map. - * - * @return the size of this map - */ - public int size() { - purge(); - return size; - } - - - /** - * Returns true if this map is empty. - * - * @return true if this map is empty - */ - public boolean isEmpty() { - purge(); - return size == 0; - } - - - /** - * Returns true if this map contains the given key. - * - * @return true if the given key is in this map - */ - public boolean containsKey(Object key) { - purge(); - Entry entry = getEntry(key); - if (entry == null) return false; - return entry.getValue() != null; - } - - - /** - * Returns the value associated with the given key, if any. - * - * @return the value associated with the given key, or null - * if the key maps to no value - */ - public Object get(Object key) { - purge(); - Entry entry = getEntry(key); - if (entry == null) return null; - return entry.getValue(); - } - - - /** - * Associates the given key with the given value.

          - * Neither the key nor the value may be null. - * - * @param key the key of the mapping - * @param value the value of the mapping - * @return the last value associated with that key, or - * null if no value was associated with the key - * @throws NullPointerException if either the key or value - * is null - */ - public Object put(Object key, Object value) { - if (key == null) throw new NullPointerException("null keys not allowed"); - if (value == null) throw new NullPointerException("null values not allowed"); - - purge(); - if (size + 1 > threshold) resize(); - - int hash = key.hashCode(); - int index = indexFor(hash); - Entry entry = table[index]; - while (entry != null) { - if ((hash == entry.hash) && key.equals(entry.getKey())) { - Object result = entry.getValue(); - entry.setValue(value); - return result; - } - entry = entry.next; - } - this.size++; - modCount++; - key = toReference(keyType, key, hash); - value = toReference(valueType, value, hash); - table[index] = new Entry(key, hash, value, table[index]); - return null; - } - - - /** - * Removes the key and its associated value from this map. - * - * @param key the key to remove - * @return the value associated with that key, or null if - * the key was not in the map - */ - public Object remove(Object key) { - if (key == null) return null; - purge(); - int hash = key.hashCode(); - int index = indexFor(hash); - Entry previous = null; - Entry entry = table[index]; - while (entry != null) { - if ((hash == entry.hash) && key.equals(entry.getKey())) { - if (previous == null) table[index] = entry.next; - else previous.next = entry.next; - this.size--; - modCount++; - return entry.getValue(); - } - previous = entry; - entry = entry.next; - } - return null; - } - - - /** - * Clears this map. - */ - public void clear() { - Arrays.fill(table, null); - size = 0; - while (queue.poll() != null); // drain the queue - } - - - /** - * Returns a set view of this map's entries. - * - * @return a set view of this map's entries - */ - public Set entrySet() { - if (entrySet != null) { - return entrySet; - } - entrySet = new AbstractSet() { - public int size() { - return ReferenceMap.this.size(); - } - - public void clear() { - ReferenceMap.this.clear(); - } - - public boolean contains(Object o) { - if (o == null) return false; - if (!(o instanceof Map.Entry)) return false; - Map.Entry e = (Map.Entry)o; - Entry e2 = getEntry(e.getKey()); - return (e2 != null) && e.equals(e2); - } - - public boolean remove(Object o) { - boolean r = contains(o); - if (r) { - Map.Entry e = (Map.Entry)o; - ReferenceMap.this.remove(e.getKey()); - } - return r; - } - - public Iterator iterator() { - return new EntryIterator(); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] arr) { - ArrayList list = new ArrayList(); - Iterator iterator = iterator(); - while (iterator.hasNext()) { - Entry e = (Entry)iterator.next(); - list.add(new DefaultMapEntry(e.getKey(), e.getValue())); - } - return list.toArray(arr); - } - }; - return entrySet; - } - - - /** - * Returns a set view of this map's keys. - * - * @return a set view of this map's keys - */ - public Set keySet() { - if (keySet != null) return keySet; - keySet = new AbstractSet() { - public int size() { - return ReferenceMap.this.size(); - } - - public Iterator iterator() { - return new KeyIterator(); - } - - public boolean contains(Object o) { - return containsKey(o); - } - - - public boolean remove(Object o) { - Object r = ReferenceMap.this.remove(o); - return r != null; - } - - public void clear() { - ReferenceMap.this.clear(); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] array) { - Collection c = new ArrayList(size()); - for (Iterator it = iterator(); it.hasNext(); ) { - c.add(it.next()); - } - return c.toArray(array); - } - }; - return keySet; - } - - - /** - * Returns a collection view of this map's values. - * - * @return a collection view of this map's values. - */ - public Collection values() { - if (values != null) return values; - values = new AbstractCollection() { - public int size() { - return ReferenceMap.this.size(); - } - - public void clear() { - ReferenceMap.this.clear(); - } - - public Iterator iterator() { - return new ValueIterator(); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] array) { - Collection c = new ArrayList(size()); - for (Iterator it = iterator(); it.hasNext(); ) { - c.add(it.next()); - } - return c.toArray(array); - } - }; - return values; - } - - - // If getKey() or getValue() returns null, it means - // the mapping is stale and should be removed. - private class Entry implements Map.Entry, KeyValue { - - Object key; - Object value; - int hash; - Entry next; - - - public Entry(Object key, int hash, Object value, Entry next) { - this.key = key; - this.hash = hash; - this.value = value; - this.next = next; - } - - - public Object getKey() { - return (keyType > HARD) ? ((Reference)key).get() : key; - } - - - public Object getValue() { - return (valueType > HARD) ? ((Reference)value).get() : value; - } - - - public Object setValue(Object object) { - Object old = getValue(); - if (valueType > HARD) ((Reference)value).clear(); - value = toReference(valueType, object, hash); - return old; - } - - - public boolean equals(Object o) { - if (o == null) return false; - if (o == this) return true; - if (!(o instanceof Map.Entry)) return false; - - Map.Entry entry = (Map.Entry)o; - Object key = entry.getKey(); - Object value = entry.getValue(); - if ((key == null) || (value == null)) return false; - return key.equals(getKey()) && value.equals(getValue()); - } - - - public int hashCode() { - Object v = getValue(); - return hash ^ ((v == null) ? 0 : v.hashCode()); - } - - - public String toString() { - return getKey() + "=" + getValue(); - } - - - boolean purge(Reference ref) { - boolean r = (keyType > HARD) && (key == ref); - r = r || ((valueType > HARD) && (value == ref)); - if (r) { - if (keyType > HARD) ((Reference)key).clear(); - if (valueType > HARD) { - ((Reference)value).clear(); - } else if (purgeValues) { - value = null; - } - } - return r; - } - } - - - private class EntryIterator implements Iterator { - // These fields keep track of where we are in the table. - int index; - Entry entry; - Entry previous; - - // These Object fields provide hard references to the - // current and next entry; this assures that if hasNext() - // returns true, next() will actually return a valid element. - Object nextKey, nextValue; - Object currentKey, currentValue; - - int expectedModCount; - - - public EntryIterator() { - index = (size() != 0 ? table.length : 0); - // have to do this here! size() invocation above - // may have altered the modCount. - expectedModCount = modCount; - } - - - public boolean hasNext() { - checkMod(); - while (nextNull()) { - Entry e = entry; - int i = index; - while ((e == null) && (i > 0)) { - i--; - e = table[i]; - } - entry = e; - index = i; - if (e == null) { - currentKey = null; - currentValue = null; - return false; - } - nextKey = e.getKey(); - nextValue = e.getValue(); - if (nextNull()) entry = entry.next; - } - return true; - } - - - private void checkMod() { - if (modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - - - private boolean nextNull() { - return (nextKey == null) || (nextValue == null); - } - - protected Entry nextEntry() { - checkMod(); - if (nextNull() && !hasNext()) throw new NoSuchElementException(); - previous = entry; - entry = entry.next; - currentKey = nextKey; - currentValue = nextValue; - nextKey = null; - nextValue = null; - return previous; - } - - - public Object next() { - return nextEntry(); - } - - - public void remove() { - checkMod(); - if (previous == null) throw new IllegalStateException(); - ReferenceMap.this.remove(currentKey); - previous = null; - currentKey = null; - currentValue = null; - expectedModCount = modCount; - } - - } - - - private class ValueIterator extends EntryIterator { - public Object next() { - return nextEntry().getValue(); - } - } - - - private class KeyIterator extends EntryIterator { - public Object next() { - return nextEntry().getKey(); - } - } - - - - // These two classes store the hashCode of the key of - // of the mapping, so that after they're dequeued a quick - // lookup of the bucket in the table can occur. - - - private static class SoftRef extends SoftReference { - private int hash; - - - public SoftRef(int hash, Object r, ReferenceQueue q) { - super(r, q); - this.hash = hash; - } - - - public int hashCode() { - return hash; - } - } - - - private static class WeakRef extends WeakReference { - private int hash; - - - public WeakRef(int hash, Object r, ReferenceQueue q) { - super(r, q); - this.hash = hash; - } - - - public int hashCode() { - return hash; - } - } - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableIterator.java deleted file mode 100644 index 21baaef9c7e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableIterator.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Iterator; - -/** - * Defines an iterator that can be reset back to an initial state. - *

          - * This interface allows an iterator to be repeatedly reused. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface ResettableIterator extends Iterator { - - /** - * Resets the iterator back to the position at which the iterator - * was created. - */ - public void reset(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableListIterator.java deleted file mode 100644 index 74f6eb55b09..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/ResettableListIterator.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.ListIterator; - -/** - * Defines a list iterator that can be reset back to an initial state. - *

          - * This interface allows an iterator to be repeatedly reused. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface ResettableListIterator extends ListIterator, ResettableIterator { - - /** - * Resets the iterator back to the position at which the iterator - * was created. - */ - public void reset(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SequencedHashMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SequencedHashMap.java deleted file mode 100644 index b9ea2591389..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SequencedHashMap.java +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.util.AbstractCollection; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * A map of objects whose mapping entries are sequenced based on the order in - * which they were added. This data structure has fast O(1) search - * time, deletion time, and insertion time. - *

          - * Although this map is sequenced, it cannot implement - * {@link java.util.List} because of incompatible interface definitions. - * The remove methods in List and Map have different return values - * (see: {@link java.util.List#remove(Object)} and {@link java.util.Map#remove(Object)}). - *

          - * This class is not thread safe. When a thread safe implementation is - * required, use {@link java.util.Collections#synchronizedMap(Map)} as it is documented, - * or use explicit synchronization controls. - * - * @deprecated Replaced by LinkedMap and ListOrderedMap in map subpackage. Due to be removed in v4.0. - * @see org.apache.commons.collections.map.LinkedMap - * @see org.apache.commons.collections.map.ListOrderedMap - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Michael A. Smith - * @author Daniel Rall - * @author Henning P. Schmiedehausen - * @author Stephen Colebourne - */ -public class SequencedHashMap implements Map, Cloneable, Externalizable { - - /** - * {@link java.util.Map.Entry} that doubles as a node in the linked list - * of sequenced mappings. - */ - private static class Entry implements Map.Entry, KeyValue { - // Note: This class cannot easily be made clonable. While the actual - // implementation of a clone would be simple, defining the semantics is - // difficult. If a shallow clone is implemented, then entry.next.prev != - // entry, which is unintuitive and probably breaks all sorts of assumptions - // in code that uses this implementation. If a deep clone is - // implemented, then what happens when the linked list is cyclical (as is - // the case with SequencedHashMap)? It's impossible to know in the clone - // when to stop cloning, and thus you end up in a recursive loop, - // continuously cloning the "next" in the list. - - private final Object key; - private Object value; - - // package private to allow the SequencedHashMap to access and manipulate - // them. - Entry next = null; - Entry prev = null; - - public Entry(Object key, Object value) { - this.key = key; - this.value = value; - } - - // per Map.Entry.getKey() - public Object getKey() { - return this.key; - } - - // per Map.Entry.getValue() - public Object getValue() { - return this.value; - } - - // per Map.Entry.setValue() - public Object setValue(Object value) { - Object oldValue = this.value; - this.value = value; - return oldValue; - } - - public int hashCode() { - // implemented per api docs for Map.Entry.hashCode() - return ((getKey() == null ? 0 : getKey().hashCode()) ^ (getValue() == null ? 0 : getValue().hashCode())); - } - - public boolean equals(Object obj) { - if (obj == null) - return false; - if (obj == this) - return true; - if (!(obj instanceof Map.Entry)) - return false; - - Map.Entry other = (Map.Entry) obj; - - // implemented per api docs for Map.Entry.equals(Object) - return ( - (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) - && (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue()))); - } - public String toString() { - return "[" + getKey() + "=" + getValue() + "]"; - } - } - - /** - * Construct an empty sentinel used to hold the head (sentinel.next) and the - * tail (sentinel.prev) of the list. The sentinel has a null - * key and value. - */ - private static final Entry createSentinel() { - Entry s = new Entry(null, null); - s.prev = s; - s.next = s; - return s; - } - - /** - * Sentinel used to hold the head and tail of the list of entries. - */ - private Entry sentinel; - - /** - * Map of keys to entries - */ - private HashMap entries; - - /** - * Holds the number of modifications that have occurred to the map, - * excluding modifications made through a collection view's iterator - * (e.g. entrySet().iterator().remove()). This is used to create a - * fail-fast behavior with the iterators. - */ - private transient long modCount = 0; - - /** - * Construct a new sequenced hash map with default initial size and load - * factor. - */ - public SequencedHashMap() { - sentinel = createSentinel(); - entries = new HashMap(); - } - - /** - * Construct a new sequenced hash map with the specified initial size and - * default load factor. - * - * @param initialSize the initial size for the hash table - * - * @see HashMap#HashMap(int) - */ - public SequencedHashMap(int initialSize) { - sentinel = createSentinel(); - entries = new HashMap(initialSize); - } - - /** - * Construct a new sequenced hash map with the specified initial size and - * load factor. - * - * @param initialSize the initial size for the hash table - * - * @param loadFactor the load factor for the hash table. - * - * @see HashMap#HashMap(int,float) - */ - public SequencedHashMap(int initialSize, float loadFactor) { - sentinel = createSentinel(); - entries = new HashMap(initialSize, loadFactor); - } - - /** - * Construct a new sequenced hash map and add all the elements in the - * specified map. The order in which the mappings in the specified map are - * added is defined by {@link #putAll(Map)}. - */ - public SequencedHashMap(Map m) { - this(); - putAll(m); - } - - /** - * Removes an internal entry from the linked list. This does not remove - * it from the underlying map. - */ - private void removeEntry(Entry entry) { - entry.next.prev = entry.prev; - entry.prev.next = entry.next; - } - - /** - * Inserts a new internal entry to the tail of the linked list. This does - * not add the entry to the underlying map. - */ - private void insertEntry(Entry entry) { - entry.next = sentinel; - entry.prev = sentinel.prev; - sentinel.prev.next = entry; - sentinel.prev = entry; - } - - // per Map.size() - - /** - * Implements {@link Map#size()}. - */ - public int size() { - // use the underlying Map's size since size is not maintained here. - return entries.size(); - } - - /** - * Implements {@link Map#isEmpty()}. - */ - public boolean isEmpty() { - // for quick check whether the map is entry, we can check the linked list - // and see if there's anything in it. - return sentinel.next == sentinel; - } - - /** - * Implements {@link Map#containsKey(Object)}. - */ - public boolean containsKey(Object key) { - // pass on to underlying map implementation - return entries.containsKey(key); - } - - /** - * Implements {@link Map#containsValue(Object)}. - */ - public boolean containsValue(Object value) { - // unfortunately, we cannot just pass this call to the underlying map - // because we are mapping keys to entries, not keys to values. The - // underlying map doesn't have an efficient implementation anyway, so this - // isn't a big deal. - - // do null comparison outside loop so we only need to do it once. This - // provides a tighter, more efficient loop at the expense of slight - // code duplication. - if (value == null) { - for (Entry pos = sentinel.next; pos != sentinel; pos = pos.next) { - if (pos.getValue() == null) - return true; - } - } else { - for (Entry pos = sentinel.next; pos != sentinel; pos = pos.next) { - if (value.equals(pos.getValue())) - return true; - } - } - return false; - } - - /** - * Implements {@link Map#get(Object)}. - */ - public Object get(Object o) { - // find entry for the specified key object - Entry entry = (Entry) entries.get(o); - if (entry == null) - return null; - - return entry.getValue(); - } - - /** - * Return the entry for the "oldest" mapping. That is, return the Map.Entry - * for the key-value pair that was first put into the map when compared to - * all the other pairings in the map. This behavior is equivalent to using - * entrySet().iterator().next(), but this method provides an - * optimized implementation. - * - * @return The first entry in the sequence, or null if the - * map is empty. - */ - public Map.Entry getFirst() { - // sentinel.next points to the "first" element of the sequence -- the head - // of the list, which is exactly the entry we need to return. We must test - // for an empty list though because we don't want to return the sentinel! - return (isEmpty()) ? null : sentinel.next; - } - - /** - * Return the key for the "oldest" mapping. That is, return the key for the - * mapping that was first put into the map when compared to all the other - * objects in the map. This behavior is equivalent to using - * getFirst().getKey(), but this method provides a slightly - * optimized implementation. - * - * @return The first key in the sequence, or null if the - * map is empty. - */ - public Object getFirstKey() { - // sentinel.next points to the "first" element of the sequence -- the head - // of the list -- and the requisite key is returned from it. An empty list - // does not need to be tested. In cases where the list is empty, - // sentinel.next will point to the sentinel itself which has a null key, - // which is exactly what we would want to return if the list is empty (a - // nice convenient way to avoid test for an empty list) - return sentinel.next.getKey(); - } - - /** - * Return the value for the "oldest" mapping. That is, return the value for - * the mapping that was first put into the map when compared to all the - * other objects in the map. This behavior is equivalent to using - * getFirst().getValue(), but this method provides a slightly - * optimized implementation. - * - * @return The first value in the sequence, or null if the - * map is empty. - */ - public Object getFirstValue() { - // sentinel.next points to the "first" element of the sequence -- the head - // of the list -- and the requisite value is returned from it. An empty - // list does not need to be tested. In cases where the list is empty, - // sentinel.next will point to the sentinel itself which has a null value, - // which is exactly what we would want to return if the list is empty (a - // nice convenient way to avoid test for an empty list) - return sentinel.next.getValue(); - } - - /** - * Return the entry for the "newest" mapping. That is, return the Map.Entry - * for the key-value pair that was first put into the map when compared to - * all the other pairings in the map. The behavior is equivalent to: - * - *

          -     *    Object obj = null;
          -     *    Iterator iter = entrySet().iterator();
          -     *    while(iter.hasNext()) {
          -     *      obj = iter.next();
          -     *    }
          -     *    return (Map.Entry)obj;
          -     *  
          - * - * However, the implementation of this method ensures an O(1) lookup of the - * last key rather than O(n). - * - * @return The last entry in the sequence, or null if the map - * is empty. - */ - public Map.Entry getLast() { - // sentinel.prev points to the "last" element of the sequence -- the tail - // of the list, which is exactly the entry we need to return. We must test - // for an empty list though because we don't want to return the sentinel! - return (isEmpty()) ? null : sentinel.prev; - } - - /** - * Return the key for the "newest" mapping. That is, return the key for the - * mapping that was last put into the map when compared to all the other - * objects in the map. This behavior is equivalent to using - * getLast().getKey(), but this method provides a slightly - * optimized implementation. - * - * @return The last key in the sequence, or null if the map is - * empty. - */ - public Object getLastKey() { - // sentinel.prev points to the "last" element of the sequence -- the tail - // of the list -- and the requisite key is returned from it. An empty list - // does not need to be tested. In cases where the list is empty, - // sentinel.prev will point to the sentinel itself which has a null key, - // which is exactly what we would want to return if the list is empty (a - // nice convenient way to avoid test for an empty list) - return sentinel.prev.getKey(); - } - - /** - * Return the value for the "newest" mapping. That is, return the value for - * the mapping that was last put into the map when compared to all the other - * objects in the map. This behavior is equivalent to using - * getLast().getValue(), but this method provides a slightly - * optimized implementation. - * - * @return The last value in the sequence, or null if the map - * is empty. - */ - public Object getLastValue() { - // sentinel.prev points to the "last" element of the sequence -- the tail - // of the list -- and the requisite value is returned from it. An empty - // list does not need to be tested. In cases where the list is empty, - // sentinel.prev will point to the sentinel itself which has a null value, - // which is exactly what we would want to return if the list is empty (a - // nice convenient way to avoid test for an empty list) - return sentinel.prev.getValue(); - } - - /** - * Implements {@link Map#put(Object, Object)}. - */ - public Object put(Object key, Object value) { - modCount++; - - Object oldValue = null; - - // lookup the entry for the specified key - Entry e = (Entry) entries.get(key); - - // check to see if it already exists - if (e != null) { - // remove from list so the entry gets "moved" to the end of list - removeEntry(e); - - // update value in map - oldValue = e.setValue(value); - - // Note: We do not update the key here because its unnecessary. We only - // do comparisons using equals(Object) and we know the specified key and - // that in the map are equal in that sense. This may cause a problem if - // someone does not implement their hashCode() and/or equals(Object) - // method properly and then use it as a key in this map. - } else { - // add new entry - e = new Entry(key, value); - entries.put(key, e); - } - // assert(entry in map, but not list) - - // add to list - insertEntry(e); - - return oldValue; - } - - /** - * Implements {@link Map#remove(Object)}. - */ - public Object remove(Object key) { - Entry e = removeImpl(key); - return (e == null) ? null : e.getValue(); - } - - /** - * Fully remove an entry from the map, returning the old entry or null if - * there was no such entry with the specified key. - */ - private Entry removeImpl(Object key) { - Entry e = (Entry) entries.remove(key); - if (e == null) - return null; - modCount++; - removeEntry(e); - return e; - } - - /** - * Adds all the mappings in the specified map to this map, replacing any - * mappings that already exist (as per {@link Map#putAll(Map)}). The order - * in which the entries are added is determined by the iterator returned - * from {@link Map#entrySet()} for the specified map. - * - * @param t the mappings that should be added to this map. - * - * @throws NullPointerException if t is null - */ - public void putAll(Map t) { - Iterator iter = t.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = (Map.Entry) iter.next(); - put(entry.getKey(), entry.getValue()); - } - } - - /** - * Implements {@link Map#clear()}. - */ - public void clear() { - modCount++; - - // remove all from the underlying map - entries.clear(); - - // and the list - sentinel.next = sentinel; - sentinel.prev = sentinel; - } - - /** - * Implements {@link Map#equals(Object)}. - */ - public boolean equals(Object obj) { - if (obj == null) - return false; - if (obj == this) - return true; - - if (!(obj instanceof Map)) - return false; - - return entrySet().equals(((Map) obj).entrySet()); - } - - /** - * Implements {@link Map#hashCode()}. - */ - public int hashCode() { - return entrySet().hashCode(); - } - - /** - * Provides a string representation of the entries within the map. The - * format of the returned string may change with different releases, so this - * method is suitable for debugging purposes only. If a specific format is - * required, use {@link #entrySet()}.{@link Set#iterator() iterator()} and - * iterate over the entries in the map formatting them as appropriate. - */ - public String toString() { - StringBuffer buf = new StringBuffer(); - buf.append('['); - for (Entry pos = sentinel.next; pos != sentinel; pos = pos.next) { - buf.append(pos.getKey()); - buf.append('='); - buf.append(pos.getValue()); - if (pos.next != sentinel) { - buf.append(','); - } - } - buf.append(']'); - - return buf.toString(); - } - - /** - * Implements {@link Map#keySet()}. - */ - public Set keySet() { - return new AbstractSet() { - - // required impls - public Iterator iterator() { - return new OrderedIterator(KEY); - } - public boolean remove(Object o) { - Entry e = SequencedHashMap.this.removeImpl(o); - return (e != null); - } - - // more efficient impls than abstract set - public void clear() { - SequencedHashMap.this.clear(); - } - public int size() { - return SequencedHashMap.this.size(); - } - public boolean isEmpty() { - return SequencedHashMap.this.isEmpty(); - } - public boolean contains(Object o) { - return SequencedHashMap.this.containsKey(o); - } - - }; - } - - /** - * Implements {@link Map#values()}. - */ - public Collection values() { - return new AbstractCollection() { - // required impl - public Iterator iterator() { - return new OrderedIterator(VALUE); - } - public boolean remove(Object value) { - // do null comparison outside loop so we only need to do it once. This - // provides a tighter, more efficient loop at the expense of slight - // code duplication. - if (value == null) { - for (Entry pos = sentinel.next; pos != sentinel; pos = pos.next) { - if (pos.getValue() == null) { - SequencedHashMap.this.removeImpl(pos.getKey()); - return true; - } - } - } else { - for (Entry pos = sentinel.next; pos != sentinel; pos = pos.next) { - if (value.equals(pos.getValue())) { - SequencedHashMap.this.removeImpl(pos.getKey()); - return true; - } - } - } - - return false; - } - - // more efficient impls than abstract collection - public void clear() { - SequencedHashMap.this.clear(); - } - public int size() { - return SequencedHashMap.this.size(); - } - public boolean isEmpty() { - return SequencedHashMap.this.isEmpty(); - } - public boolean contains(Object o) { - return SequencedHashMap.this.containsValue(o); - } - }; - } - - /** - * Implements {@link Map#entrySet()}. - */ - public Set entrySet() { - return new AbstractSet() { - // helper - private Entry findEntry(Object o) { - if (o == null) - return null; - if (!(o instanceof Map.Entry)) - return null; - - Map.Entry e = (Map.Entry) o; - Entry entry = (Entry) entries.get(e.getKey()); - if (entry != null && entry.equals(e)) - return entry; - else - return null; - } - - // required impl - public Iterator iterator() { - return new OrderedIterator(ENTRY); - } - public boolean remove(Object o) { - Entry e = findEntry(o); - if (e == null) - return false; - - return SequencedHashMap.this.removeImpl(e.getKey()) != null; - } - - // more efficient impls than abstract collection - public void clear() { - SequencedHashMap.this.clear(); - } - public int size() { - return SequencedHashMap.this.size(); - } - public boolean isEmpty() { - return SequencedHashMap.this.isEmpty(); - } - public boolean contains(Object o) { - return findEntry(o) != null; - } - }; - } - - // constants to define what the iterator should return on "next" - private static final int KEY = 0; - private static final int VALUE = 1; - private static final int ENTRY = 2; - private static final int REMOVED_MASK = 0x80000000; - - private class OrderedIterator implements Iterator { - /** - * Holds the type that should be returned from the iterator. The value - * should be either {@link #KEY}, {@link #VALUE}, or {@link #ENTRY}. To - * save a tiny bit of memory, this field is also used as a marker for when - * remove has been called on the current object to prevent a second remove - * on the same element. Essentially, if this value is negative (i.e. the - * bit specified by {@link #REMOVED_MASK} is set), the current position - * has been removed. If positive, remove can still be called. - */ - private int returnType; - - /** - * Holds the "current" position in the iterator. When pos.next is the - * sentinel, we've reached the end of the list. - */ - private Entry pos = sentinel; - - /** - * Holds the expected modification count. If the actual modification - * count of the map differs from this value, then a concurrent - * modification has occurred. - */ - private transient long expectedModCount = modCount; - - /** - * Construct an iterator over the sequenced elements in the order in which - * they were added. The {@link #next()} method returns the type specified - * by returnType which must be either {@link #KEY}, {@link - * #VALUE}, or {@link #ENTRY}. - */ - public OrderedIterator(int returnType) { - //// Since this is a private inner class, nothing else should have - //// access to the constructor. Since we know the rest of the outer - //// class uses the iterator correctly, we can leave of the following - //// check: - //if(returnType >= 0 && returnType <= 2) { - // throw new IllegalArgumentException("Invalid iterator type"); - //} - - // Set the "removed" bit so that the iterator starts in a state where - // "next" must be called before "remove" will succeed. - this.returnType = returnType | REMOVED_MASK; - } - - /** - * Returns whether there is any additional elements in the iterator to be - * returned. - * - * @return true if there are more elements left to be - * returned from the iterator; false otherwise. - */ - public boolean hasNext() { - return pos.next != sentinel; - } - - /** - * Returns the next element from the iterator. - * - * @return the next element from the iterator. - * - * @throws NoSuchElementException if there are no more elements in the - * iterator. - * - * @throws ConcurrentModificationException if a modification occurs in - * the underlying map. - */ - public Object next() { - if (modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - if (pos.next == sentinel) { - throw new NoSuchElementException(); - } - - // clear the "removed" flag - returnType = returnType & ~REMOVED_MASK; - - pos = pos.next; - switch (returnType) { - case KEY : - return pos.getKey(); - case VALUE : - return pos.getValue(); - case ENTRY : - return pos; - default : - // should never happen - throw new Error("bad iterator type: " + returnType); - } - - } - - /** - * Removes the last element returned from the {@link #next()} method from - * the sequenced map. - * - * @throws IllegalStateException if there isn't a "last element" to be - * removed. That is, if {@link #next()} has never been called, or if - * {@link #remove()} was already called on the element. - * - * @throws ConcurrentModificationException if a modification occurs in - * the underlying map. - */ - public void remove() { - if ((returnType & REMOVED_MASK) != 0) { - throw new IllegalStateException("remove() must follow next()"); - } - if (modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - - SequencedHashMap.this.removeImpl(pos.getKey()); - - // update the expected mod count for the remove operation - expectedModCount++; - - // set the removed flag - returnType = returnType | REMOVED_MASK; - } - } - - // APIs maintained from previous version of SequencedHashMap for backwards - // compatibility - - /** - * Creates a shallow copy of this object, preserving the internal structure - * by copying only references. The keys and values themselves are not - * clone()'d. The cloned object maintains the same sequence. - * - * @return A clone of this instance. - * - * @throws CloneNotSupportedException if clone is not supported by a - * subclass. - */ - public Object clone() throws CloneNotSupportedException { - // yes, calling super.clone() silly since we're just blowing away all - // the stuff that super might be doing anyway, but for motivations on - // this, see: - // http://www.javaworld.com/javaworld/jw-01-1999/jw-01-object.html - SequencedHashMap map = (SequencedHashMap) super.clone(); - - // create new, empty sentinel - map.sentinel = createSentinel(); - - // create a new, empty entry map - // note: this does not preserve the initial capacity and load factor. - map.entries = new HashMap(); - - // add all the mappings - map.putAll(this); - - // Note: We cannot just clone the hashmap and sentinel because we must - // duplicate our internal structures. Cloning those two will not clone all - // the other entries they reference, and so the cloned hash map will not be - // able to maintain internal consistency because there are two objects with - // the same entries. See discussion in the Entry implementation on why we - // cannot implement a clone of the Entry (and thus why we need to recreate - // everything). - - return map; - } - - /** - * Returns the Map.Entry at the specified index - * - * @throws ArrayIndexOutOfBoundsException if the specified index is - * < 0 or > the size of the map. - */ - private Map.Entry getEntry(int index) { - Entry pos = sentinel; - - if (index < 0) { - throw new ArrayIndexOutOfBoundsException(index + " < 0"); - } - - // loop to one before the position - int i = -1; - while (i < (index - 1) && pos.next != sentinel) { - i++; - pos = pos.next; - } - // pos.next is the requested position - - // if sentinel is next, past end of list - if (pos.next == sentinel) { - throw new ArrayIndexOutOfBoundsException(index + " >= " + (i + 1)); - } - - return pos.next; - } - - /** - * Gets the key at the specified index. - * - * @param index the index to retrieve - * @return the key at the specified index, or null - * @throws ArrayIndexOutOfBoundsException if the index is - * < 0 or > the size of the map. - */ - public Object get(int index) { - return getEntry(index).getKey(); - } - - /** - * Gets the value at the specified index. - * - * @param index the index to retrieve - * @return the value at the specified index, or null - * @throws ArrayIndexOutOfBoundsException if the index is - * < 0 or > the size of the map. - */ - public Object getValue(int index) { - return getEntry(index).getValue(); - } - - /** - * Gets the index of the specified key. - * - * @param key the key to find the index of - * @return the index, or -1 if not found - */ - public int indexOf(Object key) { - Entry e = (Entry) entries.get(key); - if (e == null) { - return -1; - } - int pos = 0; - while (e.prev != sentinel) { - pos++; - e = e.prev; - } - return pos; - } - - /** - * Gets an iterator over the keys. - * - * @return an iterator over the keys - */ - public Iterator iterator() { - return keySet().iterator(); - } - - /** - * Gets the last index of the specified key. - * - * @param key the key to find the index of - * @return the index, or -1 if not found - */ - public int lastIndexOf(Object key) { - // keys in a map are guaranteed to be unique - return indexOf(key); - } - - /** - * Returns a List view of the keys rather than a set view. The returned - * list is unmodifiable. This is required because changes to the values of - * the list (using {@link java.util.ListIterator#set(Object)}) will - * effectively remove the value from the list and reinsert that value at - * the end of the list, which is an unexpected side effect of changing the - * value of a list. This occurs because changing the key, changes when the - * mapping is added to the map and thus where it appears in the list. - * - *

          An alternative to this method is to use {@link #keySet()} - * - * @see #keySet() - * @return The ordered list of keys. - */ - public List sequence() { - List l = new ArrayList(size()); - Iterator iter = keySet().iterator(); - while (iter.hasNext()) { - l.add(iter.next()); - } - - return UnmodifiableList.decorate(l); - } - - /** - * Removes the element at the specified index. - * - * @param index The index of the object to remove. - * @return The previous value corresponding the key, or - * null if none existed. - * - * @throws ArrayIndexOutOfBoundsException if the index is - * < 0 or > the size of the map. - */ - public Object remove(int index) { - return remove(get(index)); - } - - // per Externalizable.readExternal(ObjectInput) - - /** - * Deserializes this map from the given stream. - * - * @param in the stream to deserialize from - * @throws IOException if the stream raises it - * @throws ClassNotFoundException if the stream raises it - */ - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - int size = in.readInt(); - for (int i = 0; i < size; i++) { - Object key = in.readObject(); - Object value = in.readObject(); - put(key, value); - } - } - - /** - * Serializes this map to the given stream. - * - * @param out the stream to serialize to - * @throws IOException if the stream raises it - */ - public void writeExternal(ObjectOutput out) throws IOException { - out.writeInt(size()); - for (Entry pos = sentinel.next; pos != sentinel; pos = pos.next) { - out.writeObject(pos.getKey()); - out.writeObject(pos.getValue()); - } - } - - // add a serial version uid, so that if we change things in the future - // without changing the format, we can still deserialize properly. - private static final long serialVersionUID = 3380552487888102930L; - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SetUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SetUtils.java deleted file mode 100644 index d8ba5c5dd99..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SetUtils.java +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; - -import org.apache.commons.collections.set.ListOrderedSet; -import org.apache.commons.collections.set.PredicatedSet; -import org.apache.commons.collections.set.PredicatedSortedSet; -import org.apache.commons.collections.set.SynchronizedSet; -import org.apache.commons.collections.set.SynchronizedSortedSet; -import org.apache.commons.collections.set.TransformedSet; -import org.apache.commons.collections.set.TransformedSortedSet; -import org.apache.commons.collections.set.TypedSet; -import org.apache.commons.collections.set.TypedSortedSet; -import org.apache.commons.collections.set.UnmodifiableSet; -import org.apache.commons.collections.set.UnmodifiableSortedSet; - -/** - * Provides utility methods and decorators for - * {@link Set} and {@link SortedSet} instances. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - * @author Stephen Colebourne - * @author Neil O'Toole - * @author Matthew Hawthorne - */ -public class SetUtils { - - /** - * An empty unmodifiable set. - * This uses the {@link Collections} implementation - * and is provided for completeness. - */ - public static final Set EMPTY_SET = Collections.EMPTY_SET; - /** - * An empty unmodifiable sorted set. - * This is not provided in the JDK. - */ - public static final SortedSet EMPTY_SORTED_SET = UnmodifiableSortedSet.decorate(new TreeSet()); - - /** - * SetUtils should not normally be instantiated. - */ - public SetUtils() { - } - - //----------------------------------------------------------------------- - /** - * Tests two sets for equality as per the equals() contract - * in {@link java.util.Set#equals(java.lang.Object)}. - *

          - * This method is useful for implementing Set when you cannot - * extend AbstractSet. The method takes Collection instances to enable other - * collection types to use the Set implementation algorithm. - *

          - * The relevant text (slightly paraphrased as this is a static method) is: - *

          - *

          Two sets are considered equal if they have - * the same size, and every member of the first set is contained in - * the second. This ensures that the equals method works - * properly across different implementations of the Set - * interface.

          - * - *

          - * This implementation first checks if the two sets are the same object: - * if so it returns true. Then, it checks if the two sets are - * identical in size; if not, it returns false. If so, it returns - * a.containsAll((Collection) b).

          - *
          - * - * @see java.util.Set - * @param set1 the first set, may be null - * @param set2 the second set, may be null - * @return whether the sets are equal by value comparison - */ - public static boolean isEqualSet(final Collection set1, final Collection set2) { - if (set1 == set2) { - return true; - } - if (set1 == null || set2 == null || set1.size() != set2.size()) { - return false; - } - - return set1.containsAll(set2); - } - - /** - * Generates a hash code using the algorithm specified in - * {@link java.util.Set#hashCode()}. - *

          - * This method is useful for implementing Set when you cannot - * extend AbstractSet. The method takes Collection instances to enable other - * collection types to use the Set implementation algorithm. - * - * @see java.util.Set#hashCode() - * @param set the set to calculate the hash code for, may be null - * @return the hash code - */ - public static int hashCodeForSet(final Collection set) { - if (set == null) { - return 0; - } - int hashCode = 0; - Iterator it = set.iterator(); - Object obj = null; - - while (it.hasNext()) { - obj = it.next(); - if (obj != null) { - hashCode += obj.hashCode(); - } - } - return hashCode; - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized set backed by the given set. - *

          - * You must manually synchronize on the returned buffer's iterator to - * avoid non-deterministic behavior: - * - *

          -     * Set s = SetUtils.synchronizedSet(mySet);
          -     * synchronized (s) {
          -     *     Iterator i = s.iterator();
          -     *     while (i.hasNext()) {
          -     *         process (i.next());
          -     *     }
          -     * }
          -     * 
          - * - * This method uses the implementation in the decorators subpackage. - * - * @param set the set to synchronize, must not be null - * @return a synchronized set backed by the given set - * @throws IllegalArgumentException if the set is null - */ - public static Set synchronizedSet(Set set) { - return SynchronizedSet.decorate(set); - } - - /** - * Returns an unmodifiable set backed by the given set. - *

          - * This method uses the implementation in the decorators subpackage. - * - * @param set the set to make unmodifiable, must not be null - * @return an unmodifiable set backed by the given set - * @throws IllegalArgumentException if the set is null - */ - public static Set unmodifiableSet(Set set) { - return UnmodifiableSet.decorate(set); - } - - /** - * Returns a predicated (validating) set backed by the given set. - *

          - * Only objects that pass the test in the given predicate can be added to the set. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original set after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param set the set to predicate, must not be null - * @param predicate the predicate for the set, must not be null - * @return a predicated set backed by the given set - * @throws IllegalArgumentException if the Set or Predicate is null - */ - public static Set predicatedSet(Set set, Predicate predicate) { - return PredicatedSet.decorate(set, predicate); - } - - /** - * Returns a typed set backed by the given set. - *

          - * Only objects of the specified type can be added to the set. - * - * @param set the set to limit to a specific type, must not be null - * @param type the type of objects which may be added to the set - * @return a typed set backed by the specified set - */ - public static Set typedSet(Set set, Class type) { - return TypedSet.decorate(set, type); - } - - /** - * Returns a transformed set backed by the given set. - *

          - * Each object is passed through the transformer as it is added to the - * Set. It is important not to use the original set after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param set the set to transform, must not be null - * @param transformer the transformer for the set, must not be null - * @return a transformed set backed by the given set - * @throws IllegalArgumentException if the Set or Transformer is null - */ - public static Set transformedSet(Set set, Transformer transformer) { - return TransformedSet.decorate(set, transformer); - } - - /** - * Returns a set that maintains the order of elements that are added - * backed by the given set. - *

          - * If an element is added twice, the order is determined by the first add. - * The order is observed through the iterator or toArray. - * - * @param set the set to order, must not be null - * @return an ordered set backed by the given set - * @throws IllegalArgumentException if the Set is null - */ - public static Set orderedSet(Set set) { - return ListOrderedSet.decorate(set); - } - - //----------------------------------------------------------------------- - /** - * Returns a synchronized sorted set backed by the given sorted set. - *

          - * You must manually synchronize on the returned buffer's iterator to - * avoid non-deterministic behavior: - * - *

          -     * Set s = SetUtils.synchronizedSet(mySet);
          -     * synchronized (s) {
          -     *     Iterator i = s.iterator();
          -     *     while (i.hasNext()) {
          -     *         process (i.next());
          -     *     }
          -     * }
          -     * 
          - * - * This method uses the implementation in the decorators subpackage. - * - * @param set the sorted set to synchronize, must not be null - * @return a synchronized set backed by the given set - * @throws IllegalArgumentException if the set is null - */ - public static SortedSet synchronizedSortedSet(SortedSet set) { - return SynchronizedSortedSet.decorate(set); - } - - /** - * Returns an unmodifiable sorted set backed by the given sorted set. - *

          - * This method uses the implementation in the decorators subpackage. - * - * @param set the sorted set to make unmodifiable, must not be null - * @return an unmodifiable set backed by the given set - * @throws IllegalArgumentException if the set is null - */ - public static SortedSet unmodifiableSortedSet(SortedSet set) { - return UnmodifiableSortedSet.decorate(set); - } - - /** - * Returns a predicated (validating) sorted set backed by the given sorted set. - *

          - * Only objects that pass the test in the given predicate can be added to the set. - * Trying to add an invalid object results in an IllegalArgumentException. - * It is important not to use the original set after invoking this method, - * as it is a backdoor for adding invalid objects. - * - * @param set the sorted set to predicate, must not be null - * @param predicate the predicate for the sorted set, must not be null - * @return a predicated sorted set backed by the given sorted set - * @throws IllegalArgumentException if the Set or Predicate is null - */ - public static SortedSet predicatedSortedSet(SortedSet set, Predicate predicate) { - return PredicatedSortedSet.decorate(set, predicate); - } - - /** - * Returns a typed sorted set backed by the given set. - *

          - * Only objects of the specified type can be added to the set. - * - * @param set the set to limit to a specific type, must not be null - * @param type the type of objects which may be added to the set - * @return a typed set backed by the specified set - */ - public static SortedSet typedSortedSet(SortedSet set, Class type) { - return TypedSortedSet.decorate(set, type); - } - - /** - * Returns a transformed sorted set backed by the given set. - *

          - * Each object is passed through the transformer as it is added to the - * Set. It is important not to use the original set after invoking this - * method, as it is a backdoor for adding untransformed objects. - * - * @param set the set to transform, must not be null - * @param transformer the transformer for the set, must not be null - * @return a transformed set backed by the given set - * @throws IllegalArgumentException if the Set or Transformer is null - */ - public static SortedSet transformedSortedSet(SortedSet set, Transformer transformer) { - return TransformedSortedSet.decorate(set, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBag.java deleted file mode 100644 index 20eaf5d34b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBag.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Comparator; - -/** - * Defines a type of Bag that maintains a sorted order among - * its unique representative members. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - */ -public interface SortedBag extends Bag { - - /** - * Returns the comparator associated with this sorted set, or null - * if it uses its elements' natural ordering. - * - * @return the comparator in use, or null if natural ordering - */ - public Comparator comparator(); - - /** - * Returns the first (lowest) member. - * - * @return the first element in the sorted bag - */ - public Object first(); - - /** - * Returns the last (highest) member. - * - * @return the last element in the sorted bag - */ - public Object last(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBidiMap.java deleted file mode 100644 index af90cb0e384..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SortedBidiMap.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.SortedMap; - -/** - * Defines a map that allows bidirectional lookup between key and values - * and retains both keys and values in sorted order. - *

          - * Implementations should allow a value to be looked up from a key and - * a key to be looked up from a value with equal performance. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface SortedBidiMap extends OrderedBidiMap, SortedMap { - - /** - * Gets a view of this map where the keys and values are reversed. - *

          - * Changes to one map will be visible in the other and vice versa. - * This enables both directions of the map to be accessed equally. - *

          - * Implementations should seek to avoid creating a new object every time this - * method is called. See AbstractMap.values() etc. Calling this - * method on the inverse map should return the original. - *

          - * Implementations must return a SortedBidiMap instance, - * usually by forwarding to inverseSortedBidiMap(). - * - * @return an inverted bidirectional map - */ - public BidiMap inverseBidiMap(); - - /** - * Gets a view of this map where the keys and values are reversed. - *

          - * Changes to one map will be visible in the other and vice versa. - * This enables both directions of the map to be accessed as a SortedMap. - *

          - * Implementations should seek to avoid creating a new object every time this - * method is called. See AbstractMap.values() etc. Calling this - * method on the inverse map should return the original. - *

          - * The inverse map returned by inverseBidiMap() should be the - * same object as returned by this method. - * - * @return an inverted bidirectional map - */ - public SortedBidiMap inverseSortedBidiMap(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/StaticBucketMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/StaticBucketMap.java deleted file mode 100644 index 2f454aafcd7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/StaticBucketMap.java +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.AbstractCollection; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -/** - * A StaticBucketMap is an efficient, thread-safe implementation of - * java.util.Map that performs well in in a highly - * thread-contentious environment. The map supports very efficient - * {@link #get(Object) get}, {@link #put(Object,Object) put}, - * {@link #remove(Object) remove} and {@link #containsKey(Object) containsKey} - * operations, assuming (approximate) uniform hashing and - * that the number of entries does not exceed the number of buckets. If the - * number of entries exceeds the number of buckets or if the hash codes of the - * objects are not uniformly distributed, these operations have a worst case - * scenario that is proportional to the number of elements in the map - * (O(n)).

          - * - * Each bucket in the hash table has its own monitor, so two threads can - * safely operate on the map at the same time, often without incurring any - * monitor contention. This means that you don't have to wrap instances - * of this class with {@link java.util.Collections#synchronizedMap(Map)}; - * instances are already thread-safe. Unfortunately, however, this means - * that this map implementation behaves in ways you may find disconcerting. - * Bulk operations, such as {@link #putAll(Map) putAll} or the - * {@link Collection#retainAll(Collection) retainAll} operation in collection - * views, are not atomic. If two threads are simultaneously - * executing - * - *

          - *   staticBucketMapInstance.putAll(map);
          - * 
          - * - * and - * - *
          - *   staticBucketMapInstance.entrySet().removeAll(map.entrySet());
          - * 
          - * - * then the results are generally random. Those two statement could cancel - * each other out, leaving staticBucketMapInstance essentially - * unchanged, or they could leave some random subset of map in - * staticBucketMapInstance.

          - * - * Also, much like an encyclopedia, the results of {@link #size()} and - * {@link #isEmpty()} are out-of-date as soon as they are produced.

          - * - * The iterators returned by the collection views of this class are not - * fail-fast. They will never raise a - * {@link java.util.ConcurrentModificationException}. Keys and values - * added to the map after the iterator is created do not necessarily appear - * during iteration. Similarly, the iterator does not necessarily fail to - * return keys and values that were removed after the iterator was created.

          - * - * Finally, unlike {@link java.util.HashMap}-style implementations, this - * class never rehashes the map. The number of buckets is fixed - * at construction time and never altered. Performance may degrade if - * you do not allocate enough buckets upfront.

          - * - * The {@link #atomic(Runnable)} method is provided to allow atomic iterations - * and bulk operations; however, overuse of {@link #atomic(Runnable) atomic} - * will basically result in a map that's slower than an ordinary synchronized - * {@link java.util.HashMap}. - * - * Use this class if you do not require reliable bulk operations and - * iterations, or if you can make your own guarantees about how bulk - * operations will affect the map.

          - * - * @deprecated Moved to map subpackage. Due to be removed in v4.0. - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Berin Loritsch - * @author Gerhard Froehlich - * @author Michael A. Smith - * @author Paul Jack - * @author Leo Sutic - * @author Janek Bogucki - * @author Kazuya Ujihara - */ -public final class StaticBucketMap implements Map { - - private static final int DEFAULT_BUCKETS = 255; - private Node[] m_buckets; - private Lock[] m_locks; - - /** - * Initializes the map with the default number of buckets (255). - */ - public StaticBucketMap() - { - this( DEFAULT_BUCKETS ); - } - - /** - * Initializes the map with a specified number of buckets. The number - * of buckets is never below 17, and is always an odd number (StaticBucketMap - * ensures this). The number of buckets is inversely proportional to the - * chances for thread contention. The fewer buckets, the more chances for - * thread contention. The more buckets the fewer chances for thread - * contention. - * - * @param numBuckets the number of buckets for this map - */ - public StaticBucketMap( int numBuckets ) - { - int size = Math.max( 17, numBuckets ); - - // Ensure that bucketSize is never a power of 2 (to ensure maximal distribution) - if( size % 2 == 0 ) - { - size--; - } - - m_buckets = new Node[ size ]; - m_locks = new Lock[ size ]; - - for( int i = 0; i < size; i++ ) - { - m_locks[ i ] = new Lock(); - } - } - - /** - * Determine the exact hash entry for the key. The hash algorithm - * is rather simplistic, but it does the job: - * - *

          -     *   He = |Hk mod n|
          -     * 
          - * - *

          - * He is the entry's hashCode, Hk is the key's hashCode, and n is - * the number of buckets. - *

          - */ - private final int getHash( Object key ) - { - if( key == null ) return 0; - int hash = key.hashCode(); - hash += ~(hash << 15); - hash ^= (hash >>> 10); - hash += (hash << 3); - hash ^= (hash >>> 6); - hash += ~(hash << 11); - hash ^= (hash >>> 16); - hash %= m_buckets.length; - return ( hash < 0 ) ? hash * -1 : hash; - } - - /** - * Implements {@link Map#keySet()}. - */ - public Set keySet() - { - return new KeySet(); - } - - /** - * Implements {@link Map#size()}. - */ - public int size() - { - int cnt = 0; - - for( int i = 0; i < m_buckets.length; i++ ) - { - cnt += m_locks[i].size; - } - - return cnt; - } - - /** - * Implements {@link Map#put(Object, Object)}. - */ - public Object put( final Object key, final Object value ) - { - int hash = getHash( key ); - - synchronized( m_locks[ hash ] ) - { - Node n = m_buckets[ hash ]; - - if( n == null ) - { - n = new Node(); - n.key = key; - n.value = value; - m_buckets[ hash ] = n; - m_locks[hash].size++; - return null; - } - - // Set n to the last node in the linked list. Check each key along the way - // If the key is found, then change the value of that node and return - // the old value. - for( Node next = n; next != null; next = next.next ) - { - n = next; - - if( n.key == key || ( n.key != null && n.key.equals( key ) ) ) - { - Object returnVal = n.value; - n.value = value; - return returnVal; - } - } - - // The key was not found in the current list of nodes, add it to the end - // in a new node. - Node newNode = new Node(); - newNode.key = key; - newNode.value = value; - n.next = newNode; - m_locks[hash].size++; - } - - return null; - } - - /** - * Implements {@link Map#get(Object)}. - */ - public Object get( final Object key ) - { - int hash = getHash( key ); - - synchronized( m_locks[ hash ] ) - { - Node n = m_buckets[ hash ]; - - while( n != null ) - { - if( n.key == key || ( n.key != null && n.key.equals( key ) ) ) - { - return n.value; - } - - n = n.next; - } - } - - return null; - } - - /** - * Implements {@link Map#containsKey(Object)}. - */ - public boolean containsKey( final Object key ) - { - int hash = getHash( key ); - - synchronized( m_locks[ hash ] ) - { - Node n = m_buckets[ hash ]; - - while( n != null ) - { - if( n.key == key || ( n.key != null && n.key.equals( key ) ) ) - { - return true; - } - - n = n.next; - } - } - - return false; - } - - /** - * Implements {@link Map#containsValue(Object)}. - */ - public boolean containsValue( final Object value ) - { - for( int i = 0; i < m_buckets.length; i++ ) - { - synchronized( m_locks[ i ] ) - { - Node n = m_buckets[ i ]; - - while( n != null ) - { - if( n.value == value || - (n.value != null && n.value.equals( value ) ) ) - { - return true; - } - - n = n.next; - } - } - } - - return false; - } - - /** - * Implements {@link Map#values()}. - */ - public Collection values() - { - return new Values(); - } - - /** - * Implements {@link Map#entrySet()}. - */ - public Set entrySet() - { - return new EntrySet(); - } - - /** - * Implements {@link Map#putAll(Map)}. - */ - public void putAll( Map other ) - { - Iterator i = other.keySet().iterator(); - - while( i.hasNext() ) - { - Object key = i.next(); - put( key, other.get( key ) ); - } - } - - /** - * Implements {@link Map#remove(Object)}. - */ - public Object remove( Object key ) - { - int hash = getHash( key ); - - synchronized( m_locks[ hash ] ) - { - Node n = m_buckets[ hash ]; - Node prev = null; - - while( n != null ) - { - if( n.key == key || ( n.key != null && n.key.equals( key ) ) ) - { - // Remove this node from the linked list of nodes. - if( null == prev ) - { - // This node was the head, set the next node to be the new head. - m_buckets[ hash ] = n.next; - } - else - { - // Set the next node of the previous node to be the node after this one. - prev.next = n.next; - } - m_locks[hash].size--; - return n.value; - } - - prev = n; - n = n.next; - } - } - - return null; - } - - /** - * Implements {@link Map#isEmpty()}. - */ - public final boolean isEmpty() - { - return size() == 0; - } - - /** - * Implements {@link Map#clear()}. - */ - public final void clear() - { - for( int i = 0; i < m_buckets.length; i++ ) - { - Lock lock = m_locks[i]; - synchronized (lock) { - m_buckets[ i ] = null; - lock.size = 0; - } - } - } - - /** - * Implements {@link Map#equals(Object)}. - */ - public final boolean equals( Object obj ) - { - if( obj == null ) return false; - if( obj == this ) return true; - - if( !( obj instanceof Map ) ) return false; - - Map other = (Map)obj; - - return entrySet().equals(other.entrySet()); - } - - /** - * Implements {@link Map#hashCode()}. - */ - public final int hashCode() - { - int hashCode = 0; - - for( int i = 0; i < m_buckets.length; i++ ) - { - synchronized( m_locks[ i ] ) - { - Node n = m_buckets[ i ]; - - while( n != null ) - { - hashCode += n.hashCode(); - n = n.next; - } - } - } - return hashCode; - } - - /** - * The Map.Entry for the StaticBucketMap. - */ - private static final class Node implements Map.Entry, KeyValue - { - protected Object key; - protected Object value; - protected Node next; - - public Object getKey() - { - return key; - } - - public Object getValue() - { - return value; - } - - public int hashCode() - { - return ( ( key == null ? 0 : key.hashCode() ) ^ - ( value == null ? 0 : value.hashCode() ) ); - } - - public boolean equals(Object o) { - if( o == null ) return false; - if( o == this ) return true; - - if ( ! (o instanceof Map.Entry ) ) - return false; - - Map.Entry e2 = (Map.Entry)o; - - return ((key == null ? - e2.getKey() == null : key.equals(e2.getKey())) && - (value == null ? - e2.getValue() == null : value.equals(e2.getValue()))); - } - - public Object setValue( Object val ) - { - Object retVal = value; - value = val; - return retVal; - } - } - - private final static class Lock { - - public int size; - - } - - - private class EntryIterator implements Iterator { - - private ArrayList current = new ArrayList(); - private int bucket; - private Map.Entry last; - - - public boolean hasNext() { - if (current.size() > 0) return true; - while (bucket < m_buckets.length) { - synchronized (m_locks[bucket]) { - Node n = m_buckets[bucket]; - while (n != null) { - current.add(n); - n = n.next; - } - bucket++; - if (current.size() > 0) return true; - } - } - return false; - } - - protected Map.Entry nextEntry() { - if (!hasNext()) throw new NoSuchElementException(); - last = (Map.Entry)current.remove(current.size() - 1); - return last; - } - - public Object next() { - return nextEntry(); - } - - public void remove() { - if (last == null) throw new IllegalStateException(); - StaticBucketMap.this.remove(last.getKey()); - last = null; - } - - } - - private class ValueIterator extends EntryIterator { - - public Object next() { - return nextEntry().getValue(); - } - - } - - private class KeyIterator extends EntryIterator { - - public Object next() { - return nextEntry().getKey(); - } - - } - - private class EntrySet extends AbstractSet { - - public int size() { - return StaticBucketMap.this.size(); - } - - public void clear() { - StaticBucketMap.this.clear(); - } - - public Iterator iterator() { - return new EntryIterator(); - } - - public boolean contains(Object o) { - Map.Entry entry = (Map.Entry)o; - int hash = getHash(entry.getKey()); - synchronized (m_locks[hash]) { - for (Node n = m_buckets[hash]; n != null; n = n.next) { - if (n.equals(entry)) return true; - } - } - return false; - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - int hash = getHash(entry.getKey()); - synchronized (m_locks[hash]) { - for (Node n = m_buckets[hash]; n != null; n = n.next) { - if (n.equals(entry)) { - StaticBucketMap.this.remove(n.getKey()); - return true; - } - } - } - return false; - } - - } - - - private class KeySet extends AbstractSet { - - public int size() { - return StaticBucketMap.this.size(); - } - - public void clear() { - StaticBucketMap.this.clear(); - } - - public Iterator iterator() { - return new KeyIterator(); - } - - public boolean contains(Object o) { - return StaticBucketMap.this.containsKey(o); - } - - public boolean remove(Object o) { - int hash = getHash(o); - synchronized (m_locks[hash]) { - for (Node n = m_buckets[hash]; n != null; n = n.next) { - Object k = n.getKey(); - if ((k == o) || ((k != null) && k.equals(o))) { - StaticBucketMap.this.remove(k); - return true; - } - } - } - return false; - - } - - } - - - private class Values extends AbstractCollection { - - public int size() { - return StaticBucketMap.this.size(); - } - - public void clear() { - StaticBucketMap.this.clear(); - } - - public Iterator iterator() { - return new ValueIterator(); - } - - } - - - /** - * Prevents any operations from occurring on this map while the - * given {@link Runnable} executes. This method can be used, for - * instance, to execute a bulk operation atomically: - * - *
          -     *    staticBucketMapInstance.atomic(new Runnable() {
          -     *        public void run() {
          -     *            staticBucketMapInstance.putAll(map);
          -     *        }
          -     *    });
          -     *  
          - * - * It can also be used if you need a reliable iterator: - * - *
          -     *    staticBucketMapInstance.atomic(new Runnable() {
          -     *        public void run() {
          -     *            Iterator iterator = staticBucketMapInstance.iterator();
          -     *            while (iterator.hasNext()) {
          -     *                foo(iterator.next();
          -     *            }
          -     *        }
          -     *    });
          -     *  
          - * - * Implementation note: This method requires a lot of time - * and a ton of stack space. Essentially a recursive algorithm is used - * to enter each bucket's monitor. If you have twenty thousand buckets - * in your map, then the recursive method will be invoked twenty thousand - * times. You have been warned. - * - * @param r the code to execute atomically - */ - public void atomic(Runnable r) { - if (r == null) throw new NullPointerException(); - atomic(r, 0); - } - - private void atomic(Runnable r, int bucket) { - if (bucket >= m_buckets.length) { - r.run(); - return; - } - synchronized (m_locks[bucket]) { - atomic(r, bucket + 1); - } - } - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SynchronizedPriorityQueue.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SynchronizedPriorityQueue.java deleted file mode 100644 index 569ba7e206c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/SynchronizedPriorityQueue.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.NoSuchElementException; - -/** - * A thread safe version of the PriorityQueue. - * Provides synchronized wrapper methods for all the methods - * defined in the PriorityQueue interface. - * - * @deprecated PriorityQueue is replaced by the Buffer interface, see buffer subpackage. - * Due to be removed in v4.0. - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Ram Chidambaram - */ -public final class SynchronizedPriorityQueue implements PriorityQueue { - - /** - * The underlying priority queue. - */ - protected final PriorityQueue m_priorityQueue; - - /** - * Constructs a new synchronized priority queue. - * - * @param priorityQueue the priority queue to synchronize - */ - public SynchronizedPriorityQueue(final PriorityQueue priorityQueue) { - m_priorityQueue = priorityQueue; - } - - /** - * Clear all elements from queue. - */ - public synchronized void clear() { - m_priorityQueue.clear(); - } - - /** - * Test if queue is empty. - * - * @return true if queue is empty else false. - */ - public synchronized boolean isEmpty() { - return m_priorityQueue.isEmpty(); - } - - /** - * Insert an element into queue. - * - * @param element the element to be inserted - */ - public synchronized void insert(final Object element) { - m_priorityQueue.insert(element); - } - - /** - * Return element on top of heap but don't remove it. - * - * @return the element at top of heap - * @throws NoSuchElementException if isEmpty() == true - */ - public synchronized Object peek() throws NoSuchElementException { - return m_priorityQueue.peek(); - } - - /** - * Return element on top of heap and remove it. - * - * @return the element at top of heap - * @throws NoSuchElementException if isEmpty() == true - */ - public synchronized Object pop() throws NoSuchElementException { - return m_priorityQueue.pop(); - } - - /** - * Returns a string representation of the underlying queue. - * - * @return a string representation of the underlying queue - */ - public synchronized String toString() { - return m_priorityQueue.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Transformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Transformer.java deleted file mode 100644 index 37f98cf3858..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Transformer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Defines a functor interface implemented by classes that transform one - * object into another. - *

          - * A Transformer converts the input object to the output object. - * The input object should be left unchanged. - * Transformers are typically used for type conversions, or extracting data - * from an object. - *

          - * Standard implementations of common transformers are provided by - * {@link TransformerUtils}. These include method invokation, returning a constant, - * cloning and returning the string value. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Stephen Colebourne - */ -public interface Transformer { - - /** - * Transforms the input object (leaving it unchanged) into some output object. - * - * @param input the object to be transformed, should be left unchanged - * @return a transformed object - * @throws ClassCastException (runtime) if the input is the wrong class - * @throws IllegalArgumentException (runtime) if the input is invalid - * @throws FunctorException (runtime) if the transform cannot be completed - */ - public Object transform(Object input); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TransformerUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TransformerUtils.java deleted file mode 100644 index 8789ec6ba1a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TransformerUtils.java +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.functors.ChainedTransformer; -import org.apache.commons.collections.functors.CloneTransformer; -import org.apache.commons.collections.functors.ClosureTransformer; -import org.apache.commons.collections.functors.ConstantTransformer; -import org.apache.commons.collections.functors.EqualPredicate; -import org.apache.commons.collections.functors.ExceptionTransformer; -import org.apache.commons.collections.functors.FactoryTransformer; -import org.apache.commons.collections.functors.InstantiateTransformer; -import org.apache.commons.collections.functors.InvokerTransformer; -import org.apache.commons.collections.functors.MapTransformer; -import org.apache.commons.collections.functors.NOPTransformer; -import org.apache.commons.collections.functors.PredicateTransformer; -import org.apache.commons.collections.functors.StringValueTransformer; -import org.apache.commons.collections.functors.SwitchTransformer; - -/** - * TransformerUtils provides reference implementations and - * utilities for the Transformer functor interface. The supplied transformers are: - *

            - *
          • Invoker - returns the result of a method call on the input object - *
          • Clone - returns a clone of the input object - *
          • Constant - always returns the same object - *
          • Closure - performs a Closure and returns the input object - *
          • Predicate - returns the result of the predicate as a Boolean - *
          • Factory - returns a new object from a factory - *
          • Chained - chains two or more transformers together - *
          • Switch - calls one transformer based on one or more predicates - *
          • SwitchMap - calls one transformer looked up from a Map - *
          • Instantiate - the Class input object is instantiated - *
          • Map - returns an object from a supplied Map - *
          • Null - always returns null - *
          • NOP - returns the input object, which should be immutable - *
          • Exception - always throws an exception - *
          • StringValue - returns a java.lang.String representation of the input object - *
          - * All the supplied transformers are Serializable. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author James Carman - */ -public class TransformerUtils { - - /** - * This class is not normally instantiated. - */ - public TransformerUtils() { - super(); - } - - /** - * Gets a transformer that always throws an exception. - * This could be useful during testing as a placeholder. - * - * @see org.apache.commons.collections.functors.ExceptionTransformer - * - * @return the transformer - */ - public static Transformer exceptionTransformer() { - return ExceptionTransformer.INSTANCE; - } - - /** - * Gets a transformer that always returns null. - * - * @see org.apache.commons.collections.functors.ConstantTransformer - * - * @return the transformer - */ - public static Transformer nullTransformer() { - return ConstantTransformer.NULL_INSTANCE; - } - - /** - * Gets a transformer that returns the input object. - * The input object should be immutable to maintain the - * contract of Transformer (although this is not checked). - * - * @see org.apache.commons.collections.functors.NOPTransformer - * - * @return the transformer - */ - public static Transformer nopTransformer() { - return NOPTransformer.INSTANCE; - } - - /** - * Gets a transformer that returns a clone of the input - * object. The input object will be cloned using one of these - * techniques (in order): - *
            - *
          • public clone method - *
          • public copy constructor - *
          • serialization clone - *
              - * - * @see org.apache.commons.collections.functors.CloneTransformer - * - * @return the transformer - */ - public static Transformer cloneTransformer() { - return CloneTransformer.INSTANCE; - } - - /** - * Creates a Transformer that will return the same object each time the - * transformer is used. - * - * @see org.apache.commons.collections.functors.ConstantTransformer - * - * @param constantToReturn the constant object to return each time in the transformer - * @return the transformer. - */ - public static Transformer constantTransformer(Object constantToReturn) { - return ConstantTransformer.getInstance(constantToReturn); - } - - /** - * Creates a Transformer that calls a Closure each time the transformer is used. - * The transformer returns the input object. - * - * @see org.apache.commons.collections.functors.ClosureTransformer - * - * @param closure the closure to run each time in the transformer, not null - * @return the transformer - * @throws IllegalArgumentException if the closure is null - */ - public static Transformer asTransformer(Closure closure) { - return ClosureTransformer.getInstance(closure); - } - - /** - * Creates a Transformer that calls a Predicate each time the transformer is used. - * The transformer will return either Boolean.TRUE or Boolean.FALSE. - * - * @see org.apache.commons.collections.functors.PredicateTransformer - * - * @param predicate the predicate to run each time in the transformer, not null - * @return the transformer - * @throws IllegalArgumentException if the predicate is null - */ - public static Transformer asTransformer(Predicate predicate) { - return PredicateTransformer.getInstance(predicate); - } - - /** - * Creates a Transformer that calls a Factory each time the transformer is used. - * The transformer will return the value returned by the factory. - * - * @see org.apache.commons.collections.functors.FactoryTransformer - * - * @param factory the factory to run each time in the transformer, not null - * @return the transformer - * @throws IllegalArgumentException if the factory is null - */ - public static Transformer asTransformer(Factory factory) { - return FactoryTransformer.getInstance(factory); - } - - /** - * Create a new Transformer that calls two transformers, passing the result of - * the first into the second. - * - * @see org.apache.commons.collections.functors.ChainedTransformer - * - * @param transformer1 the first transformer - * @param transformer2 the second transformer - * @return the transformer - * @throws IllegalArgumentException if either transformer is null - */ - public static Transformer chainedTransformer(Transformer transformer1, Transformer transformer2) { - return ChainedTransformer.getInstance(transformer1, transformer2); - } - - /** - * Create a new Transformer that calls each transformer in turn, passing the - * result into the next transformer. - * - * @see org.apache.commons.collections.functors.ChainedTransformer - * - * @param transformers an array of transformers to chain - * @return the transformer - * @throws IllegalArgumentException if the transformers array is null - * @throws IllegalArgumentException if any transformer in the array is null - */ - public static Transformer chainedTransformer(Transformer[] transformers) { - return ChainedTransformer.getInstance(transformers); - } - - /** - * Create a new Transformer that calls each transformer in turn, passing the - * result into the next transformer. The ordering is that of the iterator() - * method on the collection. - * - * @see org.apache.commons.collections.functors.ChainedTransformer - * - * @param transformers a collection of transformers to chain - * @return the transformer - * @throws IllegalArgumentException if the transformers collection is null - * @throws IllegalArgumentException if any transformer in the collection is null - */ - public static Transformer chainedTransformer(Collection transformers) { - return ChainedTransformer.getInstance(transformers); - } - - /** - * Create a new Transformer that calls one of two transformers depending - * on the specified predicate. - * - * @see org.apache.commons.collections.functors.SwitchTransformer - * - * @param predicate the predicate to switch on - * @param trueTransformer the transformer called if the predicate is true - * @param falseTransformer the transformer called if the predicate is false - * @return the transformer - * @throws IllegalArgumentException if the predicate is null - * @throws IllegalArgumentException if either transformer is null - */ - public static Transformer switchTransformer(Predicate predicate, Transformer trueTransformer, Transformer falseTransformer) { - return SwitchTransformer.getInstance(new Predicate[] { predicate }, new Transformer[] { trueTransformer }, falseTransformer); - } - - /** - * Create a new Transformer that calls one of the transformers depending - * on the predicates. The transformer at array location 0 is called if the - * predicate at array location 0 returned true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, null is returned. - * - * @see org.apache.commons.collections.functors.SwitchTransformer - * - * @param predicates an array of predicates to check - * @param transformers an array of transformers to call - * @return the transformer - * @throws IllegalArgumentException if the either array is null - * @throws IllegalArgumentException if the either array has 0 elements - * @throws IllegalArgumentException if any element in the arrays is null - * @throws IllegalArgumentException if the arrays are different sizes - */ - public static Transformer switchTransformer(Predicate[] predicates, Transformer[] transformers) { - return SwitchTransformer.getInstance(predicates, transformers, null); - } - - /** - * Create a new Transformer that calls one of the transformers depending - * on the predicates. The transformer at array location 0 is called if the - * predicate at array location 0 returned true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * transformer is called. If the default transformer is null, null is returned. - * - * @see org.apache.commons.collections.functors.SwitchTransformer - * - * @param predicates an array of predicates to check - * @param transformers an array of transformers to call - * @param defaultTransformer the default to call if no predicate matches, null means return null - * @return the transformer - * @throws IllegalArgumentException if the either array is null - * @throws IllegalArgumentException if the either array has 0 elements - * @throws IllegalArgumentException if any element in the arrays is null - * @throws IllegalArgumentException if the arrays are different sizes - */ - public static Transformer switchTransformer(Predicate[] predicates, Transformer[] transformers, Transformer defaultTransformer) { - return SwitchTransformer.getInstance(predicates, transformers, defaultTransformer); - } - - /** - * Create a new Transformer that calls one of the transformers depending - * on the predicates. - *

              - * The Map consists of Predicate keys and Transformer values. A transformer - * is called if its matching predicate returns true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * transformer is called. The default transformer is set in the map with a - * null key. If no default transformer is set, null will be returned in a default - * case. The ordering is that of the iterator() method on the entryset collection - * of the map. - * - * @see org.apache.commons.collections.functors.SwitchTransformer - * - * @param predicatesAndTransformers a map of predicates to transformers - * @return the transformer - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if the map is empty - * @throws IllegalArgumentException if any transformer in the map is null - * @throws ClassCastException if the map elements are of the wrong type - */ - public static Transformer switchTransformer(Map predicatesAndTransformers) { - return SwitchTransformer.getInstance(predicatesAndTransformers); - } - - /** - * Create a new Transformer that uses the input object as a key to find the - * transformer to call. - *

              - * The Map consists of object keys and Transformer values. A transformer - * is called if the input object equals the key. If there is no match, the - * default transformer is called. The default transformer is set in the map - * using a null key. If no default is set, null will be returned in a default case. - * - * @see org.apache.commons.collections.functors.SwitchTransformer - * - * @param objectsAndTransformers a map of objects to transformers - * @return the transformer - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if the map is empty - * @throws IllegalArgumentException if any transformer in the map is null - */ - public static Transformer switchMapTransformer(Map objectsAndTransformers) { - Transformer[] trs = null; - Predicate[] preds = null; - if (objectsAndTransformers == null) { - throw new IllegalArgumentException("The object and transformer map must not be null"); - } - Transformer def = (Transformer) objectsAndTransformers.remove(null); - int size = objectsAndTransformers.size(); - trs = new Transformer[size]; - preds = new Predicate[size]; - int i = 0; - for (Iterator it = objectsAndTransformers.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - preds[i] = EqualPredicate.getInstance(entry.getKey()); - trs[i] = (Transformer) entry.getValue(); - i++; - } - return switchTransformer(preds, trs, def); - } - - /** - * Gets a Transformer that expects an input Class object that it will instantiate. - * - * @see org.apache.commons.collections.functors.InstantiateTransformer - * - * @return the transformer - */ - public static Transformer instantiateTransformer() { - return InstantiateTransformer.NO_ARG_INSTANCE; - } - - /** - * Creates a Transformer that expects an input Class object that it will - * instantiate. The constructor used is determined by the arguments specified - * to this method. - * - * @see org.apache.commons.collections.functors.InstantiateTransformer - * - * @param paramTypes parameter types for the constructor, can be null - * @param args the arguments to pass to the constructor, can be null - * @return the transformer - * @throws IllegalArgumentException if the paramTypes and args don't match - */ - public static Transformer instantiateTransformer(Class[] paramTypes, Object[] args) { - return InstantiateTransformer.getInstance(paramTypes, args); - } - - /** - * Creates a Transformer that uses the passed in Map to transform the input - * object (as a simple lookup). - * - * @see org.apache.commons.collections.functors.MapTransformer - * - * @param map the map to use to transform the objects - * @return the transformer - * @throws IllegalArgumentException if the map is null - */ - public static Transformer mapTransformer(Map map) { - return MapTransformer.getInstance(map); - } - - /** - * Gets a Transformer that invokes a method on the input object. - * The method must have no parameters. If the input object is null, - * null is returned. - *

              - * For example, TransformerUtils.invokerTransformer("getName"); - * will call the getName/code> method on the input object to - * determine the transformer result. - * - * @see org.apache.commons.collections.functors.InvokerTransformer - * - * @param methodName the method name to call on the input object, may not be null - * @return the transformer - * @throws IllegalArgumentException if the methodName is null. - */ - public static Transformer invokerTransformer(String methodName){ - return InvokerTransformer.getInstance(methodName, null, null); - } - - /** - * Gets a Transformer that invokes a method on the input object. - * The method parameters are specified. If the input object is null, - * null is returned. - * - * @see org.apache.commons.collections.functors.InvokerTransformer - * - * @param methodName the name of the method - * @param paramTypes the parameter types - * @param args the arguments - * @return the transformer - * @throws IllegalArgumentException if the method name is null - * @throws IllegalArgumentException if the paramTypes and args don't match - */ - public static Transformer invokerTransformer(String methodName, Class[] paramTypes, Object[] args){ - return InvokerTransformer.getInstance(methodName, paramTypes, args); - } - - /** - * Gets a transformer that returns a java.lang.String - * representation of the input object. This is achieved via the - * toString method, null returns 'null'. - * - * @see org.apache.commons.collections.functors.StringValueTransformer - * - * @return the transformer - */ - public static Transformer stringValueTransformer() { - return StringValueTransformer.INSTANCE; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TreeBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TreeBag.java deleted file mode 100644 index cc3cafb3d85..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/TreeBag.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.Collection; -import java.util.Comparator; -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * A {@link Bag} that is backed by a {@link TreeMap}. - * Order will be maintained among the unique representative - * members. - * - * @deprecated Moved to bag subpackage and rewritten internally. Due to be removed in v4.0. - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - */ -public class TreeBag extends DefaultMapBag implements SortedBag { - - /** - * Constructs an empty TreeBag. - */ - public TreeBag() { - super(new TreeMap()); - } - - /** - * Constructs an empty {@link Bag} that maintains order on its unique - * representative members according to the given {@link Comparator}. - * - * @param comparator the comparator to use - */ - public TreeBag(Comparator comparator) { - super(new TreeMap(comparator)); - } - - /** - * Constructs a {@link Bag} containing all the members of the given - * collection. - * - * @param coll the collection to copy into the bag - */ - public TreeBag(Collection coll) { - this(); - addAll(coll); - } - - public Object first() { - return ((SortedMap) getMap()).firstKey(); - } - - public Object last() { - return ((SortedMap) getMap()).lastKey(); - } - - public Comparator comparator() { - return ((SortedMap) getMap()).comparator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/UnboundedFifoBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/UnboundedFifoBuffer.java deleted file mode 100644 index 846ed9b2fd8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/UnboundedFifoBuffer.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -import java.util.AbstractCollection; -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * UnboundedFifoBuffer is a very efficient buffer implementation. - * According to performance testing, it exhibits a constant access time, but it - * also outperforms ArrayList when used for the same purpose. - *

              - * The removal order of an UnboundedFifoBuffer is based on the insertion - * order; elements are removed in the same order in which they were added. - * The iteration order is the same as the removal order. - *

              - * The {@link #remove()} and {@link #get()} operations perform in constant time. - * The {@link #add(Object)} operation performs in amortized constant time. All - * other operations perform in linear time or worse. - *

              - * Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your UnboundedFifoBuffer: - *

              - *   Buffer fifo = BufferUtils.synchronizedBuffer(new UnboundedFifoBuffer());
              - * 
              - *

              - * This buffer prevents null objects from being added. - * - * @deprecated Moved to buffer subpackage. Due to be removed in v4.0. - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Federico Barbieri - * @author Berin Loritsch - * @author Paul Jack - * @author Stephen Colebourne - * @author Andreas Schlosser - */ -public class UnboundedFifoBuffer extends AbstractCollection implements Buffer { - - protected Object[] m_buffer; - protected int m_head; - protected int m_tail; - - /** - * Constructs an UnboundedFifoBuffer with the default number of elements. - * It is exactly the same as performing the following: - * - *

              -     *   new UnboundedFifoBuffer(32);
              -     * 
              - */ - public UnboundedFifoBuffer() { - this(32); - } - - /** - * Constructs an UnboundedFifoBuffer with the specified number of elements. - * The integer must be a positive integer. - * - * @param initialSize the initial size of the buffer - * @throws IllegalArgumentException if the size is less than 1 - */ - public UnboundedFifoBuffer(int initialSize) { - if (initialSize <= 0) { - throw new IllegalArgumentException("The size must be greater than 0"); - } - m_buffer = new Object[initialSize + 1]; - m_head = 0; - m_tail = 0; - } - - /** - * Returns the number of elements stored in the buffer. - * - * @return this buffer's size - */ - public int size() { - int size = 0; - - if (m_tail < m_head) { - size = m_buffer.length - m_head + m_tail; - } else { - size = m_tail - m_head; - } - - return size; - } - - /** - * Returns true if this buffer is empty; false otherwise. - * - * @return true if this buffer is empty - */ - public boolean isEmpty() { - return (size() == 0); - } - - /** - * Adds the given element to this buffer. - * - * @param obj the element to add - * @return true, always - * @throws NullPointerException if the given element is null - * @throws BufferOverflowException if this buffer is full - */ - public boolean add(final Object obj) { - if (obj == null) { - throw new NullPointerException("Attempted to add null object to buffer"); - } - - if (size() + 1 >= m_buffer.length) { - Object[] tmp = new Object[((m_buffer.length - 1) * 2) + 1]; - - int j = 0; - for (int i = m_head; i != m_tail;) { - tmp[j] = m_buffer[i]; - m_buffer[i] = null; - - j++; - i++; - if (i == m_buffer.length) { - i = 0; - } - } - - m_buffer = tmp; - m_head = 0; - m_tail = j; - } - - m_buffer[m_tail] = obj; - m_tail++; - if (m_tail >= m_buffer.length) { - m_tail = 0; - } - return true; - } - - /** - * Returns the next object in the buffer. - * - * @return the next object in the buffer - * @throws BufferUnderflowException if this buffer is empty - */ - public Object get() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - return m_buffer[m_head]; - } - - /** - * Removes the next object from the buffer - * - * @return the removed object - * @throws BufferUnderflowException if this buffer is empty - */ - public Object remove() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - Object element = m_buffer[m_head]; - - if (null != element) { - m_buffer[m_head] = null; - - m_head++; - if (m_head >= m_buffer.length) { - m_head = 0; - } - } - - return element; - } - - /** - * Increments the internal index. - * - * @param index the index to increment - * @return the updated index - */ - private int increment(int index) { - index++; - if (index >= m_buffer.length) { - index = 0; - } - return index; - } - - /** - * Decrements the internal index. - * - * @param index the index to decrement - * @return the updated index - */ - private int decrement(int index) { - index--; - if (index < 0) { - index = m_buffer.length - 1; - } - return index; - } - - /** - * Returns an iterator over this buffer's elements. - * - * @return an iterator over this buffer's elements - */ - public Iterator iterator() { - return new Iterator() { - - private int index = m_head; - private int lastReturnedIndex = -1; - - public boolean hasNext() { - return index != m_tail; - - } - - public Object next() { - if (!hasNext()) - throw new NoSuchElementException(); - lastReturnedIndex = index; - index = increment(index); - return m_buffer[lastReturnedIndex]; - } - - public void remove() { - if (lastReturnedIndex == -1) - throw new IllegalStateException(); - - // First element can be removed quickly - if (lastReturnedIndex == m_head) { - UnboundedFifoBuffer.this.remove(); - lastReturnedIndex = -1; - return; - } - - // Other elements require us to shift the subsequent elements - int i = increment(lastReturnedIndex); - while (i != m_tail) { - m_buffer[decrement(i)] = m_buffer[i]; - i = increment(i); - } - - lastReturnedIndex = -1; - m_tail = decrement(m_tail); - m_buffer[m_tail] = null; - index = decrement(index); - } - - }; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Unmodifiable.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Unmodifiable.java deleted file mode 100644 index feeccbc7244..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/Unmodifiable.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections; - -/** - * Marker interface for collections, maps and iterators that are unmodifiable. - *

              - * This interface enables testing such as: - *

              - * if (coll instanceof Unmodifiable) {
              - *   coll = new ArrayList(coll);
              - * }
              - * // now we know coll is modifiable
              - * 
              - * Of course all this only works if you use the Unmodifiable classes defined - * in this library. If you use the JDK unmodifiable class via java util Collections - * then the interface won't be there. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface Unmodifiable { - // marker interface - no methods to implement -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractBagDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractBagDecorator.java deleted file mode 100644 index 6888cd482ee..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractBagDecorator.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Set; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.collection.AbstractCollectionDecorator; - -/** - * Decorates another Bag to provide additional behaviour. - *

              - * Methods are forwarded directly to the decorated bag. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractBagDecorator - extends AbstractCollectionDecorator implements Bag { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractBagDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected AbstractBagDecorator(Bag bag) { - super(bag); - } - - /** - * Gets the bag being decorated. - * - * @return the decorated bag - */ - protected Bag getBag() { - return (Bag) getCollection(); - } - - //----------------------------------------------------------------------- - public int getCount(Object object) { - return getBag().getCount(object); - } - - public boolean add(Object object, int count) { - return getBag().add(object, count); - } - - public boolean remove(Object object, int count) { - return getBag().remove(object, count); - } - - public Set uniqueSet() { - return getBag().uniqueSet(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractMapBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractMapBag.java deleted file mode 100644 index afe528dea60..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractMapBag.java +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.Array; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Abstract implementation of the {@link Bag} interface to simplify the creation - * of subclass implementations. - *

              - * Subclasses specify a Map implementation to use as the internal storage. - * The map will be used to map bag elements to a number; the number represents - * the number of occurrences of that element in the bag. - * - * @since Commons Collections 3.0 (previously DefaultMapBag v2.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - * @author Michael A. Smith - * @author Stephen Colebourne - * @author Janek Bogucki - * @author Steve Clark - */ -public abstract class AbstractMapBag implements Bag { - - /** The map to use to store the data */ - private transient Map map; - /** The current total size of the bag */ - private int size; - /** The modification count for fail fast iterators */ - private transient int modCount; - /** The modification count for fail fast iterators */ - private transient Set uniqueSet; - - /** - * Constructor needed for subclass serialisation. - * - */ - protected AbstractMapBag() { - super(); - } - - /** - * Constructor that assigns the specified Map as the backing store. - * The map must be empty and non-null. - * - * @param map the map to assign - */ - protected AbstractMapBag(Map map) { - super(); - this.map = map; - } - - /** - * Utility method for implementations to access the map that backs - * this bag. Not intended for interactive use outside of subclasses. - * - * @return the map being used by the Bag - */ - protected Map getMap() { - return map; - } - - //----------------------------------------------------------------------- - /** - * Returns the number of elements in this bag. - * - * @return current size of the bag - */ - public int size() { - return size; - } - - /** - * Returns true if the underlying map is empty. - * - * @return true if bag is empty - */ - public boolean isEmpty() { - return map.isEmpty(); - } - - /** - * Returns the number of occurrence of the given element in this bag - * by looking up its count in the underlying map. - * - * @param object the object to search for - * @return the number of occurrences of the object, zero if not found - */ - public int getCount(Object object) { - MutableInteger count = (MutableInteger) map.get(object); - if (count != null) { - return count.value; - } - return 0; - } - - //----------------------------------------------------------------------- - /** - * Determines if the bag contains the given element by checking if the - * underlying map contains the element as a key. - * - * @param object the object to search for - * @return true if the bag contains the given element - */ - public boolean contains(Object object) { - return map.containsKey(object); - } - - /** - * Determines if the bag contains the given elements. - * - * @param coll the collection to check against - * @return true if the Bag contains all the collection - */ - public boolean containsAll(Collection coll) { - if (coll instanceof Bag) { - return containsAll((Bag) coll); - } - return containsAll(new HashBag(coll)); - } - - /** - * Returns true if the bag contains all elements in - * the given collection, respecting cardinality. - * - * @param other the bag to check against - * @return true if the Bag contains all the collection - */ - boolean containsAll(Bag other) { - boolean result = true; - Iterator it = other.uniqueSet().iterator(); - while (it.hasNext()) { - Object current = it.next(); - boolean contains = getCount(current) >= other.getCount(current); - result = result && contains; - } - return result; - } - - //----------------------------------------------------------------------- - /** - * Gets an iterator over the bag elements. - * Elements present in the Bag more than once will be returned repeatedly. - * - * @return the iterator - */ - public Iterator iterator() { - return new BagIterator(this); - } - - /** - * Inner class iterator for the Bag. - */ - static class BagIterator implements Iterator { - private AbstractMapBag parent; - private Iterator entryIterator; - private Map.Entry current; - private int itemCount; - private final int mods; - private boolean canRemove; - - /** - * Constructor. - * - * @param parent the parent bag - */ - public BagIterator(AbstractMapBag parent) { - this.parent = parent; - this.entryIterator = parent.map.entrySet().iterator(); - this.current = null; - this.mods = parent.modCount; - this.canRemove = false; - } - - public boolean hasNext() { - return (itemCount > 0 || entryIterator.hasNext()); - } - - public Object next() { - if (parent.modCount != mods) { - throw new ConcurrentModificationException(); - } - if (itemCount == 0) { - current = (Map.Entry) entryIterator.next(); - itemCount = ((MutableInteger) current.getValue()).value; - } - canRemove = true; - itemCount--; - return current.getKey(); - } - - public void remove() { - if (parent.modCount != mods) { - throw new ConcurrentModificationException(); - } - if (canRemove == false) { - throw new IllegalStateException(); - } - MutableInteger mut = (MutableInteger) current.getValue(); - if (mut.value > 1) { - mut.value--; - } else { - entryIterator.remove(); - } - parent.size--; - canRemove = false; - } - } - - //----------------------------------------------------------------------- - /** - * Adds a new element to the bag, incrementing its count in the underlying map. - * - * @param object the object to add - * @return true if the object was not already in the uniqueSet - */ - public boolean add(Object object) { - return add(object, 1); - } - - /** - * Adds a new element to the bag, incrementing its count in the map. - * - * @param object the object to search for - * @param nCopies the number of copies to add - * @return true if the object was not already in the uniqueSet - */ - public boolean add(Object object, int nCopies) { - modCount++; - if (nCopies > 0) { - MutableInteger mut = (MutableInteger) map.get(object); - size += nCopies; - if (mut == null) { - map.put(object, new MutableInteger(nCopies)); - return true; - } else { - mut.value += nCopies; - return false; - } - } else { - return false; - } - } - - /** - * Invokes {@link #add(Object)} for each element in the given collection. - * - * @param coll the collection to add - * @return true if this call changed the bag - */ - public boolean addAll(Collection coll) { - boolean changed = false; - Iterator i = coll.iterator(); - while (i.hasNext()) { - boolean added = add(i.next()); - changed = changed || added; - } - return changed; - } - - //----------------------------------------------------------------------- - /** - * Clears the bag by clearing the underlying map. - */ - public void clear() { - modCount++; - map.clear(); - size = 0; - } - - /** - * Removes all copies of the specified object from the bag. - * - * @param object the object to remove - * @return true if the bag changed - */ - public boolean remove(Object object) { - MutableInteger mut = (MutableInteger) map.get(object); - if (mut == null) { - return false; - } - modCount++; - map.remove(object); - size -= mut.value; - return true; - } - - /** - * Removes a specified number of copies of an object from the bag. - * - * @param object the object to remove - * @param nCopies the number of copies to remove - * @return true if the bag changed - */ - public boolean remove(Object object, int nCopies) { - MutableInteger mut = (MutableInteger) map.get(object); - if (mut == null) { - return false; - } - if (nCopies <= 0) { - return false; - } - modCount++; - if (nCopies < mut.value) { - mut.value -= nCopies; - size -= nCopies; - } else { - map.remove(object); - size -= mut.value; - } - return true; - } - - /** - * Removes objects from the bag according to their count in the specified collection. - * - * @param coll the collection to use - * @return true if the bag changed - */ - public boolean removeAll(Collection coll) { - boolean result = false; - if (coll != null) { - Iterator i = coll.iterator(); - while (i.hasNext()) { - boolean changed = remove(i.next(), 1); - result = result || changed; - } - } - return result; - } - - /** - * Remove any members of the bag that are not in the given - * bag, respecting cardinality. - * - * @param coll the collection to retain - * @return true if this call changed the collection - */ - public boolean retainAll(Collection coll) { - if (coll instanceof Bag) { - return retainAll((Bag) coll); - } - return retainAll(new HashBag(coll)); - } - - /** - * Remove any members of the bag that are not in the given - * bag, respecting cardinality. - * @see #retainAll(Collection) - * - * @param other the bag to retain - * @return true if this call changed the collection - */ - boolean retainAll(Bag other) { - boolean result = false; - Bag excess = new HashBag(); - Iterator i = uniqueSet().iterator(); - while (i.hasNext()) { - Object current = i.next(); - int myCount = getCount(current); - int otherCount = other.getCount(current); - if (1 <= otherCount && otherCount <= myCount) { - excess.add(current, myCount - otherCount); - } else { - excess.add(current, myCount); - } - } - if (!excess.isEmpty()) { - result = removeAll(excess); - } - return result; - } - - //----------------------------------------------------------------------- - /** - * Mutable integer class for storing the data. - */ - protected static class MutableInteger { - /** The value of this mutable. */ - protected int value; - - /** - * Constructor. - * @param value the initial value - */ - MutableInteger(int value) { - this.value = value; - } - - public boolean equals(Object obj) { - if (obj instanceof MutableInteger == false) { - return false; - } - return ((MutableInteger) obj).value == value; - } - - public int hashCode() { - return value; - } - } - - //----------------------------------------------------------------------- - /** - * Returns an array of all of this bag's elements. - * - * @return an array of all of this bag's elements - */ - public Object[] toArray() { - Object[] result = new Object[size()]; - int i = 0; - Iterator it = map.keySet().iterator(); - while (it.hasNext()) { - Object current = it.next(); - for (int index = getCount(current); index > 0; index--) { - result[i++] = current; - } - } - return result; - } - - /** - * Returns an array of all of this bag's elements. - * - * @param array the array to populate - * @return an array of all of this bag's elements - */ - public Object[] toArray(Object[] array) { - int size = size(); - if (array.length < size) { - array = (Object[]) Array.newInstance(array.getClass().getComponentType(), size); - } - - int i = 0; - Iterator it = map.keySet().iterator(); - while (it.hasNext()) { - Object current = it.next(); - for (int index = getCount(current); index > 0; index--) { - array[i++] = current; - } - } - if (array.length > size) { - array[size] = null; - } - return array; - } - - /** - * Returns an unmodifiable view of the underlying map's key set. - * - * @return the set of unique elements in this bag - */ - public Set uniqueSet() { - if (uniqueSet == null) { - uniqueSet = UnmodifiableSet.decorate(map.keySet()); - } - return uniqueSet; - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * @param out the output stream - * @throws IOException - */ - protected void doWriteObject(ObjectOutputStream out) throws IOException { - out.writeInt(map.size()); - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - out.writeObject(entry.getKey()); - out.writeInt(((MutableInteger) entry.getValue()).value); - } - } - - /** - * Read the map in using a custom routine. - * @param map the map to use - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - protected void doReadObject(Map map, ObjectInputStream in) throws IOException, ClassNotFoundException { - this.map = map; - int entrySize = in.readInt(); - for (int i = 0; i < entrySize; i++) { - Object obj = in.readObject(); - int count = in.readInt(); - map.put(obj, new MutableInteger(count)); - size += count; - } - } - - //----------------------------------------------------------------------- - /** - * Compares this Bag to another. - * This Bag equals another Bag if it contains the same number of occurrences of - * the same elements. - * - * @param object the Bag to compare to - * @return true if equal - */ - public boolean equals(Object object) { - if (object == this) { - return true; - } - if (object instanceof Bag == false) { - return false; - } - Bag other = (Bag) object; - if (other.size() != size()) { - return false; - } - for (Iterator it = map.keySet().iterator(); it.hasNext();) { - Object element = it.next(); - if (other.getCount(element) != getCount(element)) { - return false; - } - } - return true; - } - - /** - * Gets a hash code for the Bag compatible with the definition of equals. - * The hash code is defined as the sum total of a hash code for each element. - * The per element hash code is defined as - * (e==null ? 0 : e.hashCode()) ^ noOccurances). - * This hash code is compatible with the Set interface. - * - * @return the hash code of the Bag - */ - public int hashCode() { - int total = 0; - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - Object element = entry.getKey(); - MutableInteger count = (MutableInteger) entry.getValue(); - total += (element == null ? 0 : element.hashCode()) ^ count.value; - } - return total; - } - - /** - * Implement a toString() method suitable for debugging. - * - * @return a debugging toString - */ - public String toString() { - if (size() == 0) { - return "[]"; - } - StringBuffer buf = new StringBuffer(); - buf.append('['); - Iterator it = uniqueSet().iterator(); - while (it.hasNext()) { - Object current = it.next(); - int count = getCount(current); - buf.append(count); - buf.append(':'); - buf.append(current); - if (it.hasNext()) { - buf.append(','); - } - } - buf.append(']'); - return buf.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractSortedBagDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractSortedBagDecorator.java deleted file mode 100644 index 656ce14b232..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/AbstractSortedBagDecorator.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Comparator; - -import org.apache.commons.collections.SortedBag; - -/** - * Decorates another SortedBag to provide additional behaviour. - *

              - * Methods are forwarded directly to the decorated bag. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractSortedBagDecorator - extends AbstractBagDecorator implements SortedBag { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractSortedBagDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected AbstractSortedBagDecorator(SortedBag bag) { - super(bag); - } - - /** - * Gets the bag being decorated. - * - * @return the decorated bag - */ - protected SortedBag getSortedBag() { - return (SortedBag) getCollection(); - } - - //----------------------------------------------------------------------- - public Object first() { - return getSortedBag().first(); - } - - public Object last() { - return getSortedBag().last(); - } - - public Comparator comparator() { - return getSortedBag().comparator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/HashBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/HashBag.java deleted file mode 100644 index 66850987465..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/HashBag.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.HashMap; - -import org.apache.commons.collections.Bag; - -/** - * Implements Bag, using a HashMap to provide the - * data storage. This is the standard implementation of a bag. - *

              - * A Bag stores each object in the collection together with a - * count of occurrences. Extra methods on the interface allow multiple copies - * of an object to be added or removed at once. It is important to read the - * interface javadoc carefully as several methods violate the - * Collection interface specification. - * - * @since Commons Collections 3.0 (previously in main package v2.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - * @author Stephen Colebourne - */ -public class HashBag - extends AbstractMapBag implements Bag, Serializable { - - /** Serial version lock */ - private static final long serialVersionUID = -6561115435802554013L; - - /** - * Constructs an empty HashBag. - */ - public HashBag() { - super(new HashMap()); - } - - /** - * Constructs a bag containing all the members of the given collection. - * - * @param coll a collection to copy into this bag - */ - public HashBag(Collection coll) { - this(); - addAll(coll); - } - - //----------------------------------------------------------------------- - /** - * Write the bag out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - super.doWriteObject(out); - } - - /** - * Read the bag in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - super.doReadObject(new HashMap(), in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedBag.java deleted file mode 100644 index 09b1f165aa0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedBag.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Set; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.collection.PredicatedCollection; - -/** - * Decorates another Bag to validate that additions - * match a specified predicate. - *

              - * This bag exists to provide validation for the decorated bag. - * It is normally created to decorate an empty bag. - * If an object cannot be added to the bag, an IllegalArgumentException is thrown. - *

              - * One usage would be to ensure that no null entries are added to the bag. - *

              Bag bag = PredicatedBag.decorate(new HashBag(), NotNullPredicate.INSTANCE);
              - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedBag - extends PredicatedCollection implements Bag { - - /** Serialization version */ - private static final long serialVersionUID = -2575833140344736876L; - - /** - * Factory method to create a predicated (validating) bag. - *

              - * If there are any elements already in the bag being decorated, they - * are validated. - * - * @param bag the bag to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @return a new predicated Bag - * @throws IllegalArgumentException if bag or predicate is null - * @throws IllegalArgumentException if the bag contains invalid elements - */ - public static Bag decorate(Bag bag, Predicate predicate) { - return new PredicatedBag(bag, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the bag being decorated, they - * are validated. - * - * @param bag the bag to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if bag or predicate is null - * @throws IllegalArgumentException if the bag contains invalid elements - */ - protected PredicatedBag(Bag bag, Predicate predicate) { - super(bag, predicate); - } - - /** - * Gets the decorated bag. - * - * @return the decorated bag - */ - protected Bag getBag() { - return (Bag) getCollection(); - } - - //----------------------------------------------------------------------- - public boolean add(Object object, int count) { - validate(object); - return getBag().add(object, count); - } - - public boolean remove(Object object, int count) { - return getBag().remove(object, count); - } - - public Set uniqueSet() { - return getBag().uniqueSet(); - } - - public int getCount(Object object) { - return getBag().getCount(object); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedSortedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedSortedBag.java deleted file mode 100644 index 8f40242233e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/PredicatedSortedBag.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Comparator; - -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.SortedBag; - -/** - * Decorates another SortedBag to validate that additions - * match a specified predicate. - *

              - * This bag exists to provide validation for the decorated bag. - * It is normally created to decorate an empty bag. - * If an object cannot be added to the bag, an IllegalArgumentException is thrown. - *

              - * One usage would be to ensure that no null entries are added to the bag. - *

              SortedBag bag = PredicatedSortedBag.decorate(new TreeBag(), NotNullPredicate.INSTANCE);
              - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedSortedBag - extends PredicatedBag implements SortedBag { - - /** Serialization version */ - private static final long serialVersionUID = 3448581314086406616L; - - /** - * Factory method to create a predicated (validating) bag. - *

              - * If there are any elements already in the bag being decorated, they - * are validated. - * - * @param bag the bag to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @return a new predicated SortedBag - * @throws IllegalArgumentException if bag or predicate is null - * @throws IllegalArgumentException if the bag contains invalid elements - */ - public static SortedBag decorate(SortedBag bag, Predicate predicate) { - return new PredicatedSortedBag(bag, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the bag being decorated, they - * are validated. - * - * @param bag the bag to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if bag or predicate is null - * @throws IllegalArgumentException if the bag contains invalid elements - */ - protected PredicatedSortedBag(SortedBag bag, Predicate predicate) { - super(bag, predicate); - } - - /** - * Gets the decorated sorted bag. - * - * @return the decorated bag - */ - protected SortedBag getSortedBag() { - return (SortedBag) getCollection(); - } - - //----------------------------------------------------------------------- - public Object first() { - return getSortedBag().first(); - } - - public Object last() { - return getSortedBag().last(); - } - - public Comparator comparator() { - return getSortedBag().comparator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedBag.java deleted file mode 100644 index a404950df5a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedBag.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Set; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.collection.SynchronizedCollection; -import org.apache.commons.collections.set.SynchronizedSet; - -/** - * Decorates another Bag to synchronize its behaviour - * for a multi-threaded environment. - *

              - * Methods are synchronized, then forwarded to the decorated bag. - * Iterators must be separately synchronized around the loop. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedBag - extends SynchronizedCollection implements Bag { - - /** Serialization version */ - private static final long serialVersionUID = 8084674570753837109L; - - /** - * Factory method to create a synchronized bag. - * - * @param bag the bag to decorate, must not be null - * @return a new synchronized Bag - * @throws IllegalArgumentException if bag is null - */ - public static Bag decorate(Bag bag) { - return new SynchronizedBag(bag); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @throws IllegalArgumentException if bag is null - */ - protected SynchronizedBag(Bag bag) { - super(bag); - } - - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @param lock the lock to use, must not be null - * @throws IllegalArgumentException if bag is null - */ - protected SynchronizedBag(Bag bag, Object lock) { - super(bag, lock); - } - - /** - * Gets the bag being decorated. - * - * @return the decorated bag - */ - protected Bag getBag() { - return (Bag) collection; - } - - //----------------------------------------------------------------------- - public boolean add(Object object, int count) { - synchronized (lock) { - return getBag().add(object, count); - } - } - - public boolean remove(Object object, int count) { - synchronized (lock) { - return getBag().remove(object, count); - } - } - - public Set uniqueSet() { - synchronized (lock) { - Set set = getBag().uniqueSet(); - return new SynchronizedBagSet(set, lock); - } - } - - public int getCount(Object object) { - synchronized (lock) { - return getBag().getCount(object); - } - } - - //----------------------------------------------------------------------- - /** - * Synchronized Set for the Bag class. - */ - class SynchronizedBagSet extends SynchronizedSet { - /** - * Constructor. - * @param set the set to decorate - * @param lock the lock to use, shared with the bag - */ - SynchronizedBagSet(Set set, Object lock) { - super(set, lock); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedSortedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedSortedBag.java deleted file mode 100644 index d26c7d68620..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/SynchronizedSortedBag.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Comparator; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.SortedBag; - -/** - * Decorates another SortedBag to synchronize its behaviour - * for a multi-threaded environment. - *

              - * Methods are synchronized, then forwarded to the decorated bag. - * Iterators must be separately synchronized around the loop. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedSortedBag - extends SynchronizedBag implements SortedBag { - - /** Serialization version */ - private static final long serialVersionUID = 722374056718497858L; - - /** - * Factory method to create a synchronized sorted bag. - * - * @param bag the bag to decorate, must not be null - * @return a new synchronized SortedBag - * @throws IllegalArgumentException if bag is null - */ - public static SortedBag decorate(SortedBag bag) { - return new SynchronizedSortedBag(bag); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @throws IllegalArgumentException if bag is null - */ - protected SynchronizedSortedBag(SortedBag bag) { - super(bag); - } - - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @param lock the lock to use, must not be null - * @throws IllegalArgumentException if bag is null - */ - protected SynchronizedSortedBag(Bag bag, Object lock) { - super(bag, lock); - } - - /** - * Gets the bag being decorated. - * - * @return the decorated bag - */ - protected SortedBag getSortedBag() { - return (SortedBag) collection; - } - - //----------------------------------------------------------------------- - public synchronized Object first() { - synchronized (lock) { - return getSortedBag().first(); - } - } - - public synchronized Object last() { - synchronized (lock) { - return getSortedBag().last(); - } - } - - public synchronized Comparator comparator() { - synchronized (lock) { - return getSortedBag().comparator(); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedBag.java deleted file mode 100644 index 28dd294e4a5..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedBag.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Set; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.collection.TransformedCollection; -import org.apache.commons.collections.set.TransformedSet; - -/** - * Decorates another Bag to transform objects that are added. - *

              - * The add methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedBag - extends TransformedCollection implements Bag { - - /** Serialization version */ - private static final long serialVersionUID = 5421170911299074185L; - - /** - * Factory method to create a transforming bag. - *

              - * If there are any elements already in the bag being decorated, they - * are NOT transformed. - * - * @param bag the bag to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @return a new transformed Bag - * @throws IllegalArgumentException if bag or transformer is null - */ - public static Bag decorate(Bag bag, Transformer transformer) { - return new TransformedBag(bag, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the bag being decorated, they - * are NOT transformed. - * - * @param bag the bag to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if bag or transformer is null - */ - protected TransformedBag(Bag bag, Transformer transformer) { - super(bag, transformer); - } - - /** - * Gets the decorated bag. - * - * @return the decorated bag - */ - protected Bag getBag() { - return (Bag) collection; - } - - //----------------------------------------------------------------------- - public int getCount(Object object) { - return getBag().getCount(object); - } - - public boolean remove(Object object, int nCopies) { - return getBag().remove(object, nCopies); - } - - //----------------------------------------------------------------------- - public boolean add(Object object, int nCopies) { - object = transform(object); - return getBag().add(object, nCopies); - } - - public Set uniqueSet() { - Set set = getBag().uniqueSet(); - return TransformedSet.decorate(set, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedSortedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedSortedBag.java deleted file mode 100644 index bdc3641440b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TransformedSortedBag.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.util.Comparator; - -import org.apache.commons.collections.SortedBag; -import org.apache.commons.collections.Transformer; - -/** - * Decorates another SortedBag to transform objects that are added. - *

              - * The add methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedSortedBag - extends TransformedBag implements SortedBag { - - /** Serialization version */ - private static final long serialVersionUID = -251737742649401930L; - - /** - * Factory method to create a transforming sorted bag. - *

              - * If there are any elements already in the bag being decorated, they - * are NOT transformed. - * - * @param bag the bag to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @return a new transformed SortedBag - * @throws IllegalArgumentException if bag or transformer is null - */ - public static SortedBag decorate(SortedBag bag, Transformer transformer) { - return new TransformedSortedBag(bag, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the bag being decorated, they - * are NOT transformed. - * - * @param bag the bag to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if bag or transformer is null - */ - protected TransformedSortedBag(SortedBag bag, Transformer transformer) { - super(bag, transformer); - } - - /** - * Gets the decorated bag. - * - * @return the decorated bag - */ - protected SortedBag getSortedBag() { - return (SortedBag) collection; - } - - //----------------------------------------------------------------------- - public Object first() { - return getSortedBag().first(); - } - - public Object last() { - return getSortedBag().last(); - } - - public Comparator comparator() { - return getSortedBag().comparator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TreeBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TreeBag.java deleted file mode 100644 index f2df0e2d226..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TreeBag.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Comparator; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.apache.commons.collections.SortedBag; - -/** - * Implements SortedBag, using a TreeMap to provide - * the data storage. This is the standard implementation of a sorted bag. - *

              - * Order will be maintained among the bag members and can be viewed through the - * iterator. - *

              - * A Bag stores each object in the collection together with a - * count of occurrences. Extra methods on the interface allow multiple copies - * of an object to be added or removed at once. It is important to read the - * interface javadoc carefully as several methods violate the - * Collection interface specification. - * - * @since Commons Collections 3.0 (previously in main package v2.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Chuck Burdick - * @author Stephen Colebourne - */ -public class TreeBag - extends AbstractMapBag implements SortedBag, Serializable { - - /** Serial version lock */ - private static final long serialVersionUID = -7740146511091606676L; - - /** - * Constructs an empty TreeBag. - */ - public TreeBag() { - super(new TreeMap()); - } - - /** - * Constructs an empty bag that maintains order on its unique - * representative members according to the given {@link Comparator}. - * - * @param comparator the comparator to use - */ - public TreeBag(Comparator comparator) { - super(new TreeMap(comparator)); - } - - /** - * Constructs a TreeBag containing all the members of the - * specified collection. - * - * @param coll the collection to copy into the bag - */ - public TreeBag(Collection coll) { - this(); - addAll(coll); - } - - //----------------------------------------------------------------------- - public Object first() { - return ((SortedMap) getMap()).firstKey(); - } - - public Object last() { - return ((SortedMap) getMap()).lastKey(); - } - - public Comparator comparator() { - return ((SortedMap) getMap()).comparator(); - } - - //----------------------------------------------------------------------- - /** - * Write the bag out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(comparator()); - super.doWriteObject(out); - } - - /** - * Read the bag in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - Comparator comp = (Comparator) in.readObject(); - super.doReadObject(new TreeMap(comp), in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedBag.java deleted file mode 100644 index 6f82bda78da..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedBag.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another Bag to validate that elements added - * are of a specific type. - *

              - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedBag { - - /** - * Factory method to create a typed bag. - *

              - * If there are any elements already in the bag being decorated, they - * are validated. - * - * @param bag the bag to decorate, must not be null - * @param type the type to allow into the bag, must not be null - * @return a new typed Bag - * @throws IllegalArgumentException if bag or type is null - * @throws IllegalArgumentException if the bag contains invalid elements - */ - public static Bag decorate(Bag bag, Class type) { - return new PredicatedBag(bag, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedBag() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedSortedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedSortedBag.java deleted file mode 100644 index 2493e351284..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/TypedSortedBag.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import org.apache.commons.collections.SortedBag; -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another SortedBag to validate that elements added - * are of a specific type. - *

              - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedSortedBag { - - /** - * Factory method to create a typed sorted bag. - *

              - * If there are any elements already in the bag being decorated, they - * are validated. - * - * @param bag the bag to decorate, must not be null - * @param type the type to allow into the bag, must not be null - * @return a new transformed SortedBag - * @throws IllegalArgumentException if bag or type is null - * @throws IllegalArgumentException if the bag contains invalid elements - */ - public static SortedBag decorate(SortedBag bag, Class type) { - return new PredicatedSortedBag(bag, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedSortedBag() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableBag.java deleted file mode 100644 index dfd96be4d53..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableBag.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; - -import org.apache.commons.collections.Bag; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another Bag to ensure it can't be altered. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableBag - extends AbstractBagDecorator implements Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = -1873799975157099624L; - - /** - * Factory method to create an unmodifiable bag. - *

              - * If the bag passed in is already unmodifiable, it is returned. - * - * @param bag the bag to decorate, must not be null - * @return an unmodifiable Bag - * @throws IllegalArgumentException if bag is null - */ - public static Bag decorate(Bag bag) { - if (bag instanceof Unmodifiable) { - return bag; - } - return new UnmodifiableBag(bag); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @throws IllegalArgumentException if bag is null - */ - private UnmodifiableBag(Bag bag) { - super(bag); - } - - //----------------------------------------------------------------------- - /** - * Write the collection out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the collection in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public boolean add(Object object, int count) { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object, int count) { - throw new UnsupportedOperationException(); - } - - public Set uniqueSet() { - Set set = getBag().uniqueSet(); - return UnmodifiableSet.decorate(set); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableSortedBag.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableSortedBag.java deleted file mode 100644 index 392f2b07a73..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/UnmodifiableSortedBag.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bag; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; - -import org.apache.commons.collections.SortedBag; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another SortedBag to ensure it can't be altered. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableSortedBag - extends AbstractSortedBagDecorator implements Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = -3190437252665717841L; - - /** - * Factory method to create an unmodifiable bag. - *

              - * If the bag passed in is already unmodifiable, it is returned. - * - * @param bag the bag to decorate, must not be null - * @return an unmodifiable SortedBag - * @throws IllegalArgumentException if bag is null - */ - public static SortedBag decorate(SortedBag bag) { - if (bag instanceof Unmodifiable) { - return bag; - } - return new UnmodifiableSortedBag(bag); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param bag the bag to decorate, must not be null - * @throws IllegalArgumentException if bag is null - */ - private UnmodifiableSortedBag(SortedBag bag) { - super(bag); - } - - //----------------------------------------------------------------------- - /** - * Write the collection out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the collection in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public boolean add(Object object, int count) { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object, int count) { - throw new UnsupportedOperationException(); - } - - public Set uniqueSet() { - Set set = getBag().uniqueSet(); - return UnmodifiableSet.decorate(set); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/package.html deleted file mode 100644 index aeb9bf952b3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bag/package.html +++ /dev/null @@ -1,40 +0,0 @@ - - - -

              -This package contains implementations of the -{@link org.apache.commons.collections.Bag Bag} and -{@link org.apache.commons.collections.SortedBag SortedBag} interfaces. -A bag stores an object and a count of the number of occurences of the object. -

              -The following implementations are provided in the package: -

                -
              • HashBag - implementation that uses a HashMap to store the data -
              • TreeBag - implementation that uses a TreeMap to store the data -
              -

              -The following decorators are provided in the package: -

                -
              • Synchronized - synchronizes method access for multi-threaded environments -
              • Unmodifiable - ensures the bag cannot be altered -
              • Predicated - ensures that only elements that are valid according to a predicate can be added -
              • Typed - ensures that only elements that are of a specific type can be added -
              • Transformed - transforms each element added to the bag -
              - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.java deleted file mode 100644 index d291c8aa054..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractBidiMapDecorator.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.map.AbstractMapDecorator; - -/** - * Provides a base decorator that enables additional functionality to be added - * to a BidiMap via decoration. - *

              - * Methods are forwarded directly to the decorated map. - *

              - * This implementation does not perform any special processing with the map views. - * Instead it simply returns the set/collection from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating implementation - * it would provide a loophole around the validation. - * But, you might want that loophole, so this class is kept simple. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractBidiMapDecorator - extends AbstractMapDecorator implements BidiMap { - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - protected AbstractBidiMapDecorator(BidiMap map) { - super(map); - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected BidiMap getBidiMap() { - return (BidiMap) map; - } - - //----------------------------------------------------------------------- - public MapIterator mapIterator() { - return getBidiMap().mapIterator(); - } - - public Object getKey(Object value) { - return getBidiMap().getKey(value); - } - - public Object removeValue(Object value) { - return getBidiMap().removeValue(value); - } - - public BidiMap inverseBidiMap() { - return getBidiMap().inverseBidiMap(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractDualBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractDualBidiMap.java deleted file mode 100644 index 903b58069a8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractDualBidiMap.java +++ /dev/null @@ -1,726 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.ResettableIterator; -import org.apache.commons.collections.collection.AbstractCollectionDecorator; -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; -import org.apache.commons.collections.keyvalue.AbstractMapEntryDecorator; - -/** - * Abstract BidiMap implemented using two maps. - *

              - * An implementation can be written simply by implementing the - * createMap method. - * - * @see DualHashBidiMap - * @see DualTreeBidiMap - * @since Commons Collections 3.0 - * @version $Id: AbstractDualBidiMap.java 646777 2008-04-10 12:33:15Z niallp $ - * - * @author Matthew Hawthorne - * @author Stephen Colebourne - */ -public abstract class AbstractDualBidiMap implements BidiMap { - - /** - * Delegate map array. The first map contains standard entries, and the - * second contains inverses. - */ - protected transient final Map[] maps = new Map[2]; - /** - * Inverse view of this map. - */ - protected transient BidiMap inverseBidiMap = null; - /** - * View of the keys. - */ - protected transient Set keySet = null; - /** - * View of the values. - */ - protected transient Collection values = null; - /** - * View of the entries. - */ - protected transient Set entrySet = null; - - /** - * Creates an empty map, initialised by createMap. - *

              - * This constructor remains in place for deserialization. - * All other usage is deprecated in favour of - * {@link #AbstractDualBidiMap(Map, Map)}. - */ - protected AbstractDualBidiMap() { - super(); - maps[0] = createMap(); - maps[1] = createMap(); - } - - /** - * Creates an empty map using the two maps specified as storage. - *

              - * The two maps must be a matching pair, normal and reverse. - * They will typically both be empty. - *

              - * Neither map is validated, so nulls may be passed in. - * If you choose to do this then the subclass constructor must populate - * the maps[] instance variable itself. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @since Commons Collections 3.1 - */ - protected AbstractDualBidiMap(Map normalMap, Map reverseMap) { - super(); - maps[0] = normalMap; - maps[1] = reverseMap; - } - - /** - * Constructs a map that decorates the specified maps, - * used by the subclass createBidiMap implementation. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @param inverseBidiMap the inverse BidiMap - */ - protected AbstractDualBidiMap(Map normalMap, Map reverseMap, BidiMap inverseBidiMap) { - super(); - maps[0] = normalMap; - maps[1] = reverseMap; - this.inverseBidiMap = inverseBidiMap; - } - - /** - * Creates a new instance of the map used by the subclass to store data. - *

              - * This design is deeply flawed and has been deprecated. - * It relied on subclass data being used during a superclass constructor. - * - * @return the map to be used for internal storage - * @deprecated For constructors, use the new two map constructor. - * For deserialization, populate the maps array directly in readObject. - */ - protected Map createMap() { - return null; - } - - /** - * Creates a new instance of the subclass. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @param inverseMap this map, which is the inverse in the new map - * @return the inverse map - */ - protected abstract BidiMap createBidiMap(Map normalMap, Map reverseMap, BidiMap inverseMap); - - // Map delegation - //----------------------------------------------------------------------- - public Object get(Object key) { - return maps[0].get(key); - } - - public int size() { - return maps[0].size(); - } - - public boolean isEmpty() { - return maps[0].isEmpty(); - } - - public boolean containsKey(Object key) { - return maps[0].containsKey(key); - } - - public boolean equals(Object obj) { - return maps[0].equals(obj); - } - - public int hashCode() { - return maps[0].hashCode(); - } - - public String toString() { - return maps[0].toString(); - } - - // BidiMap changes - //----------------------------------------------------------------------- - public Object put(Object key, Object value) { - if (maps[0].containsKey(key)) { - maps[1].remove(maps[0].get(key)); - } - if (maps[1].containsKey(value)) { - maps[0].remove(maps[1].get(value)); - } - final Object obj = maps[0].put(key, value); - maps[1].put(value, key); - return obj; - } - - public void putAll(Map map) { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - - public Object remove(Object key) { - Object value = null; - if (maps[0].containsKey(key)) { - value = maps[0].remove(key); - maps[1].remove(value); - } - return value; - } - - public void clear() { - maps[0].clear(); - maps[1].clear(); - } - - public boolean containsValue(Object value) { - return maps[1].containsKey(value); - } - - // BidiMap - //----------------------------------------------------------------------- - /** - * Obtains a MapIterator over the map. - * The iterator implements ResetableMapIterator. - * This implementation relies on the entrySet iterator. - *

              - * The setValue() methods only allow a new value to be set. - * If the value being set is already in the map, an IllegalArgumentException - * is thrown (as setValue cannot change the size of the map). - * - * @return a map iterator - */ - public MapIterator mapIterator() { - return new BidiMapIterator(this); - } - - public Object getKey(Object value) { - return maps[1].get(value); - } - - public Object removeValue(Object value) { - Object key = null; - if (maps[1].containsKey(value)) { - key = maps[1].remove(value); - maps[0].remove(key); - } - return key; - } - - public BidiMap inverseBidiMap() { - if (inverseBidiMap == null) { - inverseBidiMap = createBidiMap(maps[1], maps[0], this); - } - return inverseBidiMap; - } - - // Map views - //----------------------------------------------------------------------- - /** - * Gets a keySet view of the map. - * Changes made on the view are reflected in the map. - * The set supports remove and clear but not add. - * - * @return the keySet view - */ - public Set keySet() { - if (keySet == null) { - keySet = new KeySet(this); - } - return keySet; - } - - /** - * Creates a key set iterator. - * Subclasses can override this to return iterators with different properties. - * - * @param iterator the iterator to decorate - * @return the keySet iterator - */ - protected Iterator createKeySetIterator(Iterator iterator) { - return new KeySetIterator(iterator, this); - } - - /** - * Gets a values view of the map. - * Changes made on the view are reflected in the map. - * The set supports remove and clear but not add. - * - * @return the values view - */ - public Collection values() { - if (values == null) { - values = new Values(this); - } - return values; - } - - /** - * Creates a values iterator. - * Subclasses can override this to return iterators with different properties. - * - * @param iterator the iterator to decorate - * @return the values iterator - */ - protected Iterator createValuesIterator(Iterator iterator) { - return new ValuesIterator(iterator, this); - } - - /** - * Gets an entrySet view of the map. - * Changes made on the set are reflected in the map. - * The set supports remove and clear but not add. - *

              - * The Map Entry setValue() method only allow a new value to be set. - * If the value being set is already in the map, an IllegalArgumentException - * is thrown (as setValue cannot change the size of the map). - * - * @return the entrySet view - */ - public Set entrySet() { - if (entrySet == null) { - entrySet = new EntrySet(this); - } - return entrySet; - } - - /** - * Creates an entry set iterator. - * Subclasses can override this to return iterators with different properties. - * - * @param iterator the iterator to decorate - * @return the entrySet iterator - */ - protected Iterator createEntrySetIterator(Iterator iterator) { - return new EntrySetIterator(iterator, this); - } - - //----------------------------------------------------------------------- - /** - * Inner class View. - */ - protected static abstract class View extends AbstractCollectionDecorator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - - /** - * Constructs a new view of the BidiMap. - * - * @param coll the collection view being decorated - * @param parent the parent BidiMap - */ - protected View(Collection coll, AbstractDualBidiMap parent) { - super(coll); - this.parent = parent; - } - - public boolean removeAll(Collection coll) { - if (parent.isEmpty() || coll.isEmpty()) { - return false; - } - boolean modified = false; - Iterator it = iterator(); - while (it.hasNext()) { - if (coll.contains(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - } - - public boolean retainAll(Collection coll) { - if (parent.isEmpty()) { - return false; - } - if (coll.isEmpty()) { - parent.clear(); - return true; - } - boolean modified = false; - Iterator it = iterator(); - while (it.hasNext()) { - if (coll.contains(it.next()) == false) { - it.remove(); - modified = true; - } - } - return modified; - } - - public void clear() { - parent.clear(); - } - } - - //----------------------------------------------------------------------- - /** - * Inner class KeySet. - */ - protected static class KeySet extends View implements Set { - - /** - * Constructs a new view of the BidiMap. - * - * @param parent the parent BidiMap - */ - protected KeySet(AbstractDualBidiMap parent) { - super(parent.maps[0].keySet(), parent); - } - - public Iterator iterator() { - return parent.createKeySetIterator(super.iterator()); - } - - public boolean contains(Object key) { - return parent.maps[0].containsKey(key); - } - - public boolean remove(Object key) { - if (parent.maps[0].containsKey(key)) { - Object value = parent.maps[0].remove(key); - parent.maps[1].remove(value); - return true; - } - return false; - } - } - - /** - * Inner class KeySetIterator. - */ - protected static class KeySetIterator extends AbstractIteratorDecorator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - /** The last returned key */ - protected Object lastKey = null; - /** Whether remove is allowed at present */ - protected boolean canRemove = false; - - /** - * Constructor. - * @param iterator the iterator to decorate - * @param parent the parent map - */ - protected KeySetIterator(Iterator iterator, AbstractDualBidiMap parent) { - super(iterator); - this.parent = parent; - } - - public Object next() { - lastKey = super.next(); - canRemove = true; - return lastKey; - } - - public void remove() { - if (canRemove == false) { - throw new IllegalStateException("Iterator remove() can only be called once after next()"); - } - Object value = parent.maps[0].get(lastKey); - super.remove(); - parent.maps[1].remove(value); - lastKey = null; - canRemove = false; - } - } - - //----------------------------------------------------------------------- - /** - * Inner class Values. - */ - protected static class Values extends View implements Set { - - /** - * Constructs a new view of the BidiMap. - * - * @param parent the parent BidiMap - */ - protected Values(AbstractDualBidiMap parent) { - super(parent.maps[0].values(), parent); - } - - public Iterator iterator() { - return parent.createValuesIterator(super.iterator()); - } - - public boolean contains(Object value) { - return parent.maps[1].containsKey(value); - } - - public boolean remove(Object value) { - if (parent.maps[1].containsKey(value)) { - Object key = parent.maps[1].remove(value); - parent.maps[0].remove(key); - return true; - } - return false; - } - } - - /** - * Inner class ValuesIterator. - */ - protected static class ValuesIterator extends AbstractIteratorDecorator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - /** The last returned value */ - protected Object lastValue = null; - /** Whether remove is allowed at present */ - protected boolean canRemove = false; - - /** - * Constructor. - * @param iterator the iterator to decorate - * @param parent the parent map - */ - protected ValuesIterator(Iterator iterator, AbstractDualBidiMap parent) { - super(iterator); - this.parent = parent; - } - - public Object next() { - lastValue = super.next(); - canRemove = true; - return lastValue; - } - - public void remove() { - if (canRemove == false) { - throw new IllegalStateException("Iterator remove() can only be called once after next()"); - } - super.remove(); // removes from maps[0] - parent.maps[1].remove(lastValue); - lastValue = null; - canRemove = false; - } - } - - //----------------------------------------------------------------------- - /** - * Inner class EntrySet. - */ - protected static class EntrySet extends View implements Set { - - /** - * Constructs a new view of the BidiMap. - * - * @param parent the parent BidiMap - */ - protected EntrySet(AbstractDualBidiMap parent) { - super(parent.maps[0].entrySet(), parent); - } - - public Iterator iterator() { - return parent.createEntrySetIterator(super.iterator()); - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - Object key = entry.getKey(); - if (parent.containsKey(key)) { - Object value = parent.maps[0].get(key); - if (value == null ? entry.getValue() == null : value.equals(entry.getValue())) { - parent.maps[0].remove(key); - parent.maps[1].remove(value); - return true; - } - } - return false; - } - } - - /** - * Inner class EntrySetIterator. - */ - protected static class EntrySetIterator extends AbstractIteratorDecorator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - /** The last returned entry */ - protected Map.Entry last = null; - /** Whether remove is allowed at present */ - protected boolean canRemove = false; - - /** - * Constructor. - * @param iterator the iterator to decorate - * @param parent the parent map - */ - protected EntrySetIterator(Iterator iterator, AbstractDualBidiMap parent) { - super(iterator); - this.parent = parent; - } - - public Object next() { - last = new MapEntry((Map.Entry) super.next(), parent); - canRemove = true; - return last; - } - - public void remove() { - if (canRemove == false) { - throw new IllegalStateException("Iterator remove() can only be called once after next()"); - } - // store value as remove may change the entry in the decorator (eg.TreeMap) - Object value = last.getValue(); - super.remove(); - parent.maps[1].remove(value); - last = null; - canRemove = false; - } - } - - /** - * Inner class MapEntry. - */ - protected static class MapEntry extends AbstractMapEntryDecorator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - - /** - * Constructor. - * @param entry the entry to decorate - * @param parent the parent map - */ - protected MapEntry(Map.Entry entry, AbstractDualBidiMap parent) { - super(entry); - this.parent = parent; - } - - public Object setValue(Object value) { - Object key = MapEntry.this.getKey(); - if (parent.maps[1].containsKey(value) && - parent.maps[1].get(value) != key) { - throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map"); - } - parent.put(key, value); - final Object oldValue = super.setValue(value); - return oldValue; - } - } - - /** - * Inner class MapIterator. - */ - protected static class BidiMapIterator implements MapIterator, ResettableIterator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - /** The iterator being wrapped */ - protected Iterator iterator; - /** The last returned entry */ - protected Map.Entry last = null; - /** Whether remove is allowed at present */ - protected boolean canRemove = false; - - /** - * Constructor. - * @param parent the parent map - */ - protected BidiMapIterator(AbstractDualBidiMap parent) { - super(); - this.parent = parent; - this.iterator = parent.maps[0].entrySet().iterator(); - } - - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - last = (Map.Entry) iterator.next(); - canRemove = true; - return last.getKey(); - } - - public void remove() { - if (canRemove == false) { - throw new IllegalStateException("Iterator remove() can only be called once after next()"); - } - // store value as remove may change the entry in the decorator (eg.TreeMap) - Object value = last.getValue(); - iterator.remove(); - parent.maps[1].remove(value); - last = null; - canRemove = false; - } - - public Object getKey() { - if (last == null) { - throw new IllegalStateException("Iterator getKey() can only be called after next() and before remove()"); - } - return last.getKey(); - } - - public Object getValue() { - if (last == null) { - throw new IllegalStateException("Iterator getValue() can only be called after next() and before remove()"); - } - return last.getValue(); - } - - public Object setValue(Object value) { - if (last == null) { - throw new IllegalStateException("Iterator setValue() can only be called after next() and before remove()"); - } - if (parent.maps[1].containsKey(value) && - parent.maps[1].get(value) != last.getKey()) { - throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map"); - } - return parent.put(last.getKey(), value); - } - - public void reset() { - iterator = parent.maps[0].entrySet().iterator(); - last = null; - canRemove = false; - } - - public String toString() { - if (last != null) { - return "MapIterator[" + getKey() + "=" + getValue() + "]"; - } else { - return "MapIterator[]"; - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.java deleted file mode 100644 index ef02c071861..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractOrderedBidiMapDecorator.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import org.apache.commons.collections.OrderedBidiMap; -import org.apache.commons.collections.OrderedMapIterator; - -/** - * Provides a base decorator that enables additional functionality to be added - * to an OrderedBidiMap via decoration. - *

              - * Methods are forwarded directly to the decorated map. - *

              - * This implementation does not perform any special processing with the map views. - * Instead it simply returns the inverse from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating implementation - * it would provide a loophole around the validation. - * But, you might want that loophole, so this class is kept simple. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractOrderedBidiMapDecorator - extends AbstractBidiMapDecorator implements OrderedBidiMap { - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - protected AbstractOrderedBidiMapDecorator(OrderedBidiMap map) { - super(map); - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected OrderedBidiMap getOrderedBidiMap() { - return (OrderedBidiMap) map; - } - - //----------------------------------------------------------------------- - public OrderedMapIterator orderedMapIterator() { - return getOrderedBidiMap().orderedMapIterator(); - } - - public Object firstKey() { - return getOrderedBidiMap().firstKey(); - } - - public Object lastKey() { - return getOrderedBidiMap().lastKey(); - } - - public Object nextKey(Object key) { - return getOrderedBidiMap().nextKey(key); - } - - public Object previousKey(Object key) { - return getOrderedBidiMap().previousKey(key); - } - - public OrderedBidiMap inverseOrderedBidiMap() { - return getOrderedBidiMap().inverseOrderedBidiMap(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.java deleted file mode 100644 index a03e3e7e48c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/AbstractSortedBidiMapDecorator.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.util.Comparator; -import java.util.SortedMap; - -import org.apache.commons.collections.SortedBidiMap; - -/** - * Provides a base decorator that enables additional functionality to be added - * to a SortedBidiMap via decoration. - *

              - * Methods are forwarded directly to the decorated map. - *

              - * This implementation does not perform any special processing with the map views. - * Instead it simply returns the inverse from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating implementation - * it would provide a loophole around the validation. - * But, you might want that loophole, so this class is kept simple. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractSortedBidiMapDecorator - extends AbstractOrderedBidiMapDecorator implements SortedBidiMap { - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractSortedBidiMapDecorator(SortedBidiMap map) { - super(map); - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected SortedBidiMap getSortedBidiMap() { - return (SortedBidiMap) map; - } - - //----------------------------------------------------------------------- - public SortedBidiMap inverseSortedBidiMap() { - return getSortedBidiMap().inverseSortedBidiMap(); - } - - public Comparator comparator() { - return getSortedBidiMap().comparator(); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - return getSortedBidiMap().subMap(fromKey, toKey); - } - - public SortedMap headMap(Object toKey) { - return getSortedBidiMap().headMap(toKey); - } - - public SortedMap tailMap(Object fromKey) { - return getSortedBidiMap().tailMap(fromKey); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualHashBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualHashBidiMap.java deleted file mode 100644 index ed6e573f4c6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualHashBidiMap.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.collections.BidiMap; - -/** - * Implementation of BidiMap that uses two HashMap instances. - *

              - * Two HashMap instances are used in this class. - * This provides fast lookups at the expense of storing two sets of map entries. - * Commons Collections would welcome the addition of a direct hash-based - * implementation of the BidiMap interface. - *

              - * NOTE: From Commons Collections 3.1, all subclasses will use HashMap - * and the flawed createMap method is ignored. - * - * @since Commons Collections 3.0 - * @version $Id: DualHashBidiMap.java 646777 2008-04-10 12:33:15Z niallp $ - * - * @author Matthew Hawthorne - * @author Stephen Colebourne - */ -public class DualHashBidiMap - extends AbstractDualBidiMap implements Serializable { - - /** Ensure serialization compatibility */ - private static final long serialVersionUID = 721969328361808L; - - /** - * Creates an empty HashBidiMap. - */ - public DualHashBidiMap() { - super(new HashMap(), new HashMap()); - } - - /** - * Constructs a HashBidiMap and copies the mappings from - * specified Map. - * - * @param map the map whose mappings are to be placed in this map - */ - public DualHashBidiMap(Map map) { - super(new HashMap(), new HashMap()); - putAll(map); - } - - /** - * Constructs a HashBidiMap that decorates the specified maps. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @param inverseBidiMap the inverse BidiMap - */ - protected DualHashBidiMap(Map normalMap, Map reverseMap, BidiMap inverseBidiMap) { - super(normalMap, reverseMap, inverseBidiMap); - } - - /** - * Creates a new instance of this object. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @param inverseBidiMap the inverse BidiMap - * @return new bidi map - */ - protected BidiMap createBidiMap(Map normalMap, Map reverseMap, BidiMap inverseBidiMap) { - return new DualHashBidiMap(normalMap, reverseMap, inverseBidiMap); - } - - // Serialization - //----------------------------------------------------------------------- - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(maps[0]); - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - maps[0] = new HashMap(); - maps[1] = new HashMap(); - Map map = (Map) in.readObject(); - putAll(map); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualTreeBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualTreeBidiMap.java deleted file mode 100644 index 5aa4668a1dc..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/DualTreeBidiMap.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.ListIterator; -import java.util.Map; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.OrderedBidiMap; -import org.apache.commons.collections.OrderedMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.ResettableIterator; -import org.apache.commons.collections.SortedBidiMap; -import org.apache.commons.collections.map.AbstractSortedMapDecorator; - -/** - * Implementation of BidiMap that uses two TreeMap instances. - *

              - * The setValue() method on iterators will succeed only if the new value being set is - * not already in the bidimap. - *

              - * When considering whether to use this class, the {@link TreeBidiMap} class should - * also be considered. It implements the interface using a dedicated design, and does - * not store each object twice, which can save on memory use. - *

              - * NOTE: From Commons Collections 3.1, all subclasses will use TreeMap - * and the flawed createMap method is ignored. - * - * @since Commons Collections 3.0 - * @version $Id: DualTreeBidiMap.java 646777 2008-04-10 12:33:15Z niallp $ - * - * @author Matthew Hawthorne - * @author Stephen Colebourne - */ -public class DualTreeBidiMap - extends AbstractDualBidiMap implements SortedBidiMap, Serializable { - - /** Ensure serialization compatibility */ - private static final long serialVersionUID = 721969328361809L; - /** The comparator to use */ - protected final Comparator comparator; - - /** - * Creates an empty DualTreeBidiMap - */ - public DualTreeBidiMap() { - super(new TreeMap(), new TreeMap()); - this.comparator = null; - } - - /** - * Constructs a DualTreeBidiMap and copies the mappings from - * specified Map. - * - * @param map the map whose mappings are to be placed in this map - */ - public DualTreeBidiMap(Map map) { - super(new TreeMap(), new TreeMap()); - putAll(map); - this.comparator = null; - } - - /** - * Constructs a DualTreeBidiMap using the specified Comparator. - * - * @param comparator the Comparator - */ - public DualTreeBidiMap(Comparator comparator) { - super(new TreeMap(comparator), new TreeMap(comparator)); - this.comparator = comparator; - } - - /** - * Constructs a DualTreeBidiMap that decorates the specified maps. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @param inverseBidiMap the inverse BidiMap - */ - protected DualTreeBidiMap(Map normalMap, Map reverseMap, BidiMap inverseBidiMap) { - super(normalMap, reverseMap, inverseBidiMap); - this.comparator = ((SortedMap) normalMap).comparator(); - } - - /** - * Creates a new instance of this object. - * - * @param normalMap the normal direction map - * @param reverseMap the reverse direction map - * @param inverseMap the inverse BidiMap - * @return new bidi map - */ - protected BidiMap createBidiMap(Map normalMap, Map reverseMap, BidiMap inverseMap) { - return new DualTreeBidiMap(normalMap, reverseMap, inverseMap); - } - - //----------------------------------------------------------------------- - public Comparator comparator() { - return ((SortedMap) maps[0]).comparator(); - } - - public Object firstKey() { - return ((SortedMap) maps[0]).firstKey(); - } - - public Object lastKey() { - return ((SortedMap) maps[0]).lastKey(); - } - - public Object nextKey(Object key) { - if (isEmpty()) { - return null; - } - if (maps[0] instanceof OrderedMap) { - return ((OrderedMap) maps[0]).nextKey(key); - } - SortedMap sm = (SortedMap) maps[0]; - Iterator it = sm.tailMap(key).keySet().iterator(); - it.next(); - if (it.hasNext()) { - return it.next(); - } - return null; - } - - public Object previousKey(Object key) { - if (isEmpty()) { - return null; - } - if (maps[0] instanceof OrderedMap) { - return ((OrderedMap) maps[0]).previousKey(key); - } - SortedMap sm = (SortedMap) maps[0]; - SortedMap hm = sm.headMap(key); - if (hm.isEmpty()) { - return null; - } - return hm.lastKey(); - } - - //----------------------------------------------------------------------- - /** - * Obtains an ordered map iterator. - *

              - * This implementation copies the elements to an ArrayList in order to - * provide the forward/backward behaviour. - * - * @return a new ordered map iterator - */ - public OrderedMapIterator orderedMapIterator() { - return new BidiOrderedMapIterator(this); - } - - public SortedBidiMap inverseSortedBidiMap() { - return (SortedBidiMap) inverseBidiMap(); - } - - public OrderedBidiMap inverseOrderedBidiMap() { - return (OrderedBidiMap) inverseBidiMap(); - } - - //----------------------------------------------------------------------- - public SortedMap headMap(Object toKey) { - SortedMap sub = ((SortedMap) maps[0]).headMap(toKey); - return new ViewMap(this, sub); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap sub = ((SortedMap) maps[0]).tailMap(fromKey); - return new ViewMap(this, sub); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap sub = ((SortedMap) maps[0]).subMap(fromKey, toKey); - return new ViewMap(this, sub); - } - - //----------------------------------------------------------------------- - /** - * Internal sorted map view. - */ - protected static class ViewMap extends AbstractSortedMapDecorator { - /** The parent bidi map. */ - final DualTreeBidiMap bidi; - - /** - * Constructor. - * @param bidi the parent bidi map - * @param sm the subMap sorted map - */ - protected ViewMap(DualTreeBidiMap bidi, SortedMap sm) { - // the implementation is not great here... - // use the maps[0] as the filtered map, but maps[1] as the full map - // this forces containsValue and clear to be overridden - super((SortedMap) bidi.createBidiMap(sm, bidi.maps[1], bidi.inverseBidiMap)); - this.bidi = (DualTreeBidiMap) map; - } - - public boolean containsValue(Object value) { - // override as default implementation jumps to [1] - return bidi.maps[0].containsValue(value); - } - - public void clear() { - // override as default implementation jumps to [1] - for (Iterator it = keySet().iterator(); it.hasNext();) { - it.next(); - it.remove(); - } - } - - public SortedMap headMap(Object toKey) { - return new ViewMap(bidi, super.headMap(toKey)); - } - - public SortedMap tailMap(Object fromKey) { - return new ViewMap(bidi, super.tailMap(fromKey)); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - return new ViewMap(bidi, super.subMap(fromKey, toKey)); - } - } - - //----------------------------------------------------------------------- - /** - * Inner class MapIterator. - */ - protected static class BidiOrderedMapIterator implements OrderedMapIterator, ResettableIterator { - - /** The parent map */ - protected final AbstractDualBidiMap parent; - /** The iterator being decorated */ - protected ListIterator iterator; - /** The last returned entry */ - private Map.Entry last = null; - - /** - * Constructor. - * @param parent the parent map - */ - protected BidiOrderedMapIterator(AbstractDualBidiMap parent) { - super(); - this.parent = parent; - iterator = new ArrayList(parent.entrySet()).listIterator(); - } - - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - last = (Map.Entry) iterator.next(); - return last.getKey(); - } - - public boolean hasPrevious() { - return iterator.hasPrevious(); - } - - public Object previous() { - last = (Map.Entry) iterator.previous(); - return last.getKey(); - } - - public void remove() { - iterator.remove(); - parent.remove(last.getKey()); - last = null; - } - - public Object getKey() { - if (last == null) { - throw new IllegalStateException("Iterator getKey() can only be called after next() and before remove()"); - } - return last.getKey(); - } - - public Object getValue() { - if (last == null) { - throw new IllegalStateException("Iterator getValue() can only be called after next() and before remove()"); - } - return last.getValue(); - } - - public Object setValue(Object value) { - if (last == null) { - throw new IllegalStateException("Iterator setValue() can only be called after next() and before remove()"); - } - if (parent.maps[1].containsKey(value) && - parent.maps[1].get(value) != last.getKey()) { - throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map"); - } - return parent.put(last.getKey(), value); - } - - public void reset() { - iterator = new ArrayList(parent.entrySet()).listIterator(); - last = null; - } - - public String toString() { - if (last != null) { - return "MapIterator[" + getKey() + "=" + getValue() + "]"; - } else { - return "MapIterator[]"; - } - } - } - - // Serialization - //----------------------------------------------------------------------- - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(maps[0]); - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - maps[0] = new TreeMap(comparator); - maps[1] = new TreeMap(comparator); - Map map = (Map) in.readObject(); - putAll(map); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/TreeBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/TreeBidiMap.java deleted file mode 100644 index 03044a08101..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/TreeBidiMap.java +++ /dev/null @@ -1,2085 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.util.AbstractSet; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.KeyValue; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedBidiMap; -import org.apache.commons.collections.OrderedIterator; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.iterators.EmptyOrderedMapIterator; -import org.apache.commons.collections.keyvalue.UnmodifiableMapEntry; - -/** - * Red-Black tree-based implementation of BidiMap where all objects added - * implement the Comparable interface. - *

              - * This class guarantees that the map will be in both ascending key order - * and ascending value order, sorted according to the natural order for - * the key's and value's classes. - *

              - * This Map is intended for applications that need to be able to look - * up a key-value pairing by either key or value, and need to do so - * with equal efficiency. - *

              - * While that goal could be accomplished by taking a pair of TreeMaps - * and redirecting requests to the appropriate TreeMap (e.g., - * containsKey would be directed to the TreeMap that maps values to - * keys, containsValue would be directed to the TreeMap that maps keys - * to values), there are problems with that implementation. - * If the data contained in the TreeMaps is large, the cost of redundant - * storage becomes significant. The {@link DualTreeBidiMap} and - * {@link DualHashBidiMap} implementations use this approach. - *

              - * This solution keeps minimizes the data storage by holding data only once. - * The red-black algorithm is based on java util TreeMap, but has been modified - * to simultaneously map a tree node by key and by value. This doubles the - * cost of put operations (but so does using two TreeMaps), and nearly doubles - * the cost of remove operations (there is a savings in that the lookup of the - * node to be removed only has to be performed once). And since only one node - * contains the key and value, storage is significantly less than that - * required by two TreeMaps. - *

              - * The Map.Entry instances returned by the appropriate methods will - * not allow setValue() and will throw an - * UnsupportedOperationException on attempts to call that method. - * - * @since Commons Collections 3.0 (previously DoubleOrderedMap v2.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Marc Johnson - * @author Stephen Colebourne - */ -public class TreeBidiMap implements OrderedBidiMap { - - private static final int KEY = 0; - private static final int VALUE = 1; - private static final int MAPENTRY = 2; - private static final int INVERSEMAPENTRY = 3; - private static final int SUM_OF_INDICES = KEY + VALUE; - private static final int FIRST_INDEX = 0; - private static final int NUMBER_OF_INDICES = 2; - private static final String[] dataName = new String[] { "key", "value" }; - - private Node[] rootNode = new Node[2]; - private int nodeCount = 0; - private int modifications = 0; - private Set keySet; - private Set valuesSet; - private Set entrySet; - private TreeBidiMap.Inverse inverse = null; - - //----------------------------------------------------------------------- - /** - * Constructs a new empty TreeBidiMap. - */ - public TreeBidiMap() { - super(); - } - - /** - * Constructs a new TreeBidiMap by copying an existing Map. - * - * @param map the map to copy - * @throws ClassCastException if the keys/values in the map are - * not Comparable or are not mutually comparable - * @throws NullPointerException if any key or value in the map is null - */ - public TreeBidiMap(final Map map) { - super(); - putAll(map); - } - - //----------------------------------------------------------------------- - /** - * Returns the number of key-value mappings in this map. - * - * @return the number of key-value mappings in this map - */ - public int size() { - return nodeCount; - } - - /** - * Checks whether the map is empty or not. - * - * @return true if the map is empty - */ - public boolean isEmpty() { - return (nodeCount == 0); - } - - /** - * Checks whether this map contains the a mapping for the specified key. - *

              - * The key must implement Comparable. - * - * @param key key whose presence in this map is to be tested - * @return true if this map contains a mapping for the specified key - * @throws ClassCastException if the key is of an inappropriate type - * @throws NullPointerException if the key is null - */ - public boolean containsKey(final Object key) { - checkKey(key); - return (lookup((Comparable) key, KEY) != null); - } - - /** - * Checks whether this map contains the a mapping for the specified value. - *

              - * The value must implement Comparable. - * - * @param value value whose presence in this map is to be tested - * @return true if this map contains a mapping for the specified value - * @throws ClassCastException if the value is of an inappropriate type - * @throws NullPointerException if the value is null - */ - public boolean containsValue(final Object value) { - checkValue(value); - return (lookup((Comparable) value, VALUE) != null); - } - - /** - * Gets the value to which this map maps the specified key. - * Returns null if the map contains no mapping for this key. - *

              - * The key must implement Comparable. - * - * @param key key whose associated value is to be returned - * @return the value to which this map maps the specified key, - * or null if the map contains no mapping for this key - * @throws ClassCastException if the key is of an inappropriate type - * @throws NullPointerException if the key is null - */ - public Object get(final Object key) { - return doGet((Comparable) key, KEY); - } - - /** - * Puts the key-value pair into the map, replacing any previous pair. - *

              - * When adding a key-value pair, the value may already exist in the map - * against a different key. That mapping is removed, to ensure that the - * value only occurs once in the inverse map. - *

              -     *  BidiMap map1 = new TreeBidiMap();
              -     *  map.put("A","B");  // contains A mapped to B, as per Map
              -     *  map.put("A","C");  // contains A mapped to C, as per Map
              -     * 
              -     *  BidiMap map2 = new TreeBidiMap();
              -     *  map.put("A","B");  // contains A mapped to B, as per Map
              -     *  map.put("C","B");  // contains C mapped to B, key A is removed
              -     * 
              - *

              - * Both key and value must implement Comparable. - * - * @param key key with which the specified value is to be associated - * @param value value to be associated with the specified key - * @return the previous value for the key - * @throws ClassCastException if the key is of an inappropriate type - * @throws NullPointerException if the key is null - */ - public Object put(final Object key, final Object value) { - return doPut((Comparable) key, (Comparable) value, KEY); - } - - /** - * Puts all the mappings from the specified map into this map. - *

              - * All keys and values must implement Comparable. - * - * @param map the map to copy from - */ - public void putAll(Map map) { - Iterator it = map.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - - /** - * Removes the mapping for this key from this map if present. - *

              - * The key must implement Comparable. - * - * @param key key whose mapping is to be removed from the map. - * @return previous value associated with specified key, - * or null if there was no mapping for key. - * @throws ClassCastException if the key is of an inappropriate type - * @throws NullPointerException if the key is null - */ - public Object remove(final Object key) { - return doRemove((Comparable) key, KEY); - } - - /** - * Removes all mappings from this map. - */ - public void clear() { - modify(); - - nodeCount = 0; - rootNode[KEY] = null; - rootNode[VALUE] = null; - } - - //----------------------------------------------------------------------- - /** - * Returns the key to which this map maps the specified value. - * Returns null if the map contains no mapping for this value. - *

              - * The value must implement Comparable. - * - * @param value value whose associated key is to be returned. - * @return the key to which this map maps the specified value, - * or null if the map contains no mapping for this value. - * @throws ClassCastException if the value is of an inappropriate type - * @throws NullPointerException if the value is null - */ - public Object getKey(final Object value) { - return doGet((Comparable) value, VALUE); - } - - /** - * Removes the mapping for this value from this map if present. - *

              - * The value must implement Comparable. - * - * @param value value whose mapping is to be removed from the map - * @return previous key associated with specified value, - * or null if there was no mapping for value. - * @throws ClassCastException if the value is of an inappropriate type - * @throws NullPointerException if the value is null - */ - public Object removeValue(final Object value) { - return doRemove((Comparable) value, VALUE); - } - - //----------------------------------------------------------------------- - /** - * Gets the first (lowest) key currently in this map. - * - * @return the first (lowest) key currently in this sorted map - * @throws NoSuchElementException if this map is empty - */ - public Object firstKey() { - if (nodeCount == 0) { - throw new NoSuchElementException("Map is empty"); - } - return leastNode(rootNode[KEY], KEY).getKey(); - } - - /** - * Gets the last (highest) key currently in this map. - * - * @return the last (highest) key currently in this sorted map - * @throws NoSuchElementException if this map is empty - */ - public Object lastKey() { - if (nodeCount == 0) { - throw new NoSuchElementException("Map is empty"); - } - return greatestNode(rootNode[KEY], KEY).getKey(); - } - - /** - * Gets the next key after the one specified. - *

              - * The key must implement Comparable. - * - * @param key the key to search for next from - * @return the next key, null if no match or at end - */ - public Object nextKey(Object key) { - checkKey(key); - Node node = nextGreater(lookup((Comparable) key, KEY), KEY); - return (node == null ? null : node.getKey()); - } - - /** - * Gets the previous key before the one specified. - *

              - * The key must implement Comparable. - * - * @param key the key to search for previous from - * @return the previous key, null if no match or at start - */ - public Object previousKey(Object key) { - checkKey(key); - Node node = nextSmaller(lookup((Comparable) key, KEY), KEY); - return (node == null ? null : node.getKey()); - } - - //----------------------------------------------------------------------- - /** - * Returns a set view of the keys contained in this map in key order. - *

              - * The set is backed by the map, so changes to the map are reflected in - * the set, and vice-versa. If the map is modified while an iteration over - * the set is in progress, the results of the iteration are undefined. - *

              - * The set supports element removal, which removes the corresponding mapping - * from the map. It does not support the add or addAll operations. - * - * @return a set view of the keys contained in this map. - */ - public Set keySet() { - if (keySet == null) { - keySet = new View(this, KEY, KEY); - } - return keySet; - } - - //----------------------------------------------------------------------- - /** - * Returns a set view of the values contained in this map in key order. - * The returned object can be cast to a Set. - *

              - * The set is backed by the map, so changes to the map are reflected in - * the set, and vice-versa. If the map is modified while an iteration over - * the set is in progress, the results of the iteration are undefined. - *

              - * The set supports element removal, which removes the corresponding mapping - * from the map. It does not support the add or addAll operations. - * - * @return a set view of the values contained in this map. - */ - public Collection values() { - if (valuesSet == null) { - valuesSet = new View(this, KEY, VALUE); - } - return valuesSet; - } - - //----------------------------------------------------------------------- - /** - * Returns a set view of the entries contained in this map in key order. - * For simple iteration through the map, the MapIterator is quicker. - *

              - * The set is backed by the map, so changes to the map are reflected in - * the set, and vice-versa. If the map is modified while an iteration over - * the set is in progress, the results of the iteration are undefined. - *

              - * The set supports element removal, which removes the corresponding mapping - * from the map. It does not support the add or addAll operations. - * The returned MapEntry objects do not support setValue. - * - * @return a set view of the values contained in this map. - */ - public Set entrySet() { - if (entrySet == null) { - return new EntryView(this, KEY, MAPENTRY); - } - return entrySet; - } - - //----------------------------------------------------------------------- - /** - * Gets an iterator over the map entries. - *

              - * For this map, this iterator is the fastest way to iterate over the entries. - * - * @return an iterator - */ - public MapIterator mapIterator() { - if (isEmpty()) { - return EmptyOrderedMapIterator.INSTANCE; - } - return new ViewMapIterator(this, KEY); - } - - /** - * Gets an ordered iterator over the map entries. - *

              - * This iterator allows both forward and reverse iteration over the entries. - * - * @return an iterator - */ - public OrderedMapIterator orderedMapIterator() { - if (isEmpty()) { - return EmptyOrderedMapIterator.INSTANCE; - } - return new ViewMapIterator(this, KEY); - } - - //----------------------------------------------------------------------- - /** - * Gets the inverse map for comparison. - * - * @return the inverse map - */ - public BidiMap inverseBidiMap() { - return inverseOrderedBidiMap(); - } - - /** - * Gets the inverse map for comparison. - * - * @return the inverse map - */ - public OrderedBidiMap inverseOrderedBidiMap() { - if (inverse == null) { - inverse = new Inverse(this); - } - return inverse; - } - - //----------------------------------------------------------------------- - /** - * Compares for equals as per the API. - * - * @param obj the object to compare to - * @return true if equal - */ - public boolean equals(Object obj) { - return this.doEquals(obj, KEY); - } - - /** - * Gets the hash code value for this map as per the API. - * - * @return the hash code value for this map - */ - public int hashCode() { - return this.doHashCode(KEY); - } - - /** - * Returns a string version of this Map in standard format. - * - * @return a standard format string version of the map - */ - public String toString() { - return this.doToString(KEY); - } - - //----------------------------------------------------------------------- - /** - * Common get logic, used to get by key or get by value - * - * @param obj the key or value that we're looking for - * @param index the KEY or VALUE int - * @return the key (if the value was mapped) or the value (if the - * key was mapped); null if we couldn't find the specified - * object - */ - private Object doGet(final Comparable obj, final int index) { - checkNonNullComparable(obj, index); - Node node = lookup(obj, index); - return ((node == null) ? null : node.getData(oppositeIndex(index))); - } - - /** - * Common put logic, differing only in the return value. - * - * @param key the key, always the main map key - * @param value the value, always the main map value - * @param index the KEY or VALUE int, for the return value only - * @return the previously mapped value - */ - private Object doPut(final Comparable key, final Comparable value, final int index) { - checkKeyAndValue(key, value); - - // store previous and remove previous mappings - Object prev = (index == KEY ? doGet(key, KEY) : doGet(value, VALUE)); - doRemove(key, KEY); - doRemove(value, VALUE); - - Node node = rootNode[KEY]; - if (node == null) { - // map is empty - Node root = new Node(key, value); - rootNode[KEY] = root; - rootNode[VALUE] = root; - grow(); - - } else { - // add new mapping - while (true) { - int cmp = compare(key, node.getData(KEY)); - - if (cmp == 0) { - // shouldn't happen - throw new IllegalArgumentException("Cannot store a duplicate key (\"" + key + "\") in this Map"); - } else if (cmp < 0) { - if (node.getLeft(KEY) != null) { - node = node.getLeft(KEY); - } else { - Node newNode = new Node(key, value); - - insertValue(newNode); - node.setLeft(newNode, KEY); - newNode.setParent(node, KEY); - doRedBlackInsert(newNode, KEY); - grow(); - - break; - } - } else { // cmp > 0 - if (node.getRight(KEY) != null) { - node = node.getRight(KEY); - } else { - Node newNode = new Node(key, value); - - insertValue(newNode); - node.setRight(newNode, KEY); - newNode.setParent(node, KEY); - doRedBlackInsert(newNode, KEY); - grow(); - - break; - } - } - } - } - return prev; - } - - /** - * Remove by object (remove by key or remove by value) - * - * @param o the key, or value, that we're looking for - * @param index the KEY or VALUE int - * - * @return the key, if remove by value, or the value, if remove by - * key. null if the specified key or value could not be - * found - */ - private Object doRemove(final Comparable o, final int index) { - Node node = lookup(o, index); - Object rval = null; - if (node != null) { - rval = node.getData(oppositeIndex(index)); - doRedBlackDelete(node); - } - return rval; - } - - /** - * do the actual lookup of a piece of data - * - * @param data the key or value to be looked up - * @param index the KEY or VALUE int - * @return the desired Node, or null if there is no mapping of the - * specified data - */ - private Node lookup(final Comparable data, final int index) { - Node rval = null; - Node node = rootNode[index]; - - while (node != null) { - int cmp = compare(data, node.getData(index)); - if (cmp == 0) { - rval = node; - break; - } else { - node = (cmp < 0) ? node.getLeft(index) : node.getRight(index); - } - } - - return rval; - } - - /** - * get the next larger node from the specified node - * - * @param node the node to be searched from - * @param index the KEY or VALUE int - * @return the specified node - */ - private Node nextGreater(final Node node, final int index) { - Node rval = null; - if (node == null) { - rval = null; - } else if (node.getRight(index) != null) { - // everything to the node's right is larger. The least of - // the right node's descendants is the next larger node - rval = leastNode(node.getRight(index), index); - } else { - // traverse up our ancestry until we find an ancestor that - // is null or one whose left child is our ancestor. If we - // find a null, then this node IS the largest node in the - // tree, and there is no greater node. Otherwise, we are - // the largest node in the subtree on that ancestor's left - // ... and that ancestor is the next greatest node - Node parent = node.getParent(index); - Node child = node; - - while ((parent != null) && (child == parent.getRight(index))) { - child = parent; - parent = parent.getParent(index); - } - rval = parent; - } - return rval; - } - - /** - * get the next larger node from the specified node - * - * @param node the node to be searched from - * @param index the KEY or VALUE int - * @return the specified node - */ - private Node nextSmaller(final Node node, final int index) { - Node rval = null; - if (node == null) { - rval = null; - } else if (node.getLeft(index) != null) { - // everything to the node's left is smaller. The greatest of - // the left node's descendants is the next smaller node - rval = greatestNode(node.getLeft(index), index); - } else { - // traverse up our ancestry until we find an ancestor that - // is null or one whose right child is our ancestor. If we - // find a null, then this node IS the largest node in the - // tree, and there is no greater node. Otherwise, we are - // the largest node in the subtree on that ancestor's right - // ... and that ancestor is the next greatest node - Node parent = node.getParent(index); - Node child = node; - - while ((parent != null) && (child == parent.getLeft(index))) { - child = parent; - parent = parent.getParent(index); - } - rval = parent; - } - return rval; - } - - //----------------------------------------------------------------------- - /** - * Get the opposite index of the specified index - * - * @param index the KEY or VALUE int - * @return VALUE (if KEY was specified), else KEY - */ - private static int oppositeIndex(final int index) { - // old trick ... to find the opposite of a value, m or n, - // subtract the value from the sum of the two possible - // values. (m + n) - m = n; (m + n) - n = m - return SUM_OF_INDICES - index; - } - - /** - * Compare two objects - * - * @param o1 the first object - * @param o2 the second object - * - * @return negative value if o1 < o2; 0 if o1 == o2; positive - * value if o1 > o2 - */ - private static int compare(final Comparable o1, final Comparable o2) { - return o1.compareTo(o2); - } - - /** - * Find the least node from a given node. - * - * @param node the node from which we will start searching - * @param index the KEY or VALUE int - * @return the smallest node, from the specified node, in the - * specified mapping - */ - private static Node leastNode(final Node node, final int index) { - Node rval = node; - if (rval != null) { - while (rval.getLeft(index) != null) { - rval = rval.getLeft(index); - } - } - return rval; - } - - /** - * Find the greatest node from a given node. - * - * @param node the node from which we will start searching - * @param index the KEY or VALUE int - * @return the greatest node, from the specified node - */ - private static Node greatestNode(final Node node, final int index) { - Node rval = node; - if (rval != null) { - while (rval.getRight(index) != null) { - rval = rval.getRight(index); - } - } - return rval; - } - - /** - * copy the color from one node to another, dealing with the fact - * that one or both nodes may, in fact, be null - * - * @param from the node whose color we're copying; may be null - * @param to the node whose color we're changing; may be null - * @param index the KEY or VALUE int - */ - private static void copyColor(final Node from, final Node to, final int index) { - if (to != null) { - if (from == null) { - // by default, make it black - to.setBlack(index); - } else { - to.copyColor(from, index); - } - } - } - - /** - * is the specified node red? if the node does not exist, no, it's - * black, thank you - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static boolean isRed(final Node node, final int index) { - return ((node == null) ? false : node.isRed(index)); - } - - /** - * is the specified black red? if the node does not exist, sure, - * it's black, thank you - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static boolean isBlack(final Node node, final int index) { - return ((node == null) ? true : node.isBlack(index)); - } - - /** - * force a node (if it exists) red - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static void makeRed(final Node node, final int index) { - if (node != null) { - node.setRed(index); - } - } - - /** - * force a node (if it exists) black - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static void makeBlack(final Node node, final int index) { - if (node != null) { - node.setBlack(index); - } - } - - /** - * get a node's grandparent. mind you, the node, its parent, or - * its grandparent may not exist. no problem - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static Node getGrandParent(final Node node, final int index) { - return getParent(getParent(node, index), index); - } - - /** - * get a node's parent. mind you, the node, or its parent, may not - * exist. no problem - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static Node getParent(final Node node, final int index) { - return ((node == null) ? null : node.getParent(index)); - } - - /** - * get a node's right child. mind you, the node may not exist. no - * problem - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static Node getRightChild(final Node node, final int index) { - return (node == null) ? null : node.getRight(index); - } - - /** - * get a node's left child. mind you, the node may not exist. no - * problem - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static Node getLeftChild(final Node node, final int index) { - return (node == null) ? null : node.getLeft(index); - } - - /** - * is this node its parent's left child? mind you, the node, or - * its parent, may not exist. no problem. if the node doesn't - * exist ... it's its non-existent parent's left child. If the - * node does exist but has no parent ... no, we're not the - * non-existent parent's left child. Otherwise (both the specified - * node AND its parent exist), check. - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static boolean isLeftChild(final Node node, final int index) { - return (node == null) - ? true - : ((node.getParent(index) == null) ? - false : (node == node.getParent(index).getLeft(index))); - } - - /** - * is this node its parent's right child? mind you, the node, or - * its parent, may not exist. no problem. if the node doesn't - * exist ... it's its non-existent parent's right child. If the - * node does exist but has no parent ... no, we're not the - * non-existent parent's right child. Otherwise (both the - * specified node AND its parent exist), check. - * - * @param node the node (may be null) in question - * @param index the KEY or VALUE int - */ - private static boolean isRightChild(final Node node, final int index) { - return (node == null) - ? true - : ((node.getParent(index) == null) ? - false : (node == node.getParent(index).getRight(index))); - } - - /** - * do a rotate left. standard fare in the world of balanced trees - * - * @param node the node to be rotated - * @param index the KEY or VALUE int - */ - private void rotateLeft(final Node node, final int index) { - Node rightChild = node.getRight(index); - node.setRight(rightChild.getLeft(index), index); - - if (rightChild.getLeft(index) != null) { - rightChild.getLeft(index).setParent(node, index); - } - rightChild.setParent(node.getParent(index), index); - - if (node.getParent(index) == null) { - // node was the root ... now its right child is the root - rootNode[index] = rightChild; - } else if (node.getParent(index).getLeft(index) == node) { - node.getParent(index).setLeft(rightChild, index); - } else { - node.getParent(index).setRight(rightChild, index); - } - - rightChild.setLeft(node, index); - node.setParent(rightChild, index); - } - - /** - * do a rotate right. standard fare in the world of balanced trees - * - * @param node the node to be rotated - * @param index the KEY or VALUE int - */ - private void rotateRight(final Node node, final int index) { - Node leftChild = node.getLeft(index); - node.setLeft(leftChild.getRight(index), index); - if (leftChild.getRight(index) != null) { - leftChild.getRight(index).setParent(node, index); - } - leftChild.setParent(node.getParent(index), index); - - if (node.getParent(index) == null) { - // node was the root ... now its left child is the root - rootNode[index] = leftChild; - } else if (node.getParent(index).getRight(index) == node) { - node.getParent(index).setRight(leftChild, index); - } else { - node.getParent(index).setLeft(leftChild, index); - } - - leftChild.setRight(node, index); - node.setParent(leftChild, index); - } - - /** - * complicated red-black insert stuff. Based on Sun's TreeMap - * implementation, though it's barely recognizable any more - * - * @param insertedNode the node to be inserted - * @param index the KEY or VALUE int - */ - private void doRedBlackInsert(final Node insertedNode, final int index) { - Node currentNode = insertedNode; - makeRed(currentNode, index); - - while ((currentNode != null) - && (currentNode != rootNode[index]) - && (isRed(currentNode.getParent(index), index))) { - if (isLeftChild(getParent(currentNode, index), index)) { - Node y = getRightChild(getGrandParent(currentNode, index), index); - - if (isRed(y, index)) { - makeBlack(getParent(currentNode, index), index); - makeBlack(y, index); - makeRed(getGrandParent(currentNode, index), index); - - currentNode = getGrandParent(currentNode, index); - } else { - if (isRightChild(currentNode, index)) { - currentNode = getParent(currentNode, index); - - rotateLeft(currentNode, index); - } - - makeBlack(getParent(currentNode, index), index); - makeRed(getGrandParent(currentNode, index), index); - - if (getGrandParent(currentNode, index) != null) { - rotateRight(getGrandParent(currentNode, index), index); - } - } - } else { - - // just like clause above, except swap left for right - Node y = getLeftChild(getGrandParent(currentNode, index), index); - - if (isRed(y, index)) { - makeBlack(getParent(currentNode, index), index); - makeBlack(y, index); - makeRed(getGrandParent(currentNode, index), index); - - currentNode = getGrandParent(currentNode, index); - } else { - if (isLeftChild(currentNode, index)) { - currentNode = getParent(currentNode, index); - - rotateRight(currentNode, index); - } - - makeBlack(getParent(currentNode, index), index); - makeRed(getGrandParent(currentNode, index), index); - - if (getGrandParent(currentNode, index) != null) { - rotateLeft(getGrandParent(currentNode, index), index); - } - } - } - } - - makeBlack(rootNode[index], index); - } - - /** - * complicated red-black delete stuff. Based on Sun's TreeMap - * implementation, though it's barely recognizable any more - * - * @param deletedNode the node to be deleted - */ - private void doRedBlackDelete(final Node deletedNode) { - for (int index = FIRST_INDEX; index < NUMBER_OF_INDICES; index++) { - // if deleted node has both left and children, swap with - // the next greater node - if ((deletedNode.getLeft(index) != null) && (deletedNode.getRight(index) != null)) { - swapPosition(nextGreater(deletedNode, index), deletedNode, index); - } - - Node replacement = - ((deletedNode.getLeft(index) != null) ? deletedNode.getLeft(index) : deletedNode.getRight(index)); - - if (replacement != null) { - replacement.setParent(deletedNode.getParent(index), index); - - if (deletedNode.getParent(index) == null) { - rootNode[index] = replacement; - } else if (deletedNode == deletedNode.getParent(index).getLeft(index)) { - deletedNode.getParent(index).setLeft(replacement, index); - } else { - deletedNode.getParent(index).setRight(replacement, index); - } - - deletedNode.setLeft(null, index); - deletedNode.setRight(null, index); - deletedNode.setParent(null, index); - - if (isBlack(deletedNode, index)) { - doRedBlackDeleteFixup(replacement, index); - } - } else { - - // replacement is null - if (deletedNode.getParent(index) == null) { - - // empty tree - rootNode[index] = null; - } else { - - // deleted node had no children - if (isBlack(deletedNode, index)) { - doRedBlackDeleteFixup(deletedNode, index); - } - - if (deletedNode.getParent(index) != null) { - if (deletedNode == deletedNode.getParent(index).getLeft(index)) { - deletedNode.getParent(index).setLeft(null, index); - } else { - deletedNode.getParent(index).setRight(null, index); - } - - deletedNode.setParent(null, index); - } - } - } - } - shrink(); - } - - /** - * complicated red-black delete stuff. Based on Sun's TreeMap - * implementation, though it's barely recognizable any more. This - * rebalances the tree (somewhat, as red-black trees are not - * perfectly balanced -- perfect balancing takes longer) - * - * @param replacementNode the node being replaced - * @param index the KEY or VALUE int - */ - private void doRedBlackDeleteFixup(final Node replacementNode, final int index) { - Node currentNode = replacementNode; - - while ((currentNode != rootNode[index]) && (isBlack(currentNode, index))) { - if (isLeftChild(currentNode, index)) { - Node siblingNode = getRightChild(getParent(currentNode, index), index); - - if (isRed(siblingNode, index)) { - makeBlack(siblingNode, index); - makeRed(getParent(currentNode, index), index); - rotateLeft(getParent(currentNode, index), index); - - siblingNode = getRightChild(getParent(currentNode, index), index); - } - - if (isBlack(getLeftChild(siblingNode, index), index) - && isBlack(getRightChild(siblingNode, index), index)) { - makeRed(siblingNode, index); - - currentNode = getParent(currentNode, index); - } else { - if (isBlack(getRightChild(siblingNode, index), index)) { - makeBlack(getLeftChild(siblingNode, index), index); - makeRed(siblingNode, index); - rotateRight(siblingNode, index); - - siblingNode = getRightChild(getParent(currentNode, index), index); - } - - copyColor(getParent(currentNode, index), siblingNode, index); - makeBlack(getParent(currentNode, index), index); - makeBlack(getRightChild(siblingNode, index), index); - rotateLeft(getParent(currentNode, index), index); - - currentNode = rootNode[index]; - } - } else { - Node siblingNode = getLeftChild(getParent(currentNode, index), index); - - if (isRed(siblingNode, index)) { - makeBlack(siblingNode, index); - makeRed(getParent(currentNode, index), index); - rotateRight(getParent(currentNode, index), index); - - siblingNode = getLeftChild(getParent(currentNode, index), index); - } - - if (isBlack(getRightChild(siblingNode, index), index) - && isBlack(getLeftChild(siblingNode, index), index)) { - makeRed(siblingNode, index); - - currentNode = getParent(currentNode, index); - } else { - if (isBlack(getLeftChild(siblingNode, index), index)) { - makeBlack(getRightChild(siblingNode, index), index); - makeRed(siblingNode, index); - rotateLeft(siblingNode, index); - - siblingNode = getLeftChild(getParent(currentNode, index), index); - } - - copyColor(getParent(currentNode, index), siblingNode, index); - makeBlack(getParent(currentNode, index), index); - makeBlack(getLeftChild(siblingNode, index), index); - rotateRight(getParent(currentNode, index), index); - - currentNode = rootNode[index]; - } - } - } - - makeBlack(currentNode, index); - } - - /** - * swap two nodes (except for their content), taking care of - * special cases where one is the other's parent ... hey, it - * happens. - * - * @param x one node - * @param y another node - * @param index the KEY or VALUE int - */ - private void swapPosition(final Node x, final Node y, final int index) { - // Save initial values. - Node xFormerParent = x.getParent(index); - Node xFormerLeftChild = x.getLeft(index); - Node xFormerRightChild = x.getRight(index); - Node yFormerParent = y.getParent(index); - Node yFormerLeftChild = y.getLeft(index); - Node yFormerRightChild = y.getRight(index); - boolean xWasLeftChild = (x.getParent(index) != null) && (x == x.getParent(index).getLeft(index)); - boolean yWasLeftChild = (y.getParent(index) != null) && (y == y.getParent(index).getLeft(index)); - - // Swap, handling special cases of one being the other's parent. - if (x == yFormerParent) { // x was y's parent - x.setParent(y, index); - - if (yWasLeftChild) { - y.setLeft(x, index); - y.setRight(xFormerRightChild, index); - } else { - y.setRight(x, index); - y.setLeft(xFormerLeftChild, index); - } - } else { - x.setParent(yFormerParent, index); - - if (yFormerParent != null) { - if (yWasLeftChild) { - yFormerParent.setLeft(x, index); - } else { - yFormerParent.setRight(x, index); - } - } - - y.setLeft(xFormerLeftChild, index); - y.setRight(xFormerRightChild, index); - } - - if (y == xFormerParent) { // y was x's parent - y.setParent(x, index); - - if (xWasLeftChild) { - x.setLeft(y, index); - x.setRight(yFormerRightChild, index); - } else { - x.setRight(y, index); - x.setLeft(yFormerLeftChild, index); - } - } else { - y.setParent(xFormerParent, index); - - if (xFormerParent != null) { - if (xWasLeftChild) { - xFormerParent.setLeft(y, index); - } else { - xFormerParent.setRight(y, index); - } - } - - x.setLeft(yFormerLeftChild, index); - x.setRight(yFormerRightChild, index); - } - - // Fix children's parent pointers - if (x.getLeft(index) != null) { - x.getLeft(index).setParent(x, index); - } - - if (x.getRight(index) != null) { - x.getRight(index).setParent(x, index); - } - - if (y.getLeft(index) != null) { - y.getLeft(index).setParent(y, index); - } - - if (y.getRight(index) != null) { - y.getRight(index).setParent(y, index); - } - - x.swapColors(y, index); - - // Check if root changed - if (rootNode[index] == x) { - rootNode[index] = y; - } else if (rootNode[index] == y) { - rootNode[index] = x; - } - } - - /** - * check if an object is fit to be proper input ... has to be - * Comparable and non-null - * - * @param o the object being checked - * @param index the KEY or VALUE int (used to put the right word in the - * exception message) - * - * @throws NullPointerException if o is null - * @throws ClassCastException if o is not Comparable - */ - private static void checkNonNullComparable(final Object o, final int index) { - if (o == null) { - throw new NullPointerException(dataName[index] + " cannot be null"); - } - if (!(o instanceof Comparable)) { - throw new ClassCastException(dataName[index] + " must be Comparable"); - } - } - - /** - * check a key for validity (non-null and implements Comparable) - * - * @param key the key to be checked - * - * @throws NullPointerException if key is null - * @throws ClassCastException if key is not Comparable - */ - private static void checkKey(final Object key) { - checkNonNullComparable(key, KEY); - } - - /** - * check a value for validity (non-null and implements Comparable) - * - * @param value the value to be checked - * - * @throws NullPointerException if value is null - * @throws ClassCastException if value is not Comparable - */ - private static void checkValue(final Object value) { - checkNonNullComparable(value, VALUE); - } - - /** - * check a key and a value for validity (non-null and implements - * Comparable) - * - * @param key the key to be checked - * @param value the value to be checked - * - * @throws NullPointerException if key or value is null - * @throws ClassCastException if key or value is not Comparable - */ - private static void checkKeyAndValue(final Object key, final Object value) { - checkKey(key); - checkValue(value); - } - - /** - * increment the modification count -- used to check for - * concurrent modification of the map through the map and through - * an Iterator from one of its Set or Collection views - */ - private void modify() { - modifications++; - } - - /** - * bump up the size and note that the map has changed - */ - private void grow() { - modify(); - nodeCount++; - } - - /** - * decrement the size and note that the map has changed - */ - private void shrink() { - modify(); - nodeCount--; - } - - /** - * insert a node by its value - * - * @param newNode the node to be inserted - * - * @throws IllegalArgumentException if the node already exists - * in the value mapping - */ - private void insertValue(final Node newNode) throws IllegalArgumentException { - Node node = rootNode[VALUE]; - - while (true) { - int cmp = compare(newNode.getData(VALUE), node.getData(VALUE)); - - if (cmp == 0) { - throw new IllegalArgumentException( - "Cannot store a duplicate value (\"" + newNode.getData(VALUE) + "\") in this Map"); - } else if (cmp < 0) { - if (node.getLeft(VALUE) != null) { - node = node.getLeft(VALUE); - } else { - node.setLeft(newNode, VALUE); - newNode.setParent(node, VALUE); - doRedBlackInsert(newNode, VALUE); - - break; - } - } else { // cmp > 0 - if (node.getRight(VALUE) != null) { - node = node.getRight(VALUE); - } else { - node.setRight(newNode, VALUE); - newNode.setParent(node, VALUE); - doRedBlackInsert(newNode, VALUE); - - break; - } - } - } - } - - //----------------------------------------------------------------------- - /** - * Compares for equals as per the API. - * - * @param obj the object to compare to - * @param type the KEY or VALUE int - * @return true if equal - */ - private boolean doEquals(Object obj, final int type) { - if (obj == this) { - return true; - } - if (obj instanceof Map == false) { - return false; - } - Map other = (Map) obj; - if (other.size() != size()) { - return false; - } - - if (nodeCount > 0) { - try { - for (MapIterator it = new ViewMapIterator(this, type); it.hasNext(); ) { - Object key = it.next(); - Object value = it.getValue(); - if (value.equals(other.get(key)) == false) { - return false; - } - } - } catch (ClassCastException ex) { - return false; - } catch (NullPointerException ex) { - return false; - } - } - return true; - } - - /** - * Gets the hash code value for this map as per the API. - * - * @param type the KEY or VALUE int - * @return the hash code value for this map - */ - private int doHashCode(final int type) { - int total = 0; - if (nodeCount > 0) { - for (MapIterator it = new ViewMapIterator(this, type); it.hasNext(); ) { - Object key = it.next(); - Object value = it.getValue(); - total += (key.hashCode() ^ value.hashCode()); - } - } - return total; - } - - /** - * Gets the string form of this map as per AbstractMap. - * - * @param type the KEY or VALUE int - * @return the string form of this map - */ - private String doToString(final int type) { - if (nodeCount == 0) { - return "{}"; - } - StringBuffer buf = new StringBuffer(nodeCount * 32); - buf.append('{'); - MapIterator it = new ViewMapIterator(this, type); - boolean hasNext = it.hasNext(); - while (hasNext) { - Object key = it.next(); - Object value = it.getValue(); - buf.append(key == this ? "(this Map)" : key) - .append('=') - .append(value == this ? "(this Map)" : value); - - hasNext = it.hasNext(); - if (hasNext) { - buf.append(", "); - } - } - - buf.append('}'); - return buf.toString(); - } - - //----------------------------------------------------------------------- - /** - * A view of this map. - */ - static class View extends AbstractSet { - - /** The parent map. */ - protected final TreeBidiMap main; - /** Whether to return KEY or VALUE order. */ - protected final int orderType; - /** Whether to return KEY, VALUE, MAPENTRY or INVERSEMAPENTRY data. */ - protected final int dataType; - - /** - * Constructor. - * - * @param main the main map - * @param orderType the KEY or VALUE int for the order - * @param dataType the KEY, VALUE, MAPENTRY or INVERSEMAPENTRY int - */ - View(final TreeBidiMap main, final int orderType, final int dataType) { - super(); - this.main = main; - this.orderType = orderType; - this.dataType = dataType; - } - - public Iterator iterator() { - return new ViewIterator(main, orderType, dataType); - } - - public int size() { - return main.size(); - } - - public boolean contains(final Object obj) { - checkNonNullComparable(obj, dataType); - return (main.lookup((Comparable) obj, dataType) != null); - } - - public boolean remove(final Object obj) { - return (main.doRemove((Comparable) obj, dataType) != null); - } - - public void clear() { - main.clear(); - } - } - - //----------------------------------------------------------------------- - /** - * An iterator over the map. - */ - static class ViewIterator implements OrderedIterator { - - /** The parent map. */ - protected final TreeBidiMap main; - /** Whether to return KEY or VALUE order. */ - protected final int orderType; - /** Whether to return KEY, VALUE, MAPENTRY or INVERSEMAPENTRY data. */ - protected final int dataType; - /** The last node returned by the iterator. */ - protected Node lastReturnedNode; - /** The next node to be returned by the iterator. */ - protected Node nextNode; - /** The previous node in the sequence returned by the iterator. */ - protected Node previousNode; - /** The modification count. */ - private int expectedModifications; - - /** - * Constructor. - * - * @param main the main map - * @param orderType the KEY or VALUE int for the order - * @param dataType the KEY, VALUE, MAPENTRY or INVERSEMAPENTRY int - */ - ViewIterator(final TreeBidiMap main, final int orderType, final int dataType) { - super(); - this.main = main; - this.orderType = orderType; - this.dataType = dataType; - expectedModifications = main.modifications; - nextNode = leastNode(main.rootNode[orderType], orderType); - lastReturnedNode = null; - previousNode = null; - } - - public final boolean hasNext() { - return (nextNode != null); - } - - public final Object next() { - if (nextNode == null) { - throw new NoSuchElementException(); - } - if (main.modifications != expectedModifications) { - throw new ConcurrentModificationException(); - } - lastReturnedNode = nextNode; - previousNode = nextNode; - nextNode = main.nextGreater(nextNode, orderType); - return doGetData(); - } - - public boolean hasPrevious() { - return (previousNode != null); - } - - public Object previous() { - if (previousNode == null) { - throw new NoSuchElementException(); - } - if (main.modifications != expectedModifications) { - throw new ConcurrentModificationException(); - } - nextNode = lastReturnedNode; - if (nextNode == null) { - nextNode = main.nextGreater(previousNode, orderType); - } - lastReturnedNode = previousNode; - previousNode = main.nextSmaller(previousNode, orderType); - return doGetData(); - } - - /** - * Gets the data value for the lastReturnedNode field. - * @return the data value - */ - protected Object doGetData() { - switch (dataType) { - case KEY: - return lastReturnedNode.getKey(); - case VALUE: - return lastReturnedNode.getValue(); - case MAPENTRY: - return lastReturnedNode; - case INVERSEMAPENTRY: - return new UnmodifiableMapEntry(lastReturnedNode.getValue(), lastReturnedNode.getKey()); - } - return null; - } - - public final void remove() { - if (lastReturnedNode == null) { - throw new IllegalStateException(); - } - if (main.modifications != expectedModifications) { - throw new ConcurrentModificationException(); - } - main.doRedBlackDelete(lastReturnedNode); - expectedModifications++; - lastReturnedNode = null; - if (nextNode == null) { - previousNode = TreeBidiMap.greatestNode(main.rootNode[orderType], orderType); - } else { - previousNode = main.nextSmaller(nextNode, orderType); - } - } - } - - //----------------------------------------------------------------------- - /** - * An iterator over the map. - */ - static class ViewMapIterator extends ViewIterator implements OrderedMapIterator { - - private final int oppositeType; - - /** - * Constructor. - * - * @param main the main map - * @param orderType the KEY or VALUE int for the order - */ - ViewMapIterator(final TreeBidiMap main, final int orderType) { - super(main, orderType, orderType); - this.oppositeType = oppositeIndex(dataType); - } - - public Object getKey() { - if (lastReturnedNode == null) { - throw new IllegalStateException("Iterator getKey() can only be called after next() and before remove()"); - } - return lastReturnedNode.getData(dataType); - } - - public Object getValue() { - if (lastReturnedNode == null) { - throw new IllegalStateException("Iterator getValue() can only be called after next() and before remove()"); - } - return lastReturnedNode.getData(oppositeType); - } - - public Object setValue(final Object obj) { - throw new UnsupportedOperationException(); - } - } - - //----------------------------------------------------------------------- - /** - * A view of this map. - */ - static class EntryView extends View { - - private final int oppositeType; - - /** - * Constructor. - * - * @param main the main map - * @param orderType the KEY or VALUE int for the order - * @param dataType the MAPENTRY or INVERSEMAPENTRY int for the returned data - */ - EntryView(final TreeBidiMap main, final int orderType, final int dataType) { - super(main, orderType, dataType); - this.oppositeType = TreeBidiMap.oppositeIndex(orderType); - } - - public boolean contains(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - Object value = entry.getValue(); - Node node = main.lookup((Comparable) entry.getKey(), orderType); - return (node != null && node.getData(oppositeType).equals(value)); - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - Object value = entry.getValue(); - Node node = main.lookup((Comparable) entry.getKey(), orderType); - if (node != null && node.getData(oppositeType).equals(value)) { - main.doRedBlackDelete(node); - return true; - } - return false; - } - } - - //----------------------------------------------------------------------- - /** - * A node used to store the data. - */ - static class Node implements Map.Entry, KeyValue { - - private Comparable[] data; - private Node[] leftNode; - private Node[] rightNode; - private Node[] parentNode; - private boolean[] blackColor; - private int hashcodeValue; - private boolean calculatedHashCode; - - /** - * Make a new cell with given key and value, and with null - * links, and black (true) colors. - * - * @param key - * @param value - */ - Node(final Comparable key, final Comparable value) { - super(); - data = new Comparable[] { key, value }; - leftNode = new Node[2]; - rightNode = new Node[2]; - parentNode = new Node[2]; - blackColor = new boolean[] { true, true }; - calculatedHashCode = false; - } - - /** - * Get the specified data. - * - * @param index the KEY or VALUE int - * @return the key or value - */ - private Comparable getData(final int index) { - return data[index]; - } - - /** - * Set this node's left node. - * - * @param node the new left node - * @param index the KEY or VALUE int - */ - private void setLeft(final Node node, final int index) { - leftNode[index] = node; - } - - /** - * Get the left node. - * - * @param index the KEY or VALUE int - * @return the left node, may be null - */ - private Node getLeft(final int index) { - return leftNode[index]; - } - - /** - * Set this node's right node. - * - * @param node the new right node - * @param index the KEY or VALUE int - */ - private void setRight(final Node node, final int index) { - rightNode[index] = node; - } - - /** - * Get the right node. - * - * @param index the KEY or VALUE int - * @return the right node, may be null - */ - private Node getRight(final int index) { - return rightNode[index]; - } - - /** - * Set this node's parent node. - * - * @param node the new parent node - * @param index the KEY or VALUE int - */ - private void setParent(final Node node, final int index) { - parentNode[index] = node; - } - - /** - * Get the parent node. - * - * @param index the KEY or VALUE int - * @return the parent node, may be null - */ - private Node getParent(final int index) { - return parentNode[index]; - } - - /** - * Exchange colors with another node. - * - * @param node the node to swap with - * @param index the KEY or VALUE int - */ - private void swapColors(final Node node, final int index) { - // Swap colors -- old hacker's trick - blackColor[index] ^= node.blackColor[index]; - node.blackColor[index] ^= blackColor[index]; - blackColor[index] ^= node.blackColor[index]; - } - - /** - * Is this node black? - * - * @param index the KEY or VALUE int - * @return true if black (which is represented as a true boolean) - */ - private boolean isBlack(final int index) { - return blackColor[index]; - } - - /** - * Is this node red? - * - * @param index the KEY or VALUE int - * @return true if non-black - */ - private boolean isRed(final int index) { - return !blackColor[index]; - } - - /** - * Make this node black. - * - * @param index the KEY or VALUE int - */ - private void setBlack(final int index) { - blackColor[index] = true; - } - - /** - * Make this node red. - * - * @param index the KEY or VALUE int - */ - private void setRed(final int index) { - blackColor[index] = false; - } - - /** - * Make this node the same color as another - * - * @param node the node whose color we're adopting - * @param index the KEY or VALUE int - */ - private void copyColor(final Node node, final int index) { - blackColor[index] = node.blackColor[index]; - } - - //------------------------------------------------------------------- - /** - * Gets the key. - * - * @return the key corresponding to this entry. - */ - public Object getKey() { - return data[KEY]; - } - - /** - * Gets the value. - * - * @return the value corresponding to this entry. - */ - public Object getValue() { - return data[VALUE]; - } - - /** - * Optional operation that is not permitted in this implementation - * - * @param ignored - * @return does not return - * @throws UnsupportedOperationException always - */ - public Object setValue(final Object ignored) - throws UnsupportedOperationException { - throw new UnsupportedOperationException( - "Map.Entry.setValue is not supported"); - } - - /** - * Compares the specified object with this entry for equality. - * Returns true if the given object is also a map entry and - * the two entries represent the same mapping. - * - * @param obj the object to be compared for equality with this entry. - * @return true if the specified object is equal to this entry. - */ - public boolean equals(final Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof Map.Entry)) { - return false; - } - Map.Entry e = (Map.Entry) obj; - return data[KEY].equals(e.getKey()) && data[VALUE].equals(e.getValue()); - } - - /** - * @return the hash code value for this map entry. - */ - public int hashCode() { - if (!calculatedHashCode) { - hashcodeValue = data[KEY].hashCode() ^ data[VALUE].hashCode(); - calculatedHashCode = true; - } - return hashcodeValue; - } - } - - //----------------------------------------------------------------------- - /** - * A node used to store the data. - */ - static class Inverse implements OrderedBidiMap { - - /** The parent map. */ - private final TreeBidiMap main; - /** Store the keySet once created. */ - private Set keySet; - /** Store the valuesSet once created. */ - private Set valuesSet; - /** Store the entrySet once created. */ - private Set entrySet; - - /** - * Constructor. - * @param main the main map - */ - Inverse(final TreeBidiMap main) { - super(); - this.main = main; - } - - public int size() { - return main.size(); - } - - public boolean isEmpty() { - return main.isEmpty(); - } - - public Object get(final Object key) { - return main.getKey(key); - } - - public Object getKey(final Object value) { - return main.get(value); - } - - public boolean containsKey(final Object key) { - return main.containsValue(key); - } - - public boolean containsValue(final Object value) { - return main.containsKey(value); - } - - public Object firstKey() { - if (main.nodeCount == 0) { - throw new NoSuchElementException("Map is empty"); - } - return TreeBidiMap.leastNode(main.rootNode[VALUE], VALUE).getValue(); - } - - public Object lastKey() { - if (main.nodeCount == 0) { - throw new NoSuchElementException("Map is empty"); - } - return TreeBidiMap.greatestNode(main.rootNode[VALUE], VALUE).getValue(); - } - - public Object nextKey(Object key) { - checkKey(key); - Node node = main.nextGreater(main.lookup((Comparable) key, VALUE), VALUE); - return (node == null ? null : node.getValue()); - } - - public Object previousKey(Object key) { - checkKey(key); - Node node = main.nextSmaller(main.lookup((Comparable) key, VALUE), VALUE); - return (node == null ? null : node.getValue()); - } - - public Object put(final Object key, final Object value) { - return main.doPut((Comparable) value, (Comparable) key, VALUE); - } - - public void putAll(Map map) { - Iterator it = map.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - - public Object remove(final Object key) { - return main.removeValue(key); - } - - public Object removeValue(final Object value) { - return main.remove(value); - } - - public void clear() { - main.clear(); - } - - public Set keySet() { - if (keySet == null) { - keySet = new View(main, VALUE, VALUE); - } - return keySet; - } - - public Collection values() { - if (valuesSet == null) { - valuesSet = new View(main, VALUE, KEY); - } - return valuesSet; - } - - public Set entrySet() { - if (entrySet == null) { - return new EntryView(main, VALUE, INVERSEMAPENTRY); - } - return entrySet; - } - - public MapIterator mapIterator() { - if (isEmpty()) { - return EmptyOrderedMapIterator.INSTANCE; - } - return new ViewMapIterator(main, VALUE); - } - - public OrderedMapIterator orderedMapIterator() { - if (isEmpty()) { - return EmptyOrderedMapIterator.INSTANCE; - } - return new ViewMapIterator(main, VALUE); - } - - public BidiMap inverseBidiMap() { - return main; - } - - public OrderedBidiMap inverseOrderedBidiMap() { - return main; - } - - public boolean equals(Object obj) { - return main.doEquals(obj, VALUE); - } - - public int hashCode() { - return main.doHashCode(VALUE); - } - - public String toString() { - return main.doToString(VALUE); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableBidiMap.java deleted file mode 100644 index 07268841e67..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableBidiMap.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.iterators.UnmodifiableMapIterator; -import org.apache.commons.collections.map.UnmodifiableEntrySet; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another BidiMap to ensure it can't be altered. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableBidiMap - extends AbstractBidiMapDecorator implements Unmodifiable { - - /** The inverse unmodifiable map */ - private UnmodifiableBidiMap inverse; - - /** - * Factory method to create an unmodifiable map. - *

              - * If the map passed in is already unmodifiable, it is returned. - * - * @param map the map to decorate, must not be null - * @return an unmodifiable BidiMap - * @throws IllegalArgumentException if map is null - */ - public static BidiMap decorate(BidiMap map) { - if (map instanceof Unmodifiable) { - return map; - } - return new UnmodifiableBidiMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - private UnmodifiableBidiMap(BidiMap map) { - super(map); - } - - //----------------------------------------------------------------------- - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object put(Object key, Object value) { - throw new UnsupportedOperationException(); - } - - public void putAll(Map mapToCopy) { - throw new UnsupportedOperationException(); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - public Set entrySet() { - Set set = super.entrySet(); - return UnmodifiableEntrySet.decorate(set); - } - - public Set keySet() { - Set set = super.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = super.values(); - return UnmodifiableCollection.decorate(coll); - } - - //----------------------------------------------------------------------- - public Object removeValue(Object value) { - throw new UnsupportedOperationException(); - } - - public MapIterator mapIterator() { - MapIterator it = getBidiMap().mapIterator(); - return UnmodifiableMapIterator.decorate(it); - } - - public BidiMap inverseBidiMap() { - if (inverse == null) { - inverse = new UnmodifiableBidiMap(getBidiMap().inverseBidiMap()); - inverse.inverse = this; - } - return inverse; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.java deleted file mode 100644 index 03507fa16cb..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableOrderedBidiMap.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedBidiMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.iterators.UnmodifiableOrderedMapIterator; -import org.apache.commons.collections.map.UnmodifiableEntrySet; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another OrderedBidiMap to ensure it can't be altered. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableOrderedBidiMap - extends AbstractOrderedBidiMapDecorator implements Unmodifiable { - - /** The inverse unmodifiable map */ - private UnmodifiableOrderedBidiMap inverse; - - /** - * Factory method to create an unmodifiable map. - *

              - * If the map passed in is already unmodifiable, it is returned. - * - * @param map the map to decorate, must not be null - * @return an unmodifiable OrderedBidiMap - * @throws IllegalArgumentException if map is null - */ - public static OrderedBidiMap decorate(OrderedBidiMap map) { - if (map instanceof Unmodifiable) { - return map; - } - return new UnmodifiableOrderedBidiMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - private UnmodifiableOrderedBidiMap(OrderedBidiMap map) { - super(map); - } - - //----------------------------------------------------------------------- - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object put(Object key, Object value) { - throw new UnsupportedOperationException(); - } - - public void putAll(Map mapToCopy) { - throw new UnsupportedOperationException(); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - public Set entrySet() { - Set set = super.entrySet(); - return UnmodifiableEntrySet.decorate(set); - } - - public Set keySet() { - Set set = super.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = super.values(); - return UnmodifiableCollection.decorate(coll); - } - - //----------------------------------------------------------------------- - public Object removeValue(Object value) { - throw new UnsupportedOperationException(); - } - - public MapIterator mapIterator() { - return orderedMapIterator(); - } - - public BidiMap inverseBidiMap() { - return inverseOrderedBidiMap(); - } - - //----------------------------------------------------------------------- - public OrderedMapIterator orderedMapIterator() { - OrderedMapIterator it = getOrderedBidiMap().orderedMapIterator(); - return UnmodifiableOrderedMapIterator.decorate(it); - } - - public OrderedBidiMap inverseOrderedBidiMap() { - if (inverse == null) { - inverse = new UnmodifiableOrderedBidiMap(getOrderedBidiMap().inverseOrderedBidiMap()); - inverse.inverse = this; - } - return inverse; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.java deleted file mode 100644 index e9f7211300a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/UnmodifiableSortedBidiMap.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.bidimap; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; - -import org.apache.commons.collections.BidiMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedBidiMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.SortedBidiMap; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.iterators.UnmodifiableOrderedMapIterator; -import org.apache.commons.collections.map.UnmodifiableEntrySet; -import org.apache.commons.collections.map.UnmodifiableSortedMap; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another SortedBidiMap to ensure it can't be altered. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableSortedBidiMap - extends AbstractSortedBidiMapDecorator implements Unmodifiable { - - /** The inverse unmodifiable map */ - private UnmodifiableSortedBidiMap inverse; - - /** - * Factory method to create an unmodifiable map. - *

              - * If the map passed in is already unmodifiable, it is returned. - * - * @param map the map to decorate, must not be null - * @return an unmodifiable SortedBidiMap - * @throws IllegalArgumentException if map is null - */ - public static SortedBidiMap decorate(SortedBidiMap map) { - if (map instanceof Unmodifiable) { - return map; - } - return new UnmodifiableSortedBidiMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - private UnmodifiableSortedBidiMap(SortedBidiMap map) { - super(map); - } - - //----------------------------------------------------------------------- - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object put(Object key, Object value) { - throw new UnsupportedOperationException(); - } - - public void putAll(Map mapToCopy) { - throw new UnsupportedOperationException(); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - public Set entrySet() { - Set set = super.entrySet(); - return UnmodifiableEntrySet.decorate(set); - } - - public Set keySet() { - Set set = super.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = super.values(); - return UnmodifiableCollection.decorate(coll); - } - - //----------------------------------------------------------------------- - public Object removeValue(Object value) { - throw new UnsupportedOperationException(); - } - - public MapIterator mapIterator() { - return orderedMapIterator(); - } - - public BidiMap inverseBidiMap() { - return inverseSortedBidiMap(); - } - - //----------------------------------------------------------------------- - public OrderedMapIterator orderedMapIterator() { - OrderedMapIterator it = getSortedBidiMap().orderedMapIterator(); - return UnmodifiableOrderedMapIterator.decorate(it); - } - - public OrderedBidiMap inverseOrderedBidiMap() { - return inverseSortedBidiMap(); - } - - //----------------------------------------------------------------------- - public SortedBidiMap inverseSortedBidiMap() { - if (inverse == null) { - inverse = new UnmodifiableSortedBidiMap(getSortedBidiMap().inverseSortedBidiMap()); - inverse.inverse = this; - } - return inverse; - } - - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap sm = getSortedBidiMap().subMap(fromKey, toKey); - return UnmodifiableSortedMap.decorate(sm); - } - - public SortedMap headMap(Object toKey) { - SortedMap sm = getSortedBidiMap().headMap(toKey); - return UnmodifiableSortedMap.decorate(sm); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap sm = getSortedBidiMap().tailMap(fromKey); - return UnmodifiableSortedMap.decorate(sm); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/package.html deleted file mode 100644 index 7ec5289fe79..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/bidimap/package.html +++ /dev/null @@ -1,48 +0,0 @@ - - - -

              -This package contains implementations of the -{@link org.apache.commons.collections.BidiMap BidiMap}, -{@link org.apache.commons.collections.OrderedBidiMap OrderedBidiMap} and -{@link org.apache.commons.collections.SortedBidiMap SortedBidiMap} interfaces. -A BidiMap is an extension to Map that allows keys and values to be looked up with equal ease. -One example usage is a system communicating to a legacy datasource that must convert codes -from the new format to the old format and vice versa. -

              -The following implementations are provided in the package: -

                -
              • DualHashBidiMap - uses two HashMaps to implement BidiMap -
              • DualTreeBidiMap - uses two TreeMaps to implement SortedBidiMap -
              • TreeBidiMap - red-black tree implementation of OrderedBidiMap -
              -

              -The following decorators are provided in the package: -

                -
              • Unmodifiable - ensures the map cannot be altered - -
              - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/AbstractBufferDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/AbstractBufferDecorator.java deleted file mode 100644 index d3a644128e8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/AbstractBufferDecorator.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.collection.AbstractCollectionDecorator; - -/** - * Decorates another Buffer to provide additional behaviour. - *

              - * Methods are forwarded directly to the decorated buffer. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractBufferDecorator extends AbstractCollectionDecorator implements Buffer { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractBufferDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param buffer the buffer to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected AbstractBufferDecorator(Buffer buffer) { - super(buffer); - } - - /** - * Gets the buffer being decorated. - * - * @return the decorated buffer - */ - protected Buffer getBuffer() { - return (Buffer) getCollection(); - } - - //----------------------------------------------------------------------- - public Object get() { - return getBuffer().get(); - } - - public Object remove() { - return getBuffer().remove(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BlockingBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BlockingBuffer.java deleted file mode 100644 index 27bcc9557b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BlockingBuffer.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Collection; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.BufferUnderflowException; - -/** - * Decorates another Buffer to make {@link #get()} and - * {@link #remove()} block when the Buffer is empty. - *

              - * If either get or remove is called on an empty - * Buffer, the calling thread waits for notification that - * an add or addAll operation has completed. - *

              - * When one or more entries are added to an empty Buffer, - * all threads blocked in get or remove are notified. - * There is no guarantee that concurrent blocked get or - * remove requests will be "unblocked" and receive data in the - * order that they arrive. - *

              - * This class is Serializable from Commons Collections 3.1. - * This class contains an extra field in 3.2, however the serialization - * specification will handle this gracefully. - * - * @author Stephen Colebourne - * @author Janek Bogucki - * @author Phil Steitz - * @author James Carman - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * @since Commons Collections 3.0 - */ -public class BlockingBuffer extends SynchronizedBuffer { - - /** Serialization version. */ - private static final long serialVersionUID = 1719328905017860541L; - /** The timeout value in milliseconds. */ - private final long timeout; - - /** - * Factory method to create a blocking buffer. - * - * @param buffer the buffer to decorate, must not be null - * @return a new blocking Buffer - * @throws IllegalArgumentException if buffer is null - */ - public static Buffer decorate(Buffer buffer) { - return new BlockingBuffer(buffer); - } - - /** - * Factory method to create a blocking buffer with a timeout value. - * - * @param buffer the buffer to decorate, must not be null - * @param timeoutMillis the timeout value in milliseconds, zero or less for no timeout - * @return a new blocking buffer - * @throws IllegalArgumentException if the buffer is null - * @since Commons Collections 3.2 - */ - public static Buffer decorate(Buffer buffer, long timeoutMillis) { - return new BlockingBuffer(buffer, timeoutMillis); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param buffer the buffer to decorate, must not be null - * @throws IllegalArgumentException if the buffer is null - */ - protected BlockingBuffer(Buffer buffer) { - super(buffer); - this.timeout = 0; - } - - /** - * Constructor that wraps (not copies). - * - * @param buffer the buffer to decorate, must not be null - * @param timeoutMillis the timeout value in milliseconds, zero or less for no timeout - * @throws IllegalArgumentException if the buffer is null - * @since Commons Collections 3.2 - */ - protected BlockingBuffer(Buffer buffer, long timeoutMillis) { - super(buffer); - this.timeout = (timeoutMillis < 0 ? 0 : timeoutMillis); - } - - //----------------------------------------------------------------------- - public boolean add(Object o) { - synchronized (lock) { - boolean result = collection.add(o); - lock.notifyAll(); - return result; - } - } - - public boolean addAll(Collection c) { - synchronized (lock) { - boolean result = collection.addAll(c); - lock.notifyAll(); - return result; - } - } - - /** - * Gets the next value from the buffer, waiting until an object is - * added if the buffer is empty. This method uses the default timeout - * set in the constructor. - * - * @throws BufferUnderflowException if an interrupt is received - */ - public Object get() { - synchronized (lock) { - while (collection.isEmpty()) { - try { - if (timeout <= 0) { - lock.wait(); - } else { - return get(timeout); - } - } catch (InterruptedException e) { - PrintWriter out = new PrintWriter(new StringWriter()); - e.printStackTrace(out); - throw new BufferUnderflowException("Caused by InterruptedException: " + out.toString()); - } - } - return getBuffer().get(); - } - } - - /** - * Gets the next value from the buffer, waiting until an object is - * added for up to the specified timeout value if the buffer is empty. - * - * @param timeout the timeout value in milliseconds - * @throws BufferUnderflowException if an interrupt is received - * @throws BufferUnderflowException if the timeout expires - * @since Commons Collections 3.2 - */ - public Object get(final long timeout) { - synchronized (lock) { - final long expiration = System.currentTimeMillis() + timeout; - long timeLeft = expiration - System.currentTimeMillis(); - while (timeLeft > 0 && collection.isEmpty()) { - try { - lock.wait(timeLeft); - timeLeft = expiration - System.currentTimeMillis(); - } catch(InterruptedException e) { - PrintWriter out = new PrintWriter(new StringWriter()); - e.printStackTrace(out); - throw new BufferUnderflowException("Caused by InterruptedException: " + out.toString()); - } - } - if (collection.isEmpty()) { - throw new BufferUnderflowException("Timeout expired"); - } - return getBuffer().get(); - } - } - - /** - * Removes the next value from the buffer, waiting until an object is - * added if the buffer is empty. This method uses the default timeout - * set in the constructor. - * - * @throws BufferUnderflowException if an interrupt is received - */ - public Object remove() { - synchronized (lock) { - while (collection.isEmpty()) { - try { - if (timeout <= 0) { - lock.wait(); - } else { - return remove(timeout); - } - } catch (InterruptedException e) { - PrintWriter out = new PrintWriter(new StringWriter()); - e.printStackTrace(out); - throw new BufferUnderflowException("Caused by InterruptedException: " + out.toString()); - } - } - return getBuffer().remove(); - } - } - - /** - * Removes the next value from the buffer, waiting until an object is - * added for up to the specified timeout value if the buffer is empty. - * - * @param timeout the timeout value in milliseconds - * @throws BufferUnderflowException if an interrupt is received - * @throws BufferUnderflowException if the timeout expires - * @since Commons Collections 3.2 - */ - public Object remove(final long timeout) { - synchronized (lock) { - final long expiration = System.currentTimeMillis() + timeout; - long timeLeft = expiration - System.currentTimeMillis(); - while (timeLeft > 0 && collection.isEmpty()) { - try { - lock.wait(timeLeft); - timeLeft = expiration - System.currentTimeMillis(); - } catch(InterruptedException e) { - PrintWriter out = new PrintWriter(new StringWriter()); - e.printStackTrace(out); - throw new BufferUnderflowException("Caused by InterruptedException: " + out.toString()); - } - } - if (collection.isEmpty()) { - throw new BufferUnderflowException("Timeout expired"); - } - return getBuffer().remove(); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedBuffer.java deleted file mode 100644 index 5cd6ab085b9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedBuffer.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.BoundedCollection; -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.BufferOverflowException; -import org.apache.commons.collections.BufferUnderflowException; -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; - -/** - * Decorates another Buffer to ensure a fixed maximum size. - *

              - * Note: This class should only be used if you need to add bounded - * behaviour to another buffer. If you just want a bounded buffer then - * you should use {@link BoundedFifoBuffer} or {@link CircularFifoBuffer}. - *

              - * The decoration methods allow you to specify a timeout value. - * This alters the behaviour of the add methods when the buffer is full. - * Normally, when the buffer is full, the add method will throw an exception. - * With a timeout, the add methods will wait for up to the timeout period - * to try and add the elements. - * - * @author James Carman - * @author Stephen Colebourne - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * @since Commons Collections 3.2 - */ -public class BoundedBuffer extends SynchronizedBuffer implements BoundedCollection { - - /** The serialization version. */ - private static final long serialVersionUID = 1536432911093974264L; - - /** The maximum size. */ - private final int maximumSize; - /** The timeout milliseconds. */ - private final long timeout; - - /** - * Factory method to create a bounded buffer. - *

              - * When the buffer is full, it will immediately throw a - * BufferOverflowException on calling add(). - * - * @param buffer the buffer to decorate, must not be null - * @param maximumSize the maximum size, must be size one or greater - * @return a new bounded buffer - * @throws IllegalArgumentException if the buffer is null - * @throws IllegalArgumentException if the maximum size is zero or less - */ - public static BoundedBuffer decorate(Buffer buffer, int maximumSize) { - return new BoundedBuffer(buffer, maximumSize, 0L); - } - - /** - * Factory method to create a bounded buffer that blocks for a maximum - * amount of time. - * - * @param buffer the buffer to decorate, must not be null - * @param maximumSize the maximum size, must be size one or greater - * @param timeout the maximum amount of time to wait in milliseconds - * @return a new bounded buffer - * @throws IllegalArgumentException if the buffer is null - * @throws IllegalArgumentException if the maximum size is zero or less - */ - public static BoundedBuffer decorate(Buffer buffer, int maximumSize, long timeout) { - return new BoundedBuffer(buffer, maximumSize, timeout); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies) another buffer, making it bounded - * waiting only up to a maximum amount of time. - * - * @param buffer the buffer to wrap, must not be null - * @param maximumSize the maximum size, must be size one or greater - * @param timeout the maximum amount of time to wait - * @throws IllegalArgumentException if the buffer is null - * @throws IllegalArgumentException if the maximum size is zero or less - */ - protected BoundedBuffer(Buffer buffer, int maximumSize, long timeout) { - super(buffer); - if (maximumSize < 1) { - throw new IllegalArgumentException(); - } - this.maximumSize = maximumSize; - this.timeout = timeout; - } - - //----------------------------------------------------------------------- - public Object remove() { - synchronized (lock) { - Object returnValue = getBuffer().remove(); - lock.notifyAll(); - return returnValue; - } - } - - public boolean add(Object o) { - synchronized (lock) { - timeoutWait(1); - return getBuffer().add(o); - } - } - - public boolean addAll(final Collection c) { - synchronized (lock) { - timeoutWait(c.size()); - return getBuffer().addAll(c); - } - } - - public Iterator iterator() { - return new NotifyingIterator(collection.iterator()); - } - - private void timeoutWait(final int nAdditions) { - // method synchronized by callers - if (nAdditions > maximumSize) { - throw new BufferOverflowException( - "Buffer size cannot exceed " + maximumSize); - } - if (timeout <= 0) { - // no wait period (immediate timeout) - if (getBuffer().size() + nAdditions > maximumSize) { - throw new BufferOverflowException( - "Buffer size cannot exceed " + maximumSize); - } - return; - } - final long expiration = System.currentTimeMillis() + timeout; - long timeLeft = expiration - System.currentTimeMillis(); - while (timeLeft > 0 && getBuffer().size() + nAdditions > maximumSize) { - try { - lock.wait(timeLeft); - timeLeft = expiration - System.currentTimeMillis(); - } catch (InterruptedException ex) { - PrintWriter out = new PrintWriter(new StringWriter()); - ex.printStackTrace(out); - throw new BufferUnderflowException( - "Caused by InterruptedException: " + out.toString()); - } - } - if (getBuffer().size() + nAdditions > maximumSize) { - throw new BufferOverflowException("Timeout expired"); - } - } - - public boolean isFull() { - // size() is synchronized - return (size() == maxSize()); - } - - public int maxSize() { - return maximumSize; - } - - //----------------------------------------------------------------------- - /** - * BoundedBuffer iterator. - */ - private class NotifyingIterator extends AbstractIteratorDecorator { - - public NotifyingIterator(Iterator it) { - super(it); - } - - public void remove() { - synchronized (lock) { - iterator.remove(); - lock.notifyAll(); - } - } - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedFifoBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedFifoBuffer.java deleted file mode 100644 index 95a460faa70..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/BoundedFifoBuffer.java +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.AbstractCollection; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.BoundedCollection; -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.BufferOverflowException; -import org.apache.commons.collections.BufferUnderflowException; - -/** - * The BoundedFifoBuffer is a very efficient implementation of - * Buffer that is of a fixed size. - *

              - * The removal order of a BoundedFifoBuffer is based on the - * insertion order; elements are removed in the same order in which they - * were added. The iteration order is the same as the removal order. - *

              - * The {@link #add(Object)}, {@link #remove()} and {@link #get()} operations - * all perform in constant time. All other operations perform in linear - * time or worse. - *

              - * Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your BoundedFifoBuffer: - *

              - *   Buffer fifo = BufferUtils.synchronizedBuffer(new BoundedFifoBuffer());
              - * 
              - *

              - * This buffer prevents null objects from being added. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 (previously in main package v2.1) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Berin Loritsch - * @author Paul Jack - * @author Stephen Colebourne - * @author Herve Quiroz - */ -public class BoundedFifoBuffer extends AbstractCollection - implements Buffer, BoundedCollection, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 5603722811189451017L; - - /** Underlying storage array */ - private transient Object[] elements; - - /** Array index of first (oldest) buffer element */ - private transient int start = 0; - - /** - * Index mod maxElements of the array position following the last buffer - * element. Buffer elements start at elements[start] and "wrap around" - * elements[maxElements-1], ending at elements[decrement(end)]. - * For example, elements = {c,a,b}, start=1, end=1 corresponds to - * the buffer [a,b,c]. - */ - private transient int end = 0; - - /** Flag to indicate if the buffer is currently full. */ - private transient boolean full = false; - - /** Capacity of the buffer */ - private final int maxElements; - - /** - * Constructs a new BoundedFifoBuffer big enough to hold - * 32 elements. - */ - public BoundedFifoBuffer() { - this(32); - } - - /** - * Constructs a new BoundedFifoBuffer big enough to hold - * the specified number of elements. - * - * @param size the maximum number of elements for this fifo - * @throws IllegalArgumentException if the size is less than 1 - */ - public BoundedFifoBuffer(int size) { - if (size <= 0) { - throw new IllegalArgumentException("The size must be greater than 0"); - } - elements = new Object[size]; - maxElements = elements.length; - } - - /** - * Constructs a new BoundedFifoBuffer big enough to hold all - * of the elements in the specified collection. That collection's - * elements will also be added to the buffer. - * - * @param coll the collection whose elements to add, may not be null - * @throws NullPointerException if the collection is null - */ - public BoundedFifoBuffer(Collection coll) { - this(coll.size()); - addAll(coll); - } - - //----------------------------------------------------------------------- - /** - * Write the buffer out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeInt(size()); - for (Iterator it = iterator(); it.hasNext();) { - out.writeObject(it.next()); - } - } - - /** - * Read the buffer in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - elements = new Object[maxElements]; - int size = in.readInt(); - for (int i = 0; i < size; i++) { - elements[i] = in.readObject(); - } - start = 0; - full = (size == maxElements); - if (full) { - end = 0; - } else { - end = size; - } - } - - //----------------------------------------------------------------------- - /** - * Returns the number of elements stored in the buffer. - * - * @return this buffer's size - */ - public int size() { - int size = 0; - - if (end < start) { - size = maxElements - start + end; - } else if (end == start) { - size = (full ? maxElements : 0); - } else { - size = end - start; - } - - return size; - } - - /** - * Returns true if this buffer is empty; false otherwise. - * - * @return true if this buffer is empty - */ - public boolean isEmpty() { - return size() == 0; - } - - /** - * Returns true if this collection is full and no new elements can be added. - * - * @return true if the collection is full - */ - public boolean isFull() { - return size() == maxElements; - } - - /** - * Gets the maximum size of the collection (the bound). - * - * @return the maximum number of elements the collection can hold - */ - public int maxSize() { - return maxElements; - } - - /** - * Clears this buffer. - */ - public void clear() { - full = false; - start = 0; - end = 0; - Arrays.fill(elements, null); - } - - /** - * Adds the given element to this buffer. - * - * @param element the element to add - * @return true, always - * @throws NullPointerException if the given element is null - * @throws BufferOverflowException if this buffer is full - */ - public boolean add(Object element) { - if (null == element) { - throw new NullPointerException("Attempted to add null object to buffer"); - } - - if (full) { - throw new BufferOverflowException("The buffer cannot hold more than " + maxElements + " objects."); - } - - elements[end++] = element; - - if (end >= maxElements) { - end = 0; - } - - if (end == start) { - full = true; - } - - return true; - } - - /** - * Returns the least recently inserted element in this buffer. - * - * @return the least recently inserted element - * @throws BufferUnderflowException if the buffer is empty - */ - public Object get() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - return elements[start]; - } - - /** - * Removes the least recently inserted element from this buffer. - * - * @return the least recently inserted element - * @throws BufferUnderflowException if the buffer is empty - */ - public Object remove() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - Object element = elements[start]; - - if (null != element) { - elements[start++] = null; - - if (start >= maxElements) { - start = 0; - } - - full = false; - } - - return element; - } - - /** - * Increments the internal index. - * - * @param index the index to increment - * @return the updated index - */ - private int increment(int index) { - index++; - if (index >= maxElements) { - index = 0; - } - return index; - } - - /** - * Decrements the internal index. - * - * @param index the index to decrement - * @return the updated index - */ - private int decrement(int index) { - index--; - if (index < 0) { - index = maxElements - 1; - } - return index; - } - - /** - * Returns an iterator over this buffer's elements. - * - * @return an iterator over this buffer's elements - */ - public Iterator iterator() { - return new Iterator() { - - private int index = start; - private int lastReturnedIndex = -1; - private boolean isFirst = full; - - public boolean hasNext() { - return isFirst || (index != end); - - } - - public Object next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - isFirst = false; - lastReturnedIndex = index; - index = increment(index); - return elements[lastReturnedIndex]; - } - - public void remove() { - if (lastReturnedIndex == -1) { - throw new IllegalStateException(); - } - - // First element can be removed quickly - if (lastReturnedIndex == start) { - BoundedFifoBuffer.this.remove(); - lastReturnedIndex = -1; - return; - } - - int pos = lastReturnedIndex + 1; - if (start < lastReturnedIndex && pos < end) { - // shift in one part - System.arraycopy(elements, pos, elements, - lastReturnedIndex, end - pos); - } else { - // Other elements require us to shift the subsequent elements - while (pos != end) { - if (pos >= maxElements) { - elements[pos - 1] = elements[0]; - pos = 0; - } else { - elements[decrement(pos)] = elements[pos]; - pos = increment(pos); - } - } - } - - lastReturnedIndex = -1; - end = decrement(end); - elements[end] = null; - full = false; - index = decrement(index); - } - - }; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/CircularFifoBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/CircularFifoBuffer.java deleted file mode 100644 index 2aadf178853..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/CircularFifoBuffer.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.util.Collection; - -/** - * CircularFifoBuffer is a first in first out buffer with a fixed size that - * replaces its oldest element if full. - *

              - * The removal order of a CircularFifoBuffer is based on the - * insertion order; elements are removed in the same order in which they - * were added. The iteration order is the same as the removal order. - *

              - * The {@link #add(Object)}, {@link #remove()} and {@link #get()} operations - * all perform in constant time. All other operations perform in linear - * time or worse. - *

              - * Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your CircularFifoBuffer: - *

              - *   Buffer fifo = BufferUtils.synchronizedBuffer(new CircularFifoBuffer());
              - * 
              - *

              - * This buffer prevents null objects from being added. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stefano Fornari - * @author Stephen Colebourne - */ -public class CircularFifoBuffer extends BoundedFifoBuffer { - - /** Serialization version */ - private static final long serialVersionUID = -8423413834657610406L; - - /** - * Constructor that creates a buffer with the default size of 32. - */ - public CircularFifoBuffer() { - super(32); - } - - /** - * Constructor that creates a buffer with the specified size. - * - * @param size the size of the buffer (cannot be changed) - * @throws IllegalArgumentException if the size is less than 1 - */ - public CircularFifoBuffer(int size) { - super(size); - } - - /** - * Constructor that creates a buffer from the specified collection. - * The collection size also sets the buffer size - * - * @param coll the collection to copy into the buffer, may not be null - * @throws NullPointerException if the collection is null - */ - public CircularFifoBuffer(Collection coll) { - super(coll); - } - - /** - * If the buffer is full, the least recently added element is discarded so - * that a new element can be inserted. - * - * @param element the element to add - * @return true, always - */ - public boolean add(Object element) { - if (isFull()) { - remove(); - } - return super.add(element); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PredicatedBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PredicatedBuffer.java deleted file mode 100644 index 9541220b929..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PredicatedBuffer.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.collection.PredicatedCollection; - -/** - * Decorates another Buffer to validate that additions - * match a specified predicate. - *

              - * This buffer exists to provide validation for the decorated buffer. - * It is normally created to decorate an empty buffer. - * If an object cannot be added to the buffer, an IllegalArgumentException is thrown. - *

              - * One usage would be to ensure that no null entries are added to the buffer. - *

              Buffer buffer = PredicatedBuffer.decorate(new UnboundedFifoBuffer(), NotNullPredicate.INSTANCE);
              - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedBuffer extends PredicatedCollection implements Buffer { - - /** Serialization version */ - private static final long serialVersionUID = 2307609000539943581L; - - /** - * Factory method to create a predicated (validating) buffer. - *

              - * If there are any elements already in the buffer being decorated, they - * are validated. - * - * @param buffer the buffer to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @return a new predicated Buffer - * @throws IllegalArgumentException if buffer or predicate is null - * @throws IllegalArgumentException if the buffer contains invalid elements - */ - public static Buffer decorate(Buffer buffer, Predicate predicate) { - return new PredicatedBuffer(buffer, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the collection being decorated, they - * are validated. - * - * @param buffer the buffer to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if buffer or predicate is null - * @throws IllegalArgumentException if the buffer contains invalid elements - */ - protected PredicatedBuffer(Buffer buffer, Predicate predicate) { - super(buffer, predicate); - } - - /** - * Gets the buffer being decorated. - * - * @return the decorated buffer - */ - protected Buffer getBuffer() { - return (Buffer) getCollection(); - } - - //----------------------------------------------------------------------- - public Object get() { - return getBuffer().get(); - } - - public Object remove() { - return getBuffer().remove(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PriorityBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PriorityBuffer.java deleted file mode 100644 index 9cf5317b854..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/PriorityBuffer.java +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.io.Serializable; -import java.util.AbstractCollection; -import java.util.Comparator; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.BufferUnderflowException; - -/** - * Binary heap implementation of Buffer that provides for - * removal based on Comparator ordering. - *

              - * The removal order of a binary heap is based on either the natural sort - * order of its elements or a specified {@link Comparator}. The - * {@link #remove()} method always returns the first element as determined - * by the sort order. (The ascendingOrder flag in the constructors - * can be used to reverse the sort order, in which case {@link #remove()} - * will always remove the last element.) The removal order is - * not the same as the order of iteration; elements are - * returned by the iterator in no particular order. - *

              - * The {@link #add(Object)} and {@link #remove()} operations perform - * in logarithmic time. The {@link #get()} operation performs in constant - * time. All other operations perform in linear time or worse. - *

              - * Note that this implementation is not synchronized. Use - * {@link org.apache.commons.collections.BufferUtils#synchronizedBuffer(Buffer)} or - * {@link org.apache.commons.collections.buffer.SynchronizedBuffer#decorate(Buffer)} - * to provide synchronized access to a PriorityBuffer: - *

              - * Buffer heap = SynchronizedBuffer.decorate(new PriorityBuffer());
              - * 
              - *

              - * This class is Serializable from Commons Collections 3.2. - * - * @since Commons Collections 3.0 (previously BinaryHeap v1.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Peter Donald - * @author Ram Chidambaram - * @author Michael A. Smith - * @author Paul Jack - * @author Stephen Colebourne - * @author Steve Phelps - */ -public class PriorityBuffer extends AbstractCollection - implements Buffer, Serializable { - - /** Serialization lock. */ - private static final long serialVersionUID = 6891186490470027896L; - - /** - * The default capacity for the buffer. - */ - private static final int DEFAULT_CAPACITY = 13; - - /** - * The elements in this buffer. - */ - protected Object[] elements; - /** - * The number of elements currently in this buffer. - */ - protected int size; - /** - * If true, the first element as determined by the sort order will - * be returned. If false, the last element as determined by the - * sort order will be returned. - */ - protected boolean ascendingOrder; - /** - * The comparator used to order the elements - */ - protected Comparator comparator; - - //----------------------------------------------------------------------- - /** - * Constructs a new empty buffer that sorts in ascending order by the - * natural order of the objects added. - */ - public PriorityBuffer() { - this(DEFAULT_CAPACITY, true, null); - } - - /** - * Constructs a new empty buffer that sorts in ascending order using the - * specified comparator. - * - * @param comparator the comparator used to order the elements, - * null means use natural order - */ - public PriorityBuffer(Comparator comparator) { - this(DEFAULT_CAPACITY, true, comparator); - } - - /** - * Constructs a new empty buffer specifying the sort order and using the - * natural order of the objects added. - * - * @param ascendingOrder if true the heap is created as a - * minimum heap; otherwise, the heap is created as a maximum heap - */ - public PriorityBuffer(boolean ascendingOrder) { - this(DEFAULT_CAPACITY, ascendingOrder, null); - } - - /** - * Constructs a new empty buffer specifying the sort order and comparator. - * - * @param ascendingOrder true to use the order imposed by the given - * comparator; false to reverse that order - * @param comparator the comparator used to order the elements, - * null means use natural order - */ - public PriorityBuffer(boolean ascendingOrder, Comparator comparator) { - this(DEFAULT_CAPACITY, ascendingOrder, comparator); - } - - /** - * Constructs a new empty buffer that sorts in ascending order by the - * natural order of the objects added, specifying an initial capacity. - * - * @param capacity the initial capacity for the buffer, greater than zero - * @throws IllegalArgumentException if capacity is <= 0 - */ - public PriorityBuffer(int capacity) { - this(capacity, true, null); - } - - /** - * Constructs a new empty buffer that sorts in ascending order using the - * specified comparator and initial capacity. - * - * @param capacity the initial capacity for the buffer, greater than zero - * @param comparator the comparator used to order the elements, - * null means use natural order - * @throws IllegalArgumentException if capacity is <= 0 - */ - public PriorityBuffer(int capacity, Comparator comparator) { - this(capacity, true, comparator); - } - - /** - * Constructs a new empty buffer that specifying initial capacity and - * sort order, using the natural order of the objects added. - * - * @param capacity the initial capacity for the buffer, greater than zero - * @param ascendingOrder if true the heap is created as a - * minimum heap; otherwise, the heap is created as a maximum heap. - * @throws IllegalArgumentException if capacity is <= 0 - */ - public PriorityBuffer(int capacity, boolean ascendingOrder) { - this(capacity, ascendingOrder, null); - } - - /** - * Constructs a new empty buffer that specifying initial capacity, - * sort order and comparator. - * - * @param capacity the initial capacity for the buffer, greater than zero - * @param ascendingOrder true to use the order imposed by the given - * comparator; false to reverse that order - * @param comparator the comparator used to order the elements, - * null means use natural order - * @throws IllegalArgumentException if capacity is <= 0 - */ - public PriorityBuffer(int capacity, boolean ascendingOrder, Comparator comparator) { - super(); - if (capacity <= 0) { - throw new IllegalArgumentException("invalid capacity"); - } - this.ascendingOrder = ascendingOrder; - - //+1 as 0 is noop - this.elements = new Object[capacity + 1]; - this.comparator = comparator; - } - - //----------------------------------------------------------------------- - /** - * Checks whether the heap is ascending or descending order. - * - * @return true if ascending order (a min heap) - */ - public boolean isAscendingOrder() { - return ascendingOrder; - } - - /** - * Gets the comparator being used for this buffer, null is natural order. - * - * @return the comparator in use, null is natural order - */ - public Comparator comparator() { - return comparator; - } - - //----------------------------------------------------------------------- - /** - * Returns the number of elements in this buffer. - * - * @return the number of elements in this buffer - */ - public int size() { - return size; - } - - /** - * Clears all elements from the buffer. - */ - public void clear() { - elements = new Object[elements.length]; // for gc - size = 0; - } - - /** - * Adds an element to the buffer. - *

              - * The element added will be sorted according to the comparator in use. - * - * @param element the element to be added - * @return true always - */ - public boolean add(Object element) { - if (isAtCapacity()) { - grow(); - } - // percolate element to it's place in tree - if (ascendingOrder) { - percolateUpMinHeap(element); - } else { - percolateUpMaxHeap(element); - } - return true; - } - - /** - * Gets the next element to be removed without actually removing it (peek). - * - * @return the next element - * @throws BufferUnderflowException if the buffer is empty - */ - public Object get() { - if (isEmpty()) { - throw new BufferUnderflowException(); - } else { - return elements[1]; - } - } - - /** - * Gets and removes the next element (pop). - * - * @return the next element - * @throws BufferUnderflowException if the buffer is empty - */ - public Object remove() { - final Object result = get(); - elements[1] = elements[size--]; - - // set the unused element to 'null' so that the garbage collector - // can free the object if not used anywhere else.(remove reference) - elements[size + 1] = null; - - if (size != 0) { - // percolate top element to it's place in tree - if (ascendingOrder) { - percolateDownMinHeap(1); - } else { - percolateDownMaxHeap(1); - } - } - - return result; - } - - //----------------------------------------------------------------------- - /** - * Tests if the buffer is at capacity. - * - * @return true if buffer is full; false otherwise. - */ - protected boolean isAtCapacity() { - //+1 as element 0 is noop - return elements.length == size + 1; - } - - - /** - * Percolates element down heap from the position given by the index. - *

              - * Assumes it is a minimum heap. - * - * @param index the index for the element - */ - protected void percolateDownMinHeap(final int index) { - final Object element = elements[index]; - int hole = index; - - while ((hole * 2) <= size) { - int child = hole * 2; - - // if we have a right child and that child can not be percolated - // up then move onto other child - if (child != size && compare(elements[child + 1], elements[child]) < 0) { - child++; - } - - // if we found resting place of bubble then terminate search - if (compare(elements[child], element) >= 0) { - break; - } - - elements[hole] = elements[child]; - hole = child; - } - - elements[hole] = element; - } - - /** - * Percolates element down heap from the position given by the index. - *

              - * Assumes it is a maximum heap. - * - * @param index the index of the element - */ - protected void percolateDownMaxHeap(final int index) { - final Object element = elements[index]; - int hole = index; - - while ((hole * 2) <= size) { - int child = hole * 2; - - // if we have a right child and that child can not be percolated - // up then move onto other child - if (child != size && compare(elements[child + 1], elements[child]) > 0) { - child++; - } - - // if we found resting place of bubble then terminate search - if (compare(elements[child], element) <= 0) { - break; - } - - elements[hole] = elements[child]; - hole = child; - } - - elements[hole] = element; - } - - /** - * Percolates element up heap from the position given by the index. - *

              - * Assumes it is a minimum heap. - * - * @param index the index of the element to be percolated up - */ - protected void percolateUpMinHeap(final int index) { - int hole = index; - Object element = elements[hole]; - while (hole > 1 && compare(element, elements[hole / 2]) < 0) { - // save element that is being pushed down - // as the element "bubble" is percolated up - final int next = hole / 2; - elements[hole] = elements[next]; - hole = next; - } - elements[hole] = element; - } - - /** - * Percolates a new element up heap from the bottom. - *

              - * Assumes it is a minimum heap. - * - * @param element the element - */ - protected void percolateUpMinHeap(final Object element) { - elements[++size] = element; - percolateUpMinHeap(size); - } - - /** - * Percolates element up heap from from the position given by the index. - *

              - * Assume it is a maximum heap. - * - * @param index the index of the element to be percolated up - */ - protected void percolateUpMaxHeap(final int index) { - int hole = index; - Object element = elements[hole]; - - while (hole > 1 && compare(element, elements[hole / 2]) > 0) { - // save element that is being pushed down - // as the element "bubble" is percolated up - final int next = hole / 2; - elements[hole] = elements[next]; - hole = next; - } - - elements[hole] = element; - } - - /** - * Percolates a new element up heap from the bottom. - *

              - * Assume it is a maximum heap. - * - * @param element the element - */ - protected void percolateUpMaxHeap(final Object element) { - elements[++size] = element; - percolateUpMaxHeap(size); - } - - /** - * Compares two objects using the comparator if specified, or the - * natural order otherwise. - * - * @param a the first object - * @param b the second object - * @return -ve if a less than b, 0 if they are equal, +ve if a greater than b - */ - protected int compare(Object a, Object b) { - if (comparator != null) { - return comparator.compare(a, b); - } else { - return ((Comparable) a).compareTo(b); - } - } - - /** - * Increases the size of the heap to support additional elements - */ - protected void grow() { - final Object[] array = new Object[elements.length * 2]; - System.arraycopy(elements, 0, array, 0, elements.length); - elements = array; - } - - //----------------------------------------------------------------------- - /** - * Returns an iterator over this heap's elements. - * - * @return an iterator over this heap's elements - */ - public Iterator iterator() { - return new Iterator() { - - private int index = 1; - private int lastReturnedIndex = -1; - - public boolean hasNext() { - return index <= size; - } - - public Object next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - lastReturnedIndex = index; - index++; - return elements[lastReturnedIndex]; - } - - public void remove() { - if (lastReturnedIndex == -1) { - throw new IllegalStateException(); - } - elements[ lastReturnedIndex ] = elements[ size ]; - elements[ size ] = null; - size--; - if( size != 0 && lastReturnedIndex <= size) { - int compareToParent = 0; - if (lastReturnedIndex > 1) { - compareToParent = compare(elements[lastReturnedIndex], - elements[lastReturnedIndex / 2]); - } - if (ascendingOrder) { - if (lastReturnedIndex > 1 && compareToParent < 0) { - percolateUpMinHeap(lastReturnedIndex); - } else { - percolateDownMinHeap(lastReturnedIndex); - } - } else { // max heap - if (lastReturnedIndex > 1 && compareToParent > 0) { - percolateUpMaxHeap(lastReturnedIndex); - } else { - percolateDownMaxHeap(lastReturnedIndex); - } - } - } - index--; - lastReturnedIndex = -1; - } - - }; - } - - /** - * Returns a string representation of this heap. The returned string - * is similar to those produced by standard JDK collections. - * - * @return a string representation of this heap - */ - public String toString() { - final StringBuffer sb = new StringBuffer(); - - sb.append("[ "); - - for (int i = 1; i < size + 1; i++) { - if (i != 1) { - sb.append(", "); - } - sb.append(elements[i]); - } - - sb.append(" ]"); - - return sb.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/SynchronizedBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/SynchronizedBuffer.java deleted file mode 100644 index 826c3e457e9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/SynchronizedBuffer.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.collection.SynchronizedCollection; - -/** - * Decorates another Buffer to synchronize its behaviour - * for a multi-threaded environment. - *

              - * Methods are synchronized, then forwarded to the decorated buffer. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedBuffer extends SynchronizedCollection implements Buffer { - - /** Serialization version */ - private static final long serialVersionUID = -6859936183953626253L; - - /** - * Factory method to create a synchronized buffer. - * - * @param buffer the buffer to decorate, must not be null - * @return a new synchronized Buffer - * @throws IllegalArgumentException if buffer is null - */ - public static Buffer decorate(Buffer buffer) { - return new SynchronizedBuffer(buffer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param buffer the buffer to decorate, must not be null - * @throws IllegalArgumentException if the buffer is null - */ - protected SynchronizedBuffer(Buffer buffer) { - super(buffer); - } - - /** - * Constructor that wraps (not copies). - * - * @param buffer the buffer to decorate, must not be null - * @param lock the lock object to use, must not be null - * @throws IllegalArgumentException if the buffer is null - */ - protected SynchronizedBuffer(Buffer buffer, Object lock) { - super(buffer, lock); - } - - /** - * Gets the buffer being decorated. - * - * @return the decorated buffer - */ - protected Buffer getBuffer() { - return (Buffer) collection; - } - - //----------------------------------------------------------------------- - public Object get() { - synchronized (lock) { - return getBuffer().get(); - } - } - - public Object remove() { - synchronized (lock) { - return getBuffer().remove(); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TransformedBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TransformedBuffer.java deleted file mode 100644 index 78204a6d7c1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TransformedBuffer.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.collection.TransformedCollection; - -/** - * Decorates another Buffer to transform objects that are added. - *

              - * The add methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedBuffer extends TransformedCollection implements Buffer { - - /** Serialization version */ - private static final long serialVersionUID = -7901091318986132033L; - - /** - * Factory method to create a transforming buffer. - *

              - * If there are any elements already in the buffer being decorated, they - * are NOT transformed. - * - * @param buffer the buffer to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @return a new transformed Buffer - * @throws IllegalArgumentException if buffer or transformer is null - */ - public static Buffer decorate(Buffer buffer, Transformer transformer) { - return new TransformedBuffer(buffer, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the buffer being decorated, they - * are NOT transformed. - * - * @param buffer the buffer to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if buffer or transformer is null - */ - protected TransformedBuffer(Buffer buffer, Transformer transformer) { - super(buffer, transformer); - } - - /** - * Gets the decorated buffer. - * - * @return the decorated buffer - */ - protected Buffer getBuffer() { - return (Buffer) collection; - } - - //----------------------------------------------------------------------- - public Object get() { - return getBuffer().get(); - } - - public Object remove() { - return getBuffer().remove(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TypedBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TypedBuffer.java deleted file mode 100644 index cbf1f56946b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/TypedBuffer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another Buffer to validate that elements added - * are of a specific type. - *

              - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedBuffer { - - /** - * Factory method to create a typed list. - *

              - * If there are any elements already in the buffer being decorated, they - * are validated. - * - * @param buffer the buffer to decorate, must not be null - * @param type the type to allow into the buffer, must not be null - * @return a new typed Buffer - * @throws IllegalArgumentException if buffer or type is null - * @throws IllegalArgumentException if the buffer contains invalid elements - */ - public static Buffer decorate(Buffer buffer, Class type) { - return new PredicatedBuffer(buffer, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedBuffer() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnboundedFifoBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnboundedFifoBuffer.java deleted file mode 100644 index e1cff581819..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnboundedFifoBuffer.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.AbstractCollection; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.BufferUnderflowException; - -/** - * UnboundedFifoBuffer is a very efficient implementation of - * Buffer that can grow to any size. - * According to performance testing, it exhibits a constant access time, but it - * also outperforms ArrayList when used for the same purpose. - *

              - * The removal order of an UnboundedFifoBuffer is based on the insertion - * order; elements are removed in the same order in which they were added. - * The iteration order is the same as the removal order. - *

              - * The {@link #remove()} and {@link #get()} operations perform in constant time. - * The {@link #add(Object)} operation performs in amortized constant time. All - * other operations perform in linear time or worse. - *

              - * Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your UnboundedFifoBuffer: - *

              - *   Buffer fifo = BufferUtils.synchronizedBuffer(new UnboundedFifoBuffer());
              - * 
              - *

              - * This buffer prevents null objects from being added. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 (previously in main package v2.1) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Avalon - * @author Federico Barbieri - * @author Berin Loritsch - * @author Paul Jack - * @author Stephen Colebourne - * @author Andreas Schlosser - * @author Thomas Knych - * @author Jordan Krey - */ -public class UnboundedFifoBuffer extends AbstractCollection implements Buffer, Serializable { - // invariant: buffer.length > size() - // ie.buffer always has at least one empty entry - - /** Serialization vesrion */ - private static final long serialVersionUID = -3482960336579541419L; - - /** The array of objects in the buffer. */ - protected transient Object[] buffer; - /** The current head index. */ - protected transient int head; - /** The current tail index. */ - protected transient int tail; - - /** - * Constructs an UnboundedFifoBuffer with the default number of elements. - * It is exactly the same as performing the following: - * - *

              -     *   new UnboundedFifoBuffer(32);
              -     * 
              - */ - public UnboundedFifoBuffer() { - this(32); - } - - /** - * Constructs an UnboundedFifoBuffer with the specified number of elements. - * The integer must be a positive integer. - * - * @param initialSize the initial size of the buffer - * @throws IllegalArgumentException if the size is less than 1 - */ - public UnboundedFifoBuffer(int initialSize) { - if (initialSize <= 0) { - throw new IllegalArgumentException("The size must be greater than 0"); - } - buffer = new Object[initialSize + 1]; - head = 0; - tail = 0; - } - - //----------------------------------------------------------------------- - /** - * Write the buffer out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeInt(size()); - for (Iterator it = iterator(); it.hasNext();) { - out.writeObject(it.next()); - } - } - - /** - * Read the buffer in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - int size = in.readInt(); - buffer = new Object[size + 1]; - for (int i = 0; i < size; i++) { - buffer[i] = in.readObject(); - } - head = 0; - tail = size; - } - - //----------------------------------------------------------------------- - /** - * Returns the number of elements stored in the buffer. - * - * @return this buffer's size - */ - public int size() { - int size = 0; - - if (tail < head) { - size = buffer.length - head + tail; - } else { - size = tail - head; - } - - return size; - } - - /** - * Returns true if this buffer is empty; false otherwise. - * - * @return true if this buffer is empty - */ - public boolean isEmpty() { - return (size() == 0); - } - - /** - * Adds the given element to this buffer. - * - * @param obj the element to add - * @return true, always - * @throws NullPointerException if the given element is null - */ - public boolean add(final Object obj) { - if (obj == null) { - throw new NullPointerException("Attempted to add null object to buffer"); - } - - if (size() + 1 >= buffer.length) { - // copy contents to a new buffer array - Object[] tmp = new Object[((buffer.length - 1) * 2) + 1]; - int j = 0; - // move head to element zero in the new array - for (int i = head; i != tail;) { - tmp[j] = buffer[i]; - buffer[i] = null; - - j++; - i = increment(i); - } - buffer = tmp; - head = 0; - tail = j; - } - - buffer[tail] = obj; - tail = increment(tail); - return true; - } - - /** - * Returns the next object in the buffer. - * - * @return the next object in the buffer - * @throws BufferUnderflowException if this buffer is empty - */ - public Object get() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - return buffer[head]; - } - - /** - * Removes the next object from the buffer - * - * @return the removed object - * @throws BufferUnderflowException if this buffer is empty - */ - public Object remove() { - if (isEmpty()) { - throw new BufferUnderflowException("The buffer is already empty"); - } - - Object element = buffer[head]; - if (element != null) { - buffer[head] = null; - head = increment(head); - } - return element; - } - - /** - * Increments the internal index. - * - * @param index the index to increment - * @return the updated index - */ - private int increment(int index) { - index++; - if (index >= buffer.length) { - index = 0; - } - return index; - } - - /** - * Decrements the internal index. - * - * @param index the index to decrement - * @return the updated index - */ - private int decrement(int index) { - index--; - if (index < 0) { - index = buffer.length - 1; - } - return index; - } - - /** - * Returns an iterator over this buffer's elements. - * - * @return an iterator over this buffer's elements - */ - public Iterator iterator() { - return new Iterator() { - - private int index = head; - private int lastReturnedIndex = -1; - - public boolean hasNext() { - return index != tail; - - } - - public Object next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - lastReturnedIndex = index; - index = increment(index); - return buffer[lastReturnedIndex]; - } - - public void remove() { - if (lastReturnedIndex == -1) { - throw new IllegalStateException(); - } - - // First element can be removed quickly - if (lastReturnedIndex == head) { - UnboundedFifoBuffer.this.remove(); - lastReturnedIndex = -1; - return; - } - - // Other elements require us to shift the subsequent elements - int i = increment(lastReturnedIndex); - while (i != tail) { - buffer[decrement(i)] = buffer[i]; - i = increment(i); - } - - lastReturnedIndex = -1; - tail = decrement(tail); - buffer[tail] = null; - index = decrement(index); - } - - }; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnmodifiableBuffer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnmodifiableBuffer.java deleted file mode 100644 index 76d3a3072e3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/UnmodifiableBuffer.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.buffer; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.Buffer; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; - -/** - * Decorates another Buffer to ensure it can't be altered. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableBuffer - extends AbstractBufferDecorator - implements Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 1832948656215393357L; - - /** - * Factory method to create an unmodifiable buffer. - *

              - * If the buffer passed in is already unmodifiable, it is returned. - * - * @param buffer the buffer to decorate, must not be null - * @return an unmodifiable Buffer - * @throws IllegalArgumentException if buffer is null - */ - public static Buffer decorate(Buffer buffer) { - if (buffer instanceof Unmodifiable) { - return buffer; - } - return new UnmodifiableBuffer(buffer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param buffer the buffer to decorate, must not be null - * @throws IllegalArgumentException if buffer is null - */ - private UnmodifiableBuffer(Buffer buffer) { - super(buffer); - } - - //----------------------------------------------------------------------- - /** - * Write the collection out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the collection in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public Object remove() { - throw new UnsupportedOperationException(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/package.html deleted file mode 100644 index fee9b79a1b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/buffer/package.html +++ /dev/null @@ -1,41 +0,0 @@ - - - -

              -This package contains implementations of the -{@link org.apache.commons.collections.Buffer Buffer} interface. -

              -The following implementations are provided in the package: -

                -
              • PriorityBuffer - provides for removal based on a comparator ordering -
              • BoundedFifoBuffer - implements a buffer with a fixed size that throws exceptions when full -
              • CircularFifoBuffer - implements a buffer with a fixed size that discards oldest when full -
              • UnboundedFifoBuffer - implements a buffer that grows in size if necessary -
              -

              -The following decorators are provided in the package: -

                -
              • Synchronized - synchronizes method access for multi-threaded environments -
              • Unmodifiable - ensures the collection cannot be altered -
              • Predicated - ensures that only elements that are valid according to a predicate can be added -
              • Typed - ensures that only elements that are of a specific type can be added -
              • Transformed - transforms elements added to the buffer -
              • Blocking - blocks on get and remove until an element is available -
              - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractCollectionDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractCollectionDecorator.java deleted file mode 100644 index 323d03881bf..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractCollectionDecorator.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.util.Collection; -import java.util.Iterator; - -/** - * Decorates another Collection to provide additional behaviour. - *

              - * Each method call made on this Collection is forwarded to the - * decorated Collection. This class is used as a framework on which - * to build to extensions such as synchronized and unmodifiable behaviour. The - * main advantage of decoration is that one decorator can wrap any implementation - * of Collection, whereas sub-classing requires a new class to be - * written for each implementation. - *

              - * This implementation does not perform any special processing with - * {@link #iterator()}. Instead it simply returns the value from the - * wrapped collection. This may be undesirable, for example if you are trying - * to write an unmodifiable implementation it might provide a loophole. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public abstract class AbstractCollectionDecorator implements Collection { - - /** The collection being decorated */ - protected Collection collection; - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractCollectionDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param coll the collection to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - protected AbstractCollectionDecorator(Collection coll) { - if (coll == null) { - throw new IllegalArgumentException("Collection must not be null"); - } - this.collection = coll; - } - - /** - * Gets the collection being decorated. - * - * @return the decorated collection - */ - protected Collection getCollection() { - return collection; - } - - //----------------------------------------------------------------------- - public boolean add(Object object) { - return collection.add(object); - } - - public boolean addAll(Collection coll) { - return collection.addAll(coll); - } - - public void clear() { - collection.clear(); - } - - public boolean contains(Object object) { - return collection.contains(object); - } - - public boolean isEmpty() { - return collection.isEmpty(); - } - - public Iterator iterator() { - return collection.iterator(); - } - - public boolean remove(Object object) { - return collection.remove(object); - } - - public int size() { - return collection.size(); - } - - public Object[] toArray() { - return collection.toArray(); - } - - public Object[] toArray(Object[] object) { - return collection.toArray(object); - } - - public boolean containsAll(Collection coll) { - return collection.containsAll(coll); - } - - public boolean removeAll(Collection coll) { - return collection.removeAll(coll); - } - - public boolean retainAll(Collection coll) { - return collection.retainAll(coll); - } - - public boolean equals(Object object) { - if (object == this) { - return true; - } - return collection.equals(object); - } - - public int hashCode() { - return collection.hashCode(); - } - - public String toString() { - return collection.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractSerializableCollectionDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractSerializableCollectionDecorator.java deleted file mode 100644 index daf63ea734d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/AbstractSerializableCollectionDecorator.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; - -/** - * Serializable subclass of AbstractCollectionDecorator. - * - * @author Stephen Colebourne - * @since Commons Collections 3.1 - */ -public abstract class AbstractSerializableCollectionDecorator - extends AbstractCollectionDecorator - implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 6249888059822088500L; - - /** - * Constructor. - */ - protected AbstractSerializableCollectionDecorator(Collection coll) { - super(coll); - } - - //----------------------------------------------------------------------- - /** - * Write the collection out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the collection in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/CompositeCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/CompositeCollection.java deleted file mode 100644 index ea956948dd9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/CompositeCollection.java +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.iterators.EmptyIterator; -import org.apache.commons.collections.iterators.IteratorChain; -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * Decorates a collection of other collections to provide a single unified view. - *

              - * Changes made to this collection will actually be made on the decorated collection. - * Add and remove operations require the use of a pluggable strategy. If no - * strategy is provided then add and remove are unsupported. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Brian McCallister - * @author Stephen Colebourne - * @author Phil Steitz - */ -public class CompositeCollection implements Collection { - - /** CollectionMutator to handle changes to the collection */ - protected CollectionMutator mutator; - - /** Collections in the composite */ - protected Collection[] all; - - /** - * Create an empty CompositeCollection. - */ - public CompositeCollection() { - super(); - this.all = new Collection[0]; - } - - /** - * Create a Composite Collection with only coll composited. - * - * @param coll a collection to decorate - */ - public CompositeCollection(Collection coll) { - this(); - this.addComposited(coll); - } - - /** - * Create a CompositeCollection with colls as the initial list of - * composited collections. - * - * @param colls an array of collections to decorate - */ - public CompositeCollection(Collection[] colls) { - this(); - this.addComposited(colls); - } - - //----------------------------------------------------------------------- - /** - * Gets the size of this composite collection. - *

              - * This implementation calls size() on each collection. - * - * @return total number of elements in all contained containers - */ - public int size() { - int size = 0; - for (int i = this.all.length - 1; i >= 0; i--) { - size += this.all[i].size(); - } - return size; - } - - /** - * Checks whether this composite collection is empty. - *

              - * This implementation calls isEmpty() on each collection. - * - * @return true if all of the contained collections are empty - */ - public boolean isEmpty() { - for (int i = this.all.length - 1; i >= 0; i--) { - if (this.all[i].isEmpty() == false) { - return false; - } - } - return true; - } - - /** - * Checks whether this composite collection contains the object. - *

              - * This implementation calls contains() on each collection. - * - * @param obj the object to search for - * @return true if obj is contained in any of the contained collections - */ - public boolean contains(Object obj) { - for (int i = this.all.length - 1; i >= 0; i--) { - if (this.all[i].contains(obj)) { - return true; - } - } - return false; - } - - /** - * Gets an iterator over all the collections in this composite. - *

              - * This implementation uses an IteratorChain. - * - * @return an IteratorChain instance which supports - * remove(). Iteration occurs over contained collections in - * the order they were added, but this behavior should not be relied upon. - * @see IteratorChain - */ - public Iterator iterator() { - if (this.all.length == 0) { - return EmptyIterator.INSTANCE; - } - IteratorChain chain = new IteratorChain(); - for (int i = 0; i < this.all.length; ++i) { - chain.addIterator(this.all[i].iterator()); - } - return chain; - } - - /** - * Returns an array containing all of the elements in this composite. - * - * @return an object array of all the elements in the collection - */ - public Object[] toArray() { - final Object[] result = new Object[this.size()]; - int i = 0; - for (Iterator it = this.iterator(); it.hasNext(); i++) { - result[i] = it.next(); - } - return result; - } - - /** - * Returns an object array, populating the supplied array if possible. - * See Collection interface for full details. - * - * @param array the array to use, populating if possible - * @return an array of all the elements in the collection - */ - public Object[] toArray(Object[] array) { - int size = this.size(); - Object[] result = null; - if (array.length >= size) { - result = array; - } - else { - result = (Object[]) Array.newInstance(array.getClass().getComponentType(), size); - } - - int offset = 0; - for (int i = 0; i < this.all.length; ++i) { - for (Iterator it = this.all[i].iterator(); it.hasNext();) { - result[offset++] = it.next(); - } - } - if (result.length > size) { - result[size] = null; - } - return result; - } - - /** - * Adds an object to the collection, throwing UnsupportedOperationException - * unless a CollectionMutator strategy is specified. - * - * @param obj the object to add - * @return true if the collection was modified - * @throws UnsupportedOperationException if CollectionMutator hasn't been set - * @throws UnsupportedOperationException if add is unsupported - * @throws ClassCastException if the object cannot be added due to its type - * @throws NullPointerException if the object cannot be added because its null - * @throws IllegalArgumentException if the object cannot be added - */ - public boolean add(Object obj) { - if (this.mutator == null) { - throw new UnsupportedOperationException( - "add() is not supported on CompositeCollection without a CollectionMutator strategy"); - } - return this.mutator.add(this, this.all, obj); - } - - /** - * Removes an object from the collection, throwing UnsupportedOperationException - * unless a CollectionMutator strategy is specified. - * - * @param obj the object being removed - * @return true if the collection is changed - * @throws UnsupportedOperationException if removed is unsupported - * @throws ClassCastException if the object cannot be removed due to its type - * @throws NullPointerException if the object cannot be removed because its null - * @throws IllegalArgumentException if the object cannot be removed - */ - public boolean remove(Object obj) { - if (this.mutator == null) { - throw new UnsupportedOperationException( - "remove() is not supported on CompositeCollection without a CollectionMutator strategy"); - } - return this.mutator.remove(this, this.all, obj); - } - - /** - * Checks whether this composite contains all the elements in the specified collection. - *

              - * This implementation calls contains() for each element in the - * specified collection. - * - * @param coll the collection to check for - * @return true if all elements contained - */ - public boolean containsAll(Collection coll) { - for (Iterator it = coll.iterator(); it.hasNext();) { - if (this.contains(it.next()) == false) { - return false; - } - } - return true; - } - - /** - * Adds a collection of elements to this collection, throwing - * UnsupportedOperationException unless a CollectionMutator strategy is specified. - * - * @param coll the collection to add - * @return true if the collection was modified - * @throws UnsupportedOperationException if CollectionMutator hasn't been set - * @throws UnsupportedOperationException if add is unsupported - * @throws ClassCastException if the object cannot be added due to its type - * @throws NullPointerException if the object cannot be added because its null - * @throws IllegalArgumentException if the object cannot be added - */ - public boolean addAll(Collection coll) { - if (this.mutator == null) { - throw new UnsupportedOperationException( - "addAll() is not supported on CompositeCollection without a CollectionMutator strategy"); - } - return this.mutator.addAll(this, this.all, coll); - } - - /** - * Removes the elements in the specified collection from this composite collection. - *

              - * This implementation calls removeAll on each collection. - * - * @param coll the collection to remove - * @return true if the collection was modified - * @throws UnsupportedOperationException if removeAll is unsupported - */ - public boolean removeAll(Collection coll) { - if (coll.size() == 0) { - return false; - } - boolean changed = false; - for (int i = this.all.length - 1; i >= 0; i--) { - changed = (this.all[i].removeAll(coll) || changed); - } - return changed; - } - - /** - * Retains all the elements in the specified collection in this composite collection, - * removing all others. - *

              - * This implementation calls retainAll() on each collection. - * - * @param coll the collection to remove - * @return true if the collection was modified - * @throws UnsupportedOperationException if retainAll is unsupported - */ - public boolean retainAll(final Collection coll) { - boolean changed = false; - for (int i = this.all.length - 1; i >= 0; i--) { - changed = (this.all[i].retainAll(coll) || changed); - } - return changed; - } - - /** - * Removes all of the elements from this collection . - *

              - * This implementation calls clear() on each collection. - * - * @throws UnsupportedOperationException if clear is unsupported - */ - public void clear() { - for (int i = 0; i < this.all.length; ++i) { - this.all[i].clear(); - } - } - - //----------------------------------------------------------------------- - /** - * Specify a CollectionMutator strategy instance to handle changes. - * - * @param mutator the mutator to use - */ - public void setMutator(CollectionMutator mutator) { - this.mutator = mutator; - } - - /** - * Add these Collections to the list of collections in this composite - * - * @param comps Collections to be appended to the composite - */ - public void addComposited(Collection[] comps) { - ArrayList list = new ArrayList(Arrays.asList(this.all)); - list.addAll(Arrays.asList(comps)); - all = (Collection[]) list.toArray(new Collection[list.size()]); - } - - /** - * Add an additional collection to this composite. - * - * @param c the collection to add - */ - public void addComposited(Collection c) { - this.addComposited(new Collection[]{c}); - } - - /** - * Add two additional collections to this composite. - * - * @param c the first collection to add - * @param d the second collection to add - */ - public void addComposited(Collection c, Collection d) { - this.addComposited(new Collection[]{c, d}); - } - - /** - * Removes a collection from the those being decorated in this composite. - * - * @param coll collection to be removed - */ - public void removeComposited(Collection coll) { - ArrayList list = new ArrayList(this.all.length); - list.addAll(Arrays.asList(this.all)); - list.remove(coll); - this.all = (Collection[]) list.toArray(new Collection[list.size()]); - } - - /** - * Returns a new collection containing all of the elements - * - * @return A new ArrayList containing all of the elements in this composite. - * The new collection is not backed by this composite. - */ - public Collection toCollection() { - return new ArrayList(this); - } - - /** - * Gets the collections being decorated. - * - * @return Unmodifiable collection of all collections in this composite. - */ - public Collection getCollections() { - return UnmodifiableList.decorate(Arrays.asList(this.all)); - } - - //----------------------------------------------------------------------- - /** - * Pluggable strategy to handle changes to the composite. - */ - public interface CollectionMutator { - - /** - * Called when an object is to be added to the composite. - * - * @param composite the CompositeCollection being changed - * @param collections all of the Collection instances in this CompositeCollection - * @param obj the object being added - * @return true if the collection is changed - * @throws UnsupportedOperationException if add is unsupported - * @throws ClassCastException if the object cannot be added due to its type - * @throws NullPointerException if the object cannot be added because its null - * @throws IllegalArgumentException if the object cannot be added - */ - public boolean add(CompositeCollection composite, Collection[] collections, Object obj); - - /** - * Called when a collection is to be added to the composite. - * - * @param composite the CompositeCollection being changed - * @param collections all of the Collection instances in this CompositeCollection - * @param coll the collection being added - * @return true if the collection is changed - * @throws UnsupportedOperationException if add is unsupported - * @throws ClassCastException if the object cannot be added due to its type - * @throws NullPointerException if the object cannot be added because its null - * @throws IllegalArgumentException if the object cannot be added - */ - public boolean addAll(CompositeCollection composite, Collection[] collections, Collection coll); - - /** - * Called when an object is to be removed to the composite. - * - * @param composite the CompositeCollection being changed - * @param collections all of the Collection instances in this CompositeCollection - * @param obj the object being removed - * @return true if the collection is changed - * @throws UnsupportedOperationException if removed is unsupported - * @throws ClassCastException if the object cannot be removed due to its type - * @throws NullPointerException if the object cannot be removed because its null - * @throws IllegalArgumentException if the object cannot be removed - */ - public boolean remove(CompositeCollection composite, Collection[] collections, Object obj); - - } - -} - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/PredicatedCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/PredicatedCollection.java deleted file mode 100644 index d55935804a0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/PredicatedCollection.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.Predicate; - -/** - * Decorates another Collection to validate that additions - * match a specified predicate. - *

              - * This collection exists to provide validation for the decorated collection. - * It is normally created to decorate an empty collection. - * If an object cannot be added to the collection, an IllegalArgumentException is thrown. - *

              - * One usage would be to ensure that no null entries are added to the collection. - *

              Collection coll = PredicatedCollection.decorate(new ArrayList(), NotNullPredicate.INSTANCE);
              - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedCollection extends AbstractSerializableCollectionDecorator { - - /** Serialization version */ - private static final long serialVersionUID = -5259182142076705162L; - - /** The predicate to use */ - protected final Predicate predicate; - - /** - * Factory method to create a predicated (validating) collection. - *

              - * If there are any elements already in the collection being decorated, they - * are validated. - * - * @param coll the collection to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @return a new predicated collection - * @throws IllegalArgumentException if collection or predicate is null - * @throws IllegalArgumentException if the collection contains invalid elements - */ - public static Collection decorate(Collection coll, Predicate predicate) { - return new PredicatedCollection(coll, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the collection being decorated, they - * are validated. - * - * @param coll the collection to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if collection or predicate is null - * @throws IllegalArgumentException if the collection contains invalid elements - */ - protected PredicatedCollection(Collection coll, Predicate predicate) { - super(coll); - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - this.predicate = predicate; - for (Iterator it = coll.iterator(); it.hasNext(); ) { - validate(it.next()); - } - } - - /** - * Validates the object being added to ensure it matches the predicate. - *

              - * The predicate itself should not throw an exception, but return false to - * indicate that the object cannot be added. - * - * @param object the object being added - * @throws IllegalArgumentException if the add is invalid - */ - protected void validate(Object object) { - if (predicate.evaluate(object) == false) { - throw new IllegalArgumentException("Cannot add Object '" + object + "' - Predicate rejected it"); - } - } - - //----------------------------------------------------------------------- - /** - * Override to validate the object being added to ensure it matches - * the predicate. - * - * @param object the object being added - * @return the result of adding to the underlying collection - * @throws IllegalArgumentException if the add is invalid - */ - public boolean add(Object object) { - validate(object); - return getCollection().add(object); - } - - /** - * Override to validate the objects being added to ensure they match - * the predicate. If any one fails, no update is made to the underlying - * collection. - * - * @param coll the collection being added - * @return the result of adding to the underlying collection - * @throws IllegalArgumentException if the add is invalid - */ - public boolean addAll(Collection coll) { - for (Iterator it = coll.iterator(); it.hasNext(); ) { - validate(it.next()); - } - return getCollection().addAll(coll); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/SynchronizedCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/SynchronizedCollection.java deleted file mode 100644 index 53ceffbf41b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/SynchronizedCollection.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; - -/** - * Decorates another Collection to synchronize its behaviour - * for a multi-threaded environment. - *

              - * Iterators must be manually synchronized: - *

              - * synchronized (coll) {
              - *   Iterator it = coll.iterator();
              - *   // do stuff with iterator
              - * }
              - * 
              - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedCollection implements Collection, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 2412805092710877986L; - - /** The collection to decorate */ - protected final Collection collection; - /** The object to lock on, needed for List/SortedSet views */ - protected final Object lock; - - /** - * Factory method to create a synchronized collection. - * - * @param coll the collection to decorate, must not be null - * @return a new synchronized collection - * @throws IllegalArgumentException if collection is null - */ - public static Collection decorate(Collection coll) { - return new SynchronizedCollection(coll); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param collection the collection to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - protected SynchronizedCollection(Collection collection) { - if (collection == null) { - throw new IllegalArgumentException("Collection must not be null"); - } - this.collection = collection; - this.lock = this; - } - - /** - * Constructor that wraps (not copies). - * - * @param collection the collection to decorate, must not be null - * @param lock the lock object to use, must not be null - * @throws IllegalArgumentException if the collection is null - */ - protected SynchronizedCollection(Collection collection, Object lock) { - if (collection == null) { - throw new IllegalArgumentException("Collection must not be null"); - } - this.collection = collection; - this.lock = lock; - } - - //----------------------------------------------------------------------- - public boolean add(Object object) { - synchronized (lock) { - return collection.add(object); - } - } - - public boolean addAll(Collection coll) { - synchronized (lock) { - return collection.addAll(coll); - } - } - - public void clear() { - synchronized (lock) { - collection.clear(); - } - } - - public boolean contains(Object object) { - synchronized (lock) { - return collection.contains(object); - } - } - - public boolean containsAll(Collection coll) { - synchronized (lock) { - return collection.containsAll(coll); - } - } - - public boolean isEmpty() { - synchronized (lock) { - return collection.isEmpty(); - } - } - - /** - * Iterators must be manually synchronized. - *

              -     * synchronized (coll) {
              -     *   Iterator it = coll.iterator();
              -     *   // do stuff with iterator
              -     * }
              -     * 
              -     * @return an iterator that must be manually synchronized on the collection
              -     */
              -    public Iterator iterator() {
              -        return collection.iterator();
              -    }
              -
              -    public Object[] toArray() {
              -        synchronized (lock) {
              -            return collection.toArray();
              -        }
              -    }
              -
              -    public Object[] toArray(Object[] object) {
              -        synchronized (lock) {
              -            return collection.toArray(object);
              -        }
              -    }
              -
              -    public boolean remove(Object object) {
              -        synchronized (lock) {
              -            return collection.remove(object);
              -        }
              -    }
              -
              -    public boolean removeAll(Collection coll) {
              -        synchronized (lock) {
              -            return collection.removeAll(coll);
              -        }
              -    }
              -
              -    public boolean retainAll(Collection coll) {
              -        synchronized (lock) {
              -            return collection.retainAll(coll);
              -        }
              -    }
              -
              -    public int size() {
              -        synchronized (lock) {
              -            return collection.size();
              -        }
              -    }
              -
              -    public boolean equals(Object object) {
              -        synchronized (lock) {
              -            if (object == this) {
              -                return true;
              -            }
              -            return collection.equals(object);
              -        }
              -    }
              -
              -    public int hashCode() {
              -        synchronized (lock) {
              -            return collection.hashCode();
              -        }
              -    }
              -
              -    public String toString() {
              -        synchronized (lock) {
              -            return collection.toString();
              -        }
              -    }
              -
              -}
              diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TransformedCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TransformedCollection.java
              deleted file mode 100644
              index 3bc057b3d52..00000000000
              --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TransformedCollection.java
              +++ /dev/null
              @@ -1,122 +0,0 @@
              -/*
              - *  Licensed to the Apache Software Foundation (ASF) under one or more
              - *  contributor license agreements.  See the NOTICE file distributed with
              - *  this work for additional information regarding copyright ownership.
              - *  The ASF licenses this file to You under the Apache License, Version 2.0
              - *  (the "License"); you may not use this file except in compliance with
              - *  the License.  You may obtain a copy of the License at
              - *
              - *      http://www.apache.org/licenses/LICENSE-2.0
              - *
              - *  Unless required by applicable law or agreed to in writing, software
              - *  distributed under the License is distributed on an "AS IS" BASIS,
              - *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
              - *  See the License for the specific language governing permissions and
              - *  limitations under the License.
              - */
              -package org.apache.commons.collections.collection;
              -
              -import java.util.ArrayList;
              -import java.util.Collection;
              -import java.util.Iterator;
              -import java.util.List;
              -
              -import org.apache.commons.collections.Transformer;
              -
              -/**
              - * Decorates another Collection to transform objects that are added.
              - * 

              - * The add methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedCollection extends AbstractSerializableCollectionDecorator { - - /** Serialization version */ - private static final long serialVersionUID = 8692300188161871514L; - - /** The transformer to use */ - protected final Transformer transformer; - - /** - * Factory method to create a transforming collection. - *

              - * If there are any elements already in the collection being decorated, they - * are NOT transformed. - * - * @param coll the collection to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @return a new transformed collection - * @throws IllegalArgumentException if collection or transformer is null - */ - public static Collection decorate(Collection coll, Transformer transformer) { - return new TransformedCollection(coll, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

              - * If there are any elements already in the collection being decorated, they - * are NOT transformed. - * - * @param coll the collection to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if collection or transformer is null - */ - protected TransformedCollection(Collection coll, Transformer transformer) { - super(coll); - if (transformer == null) { - throw new IllegalArgumentException("Transformer must not be null"); - } - this.transformer = transformer; - } - - /** - * Transforms an object. - *

              - * The transformer itself may throw an exception if necessary. - * - * @param object the object to transform - * @return a transformed object - */ - protected Object transform(Object object) { - return transformer.transform(object); - } - - /** - * Transforms a collection. - *

              - * The transformer itself may throw an exception if necessary. - * - * @param coll the collection to transform - * @return a transformed object - */ - protected Collection transform(Collection coll) { - List list = new ArrayList(coll.size()); - for (Iterator it = coll.iterator(); it.hasNext(); ) { - list.add(transform(it.next())); - } - return list; - } - - //----------------------------------------------------------------------- - public boolean add(Object object) { - object = transform(object); - return getCollection().add(object); - } - - public boolean addAll(Collection coll) { - coll = transform(coll); - return getCollection().addAll(coll); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TypedCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TypedCollection.java deleted file mode 100644 index ddac69a3ee1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/TypedCollection.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.util.Collection; - -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates a Collection to validate that elements added are of a specific type. - *

              - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedCollection { - - /** - * Factory method to create a typed collection. - *

              - * If there are any elements already in the collection being decorated, they - * are validated. - * - * @param coll the collection to decorate, must not be null - * @param type the type to allow into the collection, must not be null - * @return a new typed collection - * @throws IllegalArgumentException if collection or type is null - * @throws IllegalArgumentException if the collection contains invalid elements - */ - public static Collection decorate(Collection coll, Class type) { - return new PredicatedCollection(coll, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedCollection() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableBoundedCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableBoundedCollection.java deleted file mode 100644 index b201db902ed..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableBoundedCollection.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.BoundedCollection; -import org.apache.commons.collections.iterators.UnmodifiableIterator; - -/** - * UnmodifiableBoundedCollection decorates another - * BoundedCollection to ensure it can't be altered. - *

              - * If a BoundedCollection is first wrapped in some other collection decorator, - * such as synchronized or predicated, the BoundedCollection methods are no - * longer accessible. - * The factory on this class will attempt to retrieve the bounded nature by - * examining the package scope variables. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableBoundedCollection - extends AbstractSerializableCollectionDecorator - implements BoundedCollection { - - /** Serialization version */ - private static final long serialVersionUID = -7112672385450340330L; - - /** - * Factory method to create an unmodifiable bounded collection. - * - * @param coll the BoundedCollection to decorate, must not be null - * @return a new unmodifiable bounded collection - * @throws IllegalArgumentException if bag is null - */ - public static BoundedCollection decorate(BoundedCollection coll) { - return new UnmodifiableBoundedCollection(coll); - } - - /** - * Factory method to create an unmodifiable bounded collection. - *

              - * This method is capable of drilling down through up to 1000 other decorators - * to find a suitable BoundedCollection. - * - * @param coll the BoundedCollection to decorate, must not be null - * @return a new unmodifiable bounded collection - * @throws IllegalArgumentException if bag is null - */ - public static BoundedCollection decorateUsing(Collection coll) { - if (coll == null) { - throw new IllegalArgumentException("The collection must not be null"); - } - - // handle decorators - for (int i = 0; i < 1000; i++) { // counter to prevent infinite looping - if (coll instanceof BoundedCollection) { - break; // normal loop exit - } else if (coll instanceof AbstractCollectionDecorator) { - coll = ((AbstractCollectionDecorator) coll).collection; - } else if (coll instanceof SynchronizedCollection) { - coll = ((SynchronizedCollection) coll).collection; - } else { - break; // normal loop exit - } - } - - if (coll instanceof BoundedCollection == false) { - throw new IllegalArgumentException("The collection is not a bounded collection"); - } - return new UnmodifiableBoundedCollection((BoundedCollection) coll); - } - - /** - * Constructor that wraps (not copies). - * - * @param coll the collection to decorate, must not be null - * @throws IllegalArgumentException if coll is null - */ - private UnmodifiableBoundedCollection(BoundedCollection coll) { - super(coll); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public boolean isFull() { - return ((BoundedCollection) collection).isFull(); - } - - public int maxSize() { - return ((BoundedCollection) collection).maxSize(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableCollection.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableCollection.java deleted file mode 100644 index d202fa14abe..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/UnmodifiableCollection.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.collection; - -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; - -/** - * Decorates another Collection to ensure it can't be altered. - *

              - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableCollection - extends AbstractSerializableCollectionDecorator - implements Unmodifiable { - - /** Serialization version */ - private static final long serialVersionUID = -239892006883819945L; - - /** - * Factory method to create an unmodifiable collection. - *

              - * If the collection passed in is already unmodifiable, it is returned. - * - * @param coll the collection to decorate, must not be null - * @return an unmodifiable collection - * @throws IllegalArgumentException if collection is null - */ - public static Collection decorate(Collection coll) { - if (coll instanceof Unmodifiable) { - return coll; - } - return new UnmodifiableCollection(coll); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param coll the collection to decorate, must not be null - * @throws IllegalArgumentException if collection is null - */ - private UnmodifiableCollection(Collection coll) { - super(coll); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/package.html deleted file mode 100644 index 1b8407197f4..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/collection/package.html +++ /dev/null @@ -1,36 +0,0 @@ - - - -

              -This package contains implementations of the -{@link java.util.Collection Collection} interface. -

              -The following implementations are provided in the package: -

                -
              • CompositeCollection - a collection that combines multiple collections into one -
              -The following decorators are provided in the package: -
                -
              • Synchronized - synchronizes method access for multi-threaded environments -
              • Unmodifiable - ensures the collection cannot be altered -
              • Predicated - ensures that only elements that are valid according to a predicate can be added -
              • Typed - ensures that only elements that are of a specific type can be added -
              • Transformed - transforms elements as they are added -
              -
              - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/BooleanComparator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/BooleanComparator.java deleted file mode 100644 index a2133693fc6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/BooleanComparator.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.io.Serializable; -import java.util.Comparator; - -/** - * A {@link Comparator} for {@link Boolean} objects that can sort either - * true or false first. - *

              - * @see #getTrueFirstComparator() - * @see #getFalseFirstComparator() - * @see #getBooleanComparator(boolean) - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - */ -public final class BooleanComparator implements Comparator, Serializable { - - /** Serialization version. */ - private static final long serialVersionUID = 1830042991606340609L; - - /** Constant "true first" reference. */ - private static final BooleanComparator TRUE_FIRST = new BooleanComparator(true); - - /** Constant "false first" reference. */ - private static final BooleanComparator FALSE_FIRST = new BooleanComparator(false); - - /** true iff true values sort before false values. */ - private boolean trueFirst = false; - - //----------------------------------------------------------------------- - /** - * Returns a BooleanComparator instance that sorts - * true values before false values. - *

              - * Clients are encouraged to use the value returned from - * this method instead of constructing a new instance - * to reduce allocation and garbage collection overhead when - * multiple BooleanComparators may be used in the same - * virtual machine. - * - * @return the true first singleton BooleanComparator - */ - public static BooleanComparator getTrueFirstComparator() { - return TRUE_FIRST; - } - - /** - * Returns a BooleanComparator instance that sorts - * false values before true values. - *

              - * Clients are encouraged to use the value returned from - * this method instead of constructing a new instance - * to reduce allocation and garbage collection overhead when - * multiple BooleanComparators may be used in the same - * virtual machine. - * - * @return the false first singleton BooleanComparator - */ - public static BooleanComparator getFalseFirstComparator() { - return FALSE_FIRST; - } - - /** - * Returns a BooleanComparator instance that sorts - * trueFirst values before - * !trueFirst values. - *

              - * Clients are encouraged to use the value returned from - * this method instead of constructing a new instance - * to reduce allocation and garbage collection overhead when - * multiple BooleanComparators may be used in the same - * virtual machine. - * - * @param trueFirst when true, sort - * true Booleans before false - * @return a singleton BooleanComparator instance - */ - public static BooleanComparator getBooleanComparator(boolean trueFirst) { - return trueFirst ? TRUE_FIRST : FALSE_FIRST; - } - - //----------------------------------------------------------------------- - /** - * Creates a BooleanComparator that sorts - * false values before true values. - *

              - * Equivalent to {@link #BooleanComparator(boolean) BooleanComparator(false)}. - *

              - * Please use the static factory instead whenever possible. - */ - public BooleanComparator() { - this(false); - } - - /** - * Creates a BooleanComparator that sorts - * trueFirst values before - * !trueFirst values. - *

              - * Please use the static factories instead whenever possible. - * - * @param trueFirst when true, sort - * true boolean values before false - */ - public BooleanComparator(boolean trueFirst) { - this.trueFirst = trueFirst; - } - - //----------------------------------------------------------------------- - /** - * Compares two arbitrary Objects. - * When both arguments are Boolean, this method is equivalent to - * {@link #compare(Boolean,Boolean) compare((Boolean)obj1,(Boolean)obj2)}. - * When either argument is not a Boolean, this methods throws - * a {@link ClassCastException}. - * - * @param obj1 the first object to compare - * @param obj2 the second object to compare - * @return negative if obj1 is less, positive if greater, zero if equal - * @throws ClassCastException when either argument is not Boolean - */ - public int compare(Object obj1, Object obj2) { - return compare((Boolean)obj1, (Boolean)obj2); - } - - /** - * Compares two non-null Boolean objects - * according to the value of {@link #sortsTrueFirst()}. - * - * @param b1 the first boolean to compare - * @param b2 the second boolean to compare - * @return negative if obj1 is less, positive if greater, zero if equal - * @throws NullPointerException when either argument null - */ - public int compare(Boolean b1, Boolean b2) { - boolean v1 = b1.booleanValue(); - boolean v2 = b2.booleanValue(); - - return (v1 ^ v2) ? ( (v1 ^ trueFirst) ? 1 : -1 ) : 0; - } - - //----------------------------------------------------------------------- - /** - * Implement a hash code for this comparator that is consistent with - * {@link #equals(Object) equals}. - * - * @return a hash code for this comparator. - */ - public int hashCode() { - int hash = "BooleanComparator".hashCode(); - return trueFirst ? -1 * hash : hash; - } - - /** - * Returns true iff that Object is - * is a {@link Comparator} whose ordering is known to be - * equivalent to mine. - *

              - * This implementation returns true - * iff that is a {@link BooleanComparator} - * whose value of {@link #sortsTrueFirst()} is equal to mine. - * - * @param object the object to compare to - * @return true if equal - */ - public boolean equals(Object object) { - return (this == object) || - ((object instanceof BooleanComparator) && - (this.trueFirst == ((BooleanComparator)object).trueFirst)); - } - - //----------------------------------------------------------------------- - /** - * Returns true iff - * I sort true values before - * false values. In other words, - * returns true iff - * {@link #compare(Boolean,Boolean) compare(Boolean.FALSE,Boolean.TRUE)} - * returns a positive value. - * - * @return the trueFirst flag - */ - public boolean sortsTrueFirst() { - return trueFirst; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparableComparator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparableComparator.java deleted file mode 100644 index f812b743bb2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparableComparator.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.io.Serializable; -import java.util.Comparator; - -/** - * A {@link Comparator Comparator} that compares - * {@link Comparable Comparable} objects. - *

              - * This Comparator is useful, for example, - * for enforcing the natural order in custom implementations - * of SortedSet and SortedMap. - *

              - * Note: In the 2.0 and 2.1 releases of Commons Collections, - * this class would throw a {@link ClassCastException} if - * either of the arguments to {@link #compare(Object, Object) compare} - * were null, not {@link Comparable Comparable}, - * or for which {@link Comparable#compareTo(Object) compareTo} gave - * inconsistent results. This is no longer the case. See - * {@link #compare(Object, Object) compare} for details. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Henri Yandell - * - * @see java.util.Collections#reverseOrder() - */ -public class ComparableComparator implements Comparator, Serializable { - - /** Serialization version. */ - private static final long serialVersionUID=-291439688585137865L; - - /** The singleton instance. */ - private static final ComparableComparator instance = new ComparableComparator(); - - //----------------------------------------------------------------------- - /** - * Gets the singleton instance of a ComparableComparator. - *

              - * Developers are encouraged to use the comparator returned from this method - * instead of constructing a new instance to reduce allocation and GC overhead - * when multiple comparable comparators may be used in the same VM. - * - * @return the singleton ComparableComparator - */ - public static ComparableComparator getInstance() { - return instance; - } - - //----------------------------------------------------------------------- - /** - * Constructor whose use should be avoided. - *

              - * Please use the {@link #getInstance()} method whenever possible. - */ - public ComparableComparator() { - super(); - } - - //----------------------------------------------------------------------- - /** - * Compare the two {@link Comparable Comparable} arguments. - * This method is equivalent to: - *

              ((Comparable)obj1).compareTo(obj2)
              - * - * @param obj1 the first object to compare - * @param obj2 the second object to compare - * @return negative if obj1 is less, positive if greater, zero if equal - * @throws NullPointerException when obj1 is null, - * or when ((Comparable)obj1).compareTo(obj2) does - * @throws ClassCastException when obj1 is not a Comparable, - * or when ((Comparable)obj1).compareTo(obj2) does - */ - public int compare(Object obj1, Object obj2) { - return ((Comparable)obj1).compareTo(obj2); - } - - //----------------------------------------------------------------------- - /** - * Implement a hash code for this comparator that is consistent with - * {@link #equals(Object) equals}. - * - * @return a hash code for this comparator. - * @since Commons Collections 3.0 - */ - public int hashCode() { - return "ComparableComparator".hashCode(); - } - - /** - * Returns true iff that Object is - * is a {@link Comparator Comparator} whose ordering is - * known to be equivalent to mine. - *

              - * This implementation returns true - * iff object.{@link Object#getClass() getClass()} - * equals this.getClass(). - * Subclasses may want to override this behavior to remain consistent - * with the {@link Comparator#equals(Object)} contract. - * - * @param object the object to compare with - * @return true if equal - * @since Commons Collections 3.0 - */ - public boolean equals(Object object) { - return (this == object) || - ((null != object) && (object.getClass().equals(this.getClass()))); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparatorChain.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparatorChain.java deleted file mode 100644 index 9c573be4ee6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ComparatorChain.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -/** - *

              A ComparatorChain is a Comparator that wraps one or - * more Comparators in sequence. The ComparatorChain - * calls each Comparator in sequence until either 1) - * any single Comparator returns a non-zero result - * (and that result is then returned), - * or 2) the ComparatorChain is exhausted (and zero is - * returned). This type of sorting is very similar - * to multi-column sorting in SQL, and this class - * allows Java classes to emulate that kind of behaviour - * when sorting a List.

              - * - *

              To further facilitate SQL-like sorting, the order of - * any single Comparator in the list can be reversed.

              - * - *

              Calling a method that adds new Comparators or - * changes the ascend/descend sort after compare(Object, - * Object) has been called will result in an - * UnsupportedOperationException. However, take care - * to not alter the underlying List of Comparators - * or the BitSet that defines the sort order.

              - * - *

              Instances of ComparatorChain are not synchronized. - * The class is not thread-safe at construction time, but - * it is thread-safe to perform multiple comparisons - * after all the setup operations are complete.

              - * - * @since Commons Collections 2.0 - * @author Morgan Delagrange - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - */ -public class ComparatorChain implements Comparator, Serializable { - - /** Serialization version from Collections 2.0. */ - private static final long serialVersionUID = -721644942746081630L; - - /** The list of comparators in the chain. */ - protected List comparatorChain = null; - /** Order - false (clear) = ascend; true (set) = descend. */ - protected BitSet orderingBits = null; - /** Whether the chain has been "locked". */ - protected boolean isLocked = false; - - //----------------------------------------------------------------------- - /** - * Construct a ComparatorChain with no Comparators. - * You must add at least one Comparator before calling - * the compare(Object,Object) method, or an - * UnsupportedOperationException is thrown - */ - public ComparatorChain() { - this(new ArrayList(),new BitSet()); - } - - /** - * Construct a ComparatorChain with a single Comparator, - * sorting in the forward order - * - * @param comparator First comparator in the Comparator chain - */ - public ComparatorChain(Comparator comparator) { - this(comparator,false); - } - - /** - * Construct a Comparator chain with a single Comparator, - * sorting in the given order - * - * @param comparator First Comparator in the ComparatorChain - * @param reverse false = forward sort; true = reverse sort - */ - public ComparatorChain(Comparator comparator, boolean reverse) { - comparatorChain = new ArrayList(); - comparatorChain.add(comparator); - orderingBits = new BitSet(1); - if (reverse == true) { - orderingBits.set(0); - } - } - - /** - * Construct a ComparatorChain from the Comparators in the - * List. All Comparators will default to the forward - * sort order. - * - * @param list List of Comparators - * @see #ComparatorChain(List,BitSet) - */ - public ComparatorChain(List list) { - this(list,new BitSet(list.size())); - } - - /** - * Construct a ComparatorChain from the Comparators in the - * given List. The sort order of each column will be - * drawn from the given BitSet. When determining the sort - * order for Comparator at index i in the List, - * the ComparatorChain will call BitSet.get(i). - * If that method returns false, the forward - * sort order is used; a return value of true - * indicates reverse sort order. - * - * @param list List of Comparators. NOTE: This constructor does not perform a - * defensive copy of the list - * @param bits Sort order for each Comparator. Extra bits are ignored, - * unless extra Comparators are added by another method. - */ - public ComparatorChain(List list, BitSet bits) { - comparatorChain = list; - orderingBits = bits; - } - - //----------------------------------------------------------------------- - /** - * Add a Comparator to the end of the chain using the - * forward sort order - * - * @param comparator Comparator with the forward sort order - */ - public void addComparator(Comparator comparator) { - addComparator(comparator,false); - } - - /** - * Add a Comparator to the end of the chain using the - * given sort order - * - * @param comparator Comparator to add to the end of the chain - * @param reverse false = forward sort order; true = reverse sort order - */ - public void addComparator(Comparator comparator, boolean reverse) { - checkLocked(); - - comparatorChain.add(comparator); - if (reverse == true) { - orderingBits.set(comparatorChain.size() - 1); - } - } - - /** - * Replace the Comparator at the given index, maintaining - * the existing sort order. - * - * @param index index of the Comparator to replace - * @param comparator Comparator to place at the given index - * @exception IndexOutOfBoundsException - * if index < 0 or index >= size() - */ - public void setComparator(int index, Comparator comparator) - throws IndexOutOfBoundsException { - setComparator(index,comparator,false); - } - - /** - * Replace the Comparator at the given index in the - * ComparatorChain, using the given sort order - * - * @param index index of the Comparator to replace - * @param comparator Comparator to set - * @param reverse false = forward sort order; true = reverse sort order - */ - public void setComparator(int index, Comparator comparator, boolean reverse) { - checkLocked(); - - comparatorChain.set(index,comparator); - if (reverse == true) { - orderingBits.set(index); - } else { - orderingBits.clear(index); - } - } - - - /** - * Change the sort order at the given index in the - * ComparatorChain to a forward sort. - * - * @param index Index of the ComparatorChain - */ - public void setForwardSort(int index) { - checkLocked(); - orderingBits.clear(index); - } - - /** - * Change the sort order at the given index in the - * ComparatorChain to a reverse sort. - * - * @param index Index of the ComparatorChain - */ - public void setReverseSort(int index) { - checkLocked(); - orderingBits.set(index); - } - - /** - * Number of Comparators in the current ComparatorChain. - * - * @return Comparator count - */ - public int size() { - return comparatorChain.size(); - } - - /** - * Determine if modifications can still be made to the - * ComparatorChain. ComparatorChains cannot be modified - * once they have performed a comparison. - * - * @return true = ComparatorChain cannot be modified; false = - * ComparatorChain can still be modified. - */ - public boolean isLocked() { - return isLocked; - } - - // throw an exception if the ComparatorChain is locked - private void checkLocked() { - if (isLocked == true) { - throw new UnsupportedOperationException("Comparator ordering cannot be changed after the first comparison is performed"); - } - } - - private void checkChainIntegrity() { - if (comparatorChain.size() == 0) { - throw new UnsupportedOperationException("ComparatorChains must contain at least one Comparator"); - } - } - - //----------------------------------------------------------------------- - /** - * Perform comparisons on the Objects as per - * Comparator.compare(o1,o2). - * - * @param o1 the first object to compare - * @param o2 the second object to compare - * @return -1, 0, or 1 - * @exception UnsupportedOperationException - * if the ComparatorChain does not contain at least one - * Comparator - */ - public int compare(Object o1, Object o2) throws UnsupportedOperationException { - if (isLocked == false) { - checkChainIntegrity(); - isLocked = true; - } - - // iterate over all comparators in the chain - Iterator comparators = comparatorChain.iterator(); - for (int comparatorIndex = 0; comparators.hasNext(); ++comparatorIndex) { - - Comparator comparator = (Comparator) comparators.next(); - int retval = comparator.compare(o1,o2); - if (retval != 0) { - // invert the order if it is a reverse sort - if (orderingBits.get(comparatorIndex) == true) { - if(Integer.MIN_VALUE == retval) { - retval = Integer.MAX_VALUE; - } else { - retval *= -1; - } - } - - return retval; - } - - } - - // if comparators are exhausted, return 0 - return 0; - } - - //----------------------------------------------------------------------- - /** - * Implement a hash code for this comparator that is consistent with - * {@link #equals(Object) equals}. - * - * @return a suitable hash code - * @since Commons Collections 3.0 - */ - public int hashCode() { - int hash = 0; - if(null != comparatorChain) { - hash ^= comparatorChain.hashCode(); - } - if(null != orderingBits) { - hash ^= orderingBits.hashCode(); - } - return hash; - } - - /** - * Returns true iff that Object is - * is a {@link Comparator} whose ordering is known to be - * equivalent to mine. - *

              - * This implementation returns true - * iff object.{@link Object#getClass() getClass()} - * equals this.getClass(), and the underlying - * comparators and order bits are equal. - * Subclasses may want to override this behavior to remain consistent - * with the {@link Comparator#equals(Object)} contract. - * - * @param object the object to compare with - * @return true if equal - * @since Commons Collections 3.0 - */ - public boolean equals(Object object) { - if(this == object) { - return true; - } else if(null == object) { - return false; - } else if(object.getClass().equals(this.getClass())) { - ComparatorChain chain = (ComparatorChain)object; - return ( (null == orderingBits ? null == chain.orderingBits : orderingBits.equals(chain.orderingBits)) - && (null == comparatorChain ? null == chain.comparatorChain : comparatorChain.equals(chain.comparatorChain)) ); - } else { - return false; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/FixedOrderComparator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/FixedOrderComparator.java deleted file mode 100644 index 41f5ffd9c1a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/FixedOrderComparator.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * A Comparator which imposes a specific order on a specific set of Objects. - * Objects are presented to the FixedOrderComparator in a specified order and - * subsequent calls to {@link #compare(Object, Object) compare} yield that order. - * For example: - *

              - * String[] planets = {"Mercury", "Venus", "Earth", "Mars"};
              - * FixedOrderComparator distanceFromSun = new FixedOrderComparator(planets);
              - * Arrays.sort(planets);                     // Sort to alphabetical order
              - * Arrays.sort(planets, distanceFromSun);    // Back to original order
              - * 
              - *

              - * Once compare has been called, the FixedOrderComparator is locked - * and attempts to modify it yield an UnsupportedOperationException. - *

              - * Instances of FixedOrderComparator are not synchronized. The class is not - * thread-safe at construction time, but it is thread-safe to perform - * multiple comparisons after all the setup operations are complete. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author David Leppik - * @author Stephen Colebourne - * @author Janek Bogucki - */ -public class FixedOrderComparator implements Comparator { - - /** - * Behavior when comparing unknown Objects: - * unknown objects compare as before known Objects. - */ - public static final int UNKNOWN_BEFORE = 0; - - /** - * Behavior when comparing unknown Objects: - * unknown objects compare as after known Objects. - */ - public static final int UNKNOWN_AFTER = 1; - - /** - * Behavior when comparing unknown Objects: - * unknown objects cause a IllegalArgumentException to be thrown. - * This is the default behavior. - */ - public static final int UNKNOWN_THROW_EXCEPTION = 2; - - /** Internal map of object to position */ - private final Map map = new HashMap(); - /** Counter used in determining the position in the map */ - private int counter = 0; - /** Is the comparator locked against further change */ - private boolean isLocked = false; - /** The behaviour in the case of an unknown object */ - private int unknownObjectBehavior = UNKNOWN_THROW_EXCEPTION; - - // Constructors - //----------------------------------------------------------------------- - /** - * Constructs an empty FixedOrderComparator. - */ - public FixedOrderComparator() { - super(); - } - - /** - * Constructs a FixedOrderComparator which uses the order of the given array - * to compare the objects. - *

              - * The array is copied, so later changes will not affect the comparator. - * - * @param items the items that the comparator can compare in order - * @throws IllegalArgumentException if the array is null - */ - public FixedOrderComparator(Object[] items) { - super(); - if (items == null) { - throw new IllegalArgumentException("The list of items must not be null"); - } - for (int i = 0; i < items.length; i++) { - add(items[i]); - } - } - - /** - * Constructs a FixedOrderComparator which uses the order of the given list - * to compare the objects. - *

              - * The list is copied, so later changes will not affect the comparator. - * - * @param items the items that the comparator can compare in order - * @throws IllegalArgumentException if the list is null - */ - public FixedOrderComparator(List items) { - super(); - if (items == null) { - throw new IllegalArgumentException("The list of items must not be null"); - } - for (Iterator it = items.iterator(); it.hasNext();) { - add(it.next()); - } - } - - // Bean methods / state querying methods - //----------------------------------------------------------------------- - /** - * Returns true if modifications cannot be made to the FixedOrderComparator. - * FixedOrderComparators cannot be modified once they have performed a comparison. - * - * @return true if attempts to change the FixedOrderComparator yield an - * UnsupportedOperationException, false if it can be changed. - */ - public boolean isLocked() { - return isLocked; - } - - /** - * Checks to see whether the comparator is now locked against further changes. - * - * @throws UnsupportedOperationException if the comparator is locked - */ - protected void checkLocked() { - if (isLocked()) { - throw new UnsupportedOperationException("Cannot modify a FixedOrderComparator after a comparison"); - } - } - - /** - * Gets the behavior for comparing unknown objects. - * - * @return the flag for unknown behaviour - UNKNOWN_AFTER, - * UNKNOWN_BEFORE or UNKNOWN_THROW_EXCEPTION - */ - public int getUnknownObjectBehavior() { - return unknownObjectBehavior; - } - - /** - * Sets the behavior for comparing unknown objects. - * - * @param unknownObjectBehavior the flag for unknown behaviour - - * UNKNOWN_AFTER, UNKNOWN_BEFORE or UNKNOWN_THROW_EXCEPTION - * @throws UnsupportedOperationException if a comparison has been performed - * @throws IllegalArgumentException if the unknown flag is not valid - */ - public void setUnknownObjectBehavior(int unknownObjectBehavior) { - checkLocked(); - if (unknownObjectBehavior != UNKNOWN_AFTER - && unknownObjectBehavior != UNKNOWN_BEFORE - && unknownObjectBehavior != UNKNOWN_THROW_EXCEPTION) { - throw new IllegalArgumentException("Unrecognised value for unknown behaviour flag"); - } - this.unknownObjectBehavior = unknownObjectBehavior; - } - - // Methods for adding items - //----------------------------------------------------------------------- - /** - * Adds an item, which compares as after all items known to the Comparator. - * If the item is already known to the Comparator, its old position is - * replaced with the new position. - * - * @param obj the item to be added to the Comparator. - * @return true if obj has been added for the first time, false if - * it was already known to the Comparator. - * @throws UnsupportedOperationException if a comparison has already been made - */ - public boolean add(Object obj) { - checkLocked(); - Object position = map.put(obj, new Integer(counter++)); - return (position == null); - } - - /** - * Adds a new item, which compares as equal to the given existing item. - * - * @param existingObj an item already in the Comparator's set of - * known objects - * @param newObj an item to be added to the Comparator's set of - * known objects - * @return true if newObj has been added for the first time, false if - * it was already known to the Comparator. - * @throws IllegalArgumentException if existingObject is not in the - * Comparator's set of known objects. - * @throws UnsupportedOperationException if a comparison has already been made - */ - public boolean addAsEqual(Object existingObj, Object newObj) { - checkLocked(); - Integer position = (Integer) map.get(existingObj); - if (position == null) { - throw new IllegalArgumentException(existingObj + " not known to " + this); - } - Object result = map.put(newObj, position); - return (result == null); - } - - // Comparator methods - //----------------------------------------------------------------------- - /** - * Compares two objects according to the order of this Comparator. - *

              - * It is important to note that this class will throw an IllegalArgumentException - * in the case of an unrecognised object. This is not specified in the - * Comparator interface, but is the most appropriate exception. - * - * @param obj1 the first object to compare - * @param obj2 the second object to compare - * @return negative if obj1 is less, positive if greater, zero if equal - * @throws IllegalArgumentException if obj1 or obj2 are not known - * to this Comparator and an alternative behavior has not been set - * via {@link #setUnknownObjectBehavior(int)}. - */ - public int compare(Object obj1, Object obj2) { - isLocked = true; - Integer position1 = (Integer) map.get(obj1); - Integer position2 = (Integer) map.get(obj2); - if (position1 == null || position2 == null) { - switch (unknownObjectBehavior) { - case UNKNOWN_BEFORE : - if (position1 == null) { - return (position2 == null) ? 0 : -1; - } else { - return 1; - } - case UNKNOWN_AFTER : - if (position1 == null) { - return (position2 == null) ? 0 : 1; - } else { - return -1; - } - case UNKNOWN_THROW_EXCEPTION : - Object unknownObj = (position1 == null) ? obj1 : obj2; - throw new IllegalArgumentException("Attempting to compare unknown object " + unknownObj); - default : - throw new UnsupportedOperationException("Unknown unknownObjectBehavior: " + unknownObjectBehavior); - } - } else { - return position1.compareTo(position2); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/NullComparator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/NullComparator.java deleted file mode 100644 index 05d8e3e2715..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/NullComparator.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.io.Serializable; -import java.util.Comparator; - -/** - * A Comparator that will compare nulls to be either lower or higher than - * other objects. - * - * @since Commons Collections 2.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Michael A. Smith - */ -public class NullComparator implements Comparator, Serializable { - - /** Serialization version. */ - private static final long serialVersionUID = -5820772575483504339L; - - /** - * The comparator to use when comparing two non-null objects. - **/ - private Comparator nonNullComparator; - - /** - * Specifies whether a null are compared as higher than - * non-null objects. - **/ - private boolean nullsAreHigh; - - //----------------------------------------------------------------------- - /** - * Construct an instance that sorts null higher than any - * non-null object it is compared with. When comparing two - * non-null objects, the {@link ComparableComparator} is - * used. - **/ - public NullComparator() { - this(ComparableComparator.getInstance(), true); - } - - /** - * Construct an instance that sorts null higher than any - * non-null object it is compared with. When comparing two - * non-null objects, the specified {@link Comparator} is - * used. - * - * @param nonNullComparator the comparator to use when comparing two - * non-null objects. This argument cannot be - * null - * - * @exception NullPointerException if nonNullComparator is - * null - **/ - public NullComparator(Comparator nonNullComparator) { - this(nonNullComparator, true); - } - - /** - * Construct an instance that sorts null higher or lower than - * any non-null object it is compared with. When comparing - * two non-null objects, the {@link ComparableComparator} is - * used. - * - * @param nullsAreHigh a true value indicates that - * null should be compared as higher than a - * non-null object. A false value indicates - * that null should be compared as lower than a - * non-null object. - **/ - public NullComparator(boolean nullsAreHigh) { - this(ComparableComparator.getInstance(), nullsAreHigh); - } - - /** - * Construct an instance that sorts null higher or lower than - * any non-null object it is compared with. When comparing - * two non-null objects, the specified {@link Comparator} is - * used. - * - * @param nonNullComparator the comparator to use when comparing two - * non-null objects. This argument cannot be - * null - * - * @param nullsAreHigh a true value indicates that - * null should be compared as higher than a - * non-null object. A false value indicates - * that null should be compared as lower than a - * non-null object. - * - * @exception NullPointerException if nonNullComparator is - * null - **/ - public NullComparator(Comparator nonNullComparator, boolean nullsAreHigh) { - this.nonNullComparator = nonNullComparator; - this.nullsAreHigh = nullsAreHigh; - - if(nonNullComparator == null) { - throw new NullPointerException("null nonNullComparator"); - } - } - - //----------------------------------------------------------------------- - /** - * Perform a comparison between two objects. If both objects are - * null, a 0 value is returned. If one object - * is null and the other is not, the result is determined on - * whether the Comparator was constructed to have nulls as higher or lower - * than other objects. If neither object is null, an - * underlying comparator specified in the constructor (or the default) is - * used to compare the non-null objects. - * - * @param o1 the first object to compare - * @param o2 the object to compare it to. - * @return -1 if o1 is "lower" than (less than, - * before, etc.) o2; 1 if o1 is - * "higher" than (greater than, after, etc.) o2; or - * 0 if o1 and o2 are equal. - **/ - public int compare(Object o1, Object o2) { - if(o1 == o2) { return 0; } - if(o1 == null) { return (this.nullsAreHigh ? 1 : -1); } - if(o2 == null) { return (this.nullsAreHigh ? -1 : 1); } - return this.nonNullComparator.compare(o1, o2); - } - - //----------------------------------------------------------------------- - /** - * Implement a hash code for this comparator that is consistent with - * {@link #equals(Object)}. - * - * @return a hash code for this comparator. - **/ - public int hashCode() { - return (nullsAreHigh ? -1 : 1) * nonNullComparator.hashCode(); - } - - /** - * Determines whether the specified object represents a comparator that is - * equal to this comparator. - * - * @param obj the object to compare this comparator with. - * - * @return true if the specified object is a NullComparator - * with equivalent null comparison behavior - * (i.e. null high or low) and with equivalent underlying - * non-null object comparators. - **/ - public boolean equals(Object obj) { - if(obj == null) { return false; } - if(obj == this) { return true; } - if(!obj.getClass().equals(this.getClass())) { return false; } - - NullComparator other = (NullComparator)obj; - - return ((this.nullsAreHigh == other.nullsAreHigh) && - (this.nonNullComparator.equals(other.nonNullComparator))); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ReverseComparator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ReverseComparator.java deleted file mode 100644 index 9357ce365e0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/ReverseComparator.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.io.Serializable; -import java.util.Comparator; - -/** - * Reverses the order of another comparator by reversing the arguments - * to its {@link #compare(Object, Object) compare} method. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Henri Yandell - * @author Michael A. Smith - * - * @see java.util.Collections#reverseOrder() - */ -public class ReverseComparator implements Comparator, Serializable { - - /** Serialization version from Collections 2.0. */ - private static final long serialVersionUID = 2858887242028539265L; - - /** The comparator being decorated. */ - private Comparator comparator; - - //----------------------------------------------------------------------- - /** - * Creates a comparator that compares objects based on the inverse of their - * natural ordering. Using this Constructor will create a ReverseComparator - * that is functionally identical to the Comparator returned by - * java.util.Collections.reverseOrder(). - * - * @see java.util.Collections#reverseOrder() - */ - public ReverseComparator() { - this(null); - } - - /** - * Creates a comparator that inverts the comparison - * of the given comparator. If you pass in null, - * the ReverseComparator defaults to reversing the - * natural order, as per - * {@link java.util.Collections#reverseOrder()}. - * - * @param comparator Comparator to reverse - */ - public ReverseComparator(Comparator comparator) { - if(comparator != null) { - this.comparator = comparator; - } else { - this.comparator = ComparableComparator.getInstance(); - } - } - - //----------------------------------------------------------------------- - /** - * Compares two objects in reverse order. - * - * @param obj1 the first object to compare - * @param obj2 the second object to compare - * @return negative if obj1 is less, positive if greater, zero if equal - */ - public int compare(Object obj1, Object obj2) { - return comparator.compare(obj2, obj1); - } - - //----------------------------------------------------------------------- - /** - * Implement a hash code for this comparator that is consistent with - * {@link #equals(Object) equals}. - * - * @return a suitable hash code - * @since Commons Collections 3.0 - */ - public int hashCode() { - return "ReverseComparator".hashCode() ^ comparator.hashCode(); - } - - /** - * Returns true iff that Object is - * is a {@link Comparator} whose ordering is known to be - * equivalent to mine. - *

              - * This implementation returns true - * iff object.{@link Object#getClass() getClass()} - * equals this.getClass(), and the underlying - * comparators are equal. - * Subclasses may want to override this behavior to remain consistent - * with the {@link Comparator#equals(Object) equals} contract. - * - * @param object the object to compare to - * @return true if equal - * @since Commons Collections 3.0 - */ - public boolean equals(Object object) { - if(this == object) { - return true; - } else if(null == object) { - return false; - } else if(object.getClass().equals(this.getClass())) { - ReverseComparator thatrc = (ReverseComparator)object; - return comparator.equals(thatrc.comparator); - } else { - return false; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/TransformingComparator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/TransformingComparator.java deleted file mode 100644 index 00d71df3812..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/TransformingComparator.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.comparators; - -import java.util.Comparator; - -import org.apache.commons.collections.Transformer; - -/** - * Decorates another Comparator with transformation behavior. That is, the - * return value from the transform operation will be passed to the decorated - * {@link Comparator#compare(Object,Object) compare} method. - * - * @since Commons Collections 2.0 (?) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @see org.apache.commons.collections.Transformer - * @see org.apache.commons.collections.comparators.ComparableComparator - */ -public class TransformingComparator implements Comparator { - - /** The decorated comparator. */ - protected Comparator decorated; - /** The transformer being used. */ - protected Transformer transformer; - - //----------------------------------------------------------------------- - /** - * Constructs an instance with the given Transformer and a - * {@link ComparableComparator ComparableComparator}. - * - * @param transformer what will transform the arguments to compare - */ - public TransformingComparator(Transformer transformer) { - this(transformer, new ComparableComparator()); - } - - /** - * Constructs an instance with the given Transformer and Comparator. - * - * @param transformer what will transform the arguments to compare - * @param decorated the decorated Comparator - */ - public TransformingComparator(Transformer transformer, Comparator decorated) { - this.decorated = decorated; - this.transformer = transformer; - } - - //----------------------------------------------------------------------- - /** - * Returns the result of comparing the values from the transform operation. - * - * @param obj1 the first object to transform then compare - * @param obj2 the second object to transform then compare - * @return negative if obj1 is less, positive if greater, zero if equal - */ - public int compare(Object obj1, Object obj2) { - Object value1 = this.transformer.transform(obj1); - Object value2 = this.transformer.transform(obj2); - return this.decorated.compare(value1, value2); - } - -} - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/package.html deleted file mode 100644 index 1d083454d44..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/comparators/package.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -

              -This package contains implementations of the -{@link java.util.Comparator Comparator} interface. -

              -You may also consider using -{@link org.apache.commons.collections.ComparatorUtils ComparatorUtils}, -which is a single class that uses static methods to construct instances -of the classes in this package. - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AllPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AllPredicate.java deleted file mode 100644 index 1c5e1fb1d82..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AllPredicate.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Collection; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if all the - * predicates return true. - * If the array of predicates is empty, then this predicate returns true. - *

              - * NOTE: In versions prior to 3.2 an array size of zero or one - * threw an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -public final class AllPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -3094696765038308799L; - - /** The array of predicates to call */ - private final Predicate[] iPredicates; - - /** - * Factory to create the predicate. - *

              - * If the array is size zero, the predicate always returns true. - * If the array is size one, then that predicate is returned. - * - * @param predicates the predicates to check, cloned, not null - * @return the all predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Predicate[] predicates) { - FunctorUtils.validate(predicates); - if (predicates.length == 0) { - return TruePredicate.INSTANCE; - } - if (predicates.length == 1) { - return predicates[0]; - } - predicates = FunctorUtils.copy(predicates); - return new AllPredicate(predicates); - } - - /** - * Factory to create the predicate. - *

              - * If the collection is size zero, the predicate always returns true. - * If the collection is size one, then that predicate is returned. - * - * @param predicates the predicates to check, cloned, not null - * @return the all predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Collection predicates) { - Predicate[] preds = FunctorUtils.validate(predicates); - if (preds.length == 0) { - return TruePredicate.INSTANCE; - } - if (preds.length == 1) { - return preds[0]; - } - return new AllPredicate(preds); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicates the predicates to check, not cloned, not null - */ - public AllPredicate(Predicate[] predicates) { - super(); - iPredicates = predicates; - } - - /** - * Evaluates the predicate returning true if all predicates return true. - * - * @param object the input object - * @return true if all decorated predicates return true - */ - public boolean evaluate(Object object) { - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(object) == false) { - return false; - } - } - return true; - } - - /** - * Gets the predicates, do not modify the array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return iPredicates; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AndPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AndPredicate.java deleted file mode 100644 index ddb2c385faf..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AndPredicate.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if both the predicates return true. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class AndPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 4189014213763186912L; - - /** The array of predicates to call */ - private final Predicate iPredicate1; - /** The array of predicates to call */ - private final Predicate iPredicate2; - - /** - * Factory to create the predicate. - * - * @param predicate1 the first predicate to check, not null - * @param predicate2 the second predicate to check, not null - * @return the and predicate - * @throws IllegalArgumentException if either predicate is null - */ - public static Predicate getInstance(Predicate predicate1, Predicate predicate2) { - if (predicate1 == null || predicate2 == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new AndPredicate(predicate1, predicate2); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate1 the first predicate to check, not null - * @param predicate2 the second predicate to check, not null - */ - public AndPredicate(Predicate predicate1, Predicate predicate2) { - super(); - iPredicate1 = predicate1; - iPredicate2 = predicate2; - } - - /** - * Evaluates the predicate returning true if both predicates return true. - * - * @param object the input object - * @return true if both decorated predicates return true - */ - public boolean evaluate(Object object) { - return (iPredicate1.evaluate(object) && iPredicate2.evaluate(object)); - } - - /** - * Gets the two predicates being decorated as an array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate1, iPredicate2}; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AnyPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AnyPredicate.java deleted file mode 100644 index 624b3ecf95b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/AnyPredicate.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Collection; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if any of the - * predicates return true. - * If the array of predicates is empty, then this predicate returns false. - *

              - * NOTE: In versions prior to 3.2 an array size of zero or one - * threw an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -public final class AnyPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7429999530934647542L; - - /** The array of predicates to call */ - private final Predicate[] iPredicates; - - /** - * Factory to create the predicate. - *

              - * If the array is size zero, the predicate always returns false. - * If the array is size one, then that predicate is returned. - * - * @param predicates the predicates to check, cloned, not null - * @return the any predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Predicate[] predicates) { - FunctorUtils.validate(predicates); - if (predicates.length == 0) { - return FalsePredicate.INSTANCE; - } - if (predicates.length == 1) { - return predicates[0]; - } - return new AnyPredicate(FunctorUtils.copy(predicates)); - } - - /** - * Factory to create the predicate. - *

              - * If the collection is size zero, the predicate always returns false. - * If the collection is size one, then that predicate is returned. - * - * @param predicates the predicates to check, cloned, not null - * @return the all predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Collection predicates) { - Predicate[] preds = FunctorUtils.validate(predicates); - if (preds.length == 0) { - return FalsePredicate.INSTANCE; - } - if (preds.length == 1) { - return preds[0]; - } - return new AnyPredicate(preds); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicates the predicates to check, not cloned, not null - */ - public AnyPredicate(Predicate[] predicates) { - super(); - iPredicates = predicates; - } - - /** - * Evaluates the predicate returning true if any predicate returns true. - * - * @param object the input object - * @return true if any decorated predicate return true - */ - public boolean evaluate(Object object) { - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(object)) { - return true; - } - } - return false; - } - - /** - * Gets the predicates, do not modify the array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return iPredicates; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedClosure.java deleted file mode 100644 index 59756e4ad91..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedClosure.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.Closure; - -/** - * Closure implementation that chains the specified closures together. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ChainedClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -3520677225766901240L; - - /** The closures to call in turn */ - private final Closure[] iClosures; - - /** - * Factory method that performs validation and copies the parameter array. - * - * @param closures the closures to chain, copied, no nulls - * @return the chained closure - * @throws IllegalArgumentException if the closures array is null - * @throws IllegalArgumentException if any closure in the array is null - */ - public static Closure getInstance(Closure[] closures) { - FunctorUtils.validate(closures); - if (closures.length == 0) { - return NOPClosure.INSTANCE; - } - closures = FunctorUtils.copy(closures); - return new ChainedClosure(closures); - } - - /** - * Create a new Closure that calls each closure in turn, passing the - * result into the next closure. The ordering is that of the iterator() - * method on the collection. - * - * @param closures a collection of closures to chain - * @return the chained closure - * @throws IllegalArgumentException if the closures collection is null - * @throws IllegalArgumentException if any closure in the collection is null - */ - public static Closure getInstance(Collection closures) { - if (closures == null) { - throw new IllegalArgumentException("Closure collection must not be null"); - } - if (closures.size() == 0) { - return NOPClosure.INSTANCE; - } - // convert to array like this to guarantee iterator() ordering - Closure[] cmds = new Closure[closures.size()]; - int i = 0; - for (Iterator it = closures.iterator(); it.hasNext();) { - cmds[i++] = (Closure) it.next(); - } - FunctorUtils.validate(cmds); - return new ChainedClosure(cmds); - } - - /** - * Factory method that performs validation. - * - * @param closure1 the first closure, not null - * @param closure2 the second closure, not null - * @return the chained closure - * @throws IllegalArgumentException if either closure is null - */ - public static Closure getInstance(Closure closure1, Closure closure2) { - if (closure1 == null || closure2 == null) { - throw new IllegalArgumentException("Closures must not be null"); - } - Closure[] closures = new Closure[] { closure1, closure2 }; - return new ChainedClosure(closures); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param closures the closures to chain, not copied, no nulls - */ - public ChainedClosure(Closure[] closures) { - super(); - iClosures = closures; - } - - /** - * Execute a list of closures. - * - * @param input the input object passed to each closure - */ - public void execute(Object input) { - for (int i = 0; i < iClosures.length; i++) { - iClosures[i].execute(input); - } - } - - /** - * Gets the closures, do not modify the array. - * @return the closures - * @since Commons Collections 3.1 - */ - public Closure[] getClosures() { - return iClosures; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedTransformer.java deleted file mode 100644 index e8db61544b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ChainedTransformer.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that chains the specified transformers together. - *

              - * The input object is passed to the first transformer. The transformed result - * is passed to the second transformer and so on. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ChainedTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 3514945074733160196L; - - /** The transformers to call in turn */ - private final Transformer[] iTransformers; - - /** - * Factory method that performs validation and copies the parameter array. - * - * @param transformers the transformers to chain, copied, no nulls - * @return the chained transformer - * @throws IllegalArgumentException if the transformers array is null - * @throws IllegalArgumentException if any transformer in the array is null - */ - public static Transformer getInstance(Transformer[] transformers) { - FunctorUtils.validate(transformers); - if (transformers.length == 0) { - return NOPTransformer.INSTANCE; - } - transformers = FunctorUtils.copy(transformers); - return new ChainedTransformer(transformers); - } - - /** - * Create a new Transformer that calls each transformer in turn, passing the - * result into the next transformer. The ordering is that of the iterator() - * method on the collection. - * - * @param transformers a collection of transformers to chain - * @return the chained transformer - * @throws IllegalArgumentException if the transformers collection is null - * @throws IllegalArgumentException if any transformer in the collection is null - */ - public static Transformer getInstance(Collection transformers) { - if (transformers == null) { - throw new IllegalArgumentException("Transformer collection must not be null"); - } - if (transformers.size() == 0) { - return NOPTransformer.INSTANCE; - } - // convert to array like this to guarantee iterator() ordering - Transformer[] cmds = new Transformer[transformers.size()]; - int i = 0; - for (Iterator it = transformers.iterator(); it.hasNext();) { - cmds[i++] = (Transformer) it.next(); - } - FunctorUtils.validate(cmds); - return new ChainedTransformer(cmds); - } - - /** - * Factory method that performs validation. - * - * @param transformer1 the first transformer, not null - * @param transformer2 the second transformer, not null - * @return the chained transformer - * @throws IllegalArgumentException if either transformer is null - */ - public static Transformer getInstance(Transformer transformer1, Transformer transformer2) { - if (transformer1 == null || transformer2 == null) { - throw new IllegalArgumentException("Transformers must not be null"); - } - Transformer[] transformers = new Transformer[] { transformer1, transformer2 }; - return new ChainedTransformer(transformers); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param transformers the transformers to chain, not copied, no nulls - */ - public ChainedTransformer(Transformer[] transformers) { - super(); - iTransformers = transformers; - } - - /** - * Transforms the input to result via each decorated transformer - * - * @param object the input object passed to the first transformer - * @return the transformed result - */ - public Object transform(Object object) { - for (int i = 0; i < iTransformers.length; i++) { - object = iTransformers[i].transform(object); - } - return object; - } - - /** - * Gets the transformers, do not modify the array. - * @return the transformers - * @since Commons Collections 3.1 - */ - public Transformer[] getTransformers() { - return iTransformers; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/CloneTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/CloneTransformer.java deleted file mode 100644 index 7200402e9f0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/CloneTransformer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that returns a clone of the input object. - *

              - * Clone is performed using PrototypeFactory.getInstance(input).create(). - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class CloneTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -8188742709499652567L; - - /** Singleton predicate instance */ - public static final Transformer INSTANCE = new CloneTransformer(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Transformer getInstance() { - return INSTANCE; - } - - /** - * Constructor - */ - private CloneTransformer() { - super(); - } - - /** - * Transforms the input to result by cloning it. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - if (input == null) { - return null; - } - return PrototypeFactory.getInstance(input).create(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ClosureTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ClosureTransformer.java deleted file mode 100644 index 57480a2d843..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ClosureTransformer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that calls a Closure using the input object - * and then returns the input. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ClosureTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 478466901448617286L; - - /** The closure to wrap */ - private final Closure iClosure; - - /** - * Factory method that performs validation. - * - * @param closure the closure to call, not null - * @return the closure transformer - * @throws IllegalArgumentException if the closure is null - */ - public static Transformer getInstance(Closure closure) { - if (closure == null) { - throw new IllegalArgumentException("Closure must not be null"); - } - return new ClosureTransformer(closure); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param closure the closure to call, not null - */ - public ClosureTransformer(Closure closure) { - super(); - iClosure = closure; - } - - /** - * Transforms the input to result by executing a closure. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - iClosure.execute(input); - return input; - } - - /** - * Gets the closure. - * - * @return the closure - * @since Commons Collections 3.1 - */ - public Closure getClosure() { - return iClosure; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantFactory.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantFactory.java deleted file mode 100644 index f50f7bb21a3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Factory; - -/** - * Factory implementation that returns the same constant each time. - *

              - * No check is made that the object is immutable. In general, only immutable - * objects should use the constant factory. Mutable objects should - * use the prototype factory. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ConstantFactory implements Factory, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -3520677225766901240L; - - /** Returns null each time */ - public static final Factory NULL_INSTANCE = new ConstantFactory(null); - - /** The closures to call in turn */ - private final Object iConstant; - - /** - * Factory method that performs validation. - * - * @param constantToReturn the constant object to return each time in the factory - * @return the constant factory. - */ - public static Factory getInstance(Object constantToReturn) { - if (constantToReturn == null) { - return NULL_INSTANCE; - } - return new ConstantFactory(constantToReturn); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param constantToReturn the constant to return each time - */ - public ConstantFactory(Object constantToReturn) { - super(); - iConstant = constantToReturn; - } - - /** - * Always return constant. - * - * @return the stored constant value - */ - public Object create() { - return iConstant; - } - - /** - * Gets the constant. - * - * @return the constant - * @since Commons Collections 3.1 - */ - public Object getConstant() { - return iConstant; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantTransformer.java deleted file mode 100644 index 03fa93dccaa..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ConstantTransformer.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that returns the same constant each time. - *

              - * No check is made that the object is immutable. In general, only immutable - * objects should use the constant factory. Mutable objects should - * use the prototype factory. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ConstantTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 6374440726369055124L; - - /** Returns null each time */ - public static final Transformer NULL_INSTANCE = new ConstantTransformer(null); - - /** The closures to call in turn */ - private final Object iConstant; - - /** - * Transformer method that performs validation. - * - * @param constantToReturn the constant object to return each time in the factory - * @return the constant factory. - */ - public static Transformer getInstance(Object constantToReturn) { - if (constantToReturn == null) { - return NULL_INSTANCE; - } - return new ConstantTransformer(constantToReturn); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param constantToReturn the constant to return each time - */ - public ConstantTransformer(Object constantToReturn) { - super(); - iConstant = constantToReturn; - } - - /** - * Transforms the input by ignoring it and returning the stored constant instead. - * - * @param input the input object which is ignored - * @return the stored constant - */ - public Object transform(Object input) { - return iConstant; - } - - /** - * Gets the constant. - * - * @return the constant - * @since Commons Collections 3.1 - */ - public Object getConstant() { - return iConstant; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/EqualPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/EqualPredicate.java deleted file mode 100644 index 34300042b0c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/EqualPredicate.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if the input is the same object - * as the one stored in this predicate by equals. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class EqualPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 5633766978029907089L; - - /** The value to compare to */ - private final Object iValue; - - /** - * Factory to create the identity predicate. - * - * @param object the object to compare to - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance(Object object) { - if (object == null) { - return NullPredicate.INSTANCE; - } - return new EqualPredicate(object); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param object the object to compare to - */ - public EqualPredicate(Object object) { - super(); - iValue = object; - } - - /** - * Evaluates the predicate returning true if the input equals the stored value. - * - * @param object the input object - * @return true if input object equals stored value - */ - public boolean evaluate(Object object) { - return (iValue.equals(object)); - } - - /** - * Gets the value. - * - * @return the value - * @since Commons Collections 3.1 - */ - public Object getValue() { - return iValue; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionClosure.java deleted file mode 100644 index 40d0d9546e6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionClosure.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.FunctorException; - -/** - * Closure implementation that always throws an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class ExceptionClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7179106032121985545L; - - - /** Singleton predicate instance */ - public static final Closure INSTANCE = new ExceptionClosure(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Closure getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private ExceptionClosure() { - super(); - } - - /** - * Always throw an exception. - * - * @param input the input object - * @throws FunctorException always - */ - public void execute(Object input) { - throw new FunctorException("ExceptionClosure invoked"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionFactory.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionFactory.java deleted file mode 100644 index 3c7dbd5892a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionFactory.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.FunctorException; - -/** - * Factory implementation that always throws an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class ExceptionFactory implements Factory, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7179106032121985545L; - - - /** Singleton predicate instance */ - public static final Factory INSTANCE = new ExceptionFactory(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Factory getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private ExceptionFactory() { - super(); - } - - /** - * Always throws an exception. - * - * @return never - * @throws FunctorException always - */ - public Object create() { - throw new FunctorException("ExceptionFactory invoked"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionPredicate.java deleted file mode 100644 index c7bc1b61a1b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionPredicate.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that always throws an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class ExceptionPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7179106032121985545L; - - /** Singleton predicate instance */ - public static final Predicate INSTANCE = new ExceptionPredicate(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Predicate getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private ExceptionPredicate() { - super(); - } - - /** - * Evaluates the predicate always throwing an exception. - * - * @param object the input object - * @return never - * @throws FunctorException always - */ - public boolean evaluate(Object object) { - throw new FunctorException("ExceptionPredicate invoked"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionTransformer.java deleted file mode 100644 index 89dc744ef81..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ExceptionTransformer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that always throws an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class ExceptionTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7179106032121985545L; - - - /** Singleton predicate instance */ - public static final Transformer INSTANCE = new ExceptionTransformer(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Transformer getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private ExceptionTransformer() { - super(); - } - - /** - * Transforms the input to result by cloning it. - * - * @param input the input object to transform - * @return never - * @throws FunctorException always - */ - public Object transform(Object input) { - throw new FunctorException("ExceptionTransformer invoked"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FactoryTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FactoryTransformer.java deleted file mode 100644 index 3f69b202c49..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FactoryTransformer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that calls a Factory and returns the result. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class FactoryTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -6817674502475353160L; - - /** The factory to wrap */ - private final Factory iFactory; - - /** - * Factory method that performs validation. - * - * @param factory the factory to call, not null - * @return the factory transformer - * @throws IllegalArgumentException if the factory is null - */ - public static Transformer getInstance(Factory factory) { - if (factory == null) { - throw new IllegalArgumentException("Factory must not be null"); - } - return new FactoryTransformer(factory); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param factory the factory to call, not null - */ - public FactoryTransformer(Factory factory) { - super(); - iFactory = factory; - } - - /** - * Transforms the input by ignoring the input and returning the result of - * calling the decorated factory. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - return iFactory.create(); - } - - /** - * Gets the factory. - * - * @return the factory - * @since Commons Collections 3.1 - */ - public Factory getFactory() { - return iFactory; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FalsePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FalsePredicate.java deleted file mode 100644 index 6f59608b25c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FalsePredicate.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that always returns false. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class FalsePredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7533784454832764388L; - - /** Singleton predicate instance */ - public static final Predicate INSTANCE = new FalsePredicate(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Predicate getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private FalsePredicate() { - super(); - } - - /** - * Evaluates the predicate returning false always. - * - * @param object the input object - * @return false always - */ - public boolean evaluate(Object object) { - return false; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ForClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ForClosure.java deleted file mode 100644 index f0355c4a136..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/ForClosure.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; - -/** - * Closure implementation that calls another closure n times, like a for loop. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ForClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -1190120533393621674L; - - /** The number of times to loop */ - private final int iCount; - /** The closure to call */ - private final Closure iClosure; - - /** - * Factory method that performs validation. - *

              - * A null closure or zero count returns the NOPClosure. - * A count of one returns the specified closure. - * - * @param count the number of times to execute the closure - * @param closure the closure to execute, not null - * @return the for closure - */ - public static Closure getInstance(int count, Closure closure) { - if (count <= 0 || closure == null) { - return NOPClosure.INSTANCE; - } - if (count == 1) { - return closure; - } - return new ForClosure(count, closure); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param count the number of times to execute the closure - * @param closure the closure to execute, not null - */ - public ForClosure(int count, Closure closure) { - super(); - iCount = count; - iClosure = closure; - } - - /** - * Executes the closure count times. - * - * @param input the input object - */ - public void execute(Object input) { - for (int i = 0; i < iCount; i++) { - iClosure.execute(input); - } - } - - /** - * Gets the closure. - * - * @return the closure - * @since Commons Collections 3.1 - */ - public Closure getClosure() { - return iClosure; - } - - /** - * Gets the count. - * - * @return the count - * @since Commons Collections 3.1 - */ - public int getCount() { - return iCount; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FunctorUtils.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FunctorUtils.java deleted file mode 100644 index 75f8d9b433e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/FunctorUtils.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.util.Collection; -import java.util.Iterator; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.Transformer; - -/** - * Internal utilities for functors. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -class FunctorUtils { - - /** - * Restricted constructor. - */ - private FunctorUtils() { - super(); - } - - /** - * Clone the predicates to ensure that the internal reference can't be messed with. - * - * @param predicates the predicates to copy - * @return the cloned predicates - */ - static Predicate[] copy(Predicate[] predicates) { - if (predicates == null) { - return null; - } - return (Predicate[]) predicates.clone(); - } - - /** - * Validate the predicates to ensure that all is well. - * - * @param predicates the predicates to validate - */ - static void validate(Predicate[] predicates) { - if (predicates == null) { - throw new IllegalArgumentException("The predicate array must not be null"); - } - for (int i = 0; i < predicates.length; i++) { - if (predicates[i] == null) { - throw new IllegalArgumentException("The predicate array must not contain a null predicate, index " + i + " was null"); - } - } - } - - /** - * Validate the predicates to ensure that all is well. - * - * @param predicates the predicates to validate - * @return predicate array - */ - static Predicate[] validate(Collection predicates) { - if (predicates == null) { - throw new IllegalArgumentException("The predicate collection must not be null"); - } - // convert to array like this to guarantee iterator() ordering - Predicate[] preds = new Predicate[predicates.size()]; - int i = 0; - for (Iterator it = predicates.iterator(); it.hasNext();) { - preds[i] = (Predicate) it.next(); - if (preds[i] == null) { - throw new IllegalArgumentException("The predicate collection must not contain a null predicate, index " + i + " was null"); - } - i++; - } - return preds; - } - - /** - * Clone the closures to ensure that the internal reference can't be messed with. - * - * @param closures the closures to copy - * @return the cloned closures - */ - static Closure[] copy(Closure[] closures) { - if (closures == null) { - return null; - } - return (Closure[]) closures.clone(); - } - - /** - * Validate the closures to ensure that all is well. - * - * @param closures the closures to validate - */ - static void validate(Closure[] closures) { - if (closures == null) { - throw new IllegalArgumentException("The closure array must not be null"); - } - for (int i = 0; i < closures.length; i++) { - if (closures[i] == null) { - throw new IllegalArgumentException("The closure array must not contain a null closure, index " + i + " was null"); - } - } - } - - /** - * Copy method - * - * @param transformers the transformers to copy - * @return a clone of the transformers - */ - static Transformer[] copy(Transformer[] transformers) { - if (transformers == null) { - return null; - } - return (Transformer[]) transformers.clone(); - } - - /** - * Validate method - * - * @param transformers the transformers to validate - */ - static void validate(Transformer[] transformers) { - if (transformers == null) { - throw new IllegalArgumentException("The transformer array must not be null"); - } - for (int i = 0; i < transformers.length; i++) { - if (transformers[i] == null) { - throw new IllegalArgumentException( - "The transformer array must not contain a null transformer, index " + i + " was null"); - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IdentityPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IdentityPredicate.java deleted file mode 100644 index aa0777e9d8f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IdentityPredicate.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if the input is the same object - * as the one stored in this predicate. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class IdentityPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -89901658494523293L; - - - /** The value to compare to */ - private final Object iValue; - - /** - * Factory to create the identity predicate. - * - * @param object the object to compare to - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance(Object object) { - if (object == null) { - return NullPredicate.INSTANCE; - } - return new IdentityPredicate(object); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param object the object to compare to - */ - public IdentityPredicate(Object object) { - super(); - iValue = object; - } - - /** - * Evaluates the predicate returning true if the input object is identical to - * the stored object. - * - * @param object the input object - * @return true if input is the same object as the stored value - */ - public boolean evaluate(Object object) { - return (iValue == object); - } - - /** - * Gets the value. - * - * @return the value - * @since Commons Collections 3.1 - */ - public Object getValue() { - return iValue; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IfClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IfClosure.java deleted file mode 100644 index ad4ea266f9e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/IfClosure.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.Predicate; - -/** - * Closure implementation acts as an if statement calling one or other closure - * based on a predicate. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -public class IfClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 3518477308466486130L; - - /** The test */ - private final Predicate iPredicate; - /** The closure to use if true */ - private final Closure iTrueClosure; - /** The closure to use if false */ - private final Closure iFalseClosure; - - /** - * Factory method that performs validation. - *

              - * This factory creates a closure that performs no action when - * the predicate is false. - * - * @param predicate predicate to switch on - * @param trueClosure closure used if true - * @return the if closure - * @throws IllegalArgumentException if either argument is null - * @since Commons Collections 3.2 - */ - public static Closure getInstance(Predicate predicate, Closure trueClosure) { - return getInstance(predicate, trueClosure, NOPClosure.INSTANCE); - } - - /** - * Factory method that performs validation. - * - * @param predicate predicate to switch on - * @param trueClosure closure used if true - * @param falseClosure closure used if false - * @return the if closure - * @throws IllegalArgumentException if any argument is null - */ - public static Closure getInstance(Predicate predicate, Closure trueClosure, Closure falseClosure) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - if (trueClosure == null || falseClosure == null) { - throw new IllegalArgumentException("Closures must not be null"); - } - return new IfClosure(predicate, trueClosure, falseClosure); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - *

              - * This constructor creates a closure that performs no action when - * the predicate is false. - * - * @param predicate predicate to switch on, not null - * @param trueClosure closure used if true, not null - * @since Commons Collections 3.2 - */ - public IfClosure(Predicate predicate, Closure trueClosure) { - this(predicate, trueClosure, NOPClosure.INSTANCE); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate predicate to switch on, not null - * @param trueClosure closure used if true, not null - * @param falseClosure closure used if false, not null - */ - public IfClosure(Predicate predicate, Closure trueClosure, Closure falseClosure) { - super(); - iPredicate = predicate; - iTrueClosure = trueClosure; - iFalseClosure = falseClosure; - } - - /** - * Executes the true or false closure accoring to the result of the predicate. - * - * @param input the input object - */ - public void execute(Object input) { - if (iPredicate.evaluate(input) == true) { - iTrueClosure.execute(input); - } else { - iFalseClosure.execute(input); - } - } - - /** - * Gets the predicate. - * - * @return the predicate - * @since Commons Collections 3.1 - */ - public Predicate getPredicate() { - return iPredicate; - } - - /** - * Gets the closure called when true. - * - * @return the closure - * @since Commons Collections 3.1 - */ - public Closure getTrueClosure() { - return iTrueClosure; - } - - /** - * Gets the closure called when false. - * - * @return the closure - * @since Commons Collections 3.1 - */ - public Closure getFalseClosure() { - return iFalseClosure; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstanceofPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstanceofPredicate.java deleted file mode 100644 index 14aef31a8f4..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstanceofPredicate.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if the input is an instanceof - * the type stored in this predicate. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class InstanceofPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -6682656911025165584L; - - /** The type to compare to */ - private final Class iType; - - /** - * Factory to create the identity predicate. - * - * @param type the type to check for, may not be null - * @return the predicate - * @throws IllegalArgumentException if the class is null - */ - public static Predicate getInstance(Class type) { - if (type == null) { - throw new IllegalArgumentException("The type to check instanceof must not be null"); - } - return new InstanceofPredicate(type); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param type the type to check for - */ - public InstanceofPredicate(Class type) { - super(); - iType = type; - } - - /** - * Evaluates the predicate returning true if the input object is of the correct type. - * - * @param object the input object - * @return true if input is of stored type - */ - public boolean evaluate(Object object) { - return (iType.isInstance(object)); - } - - /** - * Gets the type to compare to. - * - * @return the type - * @since Commons Collections 3.1 - */ - public Class getType() { - return iType; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateFactory.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateFactory.java deleted file mode 100644 index 5d375dea1e2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateFactory.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.FunctorException; - -/** - * Factory implementation that creates a new object instance by reflection. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class InstantiateFactory implements Factory, Serializable { - - /** The serial version */ - private static final long serialVersionUID = -7732226881069447957L; - - /** The class to create */ - private final Class iClassToInstantiate; - /** The constructor parameter types */ - private final Class[] iParamTypes; - /** The constructor arguments */ - private final Object[] iArgs; - /** The constructor */ - private transient Constructor iConstructor = null; - - /** - * Factory method that performs validation. - * - * @param classToInstantiate the class to instantiate, not null - * @param paramTypes the constructor parameter types - * @param args the constructor arguments - * @return a new instantiate factory - */ - public static Factory getInstance(Class classToInstantiate, Class[] paramTypes, Object[] args) { - if (classToInstantiate == null) { - throw new IllegalArgumentException("Class to instantiate must not be null"); - } - if (((paramTypes == null) && (args != null)) - || ((paramTypes != null) && (args == null)) - || ((paramTypes != null) && (args != null) && (paramTypes.length != args.length))) { - throw new IllegalArgumentException("Parameter types must match the arguments"); - } - - if (paramTypes == null || paramTypes.length == 0) { - return new InstantiateFactory(classToInstantiate); - } else { - paramTypes = (Class[]) paramTypes.clone(); - args = (Object[]) args.clone(); - return new InstantiateFactory(classToInstantiate, paramTypes, args); - } - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param classToInstantiate the class to instantiate - */ - public InstantiateFactory(Class classToInstantiate) { - super(); - iClassToInstantiate = classToInstantiate; - iParamTypes = null; - iArgs = null; - findConstructor(); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param classToInstantiate the class to instantiate - * @param paramTypes the constructor parameter types, not cloned - * @param args the constructor arguments, not cloned - */ - public InstantiateFactory(Class classToInstantiate, Class[] paramTypes, Object[] args) { - super(); - iClassToInstantiate = classToInstantiate; - iParamTypes = paramTypes; - iArgs = args; - findConstructor(); - } - - /** - * Find the Constructor for the class specified. - */ - private void findConstructor() { - try { - iConstructor = iClassToInstantiate.getConstructor(iParamTypes); - - } catch (NoSuchMethodException ex) { - throw new IllegalArgumentException("InstantiateFactory: The constructor must exist and be public "); - } - } - - /** - * Creates an object using the stored constructor. - * - * @return the new object - */ - public Object create() { - // needed for post-serialization - if (iConstructor == null) { - findConstructor(); - } - - try { - return iConstructor.newInstance(iArgs); - - } catch (InstantiationException ex) { - throw new FunctorException("InstantiateFactory: InstantiationException", ex); - } catch (IllegalAccessException ex) { - throw new FunctorException("InstantiateFactory: Constructor must be public", ex); - } catch (InvocationTargetException ex) { - throw new FunctorException("InstantiateFactory: Constructor threw an exception", ex); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateTransformer.java deleted file mode 100644 index 73d6b2f715a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InstantiateTransformer.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that creates a new object instance by reflection. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class InstantiateTransformer implements Transformer, Serializable { - - /** The serial version */ - private static final long serialVersionUID = 3786388740793356347L; - - /** Singleton instance that uses the no arg constructor */ - public static final Transformer NO_ARG_INSTANCE = new InstantiateTransformer(); - - /** The constructor parameter types */ - private final Class[] iParamTypes; - /** The constructor arguments */ - private final Object[] iArgs; - - /** - * Transformer method that performs validation. - * - * @param paramTypes the constructor parameter types - * @param args the constructor arguments - * @return an instantiate transformer - */ - public static Transformer getInstance(Class[] paramTypes, Object[] args) { - if (((paramTypes == null) && (args != null)) - || ((paramTypes != null) && (args == null)) - || ((paramTypes != null) && (args != null) && (paramTypes.length != args.length))) { - throw new IllegalArgumentException("Parameter types must match the arguments"); - } - - if (paramTypes == null || paramTypes.length == 0) { - return NO_ARG_INSTANCE; - } else { - paramTypes = (Class[]) paramTypes.clone(); - args = (Object[]) args.clone(); - } - return new InstantiateTransformer(paramTypes, args); - } - - /** - * Constructor for no arg instance. - */ - private InstantiateTransformer() { - super(); - iParamTypes = null; - iArgs = null; - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param paramTypes the constructor parameter types, not cloned - * @param args the constructor arguments, not cloned - */ - public InstantiateTransformer(Class[] paramTypes, Object[] args) { - super(); - iParamTypes = paramTypes; - iArgs = args; - } - - /** - * Transforms the input Class object to a result by instantiation. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - try { - if (input instanceof Class == false) { - throw new FunctorException( - "InstantiateTransformer: Input object was not an instanceof Class, it was a " - + (input == null ? "null object" : input.getClass().getName())); - } - Constructor con = ((Class) input).getConstructor(iParamTypes); - return con.newInstance(iArgs); - - } catch (NoSuchMethodException ex) { - throw new FunctorException("InstantiateTransformer: The constructor must exist and be public "); - } catch (InstantiationException ex) { - throw new FunctorException("InstantiateTransformer: InstantiationException", ex); - } catch (IllegalAccessException ex) { - throw new FunctorException("InstantiateTransformer: Constructor must be public", ex); - } catch (InvocationTargetException ex) { - throw new FunctorException("InstantiateTransformer: Constructor threw an exception", ex); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InvokerTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InvokerTransformer.java deleted file mode 100644 index 6f609617c3a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/InvokerTransformer.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that creates a new object instance by reflection. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class InvokerTransformer implements Transformer, Serializable { - - /** The serial version */ - private static final long serialVersionUID = -8653385846894047688L; - - /** The method name to call */ - private final String iMethodName; - /** The array of reflection parameter types */ - private final Class[] iParamTypes; - /** The array of reflection arguments */ - private final Object[] iArgs; - - /** - * Gets an instance of this transformer calling a specific method with no arguments. - * - * @param methodName the method name to call - * @return an invoker transformer - * @since Commons Collections 3.1 - */ - public static Transformer getInstance(String methodName) { - if (methodName == null) { - throw new IllegalArgumentException("The method to invoke must not be null"); - } - return new InvokerTransformer(methodName); - } - - /** - * Gets an instance of this transformer calling a specific method with specific values. - * - * @param methodName the method name to call - * @param paramTypes the parameter types of the method - * @param args the arguments to pass to the method - * @return an invoker transformer - */ - public static Transformer getInstance(String methodName, Class[] paramTypes, Object[] args) { - if (methodName == null) { - throw new IllegalArgumentException("The method to invoke must not be null"); - } - if (((paramTypes == null) && (args != null)) - || ((paramTypes != null) && (args == null)) - || ((paramTypes != null) && (args != null) && (paramTypes.length != args.length))) { - throw new IllegalArgumentException("The parameter types must match the arguments"); - } - if (paramTypes == null || paramTypes.length == 0) { - return new InvokerTransformer(methodName); - } else { - paramTypes = (Class[]) paramTypes.clone(); - args = (Object[]) args.clone(); - return new InvokerTransformer(methodName, paramTypes, args); - } - } - - /** - * Constructor for no arg instance. - * - * @param methodName the method to call - */ - private InvokerTransformer(String methodName) { - super(); - iMethodName = methodName; - iParamTypes = null; - iArgs = null; - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param methodName the method to call - * @param paramTypes the constructor parameter types, not cloned - * @param args the constructor arguments, not cloned - */ - public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args) { - super(); - iMethodName = methodName; - iParamTypes = paramTypes; - iArgs = args; - } - - /** - * Transforms the input to result by invoking a method on the input. - * - * @param input the input object to transform - * @return the transformed result, null if null input - */ - public Object transform(Object input) { - if (input == null) { - return null; - } - try { - Class cls = input.getClass(); - Method method = cls.getMethod(iMethodName, iParamTypes); - return method.invoke(input, iArgs); - - } catch (NoSuchMethodException ex) { - throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' does not exist"); - } catch (IllegalAccessException ex) { - throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' cannot be accessed"); - } catch (InvocationTargetException ex) { - throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' threw an exception", ex); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/MapTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/MapTransformer.java deleted file mode 100644 index d6223c4a86f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/MapTransformer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Map; - -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that returns the value held in a specified map - * using the input parameter as a key. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class MapTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 862391807045468939L; - - /** The map of data to lookup in */ - private final Map iMap; - - /** - * Factory to create the transformer. - *

              - * If the map is null, a transformer that always returns null is returned. - * - * @param map the map, not cloned - * @return the transformer - */ - public static Transformer getInstance(Map map) { - if (map == null) { - return ConstantTransformer.NULL_INSTANCE; - } - return new MapTransformer(map); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param map the map to use for lookup, not cloned - */ - private MapTransformer(Map map) { - super(); - iMap = map; - } - - /** - * Transforms the input to result by looking it up in a Map. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - return iMap.get(input); - } - - /** - * Gets the map to lookup in. - * - * @return the map - * @since Commons Collections 3.1 - */ - public Map getMap() { - return iMap; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPClosure.java deleted file mode 100644 index 8040192ccd6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPClosure.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; - -/** - * Closure implementation that does nothing. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class NOPClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 3518477308466486130L; - - /** Singleton predicate instance */ - public static final Closure INSTANCE = new NOPClosure(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Closure getInstance() { - return INSTANCE; - } - - /** - * Constructor - */ - private NOPClosure() { - super(); - } - - /** - * Do nothing. - * - * @param input the input object - */ - public void execute(Object input) { - // do nothing - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPTransformer.java deleted file mode 100644 index 6f6c43c0203..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NOPTransformer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that does nothing. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class NOPTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 2133891748318574490L; - - /** Singleton predicate instance */ - public static final Transformer INSTANCE = new NOPTransformer(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Transformer getInstance() { - return INSTANCE; - } - - /** - * Constructor - */ - private NOPTransformer() { - super(); - } - - /** - * Transforms the input to result by doing nothing. - * - * @param input the input object to transform - * @return the transformed result which is the input - */ - public Object transform(Object input) { - return input; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NonePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NonePredicate.java deleted file mode 100644 index 9acd134bfda..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NonePredicate.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Collection; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if none of the - * predicates return true. - * If the array of predicates is empty, then this predicate returns true. - *

              - * NOTE: In versions prior to 3.2 an array size of zero or one - * threw an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -public final class NonePredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 2007613066565892961L; - - /** The array of predicates to call */ - private final Predicate[] iPredicates; - - /** - * Factory to create the predicate. - *

              - * If the array is size zero, the predicate always returns true. - * - * @param predicates the predicates to check, cloned, not null - * @return the any predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Predicate[] predicates) { - FunctorUtils.validate(predicates); - if (predicates.length == 0) { - return TruePredicate.INSTANCE; - } - predicates = FunctorUtils.copy(predicates); - return new NonePredicate(predicates); - } - - /** - * Factory to create the predicate. - *

              - * If the collection is size zero, the predicate always returns true. - * - * @param predicates the predicates to check, cloned, not null - * @return the one predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Collection predicates) { - Predicate[] preds = FunctorUtils.validate(predicates); - if (preds.length == 0) { - return TruePredicate.INSTANCE; - } - return new NonePredicate(preds); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicates the predicates to check, not cloned, not null - */ - public NonePredicate(Predicate[] predicates) { - super(); - iPredicates = predicates; - } - - /** - * Evaluates the predicate returning false if any stored predicate returns false. - * - * @param object the input object - * @return true if none of decorated predicates return true - */ - public boolean evaluate(Object object) { - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(object)) { - return false; - } - } - return true; - } - - /** - * Gets the predicates, do not modify the array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return iPredicates; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotNullPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotNullPredicate.java deleted file mode 100644 index 987a99f71d8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotNullPredicate.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if the input is not null. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class NotNullPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7533784454832764388L; - - /** Singleton predicate instance */ - public static final Predicate INSTANCE = new NotNullPredicate(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Predicate getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private NotNullPredicate() { - super(); - } - - /** - * Evaluates the predicate returning true if the object does not equal null. - * - * @param object the object to evaluate - * @return true if not null - */ - public boolean evaluate(Object object) { - return (object != null); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotPredicate.java deleted file mode 100644 index 8656f54eeea..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NotPredicate.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns the opposite of the decorated predicate. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class NotPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -2654603322338049674L; - - /** The predicate to decorate */ - private final Predicate iPredicate; - - /** - * Factory to create the not predicate. - * - * @param predicate the predicate to decorate, not null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance(Predicate predicate) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new NotPredicate(predicate); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate the predicate to call after the null check - */ - public NotPredicate(Predicate predicate) { - super(); - iPredicate = predicate; - } - - /** - * Evaluates the predicate returning the opposite to the stored predicate. - * - * @param object the input object - * @return true if predicate returns false - */ - public boolean evaluate(Object object) { - return !(iPredicate.evaluate(object)); - } - - /** - * Gets the predicate being decorated. - * - * @return the predicate as the only element in an array - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate}; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsExceptionPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsExceptionPredicate.java deleted file mode 100644 index 8ef0211dd15..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsExceptionPredicate.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that throws an exception if the input is null. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class NullIsExceptionPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 3243449850504576071L; - - /** The predicate to decorate */ - private final Predicate iPredicate; - - /** - * Factory to create the null exception predicate. - * - * @param predicate the predicate to decorate, not null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance(Predicate predicate) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new NullIsExceptionPredicate(predicate); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate the predicate to call after the null check - */ - public NullIsExceptionPredicate(Predicate predicate) { - super(); - iPredicate = predicate; - } - - /** - * Evaluates the predicate returning the result of the decorated predicate - * once a null check is performed. - * - * @param object the input object - * @return true if decorated predicate returns true - * @throws FunctorException if input is null - */ - public boolean evaluate(Object object) { - if (object == null) { - throw new FunctorException("Input Object must not be null"); - } - return iPredicate.evaluate(object); - } - - /** - * Gets the predicate being decorated. - * - * @return the predicate as the only element in an array - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate}; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsFalsePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsFalsePredicate.java deleted file mode 100644 index 6304e94cdbe..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsFalsePredicate.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns false if the input is null. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class NullIsFalsePredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -2997501534564735525L; - - /** The predicate to decorate */ - private final Predicate iPredicate; - - /** - * Factory to create the null false predicate. - * - * @param predicate the predicate to decorate, not null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance(Predicate predicate) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new NullIsFalsePredicate(predicate); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate the predicate to call after the null check - */ - public NullIsFalsePredicate(Predicate predicate) { - super(); - iPredicate = predicate; - } - - /** - * Evaluates the predicate returning the result of the decorated predicate - * once a null check is performed. - * - * @param object the input object - * @return true if decorated predicate returns true, false if input is null - */ - public boolean evaluate(Object object) { - if (object == null) { - return false; - } - return iPredicate.evaluate(object); - } - - /** - * Gets the predicate being decorated. - * - * @return the predicate as the only element in an array - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate}; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsTruePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsTruePredicate.java deleted file mode 100644 index 7c18fae296b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullIsTruePredicate.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if the input is null. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class NullIsTruePredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -7625133768987126273L; - - /** The predicate to decorate */ - private final Predicate iPredicate; - - /** - * Factory to create the null true predicate. - * - * @param predicate the predicate to decorate, not null - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance(Predicate predicate) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new NullIsTruePredicate(predicate); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate the predicate to call after the null check - */ - public NullIsTruePredicate(Predicate predicate) { - super(); - iPredicate = predicate; - } - - /** - * Evaluates the predicate returning the result of the decorated predicate - * once a null check is performed. - * - * @param object the input object - * @return true if decorated predicate returns true or input is null - */ - public boolean evaluate(Object object) { - if (object == null) { - return true; - } - return iPredicate.evaluate(object); - } - - /** - * Gets the predicate being decorated. - * - * @return the predicate as the only element in an array - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate}; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullPredicate.java deleted file mode 100644 index 22046f6f043..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/NullPredicate.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if the input is null. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class NullPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7533784454832764388L; - - /** Singleton predicate instance */ - public static final Predicate INSTANCE = new NullPredicate(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Predicate getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private NullPredicate() { - super(); - } - - /** - * Evaluates the predicate returning true if the input is null. - * - * @param object the input object - * @return true if input is null - */ - public boolean evaluate(Object object) { - return (object == null); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OnePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OnePredicate.java deleted file mode 100644 index a4a5eedbaa2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OnePredicate.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Collection; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if only one of the - * predicates return true. - * If the array of predicates is empty, then this predicate returns false. - *

              - * NOTE: In versions prior to 3.2 an array size of zero or one - * threw an exception. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matt Benson - */ -public final class OnePredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -8125389089924745785L; - - /** The array of predicates to call */ - private final Predicate[] iPredicates; - - /** - * Factory to create the predicate. - *

              - * If the array is size zero, the predicate always returns false. - * If the array is size one, then that predicate is returned. - * - * @param predicates the predicates to check, cloned, not null - * @return the any predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Predicate[] predicates) { - FunctorUtils.validate(predicates); - if (predicates.length == 0) { - return FalsePredicate.INSTANCE; - } - if (predicates.length == 1) { - return predicates[0]; - } - predicates = FunctorUtils.copy(predicates); - return new OnePredicate(predicates); - } - - /** - * Factory to create the predicate. - * - * @param predicates the predicates to check, cloned, not null - * @return the one predicate - * @throws IllegalArgumentException if the predicates array is null - * @throws IllegalArgumentException if any predicate in the array is null - */ - public static Predicate getInstance(Collection predicates) { - Predicate[] preds = FunctorUtils.validate(predicates); - return new OnePredicate(preds); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicates the predicates to check, not cloned, not null - */ - public OnePredicate(Predicate[] predicates) { - super(); - iPredicates = predicates; - } - - /** - * Evaluates the predicate returning true if only one decorated predicate - * returns true. - * - * @param object the input object - * @return true if only one decorated predicate returns true - */ - public boolean evaluate(Object object) { - boolean match = false; - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(object)) { - if (match) { - return false; - } - match = true; - } - } - return match; - } - - /** - * Gets the predicates, do not modify the array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return iPredicates; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OrPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OrPredicate.java deleted file mode 100644 index 03959fae292..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/OrPredicate.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true if either of the predicates return true. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class OrPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -8791518325735182855L; - - /** The array of predicates to call */ - private final Predicate iPredicate1; - /** The array of predicates to call */ - private final Predicate iPredicate2; - - /** - * Factory to create the predicate. - * - * @param predicate1 the first predicate to check, not null - * @param predicate2 the second predicate to check, not null - * @return the and predicate - * @throws IllegalArgumentException if either predicate is null - */ - public static Predicate getInstance(Predicate predicate1, Predicate predicate2) { - if (predicate1 == null || predicate2 == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new OrPredicate(predicate1, predicate2); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate1 the first predicate to check, not null - * @param predicate2 the second predicate to check, not null - */ - public OrPredicate(Predicate predicate1, Predicate predicate2) { - super(); - iPredicate1 = predicate1; - iPredicate2 = predicate2; - } - - /** - * Evaluates the predicate returning true if either predicate returns true. - * - * @param object the input object - * @return true if either decorated predicate returns true - */ - public boolean evaluate(Object object) { - return (iPredicate1.evaluate(object) || iPredicate2.evaluate(object)); - } - - /** - * Gets the two predicates being decorated as an array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate1, iPredicate2}; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateDecorator.java deleted file mode 100644 index 2cae3b9be7d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateDecorator.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import org.apache.commons.collections.Predicate; - -/** - * Defines a predicate that decorates one or more other predicates. - *

              - * This interface enables tools to access the decorated predicates. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public interface PredicateDecorator extends Predicate { - - /** - * Gets the predicates being decorated as an array. - *

              - * The array may be the internal data structure of the predicate and thus - * should not be altered. - * - * @return the predicates being decorated - */ - Predicate[] getPredicates(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateTransformer.java deleted file mode 100644 index b81c82501f7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PredicateTransformer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that calls a Predicate using the input object - * and then returns the input. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class PredicateTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 5278818408044349346L; - - /** The closure to wrap */ - private final Predicate iPredicate; - - /** - * Factory method that performs validation. - * - * @param predicate the predicate to call, not null - * @return the predicate transformer - * @throws IllegalArgumentException if the predicate is null - */ - public static Transformer getInstance(Predicate predicate) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - return new PredicateTransformer(predicate); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate the predicate to call, not null - */ - public PredicateTransformer(Predicate predicate) { - super(); - iPredicate = predicate; - } - - /** - * Transforms the input to result by calling a predicate. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - return (iPredicate.evaluate(input) ? Boolean.TRUE : Boolean.FALSE); - } - - /** - * Gets the predicate. - * - * @return the predicate - * @since Commons Collections 3.1 - */ - public Predicate getPredicate() { - return iPredicate; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PrototypeFactory.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PrototypeFactory.java deleted file mode 100644 index 4fa41506884..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/PrototypeFactory.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.FunctorException; - -/** - * Factory implementation that creates a new instance each time based on a prototype. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class PrototypeFactory { - - /** - * Factory method that performs validation. - *

              - * Creates a Factory that will return a clone of the same prototype object - * each time the factory is used. The prototype will be cloned using one of these - * techniques (in order): - *

                - *
              • public clone method - *
              • public copy constructor - *
              • serialization clone - *
                  - * - * @param prototype the object to clone each time in the factory - * @return the prototype factory - * @throws IllegalArgumentException if the prototype is null - * @throws IllegalArgumentException if the prototype cannot be cloned - */ - public static Factory getInstance(Object prototype) { - if (prototype == null) { - return ConstantFactory.NULL_INSTANCE; - } - try { - Method method = prototype.getClass().getMethod("clone", (Class[]) null); - return new PrototypeCloneFactory(prototype, method); - - } catch (NoSuchMethodException ex) { - try { - prototype.getClass().getConstructor(new Class[] { prototype.getClass()}); - return new InstantiateFactory( - prototype.getClass(), - new Class[] { prototype.getClass()}, - new Object[] { prototype }); - - } catch (NoSuchMethodException ex2) { - if (prototype instanceof Serializable) { - return new PrototypeSerializationFactory((Serializable) prototype); - } - } - } - throw new IllegalArgumentException("The prototype must be cloneable via a public clone method"); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - */ - private PrototypeFactory() { - super(); - } - - // PrototypeCloneFactory - //----------------------------------------------------------------------- - /** - * PrototypeCloneFactory creates objects by copying a prototype using the clone method. - */ - static class PrototypeCloneFactory implements Factory, Serializable { - - /** The serial version */ - private static final long serialVersionUID = 5604271422565175555L; - - /** The object to clone each time */ - private final Object iPrototype; - /** The method used to clone */ - private transient Method iCloneMethod; - - /** - * Constructor to store prototype. - */ - private PrototypeCloneFactory(Object prototype, Method method) { - super(); - iPrototype = prototype; - iCloneMethod = method; - } - - /** - * Find the Clone method for the class specified. - */ - private void findCloneMethod() { - try { - iCloneMethod = iPrototype.getClass().getMethod("clone", (Class[]) null); - - } catch (NoSuchMethodException ex) { - throw new IllegalArgumentException("PrototypeCloneFactory: The clone method must exist and be public "); - } - } - - /** - * Creates an object by calling the clone method. - * - * @return the new object - */ - public Object create() { - // needed for post-serialization - if (iCloneMethod == null) { - findCloneMethod(); - } - - try { - return iCloneMethod.invoke(iPrototype, (Object[])null); - - } catch (IllegalAccessException ex) { - throw new FunctorException("PrototypeCloneFactory: Clone method must be public", ex); - } catch (InvocationTargetException ex) { - throw new FunctorException("PrototypeCloneFactory: Clone method threw an exception", ex); - } - } - } - - // PrototypeSerializationFactory - //----------------------------------------------------------------------- - /** - * PrototypeSerializationFactory creates objects by cloning a prototype using serialization. - */ - static class PrototypeSerializationFactory implements Factory, Serializable { - - /** The serial version */ - private static final long serialVersionUID = -8704966966139178833L; - - /** The object to clone via serialization each time */ - private final Serializable iPrototype; - - /** - * Constructor to store prototype - */ - private PrototypeSerializationFactory(Serializable prototype) { - super(); - iPrototype = prototype; - } - - /** - * Creates an object using serialization. - * - * @return the new object - */ - public Object create() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(512); - ByteArrayInputStream bais = null; - try { - ObjectOutputStream out = new ObjectOutputStream(baos); - out.writeObject(iPrototype); - - bais = new ByteArrayInputStream(baos.toByteArray()); - ObjectInputStream in = new ObjectInputStream(bais); - return in.readObject(); - - } catch (ClassNotFoundException ex) { - throw new FunctorException(ex); - } catch (IOException ex) { - throw new FunctorException(ex); - } finally { - try { - if (bais != null) { - bais.close(); - } - } catch (IOException ex) { - // ignore - } - try { - if (baos != null) { - baos.close(); - } - } catch (IOException ex) { - // ignore - } - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/StringValueTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/StringValueTransformer.java deleted file mode 100644 index cceb54ba090..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/StringValueTransformer.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation that returns the result of calling - * String.valueOf on the input object. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class StringValueTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 7511110693171758606L; - - /** Singleton predicate instance */ - public static final Transformer INSTANCE = new StringValueTransformer(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Transformer getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private StringValueTransformer() { - super(); - } - - /** - * Transforms the input to result by calling String.valueOf. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - return String.valueOf(input); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchClosure.java deleted file mode 100644 index c0ebbf0e464..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchClosure.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.Predicate; - -/** - * Closure implementation calls the closure whose predicate returns true, - * like a switch statement. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SwitchClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 3518477308466486130L; - - /** The tests to consider */ - private final Predicate[] iPredicates; - /** The matching closures to call */ - private final Closure[] iClosures; - /** The default closure to call if no tests match */ - private final Closure iDefault; - - /** - * Factory method that performs validation and copies the parameter arrays. - * - * @param predicates array of predicates, cloned, no nulls - * @param closures matching array of closures, cloned, no nulls - * @param defaultClosure the closure to use if no match, null means nop - * @return the chained closure - * @throws IllegalArgumentException if array is null - * @throws IllegalArgumentException if any element in the array is null - */ - public static Closure getInstance(Predicate[] predicates, Closure[] closures, Closure defaultClosure) { - FunctorUtils.validate(predicates); - FunctorUtils.validate(closures); - if (predicates.length != closures.length) { - throw new IllegalArgumentException("The predicate and closure arrays must be the same size"); - } - if (predicates.length == 0) { - return (defaultClosure == null ? NOPClosure.INSTANCE : defaultClosure); - } - predicates = FunctorUtils.copy(predicates); - closures = FunctorUtils.copy(closures); - return new SwitchClosure(predicates, closures, defaultClosure); - } - - /** - * Create a new Closure that calls one of the closures depending - * on the predicates. - *

                  - * The Map consists of Predicate keys and Closure values. A closure - * is called if its matching predicate returns true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * closure is called. The default closure is set in the map with a - * null key. The ordering is that of the iterator() method on the entryset - * collection of the map. - * - * @param predicatesAndClosures a map of predicates to closures - * @return the switch closure - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if any closure in the map is null - * @throws ClassCastException if the map elements are of the wrong type - */ - public static Closure getInstance(Map predicatesAndClosures) { - Closure[] closures = null; - Predicate[] preds = null; - if (predicatesAndClosures == null) { - throw new IllegalArgumentException("The predicate and closure map must not be null"); - } - if (predicatesAndClosures.size() == 0) { - return NOPClosure.INSTANCE; - } - // convert to array like this to guarantee iterator() ordering - Closure defaultClosure = (Closure) predicatesAndClosures.remove(null); - int size = predicatesAndClosures.size(); - if (size == 0) { - return (defaultClosure == null ? NOPClosure.INSTANCE : defaultClosure); - } - closures = new Closure[size]; - preds = new Predicate[size]; - int i = 0; - for (Iterator it = predicatesAndClosures.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - preds[i] = (Predicate) entry.getKey(); - closures[i] = (Closure) entry.getValue(); - i++; - } - return new SwitchClosure(preds, closures, defaultClosure); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicates array of predicates, not cloned, no nulls - * @param closures matching array of closures, not cloned, no nulls - * @param defaultClosure the closure to use if no match, null means nop - */ - public SwitchClosure(Predicate[] predicates, Closure[] closures, Closure defaultClosure) { - super(); - iPredicates = predicates; - iClosures = closures; - iDefault = (defaultClosure == null ? NOPClosure.INSTANCE : defaultClosure); - } - - /** - * Executes the closure whose matching predicate returns true - * - * @param input the input object - */ - public void execute(Object input) { - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(input) == true) { - iClosures[i].execute(input); - return; - } - } - iDefault.execute(input); - } - - /** - * Gets the predicates, do not modify the array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return iPredicates; - } - - /** - * Gets the closures, do not modify the array. - * - * @return the closures - * @since Commons Collections 3.1 - */ - public Closure[] getClosures() { - return iClosures; - } - - /** - * Gets the default closure. - * - * @return the default closure - * @since Commons Collections 3.1 - */ - public Closure getDefaultClosure() { - return iDefault; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchTransformer.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchTransformer.java deleted file mode 100644 index 7c1e3e677fe..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/SwitchTransformer.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.Transformer; - -/** - * Transformer implementation calls the transformer whose predicate returns true, - * like a switch statement. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SwitchTransformer implements Transformer, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -6404460890903469332L; - - /** The tests to consider */ - private final Predicate[] iPredicates; - /** The matching transformers to call */ - private final Transformer[] iTransformers; - /** The default transformer to call if no tests match */ - private final Transformer iDefault; - - /** - * Factory method that performs validation and copies the parameter arrays. - * - * @param predicates array of predicates, cloned, no nulls - * @param transformers matching array of transformers, cloned, no nulls - * @param defaultTransformer the transformer to use if no match, null means return null - * @return the chained transformer - * @throws IllegalArgumentException if array is null - * @throws IllegalArgumentException if any element in the array is null - */ - public static Transformer getInstance(Predicate[] predicates, Transformer[] transformers, Transformer defaultTransformer) { - FunctorUtils.validate(predicates); - FunctorUtils.validate(transformers); - if (predicates.length != transformers.length) { - throw new IllegalArgumentException("The predicate and transformer arrays must be the same size"); - } - if (predicates.length == 0) { - return (defaultTransformer == null ? ConstantTransformer.NULL_INSTANCE : defaultTransformer); - } - predicates = FunctorUtils.copy(predicates); - transformers = FunctorUtils.copy(transformers); - return new SwitchTransformer(predicates, transformers, defaultTransformer); - } - - /** - * Create a new Transformer that calls one of the transformers depending - * on the predicates. - *

                  - * The Map consists of Predicate keys and Transformer values. A transformer - * is called if its matching predicate returns true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * transformer is called. The default transformer is set in the map with a - * null key. The ordering is that of the iterator() method on the entryset - * collection of the map. - * - * @param predicatesAndTransformers a map of predicates to transformers - * @return the switch transformer - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if any transformer in the map is null - * @throws ClassCastException if the map elements are of the wrong type - */ - public static Transformer getInstance(Map predicatesAndTransformers) { - Transformer[] transformers = null; - Predicate[] preds = null; - if (predicatesAndTransformers == null) { - throw new IllegalArgumentException("The predicate and transformer map must not be null"); - } - if (predicatesAndTransformers.size() == 0) { - return ConstantTransformer.NULL_INSTANCE; - } - // convert to array like this to guarantee iterator() ordering - Transformer defaultTransformer = (Transformer) predicatesAndTransformers.remove(null); - int size = predicatesAndTransformers.size(); - if (size == 0) { - return (defaultTransformer == null ? ConstantTransformer.NULL_INSTANCE : defaultTransformer); - } - transformers = new Transformer[size]; - preds = new Predicate[size]; - int i = 0; - for (Iterator it = predicatesAndTransformers.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - preds[i] = (Predicate) entry.getKey(); - transformers[i] = (Transformer) entry.getValue(); - i++; - } - return new SwitchTransformer(preds, transformers, defaultTransformer); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicates array of predicates, not cloned, no nulls - * @param transformers matching array of transformers, not cloned, no nulls - * @param defaultTransformer the transformer to use if no match, null means return null - */ - public SwitchTransformer(Predicate[] predicates, Transformer[] transformers, Transformer defaultTransformer) { - super(); - iPredicates = predicates; - iTransformers = transformers; - iDefault = (defaultTransformer == null ? ConstantTransformer.NULL_INSTANCE : defaultTransformer); - } - - /** - * Transforms the input to result by calling the transformer whose matching - * predicate returns true. - * - * @param input the input object to transform - * @return the transformed result - */ - public Object transform(Object input) { - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(input) == true) { - return iTransformers[i].transform(input); - } - } - return iDefault.transform(input); - } - - /** - * Gets the predicates, do not modify the array. - * - * @return the predicates - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return iPredicates; - } - - /** - * Gets the transformers, do not modify the array. - * - * @return the transformers - * @since Commons Collections 3.1 - */ - public Transformer[] getTransformers() { - return iTransformers; - } - - /** - * Gets the default transformer. - * - * @return the default transformer - * @since Commons Collections 3.1 - */ - public Transformer getDefaultTransformer() { - return iDefault; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformedPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformedPredicate.java deleted file mode 100644 index e4d64a2897b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformedPredicate.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.Transformer; - -/** - * Predicate implementation that transforms the given object before invoking - * another Predicate. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * @author Alban Peignier - * @author Stephen Colebourne - */ -public final class TransformedPredicate implements Predicate, PredicateDecorator, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -5596090919668315834L; - - /** The transformer to call */ - private final Transformer iTransformer; - /** The predicate to call */ - private final Predicate iPredicate; - - /** - * Factory to create the predicate. - * - * @param transformer the transformer to call - * @param predicate the predicate to call with the result of the transform - * @return the predicate - * @throws IllegalArgumentException if the transformer or the predicate is null - */ - public static Predicate getInstance(Transformer transformer, Predicate predicate) { - if (transformer == null) { - throw new IllegalArgumentException("The transformer to call must not be null"); - } - if (predicate == null) { - throw new IllegalArgumentException("The predicate to call must not be null"); - } - return new TransformedPredicate(transformer, predicate); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param transformer the transformer to use - * @param predicate the predicate to decorate - */ - public TransformedPredicate(Transformer transformer, Predicate predicate) { - iTransformer = transformer; - iPredicate = predicate; - } - - /** - * Evaluates the predicate returning the result of the decorated predicate - * once the input has been transformed - * - * @param object the input object which will be transformed - * @return true if decorated predicate returns true - */ - public boolean evaluate(Object object) { - Object result = iTransformer.transform(object); - return iPredicate.evaluate(result); - } - - /** - * Gets the predicate being decorated. - * - * @return the predicate as the only element in an array - * @since Commons Collections 3.1 - */ - public Predicate[] getPredicates() { - return new Predicate[] {iPredicate}; - } - - /** - * Gets the transformer in use. - * - * @return the transformer - */ - public Transformer getTransformer() { - return iTransformer; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerClosure.java deleted file mode 100644 index f6222ba7e0d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerClosure.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.Transformer; - -/** - * Closure implementation that calls a Transformer using the input object - * and ignore the result. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformerClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -5194992589193388969L; - - /** The transformer to wrap */ - private final Transformer iTransformer; - - /** - * Factory method that performs validation. - *

                  - * A null transformer will return the NOPClosure. - * - * @param transformer the transformer to call, null means nop - * @return the transformer closure - */ - public static Closure getInstance(Transformer transformer) { - if (transformer == null) { - return NOPClosure.INSTANCE; - } - return new TransformerClosure(transformer); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param transformer the transformer to call, not null - */ - public TransformerClosure(Transformer transformer) { - super(); - iTransformer = transformer; - } - - /** - * Executes the closure by calling the decorated transformer. - * - * @param input the input object - */ - public void execute(Object input) { - iTransformer.transform(input); - } - - /** - * Gets the transformer. - * - * @return the transformer - * @since Commons Collections 3.1 - */ - public Transformer getTransformer() { - return iTransformer; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerPredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerPredicate.java deleted file mode 100644 index 18324749c68..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TransformerPredicate.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.Transformer; - -/** - * Predicate implementation that returns the result of a transformer. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class TransformerPredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -2407966402920578741L; - - /** The transformer to call */ - private final Transformer iTransformer; - - /** - * Factory to create the predicate. - * - * @param transformer the transformer to decorate - * @return the predicate - * @throws IllegalArgumentException if the transformer is null - */ - public static Predicate getInstance(Transformer transformer) { - if (transformer == null) { - throw new IllegalArgumentException("The transformer to call must not be null"); - } - return new TransformerPredicate(transformer); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param transformer the transformer to decorate - */ - public TransformerPredicate(Transformer transformer) { - super(); - iTransformer = transformer; - } - - /** - * Evaluates the predicate returning the result of the decorated transformer. - * - * @param object the input object - * @return true if decorated transformer returns Boolean.TRUE - * @throws FunctorException if the transformer returns an invalid type - */ - public boolean evaluate(Object object) { - Object result = iTransformer.transform(object); - if (result instanceof Boolean == false) { - throw new FunctorException( - "Transformer must return an instanceof Boolean, it was a " - + (result == null ? "null object" : result.getClass().getName())); - } - return ((Boolean) result).booleanValue(); - } - - /** - * Gets the transformer. - * - * @return the transformer - * @since Commons Collections 3.1 - */ - public Transformer getTransformer() { - return iTransformer; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TruePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TruePredicate.java deleted file mode 100644 index 026b1d045b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/TruePredicate.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that always returns true. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class TruePredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = 3374767158756189740L; - - /** Singleton predicate instance */ - public static final Predicate INSTANCE = new TruePredicate(); - - /** - * Factory returning the singleton instance. - * - * @return the singleton instance - * @since Commons Collections 3.1 - */ - public static Predicate getInstance() { - return INSTANCE; - } - - /** - * Restricted constructor. - */ - private TruePredicate() { - super(); - } - - /** - * Evaluates the predicate returning true always. - * - * @param object the input object - * @return true always - */ - public boolean evaluate(Object object) { - return true; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/UniquePredicate.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/UniquePredicate.java deleted file mode 100644 index 2bc3d78fe63..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/UniquePredicate.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; - -import org.apache.commons.collections.Predicate; - -/** - * Predicate implementation that returns true the first time an object is - * passed into the predicate. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UniquePredicate implements Predicate, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -3319417438027438040L; - - /** The set of previously seen objects */ - private final Set iSet = new HashSet(); - - /** - * Factory to create the predicate. - * - * @return the predicate - * @throws IllegalArgumentException if the predicate is null - */ - public static Predicate getInstance() { - return new UniquePredicate(); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - */ - public UniquePredicate() { - super(); - } - - /** - * Evaluates the predicate returning true if the input object hasn't been - * received yet. - * - * @param object the input object - * @return true if this is the first time the object is seen - */ - public boolean evaluate(Object object) { - return iSet.add(object); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/WhileClosure.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/WhileClosure.java deleted file mode 100644 index 853e83a4058..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/WhileClosure.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.functors; - -import java.io.Serializable; - -import org.apache.commons.collections.Closure; -import org.apache.commons.collections.Predicate; - -/** - * Closure implementation that executes a closure repeatedly until a condition is met, - * like a do-while or while loop. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class WhileClosure implements Closure, Serializable { - - /** Serial version UID */ - private static final long serialVersionUID = -3110538116913760108L; - - /** The test condition */ - private final Predicate iPredicate; - /** The closure to call */ - private final Closure iClosure; - /** The flag, true is a do loop, false is a while */ - private final boolean iDoLoop; - - /** - * Factory method that performs validation. - * - * @param predicate the predicate used to evaluate when the loop terminates, not null - * @param closure the closure the execute, not null - * @param doLoop true to act as a do-while loop, always executing the closure once - * @return the while closure - * @throws IllegalArgumentException if the predicate or closure is null - */ - public static Closure getInstance(Predicate predicate, Closure closure, boolean doLoop) { - if (predicate == null) { - throw new IllegalArgumentException("Predicate must not be null"); - } - if (closure == null) { - throw new IllegalArgumentException("Closure must not be null"); - } - return new WhileClosure(predicate, closure, doLoop); - } - - /** - * Constructor that performs no validation. - * Use getInstance if you want that. - * - * @param predicate the predicate used to evaluate when the loop terminates, not null - * @param closure the closure the execute, not null - * @param doLoop true to act as a do-while loop, always executing the closure once - */ - public WhileClosure(Predicate predicate, Closure closure, boolean doLoop) { - super(); - iPredicate = predicate; - iClosure = closure; - iDoLoop = doLoop; - } - - /** - * Executes the closure until the predicate is false. - * - * @param input the input object - */ - public void execute(Object input) { - if (iDoLoop) { - iClosure.execute(input); - } - while (iPredicate.evaluate(input)) { - iClosure.execute(input); - } - } - - /** - * Gets the predicate in use. - * - * @return the predicate - * @since Commons Collections 3.1 - */ - public Predicate getPredicate() { - return iPredicate; - } - - /** - * Gets the closure. - * - * @return the closure - * @since Commons Collections 3.1 - */ - public Closure getClosure() { - return iClosure; - } - - /** - * Is the loop a do-while loop. - * - * @return true is do-while, false if while - * @since Commons Collections 3.1 - */ - public boolean isDoLoop() { - return iDoLoop; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/package.html deleted file mode 100644 index 3a5151f754e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/functors/package.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -

                  -This package contains implementations of the -{@link org.apache.commons.collections.Closure Closure}, -{@link org.apache.commons.collections.Predicate Predicate}, -{@link org.apache.commons.collections.Transformer Transformer} and -{@link org.apache.commons.collections.Factory Factory} interfaces. -These provide simple callbacks for processing with collections. -

                  - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractEmptyIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractEmptyIterator.java deleted file mode 100644 index 632eff787c5..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractEmptyIterator.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.NoSuchElementException; - -/** - * Provides an implementation of an empty iterator. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -abstract class AbstractEmptyIterator { - - /** - * Constructor. - */ - protected AbstractEmptyIterator() { - super(); - } - - public boolean hasNext() { - return false; - } - - public Object next() { - throw new NoSuchElementException("Iterator contains no elements"); - } - - public boolean hasPrevious() { - return false; - } - - public Object previous() { - throw new NoSuchElementException("Iterator contains no elements"); - } - - public int nextIndex() { - return 0; - } - - public int previousIndex() { - return -1; - } - - public void add(Object obj) { - throw new UnsupportedOperationException("add() not supported for empty Iterator"); - } - - public void set(Object obj) { - throw new IllegalStateException("Iterator contains no elements"); - } - - public void remove() { - throw new IllegalStateException("Iterator contains no elements"); - } - - public Object getKey() { - throw new IllegalStateException("Iterator contains no elements"); - } - - public Object getValue() { - throw new IllegalStateException("Iterator contains no elements"); - } - - public Object setValue(Object value) { - throw new IllegalStateException("Iterator contains no elements"); - } - - public void reset() { - // do nothing - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractIteratorDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractIteratorDecorator.java deleted file mode 100644 index 1245a31b8b2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractIteratorDecorator.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; - -/** - * Provides basic behaviour for decorating an iterator with extra functionality. - *

                  - * All methods are forwarded to the decorated iterator. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Stephen Colebourne - */ -public class AbstractIteratorDecorator implements Iterator { - - /** The iterator being decorated */ - protected final Iterator iterator; - - //----------------------------------------------------------------------- - /** - * Constructor that decorates the specified iterator. - * - * @param iterator the iterator to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractIteratorDecorator(Iterator iterator) { - super(); - if (iterator == null) { - throw new IllegalArgumentException("Iterator must not be null"); - } - this.iterator = iterator; - } - - /** - * Gets the iterator being decorated. - * - * @return the decorated iterator - */ - protected Iterator getIterator() { - return iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public void remove() { - iterator.remove(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractListIteratorDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractListIteratorDecorator.java deleted file mode 100644 index c7135866668..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractListIteratorDecorator.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; - -/** - * Provides basic behaviour for decorating a list iterator with extra functionality. - *

                  - * All methods are forwarded to the decorated list iterator. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - * @author Stephen Colebourne - */ -public class AbstractListIteratorDecorator implements ListIterator { - - /** The iterator being decorated */ - protected final ListIterator iterator; - - //----------------------------------------------------------------------- - /** - * Constructor that decorates the specified iterator. - * - * @param iterator the iterator to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractListIteratorDecorator(ListIterator iterator) { - super(); - if (iterator == null) { - throw new IllegalArgumentException("ListIterator must not be null"); - } - this.iterator = iterator; - } - - /** - * Gets the iterator being decorated. - * - * @return the decorated iterator - */ - protected ListIterator getListIterator() { - return iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public int nextIndex() { - return iterator.nextIndex(); - } - - public boolean hasPrevious() { - return iterator.hasPrevious(); - } - - public Object previous() { - return iterator.previous(); - } - - public int previousIndex() { - return iterator.previousIndex(); - } - - public void remove() { - iterator.remove(); - } - - public void set(Object obj) { - iterator.set(obj); - } - - public void add(Object obj) { - iterator.add(obj); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.java deleted file mode 100644 index c6afd7b73d8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractMapIteratorDecorator.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.MapIterator; - -/** - * Provides basic behaviour for decorating a map iterator with extra functionality. - *

                  - * All methods are forwarded to the decorated map iterator. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class AbstractMapIteratorDecorator implements MapIterator { - - /** The iterator being decorated */ - protected final MapIterator iterator; - - //----------------------------------------------------------------------- - /** - * Constructor that decorates the specified iterator. - * - * @param iterator the iterator to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractMapIteratorDecorator(MapIterator iterator) { - super(); - if (iterator == null) { - throw new IllegalArgumentException("MapIterator must not be null"); - } - this.iterator = iterator; - } - - /** - * Gets the iterator being decorated. - * - * @return the decorated iterator - */ - protected MapIterator getMapIterator() { - return iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public void remove() { - iterator.remove(); - } - - public Object getKey() { - return iterator.getKey(); - } - - public Object getValue() { - return iterator.getValue(); - } - - public Object setValue(Object obj) { - return iterator.setValue(obj); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractOrderedMapIteratorDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractOrderedMapIteratorDecorator.java deleted file mode 100644 index 8426133d241..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/AbstractOrderedMapIteratorDecorator.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.OrderedMapIterator; - -/** - * Provides basic behaviour for decorating an ordered map iterator with extra functionality. - *

                  - * All methods are forwarded to the decorated map iterator. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class AbstractOrderedMapIteratorDecorator implements OrderedMapIterator { - - /** The iterator being decorated */ - protected final OrderedMapIterator iterator; - - //----------------------------------------------------------------------- - /** - * Constructor that decorates the specified iterator. - * - * @param iterator the iterator to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractOrderedMapIteratorDecorator(OrderedMapIterator iterator) { - super(); - if (iterator == null) { - throw new IllegalArgumentException("OrderedMapIterator must not be null"); - } - this.iterator = iterator; - } - - /** - * Gets the iterator being decorated. - * - * @return the decorated iterator - */ - protected OrderedMapIterator getOrderedMapIterator() { - return iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public boolean hasPrevious() { - return iterator.hasPrevious(); - } - - public Object previous() { - return iterator.previous(); - } - - public void remove() { - iterator.remove(); - } - - public Object getKey() { - return iterator.getKey(); - } - - public Object getValue() { - return iterator.getValue(); - } - - public Object setValue(Object obj) { - return iterator.setValue(obj); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayIterator.java deleted file mode 100644 index f5ebd1a8979..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayIterator.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.lang.reflect.Array; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableIterator; - -/** - * Implements an {@link java.util.Iterator Iterator} over any array. - *

                  - * The array can be either an array of object or of primitives. If you know - * that you have an object array, the - * {@link org.apache.commons.collections.iterators.ObjectArrayIterator ObjectArrayIterator} - * class is a better choice, as it will perform better. - *

                  - * The iterator implements a {@link #reset} method, allowing the reset of - * the iterator back to the start if required. - * - * @since Commons Collections 1.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author James Strachan - * @author Mauricio S. Moura - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public class ArrayIterator implements ResettableIterator { - - /** The array to iterate over */ - protected Object array; - /** The start index to loop from */ - protected int startIndex = 0; - /** The end index to loop to */ - protected int endIndex = 0; - /** The current iterator index */ - protected int index = 0; - - // Constructors - // ---------------------------------------------------------------------- - /** - * Constructor for use with setArray. - *

                  - * Using this constructor, the iterator is equivalent to an empty iterator - * until {@link #setArray(Object)} is called to establish the array to iterate over. - */ - public ArrayIterator() { - super(); - } - - /** - * Constructs an ArrayIterator that will iterate over the values in the - * specified array. - * - * @param array the array to iterate over. - * @throws IllegalArgumentException if array is not an array. - * @throws NullPointerException if array is null - */ - public ArrayIterator(final Object array) { - super(); - setArray(array); - } - - /** - * Constructs an ArrayIterator that will iterate over the values in the - * specified array from a specific start index. - * - * @param array the array to iterate over. - * @param startIndex the index to start iterating at. - * @throws IllegalArgumentException if array is not an array. - * @throws NullPointerException if array is null - * @throws IndexOutOfBoundsException if the index is invalid - */ - public ArrayIterator(final Object array, final int startIndex) { - super(); - setArray(array); - checkBound(startIndex, "start"); - this.startIndex = startIndex; - this.index = startIndex; - } - - /** - * Construct an ArrayIterator that will iterate over a range of values - * in the specified array. - * - * @param array the array to iterate over. - * @param startIndex the index to start iterating at. - * @param endIndex the index to finish iterating at. - * @throws IllegalArgumentException if array is not an array. - * @throws NullPointerException if array is null - * @throws IndexOutOfBoundsException if either index is invalid - */ - public ArrayIterator(final Object array, final int startIndex, final int endIndex) { - super(); - setArray(array); - checkBound(startIndex, "start"); - checkBound(endIndex, "end"); - if (endIndex < startIndex) { - throw new IllegalArgumentException("End index must not be less than start index."); - } - this.startIndex = startIndex; - this.endIndex = endIndex; - this.index = startIndex; - } - - /** - * Checks whether the index is valid or not. - * - * @param bound the index to check - * @param type the index type (for error messages) - * @throws IndexOutOfBoundsException if the index is invalid - */ - protected void checkBound(final int bound, final String type ) { - if (bound > this.endIndex) { - throw new ArrayIndexOutOfBoundsException( - "Attempt to make an ArrayIterator that " + type + - "s beyond the end of the array. " - ); - } - if (bound < 0) { - throw new ArrayIndexOutOfBoundsException( - "Attempt to make an ArrayIterator that " + type + - "s before the start of the array. " - ); - } - } - - // Iterator interface - //----------------------------------------------------------------------- - /** - * Returns true if there are more elements to return from the array. - * - * @return true if there is a next element to return - */ - public boolean hasNext() { - return (index < endIndex); - } - - /** - * Returns the next element in the array. - * - * @return the next element in the array - * @throws NoSuchElementException if all the elements in the array - * have already been returned - */ - public Object next() { - if (hasNext() == false) { - throw new NoSuchElementException(); - } - return Array.get(array, index++); - } - - /** - * Throws {@link UnsupportedOperationException}. - * - * @throws UnsupportedOperationException always - */ - public void remove() { - throw new UnsupportedOperationException("remove() method is not supported"); - } - - // Properties - //----------------------------------------------------------------------- - /** - * Gets the array that this iterator is iterating over. - * - * @return the array this iterator iterates over, or null if - * the no-arg constructor was used and {@link #setArray(Object)} has never - * been called with a valid array. - */ - public Object getArray() { - return array; - } - - /** - * Sets the array that the ArrayIterator should iterate over. - *

                  - * If an array has previously been set (using the single-arg constructor - * or this method) then that array is discarded in favour of this one. - * Iteration is restarted at the start of the new array. - * Although this can be used to reset iteration, the {@link #reset()} method - * is a more effective choice. - * - * @param array the array that the iterator should iterate over. - * @throws IllegalArgumentException if array is not an array. - * @throws NullPointerException if array is null - */ - public void setArray(final Object array) { - // Array.getLength throws IllegalArgumentException if the object is not - // an array or NullPointerException if the object is null. This call - // is made before saving the array and resetting the index so that the - // array iterator remains in a consistent state if the argument is not - // an array or is null. - this.endIndex = Array.getLength(array); - this.startIndex = 0; - this.array = array; - this.index = 0; - } - - /** - * Resets the iterator back to the start index. - */ - public void reset() { - this.index = this.startIndex; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayListIterator.java deleted file mode 100644 index ddce4ef9f1a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ArrayListIterator.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.lang.reflect.Array; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * Implements a {@link ListIterator} over an array. - *

                  - * The array can be either an array of object or of primitives. If you know - * that you have an object array, the {@link ObjectArrayListIterator} - * class is a better choice, as it will perform better. - * - *

                  - * This iterator does not support {@link #add(Object)} or {@link #remove()}, as the array - * cannot be changed in size. The {@link #set(Object)} method is supported however. - * - * @see org.apache.commons.collections.iterators.ArrayIterator - * @see java.util.Iterator - * @see java.util.ListIterator - * - * @since Commons Collections 3.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Neil O'Toole - * @author Stephen Colebourne - * @author Phil Steitz - */ -public class ArrayListIterator extends ArrayIterator - implements ListIterator, ResettableListIterator { - - /** - * Holds the index of the last item returned by a call to next() - * or previous(). This is set to -1 if neither method - * has yet been invoked. lastItemIndex is used to to implement - * the {@link #set} method. - * - */ - protected int lastItemIndex = -1; - - // Constructors - // ---------------------------------------------------------------------- - /** - * Constructor for use with setArray. - *

                  - * Using this constructor, the iterator is equivalent to an empty iterator - * until {@link #setArray(Object)} is called to establish the array to iterate over. - */ - public ArrayListIterator() { - super(); - } - - /** - * Constructs an ArrayListIterator that will iterate over the values in the - * specified array. - * - * @param array the array to iterate over - * @throws IllegalArgumentException if array is not an array. - * @throws NullPointerException if array is null - */ - public ArrayListIterator(Object array) { - super(array); - } - - /** - * Constructs an ArrayListIterator that will iterate over the values in the - * specified array from a specific start index. - * - * @param array the array to iterate over - * @param startIndex the index to start iterating at - * @throws IllegalArgumentException if array is not an array. - * @throws NullPointerException if array is null - * @throws IndexOutOfBoundsException if the start index is out of bounds - */ - public ArrayListIterator(Object array, int startIndex) { - super(array, startIndex); - this.startIndex = startIndex; - } - - /** - * Construct an ArrayListIterator that will iterate over a range of values - * in the specified array. - * - * @param array the array to iterate over - * @param startIndex the index to start iterating at - * @param endIndex the index (exclusive) to finish iterating at - * @throws IllegalArgumentException if array is not an array. - * @throws IndexOutOfBoundsException if the start or end index is out of bounds - * @throws IllegalArgumentException if end index is before the start - * @throws NullPointerException if array is null - */ - public ArrayListIterator(Object array, int startIndex, int endIndex) { - super(array, startIndex, endIndex); - this.startIndex = startIndex; - } - - // ListIterator interface - //----------------------------------------------------------------------- - /** - * Returns true if there are previous elements to return from the array. - * - * @return true if there is a previous element to return - */ - public boolean hasPrevious() { - return (this.index > this.startIndex); - } - - /** - * Gets the previous element from the array. - * - * @return the previous element - * @throws NoSuchElementException if there is no previous element - */ - public Object previous() { - if (hasPrevious() == false) { - throw new NoSuchElementException(); - } - this.lastItemIndex = --this.index; - return Array.get(this.array, this.index); - } - - /** - * Gets the next element from the array. - * - * @return the next element - * @throws NoSuchElementException if there is no next element - */ - public Object next() { - if (hasNext() == false) { - throw new NoSuchElementException(); - } - this.lastItemIndex = this.index; - return Array.get(this.array, this.index++); - } - - /** - * Gets the next index to be retrieved. - * - * @return the index of the item to be retrieved next - */ - public int nextIndex() { - return this.index - this.startIndex; - } - - /** - * Gets the index of the item to be retrieved if {@link #previous()} is called. - * - * @return the index of the item to be retrieved next - */ - public int previousIndex() { - return this.index - this.startIndex - 1; - } - - /** - * This iterator does not support modification of its backing collection, and so will - * always throw an {@link UnsupportedOperationException} when this method is invoked. - * - * @throws UnsupportedOperationException always thrown. - * @see java.util.ListIterator#set - */ - public void add(Object o) { - throw new UnsupportedOperationException("add() method is not supported"); - } - - /** - * Sets the element under the cursor. - *

                  - * This method sets the element that was returned by the last call - * to {@link #next()} of {@link #previous()}. - *

                  - * Note: {@link ListIterator} implementations that support - * add() and remove() only allow set() to be called - * once per call to next() or previous (see the {@link ListIterator} - * javadoc for more details). Since this implementation does - * not support add() or remove(), set() may be - * called as often as desired. - * - * @see java.util.ListIterator#set - */ - public void set(Object o) { - if (this.lastItemIndex == -1) { - throw new IllegalStateException("must call next() or previous() before a call to set()"); - } - - Array.set(this.array, this.lastItemIndex, o); - } - - /** - * Resets the iterator back to the start index. - */ - public void reset() { - super.reset(); - this.lastItemIndex = -1; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/CollatingIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/CollatingIterator.java deleted file mode 100644 index b8095b8a63c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/CollatingIterator.java +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ArrayList; -import java.util.BitSet; -import java.util.Collection; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * Provides an ordered iteration over the elements contained in - * a collection of ordered Iterators. - *

                  - * Given two ordered {@link Iterator} instances A and B, - * the {@link #next} method on this iterator will return the lesser of - * A.next() and B.next(). - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - * @author Stephen Colebourne - */ -public class CollatingIterator implements Iterator { - - /** The {@link Comparator} used to evaluate order. */ - private Comparator comparator = null; - - /** The list of {@link Iterator}s to evaluate. */ - private ArrayList iterators = null; - - /** {@link Iterator#next Next} objects peeked from each iterator. */ - private ArrayList values = null; - - /** Whether or not each {@link #values} element has been set. */ - private BitSet valueSet = null; - - /** Index of the {@link #iterators iterator} from whom the last returned value was obtained. */ - private int lastReturned = -1; - - // Constructors - // ---------------------------------------------------------------------- - /** - * Constructs a new CollatingIterator. Natural sort order - * will be used, and child iterators will have to be manually added - * using the {@link #addIterator(Iterator)} method. - */ - public CollatingIterator() { - this(null,2); - } - - /** - * Constructs a new CollatingIterator that will used the - * specified comparator for ordering. Child iterators will have to be - * manually added using the {@link #addIterator(Iterator)} method. - * - * @param comp the comparator to use to sort, or null to use natural sort order - */ - public CollatingIterator(final Comparator comp) { - this(comp,2); - } - - /** - * Constructs a new CollatingIterator that will used the - * specified comparator for ordering and have the specified initial - * capacity. Child iterators will have to be - * manually added using the {@link #addIterator(Iterator)} method. - * - * @param comp the comparator to use to sort, or null to use natural sort order - * @param initIterCapacity the initial capacity for the internal list - * of child iterators - */ - public CollatingIterator(final Comparator comp, final int initIterCapacity) { - iterators = new ArrayList(initIterCapacity); - setComparator(comp); - } - - /** - * Constructs a new CollatingIterator that will use the - * specified comparator to provide ordered iteration over the two - * given iterators. - * - * @param comp the comparator to use to sort, or null to use natural sort order - * @param a the first child ordered iterator - * @param b the second child ordered iterator - * @throws NullPointerException if either iterator is null - */ - public CollatingIterator(final Comparator comp, final Iterator a, final Iterator b) { - this(comp,2); - addIterator(a); - addIterator(b); - } - - /** - * Constructs a new CollatingIterator that will use the - * specified comparator to provide ordered iteration over the array - * of iterators. - * - * @param comp the comparator to use to sort, or null to use natural sort order - * @param iterators the array of iterators - * @throws NullPointerException if iterators array is or contains null - */ - public CollatingIterator(final Comparator comp, final Iterator[] iterators) { - this(comp, iterators.length); - for (int i = 0; i < iterators.length; i++) { - addIterator(iterators[i]); - } - } - - /** - * Constructs a new CollatingIterator that will use the - * specified comparator to provide ordered iteration over the collection - * of iterators. - * - * @param comp the comparator to use to sort, or null to use natural sort order - * @param iterators the collection of iterators - * @throws NullPointerException if the iterators collection is or contains null - * @throws ClassCastException if the iterators collection contains an - * element that's not an {@link Iterator} - */ - public CollatingIterator(final Comparator comp, final Collection iterators) { - this(comp, iterators.size()); - for (Iterator it = iterators.iterator(); it.hasNext();) { - Iterator item = (Iterator) it.next(); - addIterator(item); - } - } - - // Public Methods - // ---------------------------------------------------------------------- - /** - * Adds the given {@link Iterator} to the iterators being collated. - * - * @param iterator the iterator to add to the collation, must not be null - * @throws IllegalStateException if iteration has started - * @throws NullPointerException if the iterator is null - */ - public void addIterator(final Iterator iterator) { - checkNotStarted(); - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - iterators.add(iterator); - } - - /** - * Sets the iterator at the given index. - * - * @param index index of the Iterator to replace - * @param iterator Iterator to place at the given index - * @throws IndexOutOfBoundsException if index < 0 or index > size() - * @throws IllegalStateException if iteration has started - * @throws NullPointerException if the iterator is null - */ - public void setIterator(final int index, final Iterator iterator) { - checkNotStarted(); - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - iterators.set(index, iterator); - } - - /** - * Gets the list of Iterators (unmodifiable). - * - * @return the unmodifiable list of iterators added - */ - public List getIterators() { - return UnmodifiableList.decorate(iterators); - } - - /** - * Gets the {@link Comparator} by which collatation occurs. - */ - public Comparator getComparator() { - return comparator; - } - - /** - * Sets the {@link Comparator} by which collation occurs. - * - * @throws IllegalStateException if iteration has started - */ - public void setComparator(final Comparator comp) { - checkNotStarted(); - comparator = comp; - } - - // Iterator Methods - // ------------------------------------------------------------------- - /** - * Returns true if any child iterator has remaining elements. - * - * @return true if this iterator has remaining elements - */ - public boolean hasNext() { - start(); - return anyValueSet(valueSet) || anyHasNext(iterators); - } - - /** - * Returns the next ordered element from a child iterator. - * - * @return the next ordered element - * @throws NoSuchElementException if no child iterator has any more elements - */ - public Object next() throws NoSuchElementException { - if (hasNext() == false) { - throw new NoSuchElementException(); - } - int leastIndex = least(); - if (leastIndex == -1) { - throw new NoSuchElementException(); - } else { - Object val = values.get(leastIndex); - clear(leastIndex); - lastReturned = leastIndex; - return val; - } - } - - /** - * Removes the last returned element from the child iterator that - * produced it. - * - * @throws IllegalStateException if there is no last returned element, - * or if the last returned element has already been removed - */ - public void remove() { - if (lastReturned == -1) { - throw new IllegalStateException("No value can be removed at present"); - } - Iterator it = (Iterator) (iterators.get(lastReturned)); - it.remove(); - } - - // Private Methods - // ------------------------------------------------------------------- - /** - * Initializes the collating state if it hasn't been already. - */ - private void start() { - if (values == null) { - values = new ArrayList(iterators.size()); - valueSet = new BitSet(iterators.size()); - for (int i = 0; i < iterators.size(); i++) { - values.add(null); - valueSet.clear(i); - } - } - } - - /** - * Sets the {@link #values} and {@link #valueSet} attributes - * at position i to the next value of the - * {@link #iterators iterator} at position i, or - * clear them if the ith iterator - * has no next value. - * - * @return false iff there was no value to set - */ - private boolean set(int i) { - Iterator it = (Iterator)(iterators.get(i)); - if (it.hasNext()) { - values.set(i, it.next()); - valueSet.set(i); - return true; - } else { - values.set(i,null); - valueSet.clear(i); - return false; - } - } - - /** - * Clears the {@link #values} and {@link #valueSet} attributes - * at position i. - */ - private void clear(int i) { - values.set(i,null); - valueSet.clear(i); - } - - /** - * Throws {@link IllegalStateException} if iteration has started - * via {@link #start}. - * - * @throws IllegalStateException if iteration started - */ - private void checkNotStarted() throws IllegalStateException { - if (values != null) { - throw new IllegalStateException("Can't do that after next or hasNext has been called."); - } - } - - /** - * Returns the index of the least element in {@link #values}, - * {@link #set(int) setting} any uninitialized values. - * - * @throws IllegalStateException - */ - private int least() { - int leastIndex = -1; - Object leastObject = null; - for (int i = 0; i < values.size(); i++) { - if (valueSet.get(i) == false) { - set(i); - } - if (valueSet.get(i)) { - if (leastIndex == -1) { - leastIndex = i; - leastObject = values.get(i); - } else { - Object curObject = values.get(i); - if (comparator.compare(curObject,leastObject) < 0) { - leastObject = curObject; - leastIndex = i; - } - } - } - } - return leastIndex; - } - - /** - * Returns true iff any bit in the given set is - * true. - */ - private boolean anyValueSet(BitSet set) { - for (int i = 0; i < set.size(); i++) { - if (set.get(i)) { - return true; - } - } - return false; - } - - /** - * Returns true iff any {@link Iterator} - * in the given list has a next value. - */ - private boolean anyHasNext(ArrayList iters) { - for (int i = 0; i < iters.size(); i++) { - Iterator it = (Iterator) iters.get(i); - if (it.hasNext()) { - return true; - } - } - return false; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyIterator.java deleted file mode 100644 index 30dc4edde0e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyIterator.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; - -import org.apache.commons.collections.ResettableIterator; - -/** - * Provides an implementation of an empty iterator. - *

                  - * This class provides an implementation of an empty iterator. - * This class provides for binary compatability between Commons Collections - * 2.1.1 and 3.1 due to issues with IteratorUtils. - * - * @since Commons Collections 2.1.1 and 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class EmptyIterator extends AbstractEmptyIterator implements ResettableIterator { - - /** - * Singleton instance of the iterator. - * @since Commons Collections 3.1 - */ - public static final ResettableIterator RESETTABLE_INSTANCE = new EmptyIterator(); - /** - * Singleton instance of the iterator. - * @since Commons Collections 2.1.1 and 3.1 - */ - public static final Iterator INSTANCE = RESETTABLE_INSTANCE; - - /** - * Constructor. - */ - protected EmptyIterator() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyListIterator.java deleted file mode 100644 index 32081ab6c13..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyListIterator.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * Provides an implementation of an empty list iterator. - *

                  - * This class provides an implementation of an empty list iterator. - * This class provides for binary compatability between Commons Collections - * 2.1.1 and 3.1 due to issues with IteratorUtils. - * - * @since Commons Collections 2.1.1 and 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class EmptyListIterator extends AbstractEmptyIterator implements ResettableListIterator { - - /** - * Singleton instance of the iterator. - * @since Commons Collections 3.1 - */ - public static final ResettableListIterator RESETTABLE_INSTANCE = new EmptyListIterator(); - /** - * Singleton instance of the iterator. - * @since Commons Collections 2.1.1 and 3.1 - */ - public static final ListIterator INSTANCE = RESETTABLE_INSTANCE; - - /** - * Constructor. - */ - protected EmptyListIterator() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyMapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyMapIterator.java deleted file mode 100644 index c0fc7ff7c54..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyMapIterator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.ResettableIterator; - -/** - * Provides an implementation of an empty map iterator. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class EmptyMapIterator extends AbstractEmptyIterator implements MapIterator, ResettableIterator { - - /** - * Singleton instance of the iterator. - * @since Commons Collections 3.1 - */ - public static final MapIterator INSTANCE = new EmptyMapIterator(); - - /** - * Constructor. - */ - protected EmptyMapIterator() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedIterator.java deleted file mode 100644 index 1c2c546b0fd..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedIterator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.OrderedIterator; -import org.apache.commons.collections.ResettableIterator; - -/** - * Provides an implementation of an empty ordered iterator. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class EmptyOrderedIterator extends AbstractEmptyIterator implements OrderedIterator, ResettableIterator { - - /** - * Singleton instance of the iterator. - * @since Commons Collections 3.1 - */ - public static final OrderedIterator INSTANCE = new EmptyOrderedIterator(); - - /** - * Constructor. - */ - protected EmptyOrderedIterator() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.java deleted file mode 100644 index 977b2eb5206..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EmptyOrderedMapIterator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.ResettableIterator; - -/** - * Provides an implementation of an empty ordered map iterator. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class EmptyOrderedMapIterator extends AbstractEmptyIterator implements OrderedMapIterator, ResettableIterator { - - /** - * Singleton instance of the iterator. - * @since Commons Collections 3.1 - */ - public static final OrderedMapIterator INSTANCE = new EmptyOrderedMapIterator(); - - /** - * Constructor. - */ - protected EmptyOrderedMapIterator() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EntrySetMapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EntrySetMapIterator.java deleted file mode 100644 index 902fc894db8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EntrySetMapIterator.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.ResettableIterator; - -/** - * Implements a MapIterator using a Map entrySet. - * Reverse iteration is not supported. - *

                  - * MapIterator it = map.mapIterator();
                  - * while (it.hasNext()) {
                  - *   Object key = it.next();
                  - *   Object value = it.getValue();
                  - *   it.setValue(newValue);
                  - * }
                  - * 
                  - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class EntrySetMapIterator implements MapIterator, ResettableIterator { - - private final Map map; - private Iterator iterator; - private Map.Entry last; - private boolean canRemove = false; - - /** - * Constructor. - * - * @param map the map to iterate over - */ - public EntrySetMapIterator(Map map) { - super(); - this.map = map; - this.iterator = map.entrySet().iterator(); - } - - //----------------------------------------------------------------------- - /** - * Checks to see if there are more entries still to be iterated. - * - * @return true if the iterator has more elements - */ - public boolean hasNext() { - return iterator.hasNext(); - } - - /** - * Gets the next key from the Map. - * - * @return the next key in the iteration - * @throws java.util.NoSuchElementException if the iteration is finished - */ - public Object next() { - last = (Map.Entry) iterator.next(); - canRemove = true; - return last.getKey(); - } - - //----------------------------------------------------------------------- - /** - * Removes the last returned key from the underlying Map. - *

                  - * This method can be called once per call to next(). - * - * @throws UnsupportedOperationException if remove is not supported by the map - * @throws IllegalStateException if next() has not yet been called - * @throws IllegalStateException if remove() has already been called - * since the last call to next() - */ - public void remove() { - if (canRemove == false) { - throw new IllegalStateException("Iterator remove() can only be called once after next()"); - } - iterator.remove(); - last = null; - canRemove = false; - } - - //----------------------------------------------------------------------- - /** - * Gets the current key, which is the key returned by the last call - * to next(). - * - * @return the current key - * @throws IllegalStateException if next() has not yet been called - */ - public Object getKey() { - if (last == null) { - throw new IllegalStateException("Iterator getKey() can only be called after next() and before remove()"); - } - return last.getKey(); - } - - /** - * Gets the current value, which is the value associated with the last key - * returned by next(). - * - * @return the current value - * @throws IllegalStateException if next() has not yet been called - */ - public Object getValue() { - if (last == null) { - throw new IllegalStateException("Iterator getValue() can only be called after next() and before remove()"); - } - return last.getValue(); - } - - /** - * Sets the value associated with the current key. - * - * @param value the new value - * @return the previous value - * @throws UnsupportedOperationException if setValue is not supported by the map - * @throws IllegalStateException if next() has not yet been called - * @throws IllegalStateException if remove() has been called since the - * last call to next() - */ - public Object setValue(Object value) { - if (last == null) { - throw new IllegalStateException("Iterator setValue() can only be called after next() and before remove()"); - } - return last.setValue(value); - } - - //----------------------------------------------------------------------- - /** - * Resets the state of the iterator. - */ - public void reset() { - iterator = map.entrySet().iterator(); - last = null; - canRemove = false; - } - - /** - * Gets the iterator as a String. - * - * @return a string version of the iterator - */ - public String toString() { - if (last != null) { - return "MapIterator[" + getKey() + "=" + getValue() + "]"; - } else { - return "MapIterator[]"; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EnumerationIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EnumerationIterator.java deleted file mode 100644 index 2c045cf2eb6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/EnumerationIterator.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; - -/** - * Adapter to make {@link Enumeration Enumeration} instances appear - * to be {@link Iterator Iterator} instances. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Daniel Rall - */ -public class EnumerationIterator implements Iterator { - - /** The collection to remove elements from */ - private Collection collection; - /** The enumeration being converted */ - private Enumeration enumeration; - /** The last object retrieved */ - private Object last; - - // Constructors - //----------------------------------------------------------------------- - /** - * Constructs a new EnumerationIterator that will not - * function until {@link #setEnumeration(Enumeration)} is called. - */ - public EnumerationIterator() { - this(null, null); - } - - /** - * Constructs a new EnumerationIterator that provides - * an iterator view of the given enumeration. - * - * @param enumeration the enumeration to use - */ - public EnumerationIterator(final Enumeration enumeration) { - this(enumeration, null); - } - - /** - * Constructs a new EnumerationIterator that will remove - * elements from the specified collection. - * - * @param enumeration the enumeration to use - * @param collection the collection to remove elements form - */ - public EnumerationIterator(final Enumeration enumeration, final Collection collection) { - super(); - this.enumeration = enumeration; - this.collection = collection; - this.last = null; - } - - // Iterator interface - //----------------------------------------------------------------------- - /** - * Returns true if the underlying enumeration has more elements. - * - * @return true if the underlying enumeration has more elements - * @throws NullPointerException if the underlying enumeration is null - */ - public boolean hasNext() { - return enumeration.hasMoreElements(); - } - - /** - * Returns the next object from the enumeration. - * - * @return the next object from the enumeration - * @throws NullPointerException if the enumeration is null - */ - public Object next() { - last = enumeration.nextElement(); - return last; - } - - /** - * Removes the last retrieved element if a collection is attached. - *

                  - * Functions if an associated Collection is known. - * If so, the first occurrence of the last returned object from this - * iterator will be removed from the collection. - * - * @exception IllegalStateException next() not called. - * @exception UnsupportedOperationException if no associated collection - */ - public void remove() { - if (collection != null) { - if (last != null) { - collection.remove(last); - } else { - throw new IllegalStateException("next() must have been called for remove() to function"); - } - } else { - throw new UnsupportedOperationException("No Collection associated with this Iterator"); - } - } - - // Properties - //----------------------------------------------------------------------- - /** - * Returns the underlying enumeration. - * - * @return the underlying enumeration - */ - public Enumeration getEnumeration() { - return enumeration; - } - - /** - * Sets the underlying enumeration. - * - * @param enumeration the new underlying enumeration - */ - public void setEnumeration(final Enumeration enumeration) { - this.enumeration = enumeration; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterIterator.java deleted file mode 100644 index 4459918c07d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterIterator.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.Predicate; - -/** - * Decorates another {@link Iterator} using a predicate to filter elements. - *

                  - * This iterator decorates the underlying iterator, only allowing through - * those elements that match the specified {@link Predicate Predicate}. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Jan Sorensen - * @author Ralph Wagner - * @author Stephen Colebourne - */ -public class FilterIterator implements Iterator { - - /** The iterator being used */ - private Iterator iterator; - /** The predicate being used */ - private Predicate predicate; - /** The next object in the iteration */ - private Object nextObject; - /** Whether the next object has been calculated yet */ - private boolean nextObjectSet = false; - - //----------------------------------------------------------------------- - /** - * Constructs a new FilterIterator that will not function - * until {@link #setIterator(Iterator) setIterator} is invoked. - */ - public FilterIterator() { - super(); - } - - /** - * Constructs a new FilterIterator that will not function - * until {@link #setPredicate(Predicate) setPredicate} is invoked. - * - * @param iterator the iterator to use - */ - public FilterIterator(Iterator iterator) { - super(); - this.iterator = iterator; - } - - /** - * Constructs a new FilterIterator that will use the - * given iterator and predicate. - * - * @param iterator the iterator to use - * @param predicate the predicate to use - */ - public FilterIterator(Iterator iterator, Predicate predicate) { - super(); - this.iterator = iterator; - this.predicate = predicate; - } - - //----------------------------------------------------------------------- - /** - * Returns true if the underlying iterator contains an object that - * matches the predicate. - * - * @return true if there is another object that matches the predicate - * @throws NullPointerException if either the iterator or predicate are null - */ - public boolean hasNext() { - if (nextObjectSet) { - return true; - } else { - return setNextObject(); - } - } - - /** - * Returns the next object that matches the predicate. - * - * @return the next object which matches the given predicate - * @throws NullPointerException if either the iterator or predicate are null - * @throws NoSuchElementException if there are no more elements that - * match the predicate - */ - public Object next() { - if (!nextObjectSet) { - if (!setNextObject()) { - throw new NoSuchElementException(); - } - } - nextObjectSet = false; - return nextObject; - } - - /** - * Removes from the underlying collection of the base iterator the last - * element returned by this iterator. - * This method can only be called - * if next() was called, but not after - * hasNext(), because the hasNext() call - * changes the base iterator. - * - * @throws IllegalStateException if hasNext() has already - * been called. - */ - public void remove() { - if (nextObjectSet) { - throw new IllegalStateException("remove() cannot be called"); - } - iterator.remove(); - } - - //----------------------------------------------------------------------- - /** - * Gets the iterator this iterator is using. - * - * @return the iterator - */ - public Iterator getIterator() { - return iterator; - } - - /** - * Sets the iterator for this iterator to use. - * If iteration has started, this effectively resets the iterator. - * - * @param iterator the iterator to use - */ - public void setIterator(Iterator iterator) { - this.iterator = iterator; - nextObject = null; - nextObjectSet = false; - } - - //----------------------------------------------------------------------- - /** - * Gets the predicate this iterator is using. - * - * @return the predicate - */ - public Predicate getPredicate() { - return predicate; - } - - /** - * Sets the predicate this the iterator to use. - * - * @param predicate the predicate to use - */ - public void setPredicate(Predicate predicate) { - this.predicate = predicate; - nextObject = null; - nextObjectSet = false; - } - - //----------------------------------------------------------------------- - /** - * Set nextObject to the next object. If there are no more - * objects then return false. Otherwise, return true. - */ - private boolean setNextObject() { - while (iterator.hasNext()) { - Object object = iterator.next(); - if (predicate.evaluate(object)) { - nextObject = object; - nextObjectSet = true; - return true; - } - } - return false; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterListIterator.java deleted file mode 100644 index a7bfa8b0fb9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/FilterListIterator.java +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.Predicate; - -/** - * Decorates another {@link ListIterator} using a predicate to filter elements. - *

                  - * This iterator decorates the underlying iterator, only allowing through - * those elements that match the specified {@link Predicate Predicate}. - * - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - */ -public class FilterListIterator implements ListIterator { - - /** The iterator being used */ - private ListIterator iterator; - - /** The predicate being used */ - private Predicate predicate; - - /** - * The value of the next (matching) object, when - * {@link #nextObjectSet} is true. - */ - private Object nextObject; - - /** - * Whether or not the {@link #nextObject} has been set - * (possibly to null). - */ - private boolean nextObjectSet = false; - - /** - * The value of the previous (matching) object, when - * {@link #previousObjectSet} is true. - */ - private Object previousObject; - - /** - * Whether or not the {@link #previousObject} has been set - * (possibly to null). - */ - private boolean previousObjectSet = false; - - /** - * The index of the element that would be returned by {@link #next}. - */ - private int nextIndex = 0; - - //----------------------------------------------------------------------- - /** - * Constructs a new FilterListIterator that will not function - * until {@link #setListIterator(ListIterator) setListIterator} - * and {@link #setPredicate(Predicate) setPredicate} are invoked. - */ - public FilterListIterator() { - super(); - } - - /** - * Constructs a new FilterListIterator that will not - * function until {@link #setPredicate(Predicate) setPredicate} is invoked. - * - * @param iterator the iterator to use - */ - public FilterListIterator(ListIterator iterator ) { - super(); - this.iterator = iterator; - } - - /** - * Constructs a new FilterListIterator. - * - * @param iterator the iterator to use - * @param predicate the predicate to use - */ - public FilterListIterator(ListIterator iterator, Predicate predicate) { - super(); - this.iterator = iterator; - this.predicate = predicate; - } - - /** - * Constructs a new FilterListIterator that will not function - * until {@link #setListIterator(ListIterator) setListIterator} is invoked. - * - * @param predicate the predicate to use. - */ - public FilterListIterator(Predicate predicate) { - super(); - this.predicate = predicate; - } - - //----------------------------------------------------------------------- - /** Not supported. */ - public void add(Object o) { - throw new UnsupportedOperationException("FilterListIterator.add(Object) is not supported."); - } - - public boolean hasNext() { - if(nextObjectSet) { - return true; - } else { - return setNextObject(); - } - } - - public boolean hasPrevious() { - if(previousObjectSet) { - return true; - } else { - return setPreviousObject(); - } - } - - public Object next() { - if(!nextObjectSet) { - if(!setNextObject()) { - throw new NoSuchElementException(); - } - } - nextIndex++; - Object temp = nextObject; - clearNextObject(); - return temp; - } - - public int nextIndex() { - return nextIndex; - } - - public Object previous() { - if(!previousObjectSet) { - if(!setPreviousObject()) { - throw new NoSuchElementException(); - } - } - nextIndex--; - Object temp = previousObject; - clearPreviousObject(); - return temp; - } - - public int previousIndex() { - return (nextIndex-1); - } - - /** Not supported. */ - public void remove() { - throw new UnsupportedOperationException("FilterListIterator.remove() is not supported."); - } - - /** Not supported. */ - public void set(Object o) { - throw new UnsupportedOperationException("FilterListIterator.set(Object) is not supported."); - } - - //----------------------------------------------------------------------- - /** - * Gets the iterator this iterator is using. - * - * @return the iterator. - */ - public ListIterator getListIterator() { - return iterator; - } - - /** - * Sets the iterator for this iterator to use. - * If iteration has started, this effectively resets the iterator. - * - * @param iterator the iterator to use - */ - public void setListIterator(ListIterator iterator) { - this.iterator = iterator; - } - - //----------------------------------------------------------------------- - /** - * Gets the predicate this iterator is using. - * - * @return the predicate. - */ - public Predicate getPredicate() { - return predicate; - } - - /** - * Sets the predicate this the iterator to use. - * - * @param predicate the transformer to use - */ - public void setPredicate(Predicate predicate) { - this.predicate = predicate; - } - - //----------------------------------------------------------------------- - private void clearNextObject() { - nextObject = null; - nextObjectSet = false; - } - - private boolean setNextObject() { - // if previousObjectSet, - // then we've walked back one step in the - // underlying list (due to a hasPrevious() call) - // so skip ahead one matching object - if(previousObjectSet) { - clearPreviousObject(); - if(!setNextObject()) { - return false; - } else { - clearNextObject(); - } - } - - while(iterator.hasNext()) { - Object object = iterator.next(); - if(predicate.evaluate(object)) { - nextObject = object; - nextObjectSet = true; - return true; - } - } - return false; - } - - private void clearPreviousObject() { - previousObject = null; - previousObjectSet = false; - } - - private boolean setPreviousObject() { - // if nextObjectSet, - // then we've walked back one step in the - // underlying list (due to a hasNext() call) - // so skip ahead one matching object - if(nextObjectSet) { - clearNextObject(); - if(!setPreviousObject()) { - return false; - } else { - clearPreviousObject(); - } - } - - while(iterator.hasPrevious()) { - Object object = iterator.previous(); - if(predicate.evaluate(object)) { - previousObject = object; - previousObjectSet = true; - return true; - } - } - return false; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorChain.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorChain.java deleted file mode 100644 index e7bef6bc5fa..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorChain.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * An IteratorChain is an Iterator that wraps a number of Iterators. - *

                  - * This class makes multiple iterators look like one to the caller - * When any method from the Iterator interface is called, the IteratorChain - * will delegate to a single underlying Iterator. The IteratorChain will - * invoke the Iterators in sequence until all Iterators are exhausted. - *

                  - * Under many circumstances, linking Iterators together in this manner is - * more efficient (and convenient) than reading out the contents of each - * Iterator into a List and creating a new Iterator. - *

                  - * Calling a method that adds new Iteratorafter a method in the Iterator - * interface has been called will result in an UnsupportedOperationException. - * Subclasses should take care to not alter the underlying List of Iterators. - *

                  - * NOTE: As from version 3.0, the IteratorChain may contain no - * iterators. In this case the class will function as an empty iterator. - * - * @since Commons Collections 2.1 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Morgan Delagrange - * @author Stephen Colebourne - */ -public class IteratorChain implements Iterator { - - /** The chain of iterators */ - protected final List iteratorChain = new ArrayList(); - /** The index of the current iterator */ - protected int currentIteratorIndex = 0; - /** The current iterator */ - protected Iterator currentIterator = null; - /** - * The "last used" Iterator is the Iterator upon which - * next() or hasNext() was most recently called - * used for the remove() operation only - */ - protected Iterator lastUsedIterator = null; - /** - * ComparatorChain is "locked" after the first time - * compare(Object,Object) is called - */ - protected boolean isLocked = false; - - //----------------------------------------------------------------------- - /** - * Construct an IteratorChain with no Iterators. - *

                  - * You will normally use {@link #addIterator(Iterator)} to add - * some iterators after using this constructor. - */ - public IteratorChain() { - super(); - } - - /** - * Construct an IteratorChain with a single Iterator. - * - * @param iterator first Iterator in the IteratorChain - * @throws NullPointerException if the iterator is null - */ - public IteratorChain(Iterator iterator) { - super(); - addIterator(iterator); - } - - /** - * Constructs a new IteratorChain over the two - * given iterators. - * - * @param a the first child iterator - * @param b the second child iterator - * @throws NullPointerException if either iterator is null - */ - public IteratorChain(Iterator a, Iterator b) { - super(); - addIterator(a); - addIterator(b); - } - - /** - * Constructs a new IteratorChain over the array - * of iterators. - * - * @param iterators the array of iterators - * @throws NullPointerException if iterators array is or contains null - */ - public IteratorChain(Iterator[] iterators) { - super(); - for (int i = 0; i < iterators.length; i++) { - addIterator(iterators[i]); - } - } - - /** - * Constructs a new IteratorChain over the collection - * of iterators. - * - * @param iterators the collection of iterators - * @throws NullPointerException if iterators collection is or contains null - * @throws ClassCastException if iterators collection doesn't contain an iterator - */ - public IteratorChain(Collection iterators) { - super(); - for (Iterator it = iterators.iterator(); it.hasNext();) { - Iterator item = (Iterator) it.next(); - addIterator(item); - } - } - - //----------------------------------------------------------------------- - /** - * Add an Iterator to the end of the chain - * - * @param iterator Iterator to add - * @throws IllegalStateException if I've already started iterating - * @throws NullPointerException if the iterator is null - */ - public void addIterator(Iterator iterator) { - checkLocked(); - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - iteratorChain.add(iterator); - } - - /** - * Set the Iterator at the given index - * - * @param index index of the Iterator to replace - * @param iterator Iterator to place at the given index - * @throws IndexOutOfBoundsException if index < 0 or index > size() - * @throws IllegalStateException if I've already started iterating - * @throws NullPointerException if the iterator is null - */ - public void setIterator(int index, Iterator iterator) throws IndexOutOfBoundsException { - checkLocked(); - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - iteratorChain.set(index, iterator); - } - - /** - * Get the list of Iterators (unmodifiable) - * - * @return the unmodifiable list of iterators added - */ - public List getIterators() { - return UnmodifiableList.decorate(iteratorChain); - } - - /** - * Number of Iterators in the current IteratorChain. - * - * @return Iterator count - */ - public int size() { - return iteratorChain.size(); - } - - /** - * Determine if modifications can still be made to the IteratorChain. - * IteratorChains cannot be modified once they have executed a method - * from the Iterator interface. - * - * @return true if IteratorChain cannot be modified, false if it can - */ - public boolean isLocked() { - return isLocked; - } - - /** - * Checks whether the iterator chain is now locked and in use. - */ - private void checkLocked() { - if (isLocked == true) { - throw new UnsupportedOperationException("IteratorChain cannot be changed after the first use of a method from the Iterator interface"); - } - } - - /** - * Lock the chain so no more iterators can be added. - * This must be called from all Iterator interface methods. - */ - private void lockChain() { - if (isLocked == false) { - isLocked = true; - } - } - - /** - * Updates the current iterator field to ensure that the current Iterator - * is not exhausted - */ - protected void updateCurrentIterator() { - if (currentIterator == null) { - if (iteratorChain.isEmpty()) { - currentIterator = EmptyIterator.INSTANCE; - } else { - currentIterator = (Iterator) iteratorChain.get(0); - } - // set last used iterator here, in case the user calls remove - // before calling hasNext() or next() (although they shouldn't) - lastUsedIterator = currentIterator; - } - - while (currentIterator.hasNext() == false && currentIteratorIndex < iteratorChain.size() - 1) { - currentIteratorIndex++; - currentIterator = (Iterator) iteratorChain.get(currentIteratorIndex); - } - } - - //----------------------------------------------------------------------- - /** - * Return true if any Iterator in the IteratorChain has a remaining element. - * - * @return true if elements remain - */ - public boolean hasNext() { - lockChain(); - updateCurrentIterator(); - lastUsedIterator = currentIterator; - - return currentIterator.hasNext(); - } - - /** - * Returns the next Object of the current Iterator - * - * @return Object from the current Iterator - * @throws java.util.NoSuchElementException if all the Iterators are exhausted - */ - public Object next() { - lockChain(); - updateCurrentIterator(); - lastUsedIterator = currentIterator; - - return currentIterator.next(); - } - - /** - * Removes from the underlying collection the last element - * returned by the Iterator. As with next() and hasNext(), - * this method calls remove() on the underlying Iterator. - * Therefore, this method may throw an - * UnsupportedOperationException if the underlying - * Iterator does not support this method. - * - * @throws UnsupportedOperationException - * if the remove operator is not supported by the underlying Iterator - * @throws IllegalStateException - * if the next method has not yet been called, or the remove method has - * already been called after the last call to the next method. - */ - public void remove() { - lockChain(); - if (currentIterator == null) { - updateCurrentIterator(); - } - lastUsedIterator.remove(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorEnumeration.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorEnumeration.java deleted file mode 100644 index 7da11e46adb..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/IteratorEnumeration.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Enumeration; -import java.util.Iterator; - -/** - * Adapter to make an {@link Iterator Iterator} instance appear to be - * an {@link Enumeration Enumeration} instance. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - */ -public class IteratorEnumeration implements Enumeration { - - /** The iterator being decorated. */ - private Iterator iterator; - - /** - * Constructs a new IteratorEnumeration that will not - * function until {@link #setIterator(Iterator) setIterator} is - * invoked. - */ - public IteratorEnumeration() { - super(); - } - - /** - * Constructs a new IteratorEnumeration that will use - * the given iterator. - * - * @param iterator the iterator to use - */ - public IteratorEnumeration( Iterator iterator ) { - super(); - this.iterator = iterator; - } - - // Iterator interface - //------------------------------------------------------------------------- - - /** - * Returns true if the underlying iterator has more elements. - * - * @return true if the underlying iterator has more elements - */ - public boolean hasMoreElements() { - return iterator.hasNext(); - } - - /** - * Returns the next element from the underlying iterator. - * - * @return the next element from the underlying iterator. - * @throws java.util.NoSuchElementException if the underlying iterator has no - * more elements - */ - public Object nextElement() { - return iterator.next(); - } - - // Properties - //------------------------------------------------------------------------- - - /** - * Returns the underlying iterator. - * - * @return the underlying iterator - */ - public Iterator getIterator() { - return iterator; - } - - /** - * Sets the underlying iterator. - * - * @param iterator the new underlying iterator - */ - public void setIterator( Iterator iterator ) { - this.iterator = iterator; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ListIteratorWrapper.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ListIteratorWrapper.java deleted file mode 100644 index fe2de84828c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ListIteratorWrapper.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * Converts an iterator into a list iterator by caching the returned entries. - *

                  - * The ListIterator interface has additional useful methods - * for navigation - previous() and the index methods. - * This class allows a regular Iterator to behave as a - * ListIterator. It achieves this by building a list internally - * of as the underlying iterator is traversed. - *

                  - * The optional operations of ListIterator are not supported. - *

                  - * This class implements ResettableListIterator from Commons Collections 3.2. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Morgan Delagrange - * @author Stephen Colebourne - */ -public class ListIteratorWrapper implements ResettableListIterator { - - /** Message used when remove, set or add are called. */ - private static final String UNSUPPORTED_OPERATION_MESSAGE = - "ListIteratorWrapper does not support optional operations of ListIterator."; - - /** The underlying iterator being decorated. */ - private final Iterator iterator; - /** The list being used to cache the iterator. */ - private final List list = new ArrayList(); - - /** The current index of this iterator. */ - private int currentIndex = 0; - /** The current index of the wrapped iterator. */ - private int wrappedIteratorIndex = 0; - - // Constructor - //------------------------------------------------------------------------- - /** - * Constructs a new ListIteratorWrapper that will wrap - * the given iterator. - * - * @param iterator the iterator to wrap - * @throws NullPointerException if the iterator is null - */ - public ListIteratorWrapper(Iterator iterator) { - super(); - if (iterator == null) { - throw new NullPointerException("Iterator must not be null"); - } - this.iterator = iterator; - } - - // ListIterator interface - //------------------------------------------------------------------------- - /** - * Throws {@link UnsupportedOperationException}. - * - * @param obj the object to add, ignored - * @throws UnsupportedOperationException always - */ - public void add(Object obj) throws UnsupportedOperationException { - throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE); - } - - /** - * Returns true if there are more elements in the iterator. - * - * @return true if there are more elements - */ - public boolean hasNext() { - if (currentIndex == wrappedIteratorIndex) { - return iterator.hasNext(); - } - return true; - } - - /** - * Returns true if there are previous elements in the iterator. - * - * @return true if there are previous elements - */ - public boolean hasPrevious() { - if (currentIndex == 0) { - return false; - } - return true; - } - - /** - * Returns the next element from the iterator. - * - * @return the next element from the iterator - * @throws NoSuchElementException if there are no more elements - */ - public Object next() throws NoSuchElementException { - if (currentIndex < wrappedIteratorIndex) { - ++currentIndex; - return list.get(currentIndex - 1); - } - - Object retval = iterator.next(); - list.add(retval); - ++currentIndex; - ++wrappedIteratorIndex; - return retval; - } - - /** - * Returns in the index of the next element. - * - * @return the index of the next element - */ - public int nextIndex() { - return currentIndex; - } - - /** - * Returns the the previous element. - * - * @return the previous element - * @throws NoSuchElementException if there are no previous elements - */ - public Object previous() throws NoSuchElementException { - if (currentIndex == 0) { - throw new NoSuchElementException(); - } - --currentIndex; - return list.get(currentIndex); - } - - /** - * Returns the index of the previous element. - * - * @return the index of the previous element - */ - public int previousIndex() { - return currentIndex - 1; - } - - /** - * Throws {@link UnsupportedOperationException}. - * - * @throws UnsupportedOperationException always - */ - public void remove() throws UnsupportedOperationException { - throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE); - } - - /** - * Throws {@link UnsupportedOperationException}. - * - * @param obj the object to set, ignored - * @throws UnsupportedOperationException always - */ - public void set(Object obj) throws UnsupportedOperationException { - throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE); - } - - // ResettableIterator interface - //------------------------------------------------------------------------- - /** - * Resets this iterator back to the position at which the iterator - * was created. - * - * @since Commons Collections 3.2 - */ - public void reset() { - currentIndex = 0; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingIterator.java deleted file mode 100644 index f7b574f1ddf..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingIterator.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Collection; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableIterator; - -/** - * An Iterator that restarts when it reaches the end. - *

                  - * The iterator will loop continuously around the provided elements, unless - * there are no elements in the collection to begin with, or all the elements - * have been {@link #remove removed}. - *

                  - * Concurrent modifications are not directly supported, and for most collection - * implementations will throw a ConcurrentModificationException. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Jonathan Carlson - * @author Stephen Colebourne - */ -public class LoopingIterator implements ResettableIterator { - - /** The collection to base the iterator on */ - private Collection collection; - /** The current iterator */ - private Iterator iterator; - - /** - * Constructor that wraps a collection. - *

                  - * There is no way to reset an Iterator instance without recreating it from - * the original source, so the Collection must be passed in. - * - * @param coll the collection to wrap - * @throws NullPointerException if the collection is null - */ - public LoopingIterator(Collection coll) { - if (coll == null) { - throw new NullPointerException("The collection must not be null"); - } - collection = coll; - reset(); - } - - /** - * Has the iterator any more elements. - *

                  - * Returns false only if the collection originally had zero elements, or - * all the elements have been {@link #remove removed}. - * - * @return true if there are more elements - */ - public boolean hasNext() { - return (collection.size() > 0); - } - - /** - * Returns the next object in the collection. - *

                  - * If at the end of the collection, return the first element. - * - * @throws NoSuchElementException if there are no elements - * at all. Use {@link #hasNext} to avoid this error. - */ - public Object next() { - if (collection.size() == 0) { - throw new NoSuchElementException("There are no elements for this iterator to loop on"); - } - if (iterator.hasNext() == false) { - reset(); - } - return iterator.next(); - } - - /** - * Removes the previously retrieved item from the underlying collection. - *

                  - * This feature is only supported if the underlying collection's - * {@link Collection#iterator iterator} method returns an implementation - * that supports it. - *

                  - * This method can only be called after at least one {@link #next} method call. - * After a removal, the remove method may not be called again until another - * next has been performed. If the {@link #reset} is called, then remove may - * not be called until {@link #next} is called again. - */ - public void remove() { - iterator.remove(); - } - - /** - * Resets the iterator back to the start of the collection. - */ - public void reset() { - iterator = collection.iterator(); - } - - /** - * Gets the size of the collection underlying the iterator. - * - * @return the current collection size - */ - public int size() { - return collection.size(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingListIterator.java deleted file mode 100644 index 0ad4b3306a5..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/LoopingListIterator.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * A ListIterator that restarts when it reaches the end or when it - * reaches the beginning. - *

                  - * The iterator will loop continuously around the provided list, - * unless there are no elements in the collection to begin with, or - * all of the elements have been {@link #remove removed}. - *

                  - * Concurrent modifications are not directly supported, and for most - * collection implementations will throw a - * ConcurrentModificationException. - * - * @since Commons Collections 3.2 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Eric Crampton - */ -public class LoopingListIterator implements ResettableListIterator { - - /** The list to base the iterator on */ - private List list; - /** The current list iterator */ - private ListIterator iterator; - - /** - * Constructor that wraps a list. - *

                  - * There is no way to reset a ListIterator instance without - * recreating it from the original source, so the List must be - * passed in and a reference to it held. - * - * @param list the list to wrap - * @throws NullPointerException if the list it null - */ - public LoopingListIterator(List list) { - if (list == null) { - throw new NullPointerException("The list must not be null"); - } - this.list = list; - reset(); - } - - /** - * Returns whether this iterator has any more elements. - *

                  - * Returns false only if the list originally had zero elements, or - * all elements have been {@link #remove removed}. - * - * @return true if there are more elements - */ - public boolean hasNext() { - return !list.isEmpty(); - } - - /** - * Returns the next object in the list. - *

                  - * If at the end of the list, returns the first element. - * - * @return the object after the last element returned - * @throws NoSuchElementException if there are no elements in the list - */ - public Object next() { - if (list.isEmpty()) { - throw new NoSuchElementException( - "There are no elements for this iterator to loop on"); - } - if (iterator.hasNext() == false) { - reset(); - } - return iterator.next(); - } - - /** - * Returns the index of the element that would be returned by a - * subsequent call to {@link #next}. - *

                  - * As would be expected, if the iterator is at the physical end of - * the underlying list, 0 is returned, signifying the beginning of - * the list. - * - * @return the index of the element that would be returned if next() were called - * @throws NoSuchElementException if there are no elements in the list - */ - public int nextIndex() { - if (list.isEmpty()) { - throw new NoSuchElementException( - "There are no elements for this iterator to loop on"); - } - if (iterator.hasNext() == false) { - return 0; - } else { - return iterator.nextIndex(); - } - } - - /** - * Returns whether this iterator has any more previous elements. - *

                  - * Returns false only if the list originally had zero elements, or - * all elements have been {@link #remove removed}. - * - * @return true if there are more elements - */ - public boolean hasPrevious() { - return !list.isEmpty(); - } - - /** - * Returns the previous object in the list. - *

                  - * If at the beginning of the list, return the last element. Note - * that in this case, traversal to find that element takes linear time. - * - * @return the object before the last element returned - * @throws NoSuchElementException if there are no elements in the list - */ - public Object previous() { - if (list.isEmpty()) { - throw new NoSuchElementException( - "There are no elements for this iterator to loop on"); - } - if (iterator.hasPrevious() == false) { - Object result = null; - while (iterator.hasNext()) { - result = iterator.next(); - } - iterator.previous(); - return result; - } else { - return iterator.previous(); - } - } - - /** - * Returns the index of the element that would be returned by a - * subsequent call to {@link #previous}. - *

                  - * As would be expected, if at the iterator is at the physical - * beginning of the underlying list, the list's size minus one is - * returned, signifying the end of the list. - * - * @return the index of the element that would be returned if previous() were called - * @throws NoSuchElementException if there are no elements in the list - */ - public int previousIndex() { - if (list.isEmpty()) { - throw new NoSuchElementException( - "There are no elements for this iterator to loop on"); - } - if (iterator.hasPrevious() == false) { - return list.size() - 1; - } else { - return iterator.previousIndex(); - } - } - - /** - * Removes the previously retrieved item from the underlying list. - *

                  - * This feature is only supported if the underlying list's - * {@link List#iterator iterator} method returns an implementation - * that supports it. - *

                  - * This method can only be called after at least one {@link #next} - * or {@link #previous} method call. After a removal, the remove - * method may not be called again until another {@link #next} or - * {@link #previous} has been performed. If the {@link #reset} is - * called, then remove may not be called until {@link #next} or - * {@link #previous} is called again. - * - * @throws UnsupportedOperationException if the remove method is - * not supported by the iterator implementation of the underlying - * list - */ - public void remove() { - iterator.remove(); - } - - /** - * Inserts the specified element into the underlying list. - *

                  - * The element is inserted before the next element that would be - * returned by {@link #next}, if any, and after the next element - * that would be returned by {@link #previous}, if any. - *

                  - * This feature is only supported if the underlying list's - * {@link List#listIterator} method returns an implementation - * that supports it. - * - * @param obj the element to insert - * @throws UnsupportedOperationException if the add method is not - * supported by the iterator implementation of the underlying list - */ - public void add(Object obj) { - iterator.add(obj); - } - - /** - * Replaces the last element that was returned by {@link #next} or - * {@link #previous}. - *

                  - * This feature is only supported if the underlying list's - * {@link List#listIterator} method returns an implementation - * that supports it. - * - * @param obj the element with which to replace the last element returned - * @throws UnsupportedOperationException if the set method is not - * supported by the iterator implementation of the underlying list - */ - public void set(Object obj) { - iterator.set(obj); - } - - /** - * Resets the iterator back to the start of the list. - */ - public void reset() { - iterator = list.listIterator(); - } - - /** - * Gets the size of the list underlying the iterator. - * - * @return the current list size - */ - public int size() { - return list.size(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayIterator.java deleted file mode 100644 index 9fd1d7a73fc..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayIterator.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableIterator; - -/** - * An {@link Iterator} over an array of objects. - *

                  - * This iterator does not support {@link #remove}, as the object array cannot be - * structurally modified. - *

                  - * The iterator implements a {@link #reset} method, allowing the reset of the iterator - * back to the start if required. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Mauricio S. Moura - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - * @author Phil Steitz - */ -public class ObjectArrayIterator - implements Iterator, ResettableIterator { - - /** The array */ - protected Object[] array = null; - /** The start index to loop from */ - protected int startIndex = 0; - /** The end index to loop to */ - protected int endIndex = 0; - /** The current iterator index */ - protected int index = 0; - - /** - * Constructor for use with setArray. - *

                  - * Using this constructor, the iterator is equivalent to an empty iterator - * until {@link #setArray} is called to establish the array to iterate over. - */ - public ObjectArrayIterator() { - super(); - } - - /** - * Constructs an ObjectArrayIterator that will iterate over the values in the - * specified array. - * - * @param array the array to iterate over - * @throws NullPointerException if array is null - */ - public ObjectArrayIterator(Object[] array) { - this(array, 0, array.length); - } - - /** - * Constructs an ObjectArrayIterator that will iterate over the values in the - * specified array from a specific start index. - * - * @param array the array to iterate over - * @param start the index to start iterating at - * @throws NullPointerException if array is null - * @throws IndexOutOfBoundsException if the start index is out of bounds - */ - public ObjectArrayIterator(Object array[], int start) { - this(array, start, array.length); - } - - /** - * Construct an ObjectArrayIterator that will iterate over a range of values - * in the specified array. - * - * @param array the array to iterate over - * @param start the index to start iterating at - * @param end the index (exclusive) to finish iterating at - * @throws IndexOutOfBoundsException if the start or end index is out of bounds - * @throws IllegalArgumentException if end index is before the start - * @throws NullPointerException if array is null - */ - public ObjectArrayIterator(Object array[], int start, int end) { - super(); - if (start < 0) { - throw new ArrayIndexOutOfBoundsException("Start index must not be less than zero"); - } - if (end > array.length) { - throw new ArrayIndexOutOfBoundsException("End index must not be greater than the array length"); - } - if (start > array.length) { - throw new ArrayIndexOutOfBoundsException("Start index must not be greater than the array length"); - } - if (end < start) { - throw new IllegalArgumentException("End index must not be less than start index"); - } - this.array = array; - this.startIndex = start; - this.endIndex = end; - this.index = start; - } - - // Iterator interface - //------------------------------------------------------------------------- - - /** - * Returns true if there are more elements to return from the array. - * - * @return true if there is a next element to return - */ - public boolean hasNext() { - return (this.index < this.endIndex); - } - - /** - * Returns the next element in the array. - * - * @return the next element in the array - * @throws NoSuchElementException if all the elements in the array - * have already been returned - */ - public Object next() { - if (hasNext() == false) { - throw new NoSuchElementException(); - } - return this.array[this.index++]; - } - - /** - * Throws {@link UnsupportedOperationException}. - * - * @throws UnsupportedOperationException always - */ - public void remove() { - throw new UnsupportedOperationException("remove() method is not supported for an ObjectArrayIterator"); - } - - // Properties - //------------------------------------------------------------------------- - - /** - * Gets the array that this iterator is iterating over. - * - * @return the array this iterator iterates over, or null if - * the no-arg constructor was used and {@link #setArray} has never - * been called with a valid array. - */ - public Object[] getArray() { - return this.array; - } - - /** - * Sets the array that the ArrayIterator should iterate over. - *

                  - * This method may only be called once, otherwise an IllegalStateException - * will occur. - *

                  - * The {@link #reset} method can be used to reset the iterator if required. - * - * @param array the array that the iterator should iterate over - * @throws IllegalStateException if the array was set in the constructor - * @throws NullPointerException if array is null - */ - public void setArray(Object[] array) { - if (this.array != null) { - throw new IllegalStateException("The array to iterate over has already been set"); - } - this.array = array; - this.startIndex = 0; - this.endIndex = array.length; - this.index = 0; - } - - /** - * Gets the start index to loop from. - * - * @return the start index - */ - public int getStartIndex() { - return this.startIndex; - } - - /** - * Gets the end index to loop to. - * - * @return the end index - */ - public int getEndIndex() { - return this.endIndex; - } - - /** - * Resets the iterator back to the start index. - */ - public void reset() { - this.index = this.startIndex; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayListIterator.java deleted file mode 100644 index afb344741f2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectArrayListIterator.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * Implements a {@link ListIterator} over an array of objects. - *

                  - * This iterator does not support {@link #add} or {@link #remove}, as the object array - * cannot be structurally modified. The {@link #set} method is supported however. - *

                  - * The iterator implements a {@link #reset} method, allowing the reset of the iterator - * back to the start if required. - * - * @see org.apache.commons.collections.iterators.ObjectArrayIterator - * @see java.util.Iterator - * @see java.util.ListIterator - * - * @since Commons Collections 3.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Neil O'Toole - * @author Stephen Colebourne - * @author Phil Steitz - */ -public class ObjectArrayListIterator extends ObjectArrayIterator - implements ListIterator, ResettableListIterator { - - /** - * Holds the index of the last item returned by a call to next() - * or previous(). This is set to -1 if neither method - * has yet been invoked. lastItemIndex is used to to implement the - * {@link #set} method. - */ - protected int lastItemIndex = -1; - - /** - * Constructor for use with setArray. - *

                  - * Using this constructor, the iterator is equivalent to an empty iterator - * until {@link #setArray} is called to establish the array to iterate over. - */ - public ObjectArrayListIterator() { - super(); - } - - /** - * Constructs an ObjectArrayListIterator that will iterate over the values in the - * specified array. - * - * @param array the array to iterate over - * @throws NullPointerException if array is null - */ - public ObjectArrayListIterator(Object[] array) { - super(array); - } - - /** - * Constructs an ObjectArrayListIterator that will iterate over the values in the - * specified array from a specific start index. - * - * @param array the array to iterate over - * @param start the index to start iterating at - * @throws NullPointerException if array is null - * @throws IndexOutOfBoundsException if the start index is out of bounds - */ - public ObjectArrayListIterator(Object[] array, int start) { - super(array, start); - } - - /** - * Construct an ObjectArrayListIterator that will iterate over a range of values - * in the specified array. - * - * @param array the array to iterate over - * @param start the index to start iterating at - * @param end the index (exclusive) to finish iterating at - * @throws IndexOutOfBoundsException if the start or end index is out of bounds - * @throws IllegalArgumentException if end index is before the start - * @throws NullPointerException if array is null - */ - public ObjectArrayListIterator(Object[] array, int start, int end) { - super(array, start, end); - } - - // ListIterator interface - //------------------------------------------------------------------------- - - /** - * Returns true if there are previous elements to return from the array. - * - * @return true if there is a previous element to return - */ - public boolean hasPrevious() { - return (this.index > this.startIndex); - } - - /** - * Gets the previous element from the array. - * - * @return the previous element - * @throws NoSuchElementException if there is no previous element - */ - public Object previous() { - if (hasPrevious() == false) { - throw new NoSuchElementException(); - } - this.lastItemIndex = --this.index; - return this.array[this.index]; - } - - /** - * Gets the next element from the array. - * - * @return the next element - * @throws NoSuchElementException if there is no next element - */ - public Object next() { - if (hasNext() == false) { - throw new NoSuchElementException(); - } - this.lastItemIndex = this.index; - return this.array[this.index++]; - } - - /** - * Gets the next index to be retrieved. - * - * @return the index of the item to be retrieved next - */ - public int nextIndex() { - return this.index - this.startIndex; - } - - /** - * Gets the index of the item to be retrieved if {@link #previous()} is called. - * - * @return the index of the item to be retrieved next - */ - public int previousIndex() { - return this.index - this.startIndex - 1; - } - - /** - * This iterator does not support modification of its backing array's size, and so will - * always throw an {@link UnsupportedOperationException} when this method is invoked. - * - * @param obj the object to add - * @throws UnsupportedOperationException always thrown. - */ - public void add(Object obj) { - throw new UnsupportedOperationException("add() method is not supported"); - } - - /** - * Sets the element under the cursor. - *

                  - * This method sets the element that was returned by the last call - * to {@link #next()} of {@link #previous()}. - * - * Note: {@link ListIterator} implementations that support add() - * and remove() only allow set() to be called once per call - * to next() or previous (see the {@link ListIterator} - * javadoc for more details). Since this implementation does not support - * add() or remove(), set() may be - * called as often as desired. - * - * @param obj the object to set into the array - * @throws IllegalStateException if next() has not yet been called. - * @throws ClassCastException if the object type is unsuitable for the array - */ - public void set(Object obj) { - if (this.lastItemIndex == -1) { - throw new IllegalStateException("must call next() or previous() before a call to set()"); - } - - this.array[this.lastItemIndex] = obj; - } - - /** - * Resets the iterator back to the start index. - */ - public void reset() { - super.reset(); - this.lastItemIndex = -1; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectGraphIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectGraphIterator.java deleted file mode 100644 index 883bce7774a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ObjectGraphIterator.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ArrayStack; -import org.apache.commons.collections.Transformer; - -/** - * An Iterator that can traverse multiple iterators down an object graph. - *

                  - * This iterator can extract multiple objects from a complex tree-like object graph. - * The iteration starts from a single root object. - * It uses a Transformer to extract the iterators and elements. - * Its main benefit is that no intermediate List is created. - *

                  - * For example, consider an object graph: - *

                  - *                 |- Branch -- Leaf
                  - *                 |         \- Leaf
                  - *         |- Tree |         /- Leaf
                  - *         |       |- Branch -- Leaf
                  - *  Forest |                 \- Leaf
                  - *         |       |- Branch -- Leaf
                  - *         |       |         \- Leaf
                  - *         |- Tree |         /- Leaf
                  - *                 |- Branch -- Leaf
                  - *                 |- Branch -- Leaf
                  - * The following Transformer, used in this class, will extract all - * the Leaf objects without creating a combined intermediate list: - *
                  - * public Object transform(Object input) {
                  - *   if (input instanceof Forest) {
                  - *     return ((Forest) input).treeIterator();
                  - *   }
                  - *   if (input instanceof Tree) {
                  - *     return ((Tree) input).branchIterator();
                  - *   }
                  - *   if (input instanceof Branch) {
                  - *     return ((Branch) input).leafIterator();
                  - *   }
                  - *   if (input instanceof Leaf) {
                  - *     return input;
                  - *   }
                  - *   throw new ClassCastException();
                  - * }
                  - *

                  - * Internally, iteration starts from the root object. When next is called, - * the transformer is called to examine the object. The transformer will return - * either an iterator or an object. If the object is an Iterator, the next element - * from that iterator is obtained and the process repeats. If the element is an object - * it is returned. - *

                  - * Under many circumstances, linking Iterators together in this manner is - * more efficient (and convenient) than using nested for loops to extract a list. - * - * @since Commons Collections 3.1 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ObjectGraphIterator implements Iterator { - - /** The stack of iterators */ - protected final ArrayStack stack = new ArrayStack(8); - /** The root object in the tree */ - protected Object root; - /** The transformer to use */ - protected Transformer transformer; - - /** Whether there is another element in the iteration */ - protected boolean hasNext = false; - /** The current iterator */ - protected Iterator currentIterator; - /** The current value */ - protected Object currentValue; - /** The last used iterator, needed for remove() */ - protected Iterator lastUsedIterator; - - //----------------------------------------------------------------------- - /** - * Constructs an ObjectGraphIterator using a root object and transformer. - *

                  - * The root object can be an iterator, in which case it will be immediately - * looped around. - * - * @param root the root object, null will result in an empty iterator - * @param transformer the transformer to use, null will use a no effect transformer - */ - public ObjectGraphIterator(Object root, Transformer transformer) { - super(); - if (root instanceof Iterator) { - this.currentIterator = (Iterator) root; - } else { - this.root = root; - } - this.transformer = transformer; - } - - /** - * Constructs a ObjectGraphIterator that will handle an iterator of iterators. - *

                  - * This constructor exists for convenience to emphasise that this class can - * be used to iterate over nested iterators. That is to say that the iterator - * passed in here contains other iterators, which may in turn contain further - * iterators. - * - * @param rootIterator the root iterator, null will result in an empty iterator - */ - public ObjectGraphIterator(Iterator rootIterator) { - super(); - this.currentIterator = rootIterator; - this.transformer = null; - } - - //----------------------------------------------------------------------- - /** - * Loops around the iterators to find the next value to return. - */ - protected void updateCurrentIterator() { - if (hasNext) { - return; - } - if (currentIterator == null) { - if (root == null) { - // do nothing, hasNext will be false - } else { - if (transformer == null) { - findNext(root); - } else { - findNext(transformer.transform(root)); - } - root = null; - } - } else { - findNextByIterator(currentIterator); - } - } - - /** - * Finds the next object in the iteration given any start object. - * - * @param value the value to start from - */ - protected void findNext(Object value) { - if (value instanceof Iterator) { - // need to examine this iterator - findNextByIterator((Iterator) value); - } else { - // next value found - currentValue = value; - hasNext = true; - } - } - - /** - * Finds the next object in the iteration given an iterator. - * - * @param iterator the iterator to start from - */ - protected void findNextByIterator(Iterator iterator) { - if (iterator != currentIterator) { - // recurse a level - if (currentIterator != null) { - stack.push(currentIterator); - } - currentIterator = iterator; - } - - while (currentIterator.hasNext() && hasNext == false) { - Object next = currentIterator.next(); - if (transformer != null) { - next = transformer.transform(next); - } - findNext(next); - } - if (hasNext) { - // next value found - } else if (stack.isEmpty()) { - // all iterators exhausted - } else { - // current iterator exhausted, go up a level - currentIterator = (Iterator) stack.pop(); - findNextByIterator(currentIterator); - } - } - - //----------------------------------------------------------------------- - /** - * Checks whether there are any more elements in the iteration to obtain. - * - * @return true if elements remain in the iteration - */ - public boolean hasNext() { - updateCurrentIterator(); - return hasNext; - } - - /** - * Gets the next element of the iteration. - * - * @return the next element from the iteration - * @throws NoSuchElementException if all the Iterators are exhausted - */ - public Object next() { - updateCurrentIterator(); - if (hasNext == false) { - throw new NoSuchElementException("No more elements in the iteration"); - } - lastUsedIterator = currentIterator; - Object result = currentValue; - currentValue = null; - hasNext = false; - return result; - } - - /** - * Removes from the underlying collection the last element returned. - *

                  - * This method calls remove() on the underlying Iterator and it may - * throw an UnsupportedOperationException if the underlying Iterator - * does not support this method. - * - * @throws UnsupportedOperationException - * if the remove operator is not supported by the underlying Iterator - * @throws IllegalStateException - * if the next method has not yet been called, or the remove method has - * already been called after the last call to the next method. - */ - public void remove() { - if (lastUsedIterator == null) { - throw new IllegalStateException("Iterator remove() cannot be called at this time"); - } - lastUsedIterator.remove(); - lastUsedIterator = null; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyIterator.java deleted file mode 100644 index 423f5fadfbc..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyIterator.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; - -/** - * A Proxy {@link Iterator Iterator} which delegates its methods to a proxy instance. - * - * @deprecated Use AbstractIteratorDecorator. Will be removed in v4.0 - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - */ -public class ProxyIterator implements Iterator { - - /** Holds value of property iterator. */ - private Iterator iterator; - - // Constructors - //------------------------------------------------------------------------- - - /** - * Constructs a new ProxyIterator that will not function - * until {@link #setIterator(Iterator)} is called. - */ - public ProxyIterator() { - super(); - } - - /** - * Constructs a new ProxyIterator that will use the - * given iterator. - * - * @param iterator the underlying iterator - */ - public ProxyIterator(Iterator iterator) { - super(); - this.iterator = iterator; - } - - // Iterator interface - //------------------------------------------------------------------------- - - /** - * Returns true if the underlying iterator has more elements. - * - * @return true if the underlying iterator has more elements - */ - public boolean hasNext() { - return getIterator().hasNext(); - } - - /** - * Returns the next element from the underlying iterator. - * - * @return the next element from the underlying iterator - * @throws java.util.NoSuchElementException if the underlying iterator - * raises it because it has no more elements - */ - public Object next() { - return getIterator().next(); - } - - /** - * Removes the last returned element from the collection that spawned - * the underlying iterator. - */ - public void remove() { - getIterator().remove(); - } - - // Properties - //------------------------------------------------------------------------- - /** Getter for property iterator. - * @return Value of property iterator. - */ - public Iterator getIterator() { - return iterator; - } - /** Setter for property iterator. - * @param iterator New value of property iterator. - */ - public void setIterator(Iterator iterator) { - this.iterator = iterator; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyListIterator.java deleted file mode 100644 index c430df2a59d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ProxyListIterator.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; - -/** - * A proxy {@link ListIterator ListIterator} which delegates its - * methods to a proxy instance. - * - * @deprecated Use AbstractListIteratorDecorator. Will be removed in v4.0 - * @since Commons Collections 2.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - */ -public class ProxyListIterator implements ListIterator { - - /** Holds value of property "iterator". */ - private ListIterator iterator; - - // Constructors - //------------------------------------------------------------------------- - - /** - * Constructs a new ProxyListIterator that will not - * function until {@link #setListIterator(ListIterator) setListIterator} - * is invoked. - */ - public ProxyListIterator() { - super(); - } - - /** - * Constructs a new ProxyListIterator that will use the - * given list iterator. - * - * @param iterator the list iterator to use - */ - public ProxyListIterator(ListIterator iterator) { - super(); - this.iterator = iterator; - } - - // ListIterator interface - //------------------------------------------------------------------------- - - /** - * Invokes the underlying {@link ListIterator#add(Object)} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public void add(Object o) { - getListIterator().add(o); - } - - /** - * Invokes the underlying {@link ListIterator#hasNext()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public boolean hasNext() { - return getListIterator().hasNext(); - } - - /** - * Invokes the underlying {@link ListIterator#hasPrevious()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public boolean hasPrevious() { - return getListIterator().hasPrevious(); - } - - /** - * Invokes the underlying {@link ListIterator#next()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public Object next() { - return getListIterator().next(); - } - - /** - * Invokes the underlying {@link ListIterator#nextIndex()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public int nextIndex() { - return getListIterator().nextIndex(); - } - - /** - * Invokes the underlying {@link ListIterator#previous()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public Object previous() { - return getListIterator().previous(); - } - - /** - * Invokes the underlying {@link ListIterator#previousIndex()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public int previousIndex() { - return getListIterator().previousIndex(); - } - - /** - * Invokes the underlying {@link ListIterator#remove()} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public void remove() { - getListIterator().remove(); - } - - /** - * Invokes the underlying {@link ListIterator#set(Object)} method. - * - * @throws NullPointerException if the underlying iterator is null - */ - public void set(Object o) { - getListIterator().set(o); - } - - // Properties - //------------------------------------------------------------------------- - - /** - * Getter for property iterator. - * @return Value of property iterator. - */ - public ListIterator getListIterator() { - return iterator; - } - - /** - * Setter for property iterator. - * @param iterator New value of property iterator. - */ - public void setListIterator(ListIterator iterator) { - this.iterator = iterator; - } - -} - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ReverseListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ReverseListIterator.java deleted file mode 100644 index d343a4b9ab7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/ReverseListIterator.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.List; -import java.util.ListIterator; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * Iterates backwards through a List, starting with the last element - * and continuing to the first. This is useful for looping around - * a list in reverse order without needing to actually reverse the list. - *

                  - * The first call to next() will return the last element - * from the list, and so on. The hasNext() method works - * in concert with the next() method as expected. - * However, the nextIndex() method returns the correct - * index in the list, thus it starts high and reduces as the iteration - * continues. The previous methods work similarly. - * - * @author Serge Knystautas - * @author Stephen Colebourne - * @since Commons Collections 3.2 - * @version $Revision: $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - */ -public class ReverseListIterator implements ResettableListIterator { - - /** The list being wrapped. */ - private final List list; - /** The list iterator being wrapped. */ - private ListIterator iterator; - /** Flag to indicate if updating is possible at the moment. */ - private boolean validForUpdate = true; - - /** - * Constructor that wraps a list. - * - * @param list the list to create a reversed iterator for - * @throws NullPointerException if the list is null - */ - public ReverseListIterator(List list) { - super(); - this.list = list; - iterator = list.listIterator(list.size()); - } - - //----------------------------------------------------------------------- - /** - * Checks whether there is another element. - * - * @return true if there is another element - */ - public boolean hasNext() { - return iterator.hasPrevious(); - } - - /** - * Gets the next element. - * The next element is the previous in the list. - * - * @return the next element in the iterator - */ - public Object next() { - Object obj = iterator.previous(); - validForUpdate = true; - return obj; - } - - /** - * Gets the index of the next element. - * - * @return the index of the next element in the iterator - */ - public int nextIndex() { - return iterator.previousIndex(); - } - - /** - * Checks whether there is a previous element. - * - * @return true if there is a previous element - */ - public boolean hasPrevious() { - return iterator.hasNext(); - } - - /** - * Gets the previous element. - * The next element is the previous in the list. - * - * @return the previous element in the iterator - */ - public Object previous() { - Object obj = iterator.next(); - validForUpdate = true; - return obj; - } - - /** - * Gets the index of the previous element. - * - * @return the index of the previous element in the iterator - */ - public int previousIndex() { - return iterator.nextIndex(); - } - - /** - * Removes the last returned element. - * - * @throws UnsupportedOperationException if the list is unmodifiable - * @throws IllegalStateException if there is no element to remove - */ - public void remove() { - if (validForUpdate == false) { - throw new IllegalStateException("Cannot remove from list until next() or previous() called"); - } - iterator.remove(); - } - - /** - * Replaces the last returned element. - * - * @param obj the object to set - * @throws UnsupportedOperationException if the list is unmodifiable - * @throws IllegalStateException if the iterator is not in a valid state for set - */ - public void set(Object obj) { - if (validForUpdate == false) { - throw new IllegalStateException("Cannot set to list until next() or previous() called"); - } - iterator.set(obj); - } - - /** - * Adds a new element to the list between the next and previous elements. - * - * @param obj the object to add - * @throws UnsupportedOperationException if the list is unmodifiable - * @throws IllegalStateException if the iterator is not in a valid state for set - */ - public void add(Object obj) { - // the validForUpdate flag is needed as the necessary previous() - // method call re-enables remove and add - if (validForUpdate == false) { - throw new IllegalStateException("Cannot add to list until next() or previous() called"); - } - validForUpdate = false; - iterator.add(obj); - iterator.previous(); - } - - /** - * Resets the iterator back to the start (which is the - * end of the list as this is a reversed iterator) - */ - public void reset() { - iterator = list.listIterator(list.size()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonIterator.java deleted file mode 100644 index f9821e3a431..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonIterator.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableIterator; - -/** - * SingletonIterator is an {@link Iterator} over a single - * object instance. - * - * @since Commons Collections 2.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author James Strachan - * @author Stephen Colebourne - * @author Rodney Waldhoff - */ -public class SingletonIterator - implements Iterator, ResettableIterator { - - /** Whether remove is allowed */ - private final boolean removeAllowed; - /** Is the cursor before the first element */ - private boolean beforeFirst = true; - /** Has the element been removed */ - private boolean removed = false; - /** The object */ - private Object object; - - /** - * Constructs a new SingletonIterator where remove - * is a permitted operation. - * - * @param object the single object to return from the iterator - */ - public SingletonIterator(Object object) { - this(object, true); - } - - /** - * Constructs a new SingletonIterator optionally choosing if - * remove is a permitted operation. - * - * @param object the single object to return from the iterator - * @param removeAllowed true if remove is allowed - * @since Commons Collections 3.1 - */ - public SingletonIterator(Object object, boolean removeAllowed) { - super(); - this.object = object; - this.removeAllowed = removeAllowed; - } - - //----------------------------------------------------------------------- - /** - * Is another object available from the iterator? - *

                  - * This returns true if the single object hasn't been returned yet. - * - * @return true if the single object hasn't been returned yet - */ - public boolean hasNext() { - return (beforeFirst && !removed); - } - - /** - * Get the next object from the iterator. - *

                  - * This returns the single object if it hasn't been returned yet. - * - * @return the single object - * @throws NoSuchElementException if the single object has already - * been returned - */ - public Object next() { - if (!beforeFirst || removed) { - throw new NoSuchElementException(); - } - beforeFirst = false; - return object; - } - - /** - * Remove the object from this iterator. - * - * @throws IllegalStateException if the next method has not - * yet been called, or the remove method has already - * been called after the last call to the next - * method. - * @throws UnsupportedOperationException if remove is not supported - */ - public void remove() { - if (removeAllowed) { - if (removed || beforeFirst) { - throw new IllegalStateException(); - } else { - object = null; - removed = true; - } - } else { - throw new UnsupportedOperationException(); - } - } - - /** - * Reset the iterator to the start. - */ - public void reset() { - beforeFirst = true; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonListIterator.java deleted file mode 100644 index c2bb0aef47b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/SingletonListIterator.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.ResettableListIterator; - -/** - * SingletonIterator is an {@link ListIterator} over a single - * object instance. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Rodney Waldhoff - */ -public class SingletonListIterator implements ListIterator, ResettableListIterator { - - private boolean beforeFirst = true; - private boolean nextCalled = false; - private boolean removed = false; - private Object object; - - /** - * Constructs a new SingletonListIterator. - * - * @param object the single object to return from the iterator - */ - public SingletonListIterator(Object object) { - super(); - this.object = object; - } - - /** - * Is another object available from the iterator? - *

                  - * This returns true if the single object hasn't been returned yet. - * - * @return true if the single object hasn't been returned yet - */ - public boolean hasNext() { - return beforeFirst && !removed; - } - - /** - * Is a previous object available from the iterator? - *

                  - * This returns true if the single object has been returned. - * - * @return true if the single object has been returned - */ - public boolean hasPrevious() { - return !beforeFirst && !removed; - } - - /** - * Returns the index of the element that would be returned by a subsequent - * call to next. - * - * @return 0 or 1 depending on current state. - */ - public int nextIndex() { - return (beforeFirst ? 0 : 1); - } - - /** - * Returns the index of the element that would be returned by a subsequent - * call to previous. A return value of -1 indicates that the iterator is currently at - * the start. - * - * @return 0 or -1 depending on current state. - */ - public int previousIndex() { - return (beforeFirst ? -1 : 0); - } - - /** - * Get the next object from the iterator. - *

                  - * This returns the single object if it hasn't been returned yet. - * - * @return the single object - * @throws NoSuchElementException if the single object has already - * been returned - */ - public Object next() { - if (!beforeFirst || removed) { - throw new NoSuchElementException(); - } - beforeFirst = false; - nextCalled = true; - return object; - } - - /** - * Get the previous object from the iterator. - *

                  - * This returns the single object if it has been returned. - * - * @return the single object - * @throws NoSuchElementException if the single object has not already - * been returned - */ - public Object previous() { - if (beforeFirst || removed) { - throw new NoSuchElementException(); - } - beforeFirst = true; - return object; - } - - /** - * Remove the object from this iterator. - * @throws IllegalStateException if the next or previous - * method has not yet been called, or the remove method - * has already been called after the last call to next - * or previous. - */ - public void remove() { - if(!nextCalled || removed) { - throw new IllegalStateException(); - } else { - object = null; - removed = true; - } - } - - /** - * Add always throws {@link UnsupportedOperationException}. - * - * @throws UnsupportedOperationException always - */ - public void add(Object obj) { - throw new UnsupportedOperationException("add() is not supported by this iterator"); - } - - /** - * Set sets the value of the singleton. - * - * @param obj the object to set - * @throws IllegalStateException if next has not been called - * or the object has been removed - */ - public void set(Object obj) { - if (!nextCalled || removed) { - throw new IllegalStateException(); - } - this.object = obj; - } - - /** - * Reset the iterator back to the start. - */ - public void reset() { - beforeFirst = true; - nextCalled = false; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/TransformIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/TransformIterator.java deleted file mode 100644 index 61e5c84073c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/TransformIterator.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; - -import org.apache.commons.collections.Transformer; - -/** - * Decorates an iterator such that each element returned is transformed. - * - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Stephen Colebourne - */ -public class TransformIterator implements Iterator { - - /** The iterator being used */ - private Iterator iterator; - /** The transformer being used */ - private Transformer transformer; - - //----------------------------------------------------------------------- - /** - * Constructs a new TransformIterator that will not function - * until the {@link #setIterator(Iterator) setIterator} method is - * invoked. - */ - public TransformIterator() { - super(); - } - - /** - * Constructs a new TransformIterator that won't transform - * elements from the given iterator. - * - * @param iterator the iterator to use - */ - public TransformIterator(Iterator iterator) { - super(); - this.iterator = iterator; - } - - /** - * Constructs a new TransformIterator that will use the - * given iterator and transformer. If the given transformer is null, - * then objects will not be transformed. - * - * @param iterator the iterator to use - * @param transformer the transformer to use - */ - public TransformIterator(Iterator iterator, Transformer transformer) { - super(); - this.iterator = iterator; - this.transformer = transformer; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - /** - * Gets the next object from the iteration, transforming it using the - * current transformer. If the transformer is null, no transformation - * occurs and the object from the iterator is returned directly. - * - * @return the next object - * @throws java.util.NoSuchElementException if there are no more elements - */ - public Object next() { - return transform(iterator.next()); - } - - public void remove() { - iterator.remove(); - } - - //----------------------------------------------------------------------- - /** - * Gets the iterator this iterator is using. - * - * @return the iterator. - */ - public Iterator getIterator() { - return iterator; - } - - /** - * Sets the iterator for this iterator to use. - * If iteration has started, this effectively resets the iterator. - * - * @param iterator the iterator to use - */ - public void setIterator(Iterator iterator) { - this.iterator = iterator; - } - - //----------------------------------------------------------------------- - /** - * Gets the transformer this iterator is using. - * - * @return the transformer. - */ - public Transformer getTransformer() { - return transformer; - } - - /** - * Sets the transformer this the iterator to use. - * A null transformer is a no-op transformer. - * - * @param transformer the transformer to use - */ - public void setTransformer(Transformer transformer) { - this.transformer = transformer; - } - - //----------------------------------------------------------------------- - /** - * Transforms the given object using the transformer. - * If the transformer is null, the original object is returned as-is. - * - * @param source the object to transform - * @return the transformed object - */ - protected Object transform(Object source) { - if (transformer != null) { - return transformer.transform(source); - } - return source; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UniqueFilterIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UniqueFilterIterator.java deleted file mode 100644 index a45f048f16a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UniqueFilterIterator.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; - -import org.apache.commons.collections.functors.UniquePredicate; - -/** - * A FilterIterator which only returns "unique" Objects. Internally, - * the Iterator maintains a Set of objects it has already encountered, - * and duplicate Objects are skipped. - * - * @since Commons Collections 2.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Morgan Delagrange - */ -public class UniqueFilterIterator extends FilterIterator { - - //------------------------------------------------------------------------- - - /** - * Constructs a new UniqueFilterIterator. - * - * @param iterator the iterator to use - */ - public UniqueFilterIterator( Iterator iterator ) { - super(iterator, UniquePredicate.getInstance()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableIterator.java deleted file mode 100644 index 08855c7d69e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableIterator.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.Iterator; - -import org.apache.commons.collections.Unmodifiable; - -/** - * Decorates an iterator such that it cannot be modified. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableIterator implements Iterator, Unmodifiable { - - /** The iterator being decorated */ - private Iterator iterator; - - //----------------------------------------------------------------------- - /** - * Decorates the specified iterator such that it cannot be modified. - *

                  - * If the iterator is already unmodifiable it is returned directly. - * - * @param iterator the iterator to decorate - * @throws IllegalArgumentException if the iterator is null - */ - public static Iterator decorate(Iterator iterator) { - if (iterator == null) { - throw new IllegalArgumentException("Iterator must not be null"); - } - if (iterator instanceof Unmodifiable) { - return iterator; - } - return new UnmodifiableIterator(iterator); - } - - //----------------------------------------------------------------------- - /** - * Constructor. - * - * @param iterator the iterator to decorate - */ - private UnmodifiableIterator(Iterator iterator) { - super(); - this.iterator = iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public void remove() { - throw new UnsupportedOperationException("remove() is not supported"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableListIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableListIterator.java deleted file mode 100644 index 5d2a3967f96..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableListIterator.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import java.util.ListIterator; - -import org.apache.commons.collections.Unmodifiable; - -/** - * Decorates a list iterator such that it cannot be modified. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableListIterator implements ListIterator, Unmodifiable { - - /** The iterator being decorated */ - private ListIterator iterator; - - //----------------------------------------------------------------------- - /** - * Decorates the specified iterator such that it cannot be modified. - * - * @param iterator the iterator to decorate - * @throws IllegalArgumentException if the iterator is null - */ - public static ListIterator decorate(ListIterator iterator) { - if (iterator == null) { - throw new IllegalArgumentException("ListIterator must not be null"); - } - if (iterator instanceof Unmodifiable) { - return iterator; - } - return new UnmodifiableListIterator(iterator); - } - - //----------------------------------------------------------------------- - /** - * Constructor. - * - * @param iterator the iterator to decorate - */ - private UnmodifiableListIterator(ListIterator iterator) { - super(); - this.iterator = iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public int nextIndex() { - return iterator.nextIndex(); - } - - public boolean hasPrevious() { - return iterator.hasPrevious(); - } - - public Object previous() { - return iterator.previous(); - } - - public int previousIndex() { - return iterator.previousIndex(); - } - - public void remove() { - throw new UnsupportedOperationException("remove() is not supported"); - } - - public void set(Object obj) { - throw new UnsupportedOperationException("set() is not supported"); - } - - public void add(Object obj) { - throw new UnsupportedOperationException("add() is not supported"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableMapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableMapIterator.java deleted file mode 100644 index a510f327ee0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableMapIterator.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.Unmodifiable; - -/** - * Decorates a map iterator such that it cannot be modified. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableMapIterator implements MapIterator, Unmodifiable { - - /** The iterator being decorated */ - private MapIterator iterator; - - //----------------------------------------------------------------------- - /** - * Decorates the specified iterator such that it cannot be modified. - * - * @param iterator the iterator to decorate - * @throws IllegalArgumentException if the iterator is null - */ - public static MapIterator decorate(MapIterator iterator) { - if (iterator == null) { - throw new IllegalArgumentException("MapIterator must not be null"); - } - if (iterator instanceof Unmodifiable) { - return iterator; - } - return new UnmodifiableMapIterator(iterator); - } - - //----------------------------------------------------------------------- - /** - * Constructor. - * - * @param iterator the iterator to decorate - */ - private UnmodifiableMapIterator(MapIterator iterator) { - super(); - this.iterator = iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public Object getKey() { - return iterator.getKey(); - } - - public Object getValue() { - return iterator.getValue(); - } - - public Object setValue(Object value) { - throw new UnsupportedOperationException("setValue() is not supported"); - } - - public void remove() { - throw new UnsupportedOperationException("remove() is not supported"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableOrderedMapIterator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableOrderedMapIterator.java deleted file mode 100644 index 77caf0123f7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/UnmodifiableOrderedMapIterator.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.iterators; - -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.Unmodifiable; - -/** - * Decorates an ordered map iterator such that it cannot be modified. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableOrderedMapIterator implements OrderedMapIterator, Unmodifiable { - - /** The iterator being decorated */ - private OrderedMapIterator iterator; - - //----------------------------------------------------------------------- - /** - * Decorates the specified iterator such that it cannot be modified. - * - * @param iterator the iterator to decorate - * @throws IllegalArgumentException if the iterator is null - */ - public static OrderedMapIterator decorate(OrderedMapIterator iterator) { - if (iterator == null) { - throw new IllegalArgumentException("OrderedMapIterator must not be null"); - } - if (iterator instanceof Unmodifiable) { - return iterator; - } - return new UnmodifiableOrderedMapIterator(iterator); - } - - //----------------------------------------------------------------------- - /** - * Constructor. - * - * @param iterator the iterator to decorate - */ - private UnmodifiableOrderedMapIterator(OrderedMapIterator iterator) { - super(); - this.iterator = iterator; - } - - //----------------------------------------------------------------------- - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - - public boolean hasPrevious() { - return iterator.hasPrevious(); - } - - public Object previous() { - return iterator.previous(); - } - - public Object getKey() { - return iterator.getKey(); - } - - public Object getValue() { - return iterator.getValue(); - } - - public Object setValue(Object value) { - throw new UnsupportedOperationException("setValue() is not supported"); - } - - public void remove() { - throw new UnsupportedOperationException("remove() is not supported"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/package.html deleted file mode 100644 index ff1b4f5de4e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/iterators/package.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -

                  -This package contains implementations of the -{@link java.util.Iterator Iterator} interface. -

                  -You may also consider using -{@link org.apache.commons.collections.IteratorUtils IteratorUtils}, -which is a single class that uses static methods to construct instances -of the classes in this package. - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractKeyValue.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractKeyValue.java deleted file mode 100644 index ba4e6f508e2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractKeyValue.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import org.apache.commons.collections.KeyValue; - -/** - * Abstract pair class to assist with creating KeyValue - * and {@link java.util.Map.Entry Map.Entry} implementations. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public abstract class AbstractKeyValue implements KeyValue { - - /** The key */ - protected Object key; - /** The value */ - protected Object value; - - /** - * Constructs a new pair with the specified key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - protected AbstractKeyValue(Object key, Object value) { - super(); - this.key = key; - this.value = value; - } - - /** - * Gets the key from the pair. - * - * @return the key - */ - public Object getKey() { - return key; - } - - /** - * Gets the value from the pair. - * - * @return the value - */ - public Object getValue() { - return value; - } - - /** - * Gets a debugging String view of the pair. - * - * @return a String view of the entry - */ - public String toString() { - return new StringBuffer() - .append(getKey()) - .append('=') - .append(getValue()) - .toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntry.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntry.java deleted file mode 100644 index 10c056a16c3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntry.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.util.Map; - -/** - * Abstract Pair class to assist with creating correct - * {@link java.util.Map.Entry Map.Entry} implementations. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public abstract class AbstractMapEntry extends AbstractKeyValue implements Map.Entry { - - /** - * Constructs a new entry with the given key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - protected AbstractMapEntry(Object key, Object value) { - super(key, value); - } - - // Map.Entry interface - //------------------------------------------------------------------------- - /** - * Sets the value stored in this Map.Entry. - *

                  - * This Map.Entry is not connected to a Map, so only the - * local data is changed. - * - * @param value the new value - * @return the previous value - */ - public Object setValue(Object value) { - Object answer = this.value; - this.value = value; - return answer; - } - - /** - * Compares this Map.Entry with another Map.Entry. - *

                  - * Implemented per API documentation of {@link java.util.Map.Entry#equals(Object)} - * - * @param obj the object to compare to - * @return true if equal key and value - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - return - (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) && - (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue())); - } - - /** - * Gets a hashCode compatible with the equals method. - *

                  - * Implemented per API documentation of {@link java.util.Map.Entry#hashCode()} - * - * @return a suitable hash code - */ - public int hashCode() { - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (getValue() == null ? 0 : getValue().hashCode()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.java deleted file mode 100644 index 2e8eb1beec0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/AbstractMapEntryDecorator.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.util.Map; - -import org.apache.commons.collections.KeyValue; - -/** - * Provides a base decorator that allows additional functionality to be - * added to a {@link java.util.Map.Entry Map.Entry}. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractMapEntryDecorator implements Map.Entry, KeyValue { - - /** The Map.Entry to decorate */ - protected final Map.Entry entry; - - /** - * Constructor that wraps (not copies). - * - * @param entry the Map.Entry to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractMapEntryDecorator(Map.Entry entry) { - if (entry == null) { - throw new IllegalArgumentException("Map Entry must not be null"); - } - this.entry = entry; - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected Map.Entry getMapEntry() { - return entry; - } - - //----------------------------------------------------------------------- - public Object getKey() { - return entry.getKey(); - } - - public Object getValue() { - return entry.getValue(); - } - - public Object setValue(Object object) { - return entry.setValue(object); - } - - public boolean equals(Object object) { - if (object == this) { - return true; - } - return entry.equals(object); - } - - public int hashCode() { - return entry.hashCode(); - } - - public String toString() { - return entry.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultKeyValue.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultKeyValue.java deleted file mode 100644 index 42bb6a4b7bf..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultKeyValue.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.util.Map; - -import org.apache.commons.collections.KeyValue; - -/** - * A mutable KeyValue pair that does not implement - * {@link java.util.Map.Entry Map.Entry}. - *

                  - * Note that a DefaultKeyValue instance may not contain - * itself as a key or value. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public class DefaultKeyValue extends AbstractKeyValue { - - /** - * Constructs a new pair with a null key and null value. - */ - public DefaultKeyValue() { - super(null, null); - } - - /** - * Constructs a new pair with the specified key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - public DefaultKeyValue(final Object key, final Object value) { - super(key, value); - } - - /** - * Constructs a new pair from the specified KeyValue. - * - * @param pair the pair to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultKeyValue(final KeyValue pair) { - super(pair.getKey(), pair.getValue()); - } - - /** - * Constructs a new pair from the specified Map.Entry. - * - * @param entry the entry to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultKeyValue(final Map.Entry entry) { - super(entry.getKey(), entry.getValue()); - } - - //----------------------------------------------------------------------- - /** - * Sets the key. - * - * @param key the new key - * @return the old key - * @throws IllegalArgumentException if key is this object - */ - public Object setKey(final Object key) { - if (key == this) { - throw new IllegalArgumentException("DefaultKeyValue may not contain itself as a key."); - } - - final Object old = this.key; - this.key = key; - return old; - } - - /** - * Sets the value. - * - * @return the old value of the value - * @param value the new value - * @throws IllegalArgumentException if value is this object - */ - public Object setValue(final Object value) { - if (value == this) { - throw new IllegalArgumentException("DefaultKeyValue may not contain itself as a value."); - } - - final Object old = this.value; - this.value = value; - return old; - } - - //----------------------------------------------------------------------- - /** - * Returns a new Map.Entry object with key and value from this pair. - * - * @return a MapEntry instance - */ - public Map.Entry toMapEntry() { - return new DefaultMapEntry(this); - } - - //----------------------------------------------------------------------- - /** - * Compares this Map.Entry with another Map.Entry. - *

                  - * Returns true if the compared object is also a DefaultKeyValue, - * and its key and value are equal to this object's key and value. - * - * @param obj the object to compare to - * @return true if equal key and value - */ - public boolean equals(final Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof DefaultKeyValue == false) { - return false; - } - - DefaultKeyValue other = (DefaultKeyValue) obj; - return - (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) && - (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue())); - } - - /** - * Gets a hashCode compatible with the equals method. - *

                  - * Implemented per API documentation of {@link java.util.Map.Entry#hashCode()}, - * however subclasses may override this. - * - * @return a suitable hash code - */ - public int hashCode() { - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (getValue() == null ? 0 : getValue().hashCode()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultMapEntry.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultMapEntry.java deleted file mode 100644 index e9b23409dc9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/DefaultMapEntry.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.util.Map; - -import org.apache.commons.collections.KeyValue; - -/** - * A restricted implementation of {@link java.util.Map.Entry} that prevents - * the Map.Entry contract from being broken. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public final class DefaultMapEntry extends AbstractMapEntry { - - /** - * Constructs a new entry with the specified key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - public DefaultMapEntry(final Object key, final Object value) { - super(key, value); - } - - /** - * Constructs a new entry from the specified KeyValue. - * - * @param pair the pair to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultMapEntry(final KeyValue pair) { - super(pair.getKey(), pair.getValue()); - } - - /** - * Constructs a new entry from the specified Map.Entry. - * - * @param entry the entry to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultMapEntry(final Map.Entry entry) { - super(entry.getKey(), entry.getValue()); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/MultiKey.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/MultiKey.java deleted file mode 100644 index 6958aa9f8c2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/MultiKey.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * A MultiKey allows multiple map keys to be merged together. - *

                  - * The purpose of this class is to avoid the need to write code to handle - * maps of maps. An example might be the need to lookup a filename by - * key and locale. The typical solution might be nested maps. This class - * can be used instead by creating an instance passing in the key and locale. - *

                  - * Example usage: - *

                  - * // populate map with data mapping key+locale to localizedText
                  - * Map map = new HashMap();
                  - * MultiKey multiKey = new MultiKey(key, locale);
                  - * map.put(multiKey, localizedText);
                  - *
                  - * // later retireve the localized text
                  - * MultiKey multiKey = new MultiKey(key, locale);
                  - * String localizedText = (String) map.get(multiKey);
                  - * 
                  - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Howard Lewis Ship - * @author Stephen Colebourne - */ -public class MultiKey implements Serializable { - // This class could implement List, but that would confuse it's purpose - - /** Serialisation version */ - private static final long serialVersionUID = 4465448607415788805L; - - /** The individual keys */ - private final Object[] keys; - /** The cached hashCode */ - private final int hashCode; - - /** - * Constructor taking two keys. - *

                  - * The keys should be immutable - * If they are not then they must not be changed after adding to the MultiKey. - * - * @param key1 the first key - * @param key2 the second key - */ - public MultiKey(Object key1, Object key2) { - this(new Object[] {key1, key2}, false); - } - - /** - * Constructor taking three keys. - *

                  - * The keys should be immutable - * If they are not then they must not be changed after adding to the MultiKey. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - */ - public MultiKey(Object key1, Object key2, Object key3) { - this(new Object[] {key1, key2, key3}, false); - } - - /** - * Constructor taking four keys. - *

                  - * The keys should be immutable - * If they are not then they must not be changed after adding to the MultiKey. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - */ - public MultiKey(Object key1, Object key2, Object key3, Object key4) { - this(new Object[] {key1, key2, key3, key4}, false); - } - - /** - * Constructor taking five keys. - *

                  - * The keys should be immutable - * If they are not then they must not be changed after adding to the MultiKey. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - */ - public MultiKey(Object key1, Object key2, Object key3, Object key4, Object key5) { - this(new Object[] {key1, key2, key3, key4, key5}, false); - } - - /** - * Constructor taking an array of keys which is cloned. - *

                  - * The keys should be immutable - * If they are not then they must not be changed after adding to the MultiKey. - *

                  - * This is equivalent to new MultiKey(keys, true). - * - * @param keys the array of keys, not null - * @throws IllegalArgumentException if the key array is null - */ - public MultiKey(Object[] keys) { - this(keys, true); - } - - /** - * Constructor taking an array of keys, optionally choosing whether to clone. - *

                  - * If the array is not cloned, then it must not be modified. - *

                  - * This method is public for performance reasons only, to avoid a clone. - * The hashcode is calculated once here in this method. - * Therefore, changing the array passed in would not change the hashcode but - * would change the equals method, which is a bug. - *

                  - * This is the only fully safe usage of this constructor, as the object array - * is never made available in a variable: - *

                  -     * new MultiKey(new Object[] {...}, false);
                  -     * 
                  - *

                  - * The keys should be immutable - * If they are not then they must not be changed after adding to the MultiKey. - * - * @param keys the array of keys, not null - * @param makeClone true to clone the array, false to assign it - * @throws IllegalArgumentException if the key array is null - * @since Commons Collections 3.1 - */ - public MultiKey(Object[] keys, boolean makeClone) { - super(); - if (keys == null) { - throw new IllegalArgumentException("The array of keys must not be null"); - } - if (makeClone) { - this.keys = (Object[]) keys.clone(); - } else { - this.keys = keys; - } - - int total = 0; - for (int i = 0; i < keys.length; i++) { - if (keys[i] != null) { - total ^= keys[i].hashCode(); - } - } - hashCode = total; - } - - //----------------------------------------------------------------------- - /** - * Gets a clone of the array of keys. - *

                  - * The keys should be immutable - * If they are not then they must not be changed. - * - * @return the individual keys - */ - public Object[] getKeys() { - return (Object[]) keys.clone(); - } - - /** - * Gets the key at the specified index. - *

                  - * The key should be immutable. - * If it is not then it must not be changed. - * - * @param index the index to retrieve - * @return the key at the index - * @throws IndexOutOfBoundsException if the index is invalid - * @since Commons Collections 3.1 - */ - public Object getKey(int index) { - return keys[index]; - } - - /** - * Gets the size of the list of keys. - * - * @return the size of the list of keys - * @since Commons Collections 3.1 - */ - public int size() { - return keys.length; - } - - //----------------------------------------------------------------------- - /** - * Compares this object to another. - *

                  - * To be equal, the other object must be a MultiKey with the - * same number of keys which are also equal. - * - * @param other the other object to compare to - * @return true if equal - */ - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (other instanceof MultiKey) { - MultiKey otherMulti = (MultiKey) other; - return Arrays.equals(keys, otherMulti.keys); - } - return false; - } - - /** - * Gets the combined hash code that is computed from all the keys. - *

                  - * This value is computed once and then cached, so elements should not - * change their hash codes once created (note that this is the same - * constraint that would be used if the individual keys elements were - * themselves {@link java.util.Map Map} keys. - * - * @return the hash code - */ - public int hashCode() { - return hashCode; - } - - /** - * Gets a debugging string version of the key. - * - * @return a debugging string - */ - public String toString() { - return "MultiKey" + Arrays.asList(keys).toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/TiedMapEntry.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/TiedMapEntry.java deleted file mode 100644 index 2f99cbfe0bb..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/TiedMapEntry.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.io.Serializable; -import java.util.Map; - -import org.apache.commons.collections.KeyValue; - -/** - * A {@link java.util.Map.Entry Map.Entry} tied to a map underneath. - *

                  - * This can be used to enable a map entry to make changes on the underlying - * map, however this will probably mess up any iterators. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TiedMapEntry implements Map.Entry, KeyValue, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = -8453869361373831205L; - - /** The map underlying the entry/iterator */ - private final Map map; - /** The key */ - private final Object key; - - /** - * Constructs a new entry with the given Map and key. - * - * @param map the map - * @param key the key - */ - public TiedMapEntry(Map map, Object key) { - super(); - this.map = map; - this.key = key; - } - - // Map.Entry interface - //------------------------------------------------------------------------- - /** - * Gets the key of this entry - * - * @return the key - */ - public Object getKey() { - return key; - } - - /** - * Gets the value of this entry direct from the map. - * - * @return the value - */ - public Object getValue() { - return map.get(key); - } - - /** - * Sets the value associated with the key direct onto the map. - * - * @param value the new value - * @return the old value - * @throws IllegalArgumentException if the value is set to this map entry - */ - public Object setValue(Object value) { - if (value == this) { - throw new IllegalArgumentException("Cannot set value to this map entry"); - } - return map.put(key, value); - } - - /** - * Compares this Map.Entry with another Map.Entry. - *

                  - * Implemented per API documentation of {@link java.util.Map.Entry#equals(Object)} - * - * @param obj the object to compare to - * @return true if equal key and value - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - Object value = getValue(); - return - (key == null ? other.getKey() == null : key.equals(other.getKey())) && - (value == null ? other.getValue() == null : value.equals(other.getValue())); - } - - /** - * Gets a hashCode compatible with the equals method. - *

                  - * Implemented per API documentation of {@link java.util.Map.Entry#hashCode()} - * - * @return a suitable hash code - */ - public int hashCode() { - Object value = getValue(); - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (value == null ? 0 : value.hashCode()); - } - - /** - * Gets a string version of the entry. - * - * @return entry as a string - */ - public String toString() { - return getKey() + "=" + getValue(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java deleted file mode 100644 index 6f5ed5f6bd0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/UnmodifiableMapEntry.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.keyvalue; - -import java.util.Map; - -import org.apache.commons.collections.KeyValue; -import org.apache.commons.collections.Unmodifiable; - -/** - * A {@link java.util.Map.Entry Map.Entry} that throws - * UnsupportedOperationException when setValue is called. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableMapEntry extends AbstractMapEntry implements Unmodifiable { - - /** - * Constructs a new entry with the specified key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - public UnmodifiableMapEntry(final Object key, final Object value) { - super(key, value); - } - - /** - * Constructs a new entry from the specified KeyValue. - * - * @param pair the pair to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public UnmodifiableMapEntry(final KeyValue pair) { - super(pair.getKey(), pair.getValue()); - } - - /** - * Constructs a new entry from the specified Map.Entry. - * - * @param entry the entry to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public UnmodifiableMapEntry(final Map.Entry entry) { - super(entry.getKey(), entry.getValue()); - } - - /** - * Throws UnsupportedOperationException. - * - * @param value the new value - * @return the previous value - * @throws UnsupportedOperationException always - */ - public Object setValue(Object value) { - throw new UnsupportedOperationException("setValue() is not supported"); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/package.html deleted file mode 100644 index 8a133316536..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/keyvalue/package.html +++ /dev/null @@ -1,30 +0,0 @@ - - - -

                  -This package contains implementations of collection and map related key/value classes. -These are usually used in maps, however they can be used as data holders in any collection. -

                  -The following key/value designs are included: -

                    -
                  • Map Entry - various map entry implementations -
                  • KeyValue - a key and value pair, without map entry semantics -
                  • MultiKey - a holder of multiple keys tied together -
                  - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractLinkedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractLinkedList.java deleted file mode 100644 index 93715f68a54..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractLinkedList.java +++ /dev/null @@ -1,1012 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.Array; -import java.util.AbstractList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.OrderedIterator; - -/** - * An abstract implementation of a linked list which provides numerous points for - * subclasses to override. - *

                  - * Overridable methods are provided to change the storage node and to change how - * nodes are added to and removed. Hopefully, all you need for unusual subclasses - * is here. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rich Dougherty - * @author Phil Steitz - * @author Stephen Colebourne - */ -public abstract class AbstractLinkedList implements List { - - /* - * Implementation notes: - * - a standard circular doubly-linked list - * - a marker node is stored to mark the start and the end of the list - * - node creation and removal always occurs through createNode() and - * removeNode(). - * - a modification count is kept, with the same semantics as - * {@link java.util.LinkedList}. - * - respects {@link AbstractList#modCount} - */ - - /** - * A {@link Node} which indicates the start and end of the list and does not - * hold a value. The value of next is the first item in the - * list. The value of of previous is the last item in the list. - */ - protected transient Node header; - /** The size of the list */ - protected transient int size; - /** Modification count for iterators */ - protected transient int modCount; - - /** - * Constructor that does nothing intended for deserialization. - *

                  - * If this constructor is used by a serializable subclass then the init() - * method must be called. - */ - protected AbstractLinkedList() { - super(); - } - - /** - * Constructs a list copying data from the specified collection. - * - * @param coll the collection to copy - */ - protected AbstractLinkedList(Collection coll) { - super(); - init(); - addAll(coll); - } - - /** - * The equivalent of a default constructor, broken out so it can be called - * by any constructor and by readObject. - * Subclasses which override this method should make sure they call super, - * so the list is initialised properly. - */ - protected void init() { - header = createHeaderNode(); - } - - //----------------------------------------------------------------------- - public int size() { - return size; - } - - public boolean isEmpty() { - return (size() == 0); - } - - public Object get(int index) { - Node node = getNode(index, false); - return node.getValue(); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return listIterator(); - } - - public ListIterator listIterator() { - return new LinkedListIterator(this, 0); - } - - public ListIterator listIterator(int fromIndex) { - return new LinkedListIterator(this, fromIndex); - } - - //----------------------------------------------------------------------- - public int indexOf(Object value) { - int i = 0; - for (Node node = header.next; node != header; node = node.next) { - if (isEqualValue(node.getValue(), value)) { - return i; - } - i++; - } - return -1; - } - - public int lastIndexOf(Object value) { - int i = size - 1; - for (Node node = header.previous; node != header; node = node.previous) { - if (isEqualValue(node.getValue(), value)) { - return i; - } - i--; - } - return -1; - } - - public boolean contains(Object value) { - return indexOf(value) != -1; - } - - public boolean containsAll(Collection coll) { - Iterator it = coll.iterator(); - while (it.hasNext()) { - if (contains(it.next()) == false) { - return false; - } - } - return true; - } - - //----------------------------------------------------------------------- - public Object[] toArray() { - return toArray(new Object[size]); - } - - public Object[] toArray(Object[] array) { - // Extend the array if needed - if (array.length < size) { - Class componentType = array.getClass().getComponentType(); - array = (Object[]) Array.newInstance(componentType, size); - } - // Copy the values into the array - int i = 0; - for (Node node = header.next; node != header; node = node.next, i++) { - array[i] = node.getValue(); - } - // Set the value after the last value to null - if (array.length > size) { - array[size] = null; - } - return array; - } - - /** - * Gets a sublist of the main list. - * - * @param fromIndexInclusive the index to start from - * @param toIndexExclusive the index to end at - * @return the new sublist - */ - public List subList(int fromIndexInclusive, int toIndexExclusive) { - return new LinkedSubList(this, fromIndexInclusive, toIndexExclusive); - } - - //----------------------------------------------------------------------- - public boolean add(Object value) { - addLast(value); - return true; - } - - public void add(int index, Object value) { - Node node = getNode(index, true); - addNodeBefore(node, value); - } - - public boolean addAll(Collection coll) { - return addAll(size, coll); - } - - public boolean addAll(int index, Collection coll) { - Node node = getNode(index, true); - for (Iterator itr = coll.iterator(); itr.hasNext();) { - Object value = itr.next(); - addNodeBefore(node, value); - } - return true; - } - - //----------------------------------------------------------------------- - public Object remove(int index) { - Node node = getNode(index, false); - Object oldValue = node.getValue(); - removeNode(node); - return oldValue; - } - - public boolean remove(Object value) { - for (Node node = header.next; node != header; node = node.next) { - if (isEqualValue(node.getValue(), value)) { - removeNode(node); - return true; - } - } - return false; - } - - public boolean removeAll(Collection coll) { - boolean modified = false; - Iterator it = iterator(); - while (it.hasNext()) { - if (coll.contains(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - } - - //----------------------------------------------------------------------- - public boolean retainAll(Collection coll) { - boolean modified = false; - Iterator it = iterator(); - while (it.hasNext()) { - if (coll.contains(it.next()) == false) { - it.remove(); - modified = true; - } - } - return modified; - } - - public Object set(int index, Object value) { - Node node = getNode(index, false); - Object oldValue = node.getValue(); - updateNode(node, value); - return oldValue; - } - - public void clear() { - removeAllNodes(); - } - - //----------------------------------------------------------------------- - public Object getFirst() { - Node node = header.next; - if (node == header) { - throw new NoSuchElementException(); - } - return node.getValue(); - } - - public Object getLast() { - Node node = header.previous; - if (node == header) { - throw new NoSuchElementException(); - } - return node.getValue(); - } - - public boolean addFirst(Object o) { - addNodeAfter(header, o); - return true; - } - - public boolean addLast(Object o) { - addNodeBefore(header, o); - return true; - } - - public Object removeFirst() { - Node node = header.next; - if (node == header) { - throw new NoSuchElementException(); - } - Object oldValue = node.getValue(); - removeNode(node); - return oldValue; - } - - public Object removeLast() { - Node node = header.previous; - if (node == header) { - throw new NoSuchElementException(); - } - Object oldValue = node.getValue(); - removeNode(node); - return oldValue; - } - - //----------------------------------------------------------------------- - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof List == false) { - return false; - } - List other = (List) obj; - if (other.size() != size()) { - return false; - } - ListIterator it1 = listIterator(); - ListIterator it2 = other.listIterator(); - while (it1.hasNext() && it2.hasNext()) { - Object o1 = it1.next(); - Object o2 = it2.next(); - if (!(o1 == null ? o2 == null : o1.equals(o2))) - return false; - } - return !(it1.hasNext() || it2.hasNext()); - } - - public int hashCode() { - int hashCode = 1; - Iterator it = iterator(); - while (it.hasNext()) { - Object obj = it.next(); - hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode()); - } - return hashCode; - } - - public String toString() { - if (size() == 0) { - return "[]"; - } - StringBuffer buf = new StringBuffer(16 * size()); - buf.append("["); - - Iterator it = iterator(); - boolean hasNext = it.hasNext(); - while (hasNext) { - Object value = it.next(); - buf.append(value == this ? "(this Collection)" : value); - hasNext = it.hasNext(); - if (hasNext) { - buf.append(", "); - } - } - buf.append("]"); - return buf.toString(); - } - - //----------------------------------------------------------------------- - /** - * Compares two values for equals. - * This implementation uses the equals method. - * Subclasses can override this to match differently. - * - * @param value1 the first value to compare, may be null - * @param value2 the second value to compare, may be null - * @return true if equal - */ - protected boolean isEqualValue(Object value1, Object value2) { - return (value1 == value2 || (value1 == null ? false : value1.equals(value2))); - } - - /** - * Updates the node with a new value. - * This implementation sets the value on the node. - * Subclasses can override this to record the change. - * - * @param node node to update - * @param value new value of the node - */ - protected void updateNode(Node node, Object value) { - node.setValue(value); - } - - /** - * Creates a new node with previous, next and element all set to null. - * This implementation creates a new empty Node. - * Subclasses can override this to create a different class. - * - * @return newly created node - */ - protected Node createHeaderNode() { - return new Node(); - } - - /** - * Creates a new node with the specified properties. - * This implementation creates a new Node with data. - * Subclasses can override this to create a different class. - * - * @param value value of the new node - */ - protected Node createNode(Object value) { - return new Node(value); - } - - /** - * Creates a new node with the specified object as its - * value and inserts it before node. - *

                  - * This implementation uses {@link #createNode(Object)} and - * {@link #addNode(AbstractLinkedList.Node,AbstractLinkedList.Node)}. - * - * @param node node to insert before - * @param value value of the newly added node - * @throws NullPointerException if node is null - */ - protected void addNodeBefore(Node node, Object value) { - Node newNode = createNode(value); - addNode(newNode, node); - } - - /** - * Creates a new node with the specified object as its - * value and inserts it after node. - *

                  - * This implementation uses {@link #createNode(Object)} and - * {@link #addNode(AbstractLinkedList.Node,AbstractLinkedList.Node)}. - * - * @param node node to insert after - * @param value value of the newly added node - * @throws NullPointerException if node is null - */ - protected void addNodeAfter(Node node, Object value) { - Node newNode = createNode(value); - addNode(newNode, node.next); - } - - /** - * Inserts a new node into the list. - * - * @param nodeToInsert new node to insert - * @param insertBeforeNode node to insert before - * @throws NullPointerException if either node is null - */ - protected void addNode(Node nodeToInsert, Node insertBeforeNode) { - nodeToInsert.next = insertBeforeNode; - nodeToInsert.previous = insertBeforeNode.previous; - insertBeforeNode.previous.next = nodeToInsert; - insertBeforeNode.previous = nodeToInsert; - size++; - modCount++; - } - - /** - * Removes the specified node from the list. - * - * @param node the node to remove - * @throws NullPointerException if node is null - */ - protected void removeNode(Node node) { - node.previous.next = node.next; - node.next.previous = node.previous; - size--; - modCount++; - } - - /** - * Removes all nodes by resetting the circular list marker. - */ - protected void removeAllNodes() { - header.next = header; - header.previous = header; - size = 0; - modCount++; - } - - /** - * Gets the node at a particular index. - * - * @param index the index, starting from 0 - * @param endMarkerAllowed whether or not the end marker can be returned if - * startIndex is set to the list's size - * @throws IndexOutOfBoundsException if the index is less than 0; equal to - * the size of the list and endMakerAllowed is false; or greater than the - * size of the list - */ - protected Node getNode(int index, boolean endMarkerAllowed) throws IndexOutOfBoundsException { - // Check the index is within the bounds - if (index < 0) { - throw new IndexOutOfBoundsException("Couldn't get the node: " + - "index (" + index + ") less than zero."); - } - if (!endMarkerAllowed && index == size) { - throw new IndexOutOfBoundsException("Couldn't get the node: " + - "index (" + index + ") is the size of the list."); - } - if (index > size) { - throw new IndexOutOfBoundsException("Couldn't get the node: " + - "index (" + index + ") greater than the size of the " + - "list (" + size + ")."); - } - // Search the list and get the node - Node node; - if (index < (size / 2)) { - // Search forwards - node = header.next; - for (int currentIndex = 0; currentIndex < index; currentIndex++) { - node = node.next; - } - } else { - // Search backwards - node = header; - for (int currentIndex = size; currentIndex > index; currentIndex--) { - node = node.previous; - } - } - return node; - } - - //----------------------------------------------------------------------- - /** - * Creates an iterator for the sublist. - * - * @param subList the sublist to get an iterator for - */ - protected Iterator createSubListIterator(LinkedSubList subList) { - return createSubListListIterator(subList, 0); - } - - /** - * Creates a list iterator for the sublist. - * - * @param subList the sublist to get an iterator for - * @param fromIndex the index to start from, relative to the sublist - */ - protected ListIterator createSubListListIterator(LinkedSubList subList, int fromIndex) { - return new LinkedSubListIterator(subList, fromIndex); - } - - //----------------------------------------------------------------------- - /** - * Serializes the data held in this object to the stream specified. - *

                  - * The first serializable subclass must call this method from - * writeObject. - */ - protected void doWriteObject(ObjectOutputStream outputStream) throws IOException { - // Write the size so we know how many nodes to read back - outputStream.writeInt(size()); - for (Iterator itr = iterator(); itr.hasNext();) { - outputStream.writeObject(itr.next()); - } - } - - /** - * Deserializes the data held in this object to the stream specified. - *

                  - * The first serializable subclass must call this method from - * readObject. - */ - protected void doReadObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException { - init(); - int size = inputStream.readInt(); - for (int i = 0; i < size; i++) { - add(inputStream.readObject()); - } - } - - //----------------------------------------------------------------------- - /** - * A node within the linked list. - *

                  - * From Commons Collections 3.1, all access to the value property - * is via the methods on this class. - */ - protected static class Node { - - /** A pointer to the node before this node */ - protected Node previous; - /** A pointer to the node after this node */ - protected Node next; - /** The object contained within this node */ - protected Object value; - - /** - * Constructs a new header node. - */ - protected Node() { - super(); - previous = this; - next = this; - } - - /** - * Constructs a new node. - * - * @param value the value to store - */ - protected Node(Object value) { - super(); - this.value = value; - } - - /** - * Constructs a new node. - * - * @param previous the previous node in the list - * @param next the next node in the list - * @param value the value to store - */ - protected Node(Node previous, Node next, Object value) { - super(); - this.previous = previous; - this.next = next; - this.value = value; - } - - /** - * Gets the value of the node. - * - * @return the value - * @since Commons Collections 3.1 - */ - protected Object getValue() { - return value; - } - - /** - * Sets the value of the node. - * - * @param value the value - * @since Commons Collections 3.1 - */ - protected void setValue(Object value) { - this.value = value; - } - - /** - * Gets the previous node. - * - * @return the previous node - * @since Commons Collections 3.1 - */ - protected Node getPreviousNode() { - return previous; - } - - /** - * Sets the previous node. - * - * @param previous the previous node - * @since Commons Collections 3.1 - */ - protected void setPreviousNode(Node previous) { - this.previous = previous; - } - - /** - * Gets the next node. - * - * @return the next node - * @since Commons Collections 3.1 - */ - protected Node getNextNode() { - return next; - } - - /** - * Sets the next node. - * - * @param next the next node - * @since Commons Collections 3.1 - */ - protected void setNextNode(Node next) { - this.next = next; - } - } - - //----------------------------------------------------------------------- - /** - * A list iterator over the linked list. - */ - protected static class LinkedListIterator implements ListIterator, OrderedIterator { - - /** The parent list */ - protected final AbstractLinkedList parent; - - /** - * The node that will be returned by {@link #next()}. If this is equal - * to {@link AbstractLinkedList#header} then there are no more values to return. - */ - protected Node next; - - /** - * The index of {@link #next}. - */ - protected int nextIndex; - - /** - * The last node that was returned by {@link #next()} or {@link - * #previous()}. Set to null if {@link #next()} or {@link - * #previous()} haven't been called, or if the node has been removed - * with {@link #remove()} or a new node added with {@link #add(Object)}. - * Should be accessed through {@link #getLastNodeReturned()} to enforce - * this behaviour. - */ - protected Node current; - - /** - * The modification count that the list is expected to have. If the list - * doesn't have this count, then a - * {@link java.util.ConcurrentModificationException} may be thrown by - * the operations. - */ - protected int expectedModCount; - - /** - * Create a ListIterator for a list. - * - * @param parent the parent list - * @param fromIndex the index to start at - */ - protected LinkedListIterator(AbstractLinkedList parent, int fromIndex) throws IndexOutOfBoundsException { - super(); - this.parent = parent; - this.expectedModCount = parent.modCount; - this.next = parent.getNode(fromIndex, true); - this.nextIndex = fromIndex; - } - - /** - * Checks the modification count of the list is the value that this - * object expects. - * - * @throws ConcurrentModificationException If the list's modification - * count isn't the value that was expected. - */ - protected void checkModCount() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - - /** - * Gets the last node returned. - * - * @throws IllegalStateException If {@link #next()} or - * {@link #previous()} haven't been called, or if the node has been removed - * with {@link #remove()} or a new node added with {@link #add(Object)}. - */ - protected Node getLastNodeReturned() throws IllegalStateException { - if (current == null) { - throw new IllegalStateException(); - } - return current; - } - - public boolean hasNext() { - return next != parent.header; - } - - public Object next() { - checkModCount(); - if (!hasNext()) { - throw new NoSuchElementException("No element at index " + nextIndex + "."); - } - Object value = next.getValue(); - current = next; - next = next.next; - nextIndex++; - return value; - } - - public boolean hasPrevious() { - return next.previous != parent.header; - } - - public Object previous() { - checkModCount(); - if (!hasPrevious()) { - throw new NoSuchElementException("Already at start of list."); - } - next = next.previous; - Object value = next.getValue(); - current = next; - nextIndex--; - return value; - } - - public int nextIndex() { - return nextIndex; - } - - public int previousIndex() { - // not normally overridden, as relative to nextIndex() - return nextIndex() - 1; - } - - public void remove() { - checkModCount(); - if (current == next) { - // remove() following previous() - next = next.next; - parent.removeNode(getLastNodeReturned()); - } else { - // remove() following next() - parent.removeNode(getLastNodeReturned()); - nextIndex--; - } - current = null; - expectedModCount++; - } - - public void set(Object obj) { - checkModCount(); - getLastNodeReturned().setValue(obj); - } - - public void add(Object obj) { - checkModCount(); - parent.addNodeBefore(next, obj); - current = null; - nextIndex++; - expectedModCount++; - } - - } - - //----------------------------------------------------------------------- - /** - * A list iterator over the linked sub list. - */ - protected static class LinkedSubListIterator extends LinkedListIterator { - - /** The parent list */ - protected final LinkedSubList sub; - - protected LinkedSubListIterator(LinkedSubList sub, int startIndex) { - super(sub.parent, startIndex + sub.offset); - this.sub = sub; - } - - public boolean hasNext() { - return (nextIndex() < sub.size); - } - - public boolean hasPrevious() { - return (previousIndex() >= 0); - } - - public int nextIndex() { - return (super.nextIndex() - sub.offset); - } - - public void add(Object obj) { - super.add(obj); - sub.expectedModCount = parent.modCount; - sub.size++; - } - - public void remove() { - super.remove(); - sub.expectedModCount = parent.modCount; - sub.size--; - } - } - - //----------------------------------------------------------------------- - /** - * The sublist implementation for AbstractLinkedList. - */ - protected static class LinkedSubList extends AbstractList { - /** The main list */ - AbstractLinkedList parent; - /** Offset from the main list */ - int offset; - /** Sublist size */ - int size; - /** Sublist modCount */ - int expectedModCount; - - protected LinkedSubList(AbstractLinkedList parent, int fromIndex, int toIndex) { - if (fromIndex < 0) { - throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); - } - if (toIndex > parent.size()) { - throw new IndexOutOfBoundsException("toIndex = " + toIndex); - } - if (fromIndex > toIndex) { - throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); - } - this.parent = parent; - this.offset = fromIndex; - this.size = toIndex - fromIndex; - this.expectedModCount = parent.modCount; - } - - public int size() { - checkModCount(); - return size; - } - - public Object get(int index) { - rangeCheck(index, size); - checkModCount(); - return parent.get(index + offset); - } - - public void add(int index, Object obj) { - rangeCheck(index, size + 1); - checkModCount(); - parent.add(index + offset, obj); - expectedModCount = parent.modCount; - size++; - LinkedSubList.this.modCount++; - } - - public Object remove(int index) { - rangeCheck(index, size); - checkModCount(); - Object result = parent.remove(index + offset); - expectedModCount = parent.modCount; - size--; - LinkedSubList.this.modCount++; - return result; - } - - public boolean addAll(Collection coll) { - return addAll(size, coll); - } - - public boolean addAll(int index, Collection coll) { - rangeCheck(index, size + 1); - int cSize = coll.size(); - if (cSize == 0) { - return false; - } - - checkModCount(); - parent.addAll(offset + index, coll); - expectedModCount = parent.modCount; - size += cSize; - LinkedSubList.this.modCount++; - return true; - } - - public Object set(int index, Object obj) { - rangeCheck(index, size); - checkModCount(); - return parent.set(index + offset, obj); - } - - public void clear() { - checkModCount(); - Iterator it = iterator(); - while (it.hasNext()) { - it.next(); - it.remove(); - } - } - - public Iterator iterator() { - checkModCount(); - return parent.createSubListIterator(this); - } - - public ListIterator listIterator(final int index) { - rangeCheck(index, size + 1); - checkModCount(); - return parent.createSubListListIterator(this, index); - } - - public List subList(int fromIndexInclusive, int toIndexExclusive) { - return new LinkedSubList(parent, fromIndexInclusive + offset, toIndexExclusive + offset); - } - - protected void rangeCheck(int index, int beyond) { - if (index < 0 || index >= beyond) { - throw new IndexOutOfBoundsException("Index '" + index + "' out of bounds for size '" + size + "'"); - } - } - - protected void checkModCount() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractListDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractListDecorator.java deleted file mode 100644 index 28094331057..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractListDecorator.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.Collection; -import java.util.List; -import java.util.ListIterator; - -import org.apache.commons.collections.collection.AbstractCollectionDecorator; - -/** - * Decorates another List to provide additional behaviour. - *

                  - * Methods are forwarded directly to the decorated list. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractListDecorator extends AbstractCollectionDecorator implements List { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractListDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected AbstractListDecorator(List list) { - super(list); - } - - /** - * Gets the list being decorated. - * - * @return the decorated list - */ - protected List getList() { - return (List) getCollection(); - } - - //----------------------------------------------------------------------- - public void add(int index, Object object) { - getList().add(index, object); - } - - public boolean addAll(int index, Collection coll) { - return getList().addAll(index, coll); - } - - public Object get(int index) { - return getList().get(index); - } - - public int indexOf(Object object) { - return getList().indexOf(object); - } - - public int lastIndexOf(Object object) { - return getList().lastIndexOf(object); - } - - public ListIterator listIterator() { - return getList().listIterator(); - } - - public ListIterator listIterator(int index) { - return getList().listIterator(index); - } - - public Object remove(int index) { - return getList().remove(index); - } - - public Object set(int index, Object object) { - return getList().set(index, object); - } - - public List subList(int fromIndex, int toIndex) { - return getList().subList(fromIndex, toIndex); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractSerializableListDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractSerializableListDecorator.java deleted file mode 100644 index ba3f587e9ad..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/AbstractSerializableListDecorator.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.List; - -/** - * Serializable subclass of AbstractListDecorator. - * - * @author Stephen Colebourne - * @since Commons Collections 3.1 - */ -public abstract class AbstractSerializableListDecorator - extends AbstractListDecorator - implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 2684959196747496299L; - - /** - * Constructor. - */ - protected AbstractSerializableListDecorator(List list) { - super(list); - } - - //----------------------------------------------------------------------- - /** - * Write the list out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the list in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/CursorableLinkedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/CursorableLinkedList.java deleted file mode 100644 index 5f63bacd967..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/CursorableLinkedList.java +++ /dev/null @@ -1,605 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -/** - * A List implementation with a ListIterator that - * allows concurrent modifications to the underlying list. - *

                  - * This implementation supports all of the optional {@link List} operations. - * It extends AbstractLinkedList and thus provides the - * stack/queue/dequeue operations available in {@link java.util.LinkedList}. - *

                  - * The main feature of this class is the ability to modify the list and the - * iterator at the same time. Both the {@link #listIterator()} and {@link #cursor()} - * methods provides access to a Cursor instance which extends - * ListIterator. The cursor allows changes to the list concurrent - * with changes to the iterator. Note that the {@link #iterator()} method and - * sublists do not provide this cursor behaviour. - *

                  - * The Cursor class is provided partly for backwards compatibility - * and partly because it allows the cursor to be directly closed. Closing the - * cursor is optional because references are held via a WeakReference. - * For most purposes, simply modify the iterator and list at will, and then let - * the garbage collector to the rest. - *

                  - * Note that this implementation is not synchronized. - * - * @see java.util.LinkedList - * @since Commons Collections 1.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Rodney Waldhoff - * @author Janek Bogucki - * @author Simon Kitching - * @author Stephen Colebourne - */ -public class CursorableLinkedList extends AbstractLinkedList implements Serializable { - - /** Ensure serialization compatibility */ - private static final long serialVersionUID = 8836393098519411393L; - - /** A list of the cursor currently open on this list */ - protected transient List cursors = new ArrayList(); - - //----------------------------------------------------------------------- - /** - * Constructor that creates. - */ - public CursorableLinkedList() { - super(); - init(); // must call init() as use super(); - } - - /** - * Constructor that copies the specified collection - * - * @param coll the collection to copy - */ - public CursorableLinkedList(Collection coll) { - super(coll); - } - - /** - * The equivalent of a default constructor called - * by any constructor and by readObject. - */ - protected void init() { - super.init(); - cursors = new ArrayList(); - } - - //----------------------------------------------------------------------- - /** - * Returns an iterator that does not support concurrent modification. - *

                  - * If the underlying list is modified while iterating using this iterator - * a ConcurrentModificationException will occur. - * The cursor behaviour is available via {@link #listIterator()}. - * - * @return a new iterator that does not support concurrent modification - */ - public Iterator iterator() { - return super.listIterator(0); - } - - /** - * Returns a cursor iterator that allows changes to the underlying list in parallel. - *

                  - * The cursor enables iteration and list changes to occur in any order without - * invalidating the iterator (from one thread). When elements are added to the - * list, an event is fired to all active cursors enabling them to adjust to the - * change in the list. - *

                  - * When the "current" (i.e., last returned by {@link ListIterator#next} - * or {@link ListIterator#previous}) element of the list is removed, - * the cursor automatically adjusts to the change (invalidating the - * last returned value such that it cannot be removed). - * - * @return a new cursor iterator - */ - public ListIterator listIterator() { - return cursor(0); - } - - /** - * Returns a cursor iterator that allows changes to the underlying list in parallel. - *

                  - * The cursor enables iteration and list changes to occur in any order without - * invalidating the iterator (from one thread). When elements are added to the - * list, an event is fired to all active cursors enabling them to adjust to the - * change in the list. - *

                  - * When the "current" (i.e., last returned by {@link ListIterator#next} - * or {@link ListIterator#previous}) element of the list is removed, - * the cursor automatically adjusts to the change (invalidating the - * last returned value such that it cannot be removed). - * - * @param fromIndex the index to start from - * @return a new cursor iterator - */ - public ListIterator listIterator(int fromIndex) { - return cursor(fromIndex); - } - - /** - * Returns a {@link Cursor} for iterating through the elements of this list. - *

                  - * A Cursor is a ListIterator with an additional - * close() method. Calling this method immediately discards the - * references to the cursor. If it is not called, then the garbage collector - * will still remove the reference as it is held via a WeakReference. - *

                  - * The cursor enables iteration and list changes to occur in any order without - * invalidating the iterator (from one thread). When elements are added to the - * list, an event is fired to all active cursors enabling them to adjust to the - * change in the list. - *

                  - * When the "current" (i.e., last returned by {@link ListIterator#next} - * or {@link ListIterator#previous}) element of the list is removed, - * the cursor automatically adjusts to the change (invalidating the - * last returned value such that it cannot be removed). - *

                  - * The {@link #listIterator()} method returns the same as this method, and can - * be cast to a Cursor if the close method is required. - * - * @return a new cursor iterator - */ - public CursorableLinkedList.Cursor cursor() { - return cursor(0); - } - - /** - * Returns a {@link Cursor} for iterating through the elements of this list - * starting from a specified index. - *

                  - * A Cursor is a ListIterator with an additional - * close() method. Calling this method immediately discards the - * references to the cursor. If it is not called, then the garbage collector - * will still remove the reference as it is held via a WeakReference. - *

                  - * The cursor enables iteration and list changes to occur in any order without - * invalidating the iterator (from one thread). When elements are added to the - * list, an event is fired to all active cursors enabling them to adjust to the - * change in the list. - *

                  - * When the "current" (i.e., last returned by {@link ListIterator#next} - * or {@link ListIterator#previous}) element of the list is removed, - * the cursor automatically adjusts to the change (invalidating the - * last returned value such that it cannot be removed). - *

                  - * The {@link #listIterator(int)} method returns the same as this method, and can - * be cast to a Cursor if the close method is required. - * - * @param fromIndex the index to start from - * @return a new cursor iterator - * @throws IndexOutOfBoundsException if the index is out of range - * (index < 0 || index > size()). - */ - public CursorableLinkedList.Cursor cursor(int fromIndex) { - Cursor cursor = new Cursor(this, fromIndex); - registerCursor(cursor); - return cursor; - } - - //----------------------------------------------------------------------- - /** - * Updates the node with a new value. - * This implementation sets the value on the node. - * Subclasses can override this to record the change. - * - * @param node node to update - * @param value new value of the node - */ - protected void updateNode(Node node, Object value) { - super.updateNode(node, value); - broadcastNodeChanged(node); - } - - /** - * Inserts a new node into the list. - * - * @param nodeToInsert new node to insert - * @param insertBeforeNode node to insert before - * @throws NullPointerException if either node is null - */ - protected void addNode(Node nodeToInsert, Node insertBeforeNode) { - super.addNode(nodeToInsert, insertBeforeNode); - broadcastNodeInserted(nodeToInsert); - } - - /** - * Removes the specified node from the list. - * - * @param node the node to remove - * @throws NullPointerException if node is null - */ - protected void removeNode(Node node) { - super.removeNode(node); - broadcastNodeRemoved(node); - } - - /** - * Removes all nodes by iteration. - */ - protected void removeAllNodes() { - if (size() > 0) { - // superclass implementation would break all the iterators - Iterator it = iterator(); - while (it.hasNext()) { - it.next(); - it.remove(); - } - } - } - - //----------------------------------------------------------------------- - /** - * Registers a cursor to be notified of changes to this list. - * - * @param cursor the cursor to register - */ - protected void registerCursor(Cursor cursor) { - // We take this opportunity to clean the cursors list - // of WeakReference objects to garbage-collected cursors. - for (Iterator it = cursors.iterator(); it.hasNext();) { - WeakReference ref = (WeakReference) it.next(); - if (ref.get() == null) { - it.remove(); - } - } - cursors.add(new WeakReference(cursor)); - } - - /** - * Deregisters a cursor from the list to be notified of changes. - * - * @param cursor the cursor to deregister - */ - protected void unregisterCursor(Cursor cursor) { - for (Iterator it = cursors.iterator(); it.hasNext();) { - WeakReference ref = (WeakReference) it.next(); - Cursor cur = (Cursor) ref.get(); - if (cur == null) { - // some other unrelated cursor object has been - // garbage-collected; let's take the opportunity to - // clean up the cursors list anyway.. - it.remove(); - - } else if (cur == cursor) { - ref.clear(); - it.remove(); - break; - } - } - } - - //----------------------------------------------------------------------- - /** - * Informs all of my registered cursors that the specified - * element was changed. - * - * @param node the node that was changed - */ - protected void broadcastNodeChanged(Node node) { - Iterator it = cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - it.remove(); // clean up list - } else { - cursor.nodeChanged(node); - } - } - } - - /** - * Informs all of my registered cursors that the specified - * element was just removed from my list. - * - * @param node the node that was changed - */ - protected void broadcastNodeRemoved(Node node) { - Iterator it = cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - it.remove(); // clean up list - } else { - cursor.nodeRemoved(node); - } - } - } - - /** - * Informs all of my registered cursors that the specified - * element was just added to my list. - * - * @param node the node that was changed - */ - protected void broadcastNodeInserted(Node node) { - Iterator it = cursors.iterator(); - while (it.hasNext()) { - WeakReference ref = (WeakReference) it.next(); - Cursor cursor = (Cursor) ref.get(); - if (cursor == null) { - it.remove(); // clean up list - } else { - cursor.nodeInserted(node); - } - } - } - - //----------------------------------------------------------------------- - /** - * Serializes the data held in this object to the stream specified. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Deserializes the data held in this object to the stream specified. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - - //----------------------------------------------------------------------- - /** - * Creates a list iterator for the sublist. - * - * @param subList the sublist to get an iterator for - * @param fromIndex the index to start from, relative to the sublist - */ - protected ListIterator createSubListListIterator(LinkedSubList subList, int fromIndex) { - SubCursor cursor = new SubCursor(subList, fromIndex); - registerCursor(cursor); - return cursor; - } - - //----------------------------------------------------------------------- - /** - * An extended ListIterator that allows concurrent changes to - * the underlying list. - */ - public static class Cursor extends AbstractLinkedList.LinkedListIterator { - /** Is the cursor valid (not closed) */ - boolean valid = true; - /** Is the next index valid */ - boolean nextIndexValid = true; - /** Flag to indicate if the current element was removed by another object. */ - boolean currentRemovedByAnother = false; - - /** - * Constructs a new cursor. - * - * @param index the index to start from - */ - protected Cursor(CursorableLinkedList parent, int index) { - super(parent, index); - valid = true; - } - - /** - * Removes the item last returned by this iterator. - *

                  - * There may have been subsequent alterations to the list - * since you obtained this item, however you can still remove it. - * You can even remove it if the item is no longer in the main list. - * However, you can't call this method on the same iterator more - * than once without calling next() or previous(). - * - * @throws IllegalStateException if there is no item to remove - */ - public void remove() { - // overridden, as the nodeRemoved() method updates the iterator - // state in the parent.removeNode() call below - if (current == null && currentRemovedByAnother) { - // quietly ignore, as the last returned node was removed - // by the list or some other iterator - // by ignoring it, we keep this iterator independent from - // other changes as much as possible - } else { - checkModCount(); - parent.removeNode(getLastNodeReturned()); - } - currentRemovedByAnother = false; - } - - /** - * Adds an object to the list. - * The object added here will be the new 'previous' in the iterator. - * - * @param obj the object to add - */ - public void add(Object obj) { - // overridden, as the nodeInserted() method updates the iterator state - super.add(obj); - // matches the (next.previous == node) clause in nodeInserted() - // thus next gets changed - reset it again here - next = next.next; - } - - // set is not overridden, as it works ok - // note that we want it to throw an exception if the element being - // set has been removed from the real list (compare this with the - // remove method where we silently ignore this case) - - /** - * Gets the index of the next element to be returned. - * - * @return the next index - */ - public int nextIndex() { - if (nextIndexValid == false) { - if (next == parent.header) { - nextIndex = parent.size(); - } else { - int pos = 0; - Node temp = parent.header.next; - while (temp != next) { - pos++; - temp = temp.next; - } - nextIndex = pos; - } - nextIndexValid = true; - } - return nextIndex; - } - - /** - * Handle event from the list when a node has changed. - * - * @param node the node that changed - */ - protected void nodeChanged(Node node) { - // do nothing - } - - /** - * Handle event from the list when a node has been removed. - * - * @param node the node that was removed - */ - protected void nodeRemoved(Node node) { - if (node == next && node == current) { - // state where next() followed by previous() - next = node.next; - current = null; - currentRemovedByAnother = true; - } else if (node == next) { - // state where next() not followed by previous() - // and we are matching next node - next = node.next; - currentRemovedByAnother = false; - } else if (node == current) { - // state where next() not followed by previous() - // and we are matching current (last returned) node - current = null; - currentRemovedByAnother = true; - nextIndex--; - } else { - nextIndexValid = false; - currentRemovedByAnother = false; - } - } - - /** - * Handle event from the list when a node has been added. - * - * @param node the node that was added - */ - protected void nodeInserted(Node node) { - if (node.previous == current) { - next = node; - } else if (next.previous == node) { - next = node; - } else { - nextIndexValid = false; - } - } - - /** - * Override superclass modCount check, and replace it with our valid flag. - */ - protected void checkModCount() { - if (!valid) { - throw new ConcurrentModificationException("Cursor closed"); - } - } - - /** - * Mark this cursor as no longer being needed. Any resources - * associated with this cursor are immediately released. - * In previous versions of this class, it was mandatory to close - * all cursor objects to avoid memory leaks. It is no longer - * necessary to call this close method; an instance of this class - * can now be treated exactly like a normal iterator. - */ - public void close() { - if (valid) { - ((CursorableLinkedList) parent).unregisterCursor(this); - valid = false; - } - } - } - - //----------------------------------------------------------------------- - /** - * A cursor for the sublist based on LinkedSubListIterator. - * - * @since Commons Collections 3.2 - */ - protected static class SubCursor extends Cursor { - - /** The parent list */ - protected final LinkedSubList sub; - - /** - * Constructs a new cursor. - * - * @param index the index to start from - */ - protected SubCursor(LinkedSubList sub, int index) { - super((CursorableLinkedList) sub.parent, index + sub.offset); - this.sub = sub; - } - - public boolean hasNext() { - return (nextIndex() < sub.size); - } - - public boolean hasPrevious() { - return (previousIndex() >= 0); - } - - public int nextIndex() { - return (super.nextIndex() - sub.offset); - } - - public void add(Object obj) { - super.add(obj); - sub.expectedModCount = parent.modCount; - sub.size++; - } - - public void remove() { - super.remove(); - sub.expectedModCount = parent.modCount; - sub.size--; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/FixedSizeList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/FixedSizeList.java deleted file mode 100644 index fb78448b553..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/FixedSizeList.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -import org.apache.commons.collections.BoundedCollection; -import org.apache.commons.collections.iterators.AbstractListIteratorDecorator; -import org.apache.commons.collections.iterators.UnmodifiableIterator; - -/** - * Decorates another List to fix the size preventing add/remove. - *

                  - * The add, remove, clear and retain operations are unsupported. - * The set method is allowed (as it doesn't change the list size). - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class FixedSizeList - extends AbstractSerializableListDecorator - implements BoundedCollection { - - /** Serialization version */ - private static final long serialVersionUID = -2218010673611160319L; - - /** - * Factory method to create a fixed size list. - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - public static List decorate(List list) { - return new FixedSizeList(list); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected FixedSizeList(List list) { - super(list); - } - - //----------------------------------------------------------------------- - public boolean add(Object object) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public void add(int index, Object object) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public boolean addAll(int index, Collection coll) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public void clear() { - throw new UnsupportedOperationException("List is fixed size"); - } - - public Object get(int index) { - return getList().get(index); - } - - public int indexOf(Object object) { - return getList().indexOf(object); - } - - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public int lastIndexOf(Object object) { - return getList().lastIndexOf(object); - } - - public ListIterator listIterator() { - return new FixedSizeListIterator(getList().listIterator(0)); - } - - public ListIterator listIterator(int index) { - return new FixedSizeListIterator(getList().listIterator(index)); - } - - public Object remove(int index) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException("List is fixed size"); - } - - public Object set(int index, Object object) { - return getList().set(index, object); - } - - public List subList(int fromIndex, int toIndex) { - List sub = getList().subList(fromIndex, toIndex); - return new FixedSizeList(sub); - } - - /** - * List iterator that only permits changes via set() - */ - static class FixedSizeListIterator extends AbstractListIteratorDecorator { - protected FixedSizeListIterator(ListIterator iterator) { - super(iterator); - } - public void remove() { - throw new UnsupportedOperationException("List is fixed size"); - } - public void add(Object object) { - throw new UnsupportedOperationException("List is fixed size"); - } - } - - public boolean isFull() { - return true; - } - - public int maxSize() { - return size(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/GrowthList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/GrowthList.java deleted file mode 100644 index 6f5677f80e9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/GrowthList.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * Decorates another List to make it seamlessly grow when - * indices larger than the list size are used on add and set, - * avoiding most IndexOutOfBoundsExceptions. - *

                  - * This class avoids errors by growing when a set or add method would - * normally throw an IndexOutOfBoundsException. - * Note that IndexOutOfBoundsException IS returned for invalid negative indices. - *

                  - * Trying to set or add to an index larger than the size will cause the list - * to grow (using null elements). Clearly, care must be taken - * not to use excessively large indices, as the internal list will grow to - * match. - *

                  - * Trying to use any method other than add or set with an invalid index will - * call the underlying list and probably result in an IndexOutOfBoundsException. - *

                  - * Take care when using this list with null values, as - * null is the value added when growing the list. - *

                  - * All sub-lists will access the underlying list directly, and will throw - * IndexOutOfBoundsExceptions. - *

                  - * This class differs from {@link LazyList} because here growth occurs on - * set and add, where LazyList grows on get. However, they - * can be used together by decorating twice. - * - * @see LazyList - * @since Commons Collections 3.2 - * @version $Revision: 155406 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Legato - */ -public class GrowthList extends AbstractSerializableListDecorator { - - /** Serialization version */ - private static final long serialVersionUID = -3620001881672L; - - /** - * Factory method to create a growth list. - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - public static List decorate(List list) { - return new GrowthList(list); - } - - //----------------------------------------------------------------------- - /** - * Constructor that uses an ArrayList internally. - */ - public GrowthList() { - super(new ArrayList()); - } - - /** - * Constructor that uses an ArrayList internally. - * - * @param initialSize the initial size of the ArrayList - * @throws IllegalArgumentException if initial size is invalid - */ - public GrowthList(int initialSize) { - super(new ArrayList(initialSize)); - } - - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected GrowthList(List list) { - super(list); - } - - //----------------------------------------------------------------------- - /** - * Decorate the add method to perform the growth behaviour. - *

                  - * If the requested index is greater than the current size, the list will - * grow to the new size. Indices between the old size and the requested - * size will be filled with null. - *

                  - * If the index is less than the current size, the value will be added to - * the underlying list directly. - * If the index is less than zero, the underlying list is called, which - * will probably throw an IndexOutOfBoundsException. - * - * @param index the index to add at - * @param element the object to add at the specified index - * @throws UnsupportedOperationException if the underlying list doesn't implement set - * @throws ClassCastException if the underlying list rejects the element - * @throws IllegalArgumentException if the underlying list rejects the element - */ - public void add(int index, Object element) { - int size = getList().size(); - if (index > size) { - getList().addAll(Collections.nCopies(index - size, null)); - } - getList().add(index, element); - } - - //----------------------------------------------------------------------- - /** - * Decorate the addAll method to perform the growth behaviour. - *

                  - * If the requested index is greater than the current size, the list will - * grow to the new size. Indices between the old size and the requested - * size will be filled with null. - *

                  - * If the index is less than the current size, the values will be added to - * the underlying list directly. - * If the index is less than zero, the underlying list is called, which - * will probably throw an IndexOutOfBoundsException. - * - * @param index the index to add at - * @param coll the collection to add at the specified index - * @return true if the list changed - * @throws UnsupportedOperationException if the underlying list doesn't implement set - * @throws ClassCastException if the underlying list rejects the element - * @throws IllegalArgumentException if the underlying list rejects the element - */ - public boolean addAll(int index, Collection coll) { - int size = getList().size(); - boolean result = false; - if (index > size) { - getList().addAll(Collections.nCopies(index - size, null)); - result = true; - } - return (getList().addAll(index, coll) | result); - } - - //----------------------------------------------------------------------- - /** - * Decorate the set method to perform the growth behaviour. - *

                  - * If the requested index is greater than the current size, the list will - * grow to the new size. Indices between the old size and the requested - * size will be filled with null. - *

                  - * If the index is less than the current size, the value will be set onto - * the underlying list directly. - * If the index is less than zero, the underlying list is called, which - * will probably throw an IndexOutOfBoundsException. - * - * @param index the index to set - * @param element the object to set at the specified index - * @return the object previously at that index - * @throws UnsupportedOperationException if the underlying list doesn't implement set - * @throws ClassCastException if the underlying list rejects the element - * @throws IllegalArgumentException if the underlying list rejects the element - */ - public Object set(int index, Object element) { - int size = getList().size(); - if (index >= size) { - getList().addAll(Collections.nCopies((index - size) + 1, null)); - } - return getList().set(index, element); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/LazyList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/LazyList.java deleted file mode 100644 index 5921bc3be71..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/LazyList.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.List; - -import org.apache.commons.collections.Factory; - -/** - * Decorates another List to create objects in the list on demand. - *

                  - * When the {@link #get(int)} method is called with an index greater than - * the size of the list, the list will automatically grow in size and return - * a new object from the specified factory. The gaps will be filled by null. - * If a get method call encounters a null, it will be replaced with a new - * object from the factory. Thus this list is unsuitable for storing null - * objects. - *

                  - * For instance: - * - *

                  - * Factory factory = new Factory() {
                  - *     public Object create() {
                  - *         return new Date();
                  - *     }
                  - * }
                  - * List lazy = LazyList.decorate(new ArrayList(), factory);
                  - * Object obj = lazy.get(3);
                  - * 
                  - * - * After the above code is executed, obj will contain - * a new Date instance. Furthermore, that Date - * instance is the fourth element in the list. The first, second, - * and third element are all set to null. - *

                  - * This class differs from {@link GrowthList} because here growth occurs on - * get, where GrowthList grows on set and add. However, they - * could easily be used together by decorating twice. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @see GrowthList - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Arron Bates - * @author Paul Jack - */ -public class LazyList extends AbstractSerializableListDecorator { - - /** Serialization version */ - private static final long serialVersionUID = -1708388017160694542L; - - /** The factory to use to lazily instantiate the objects */ - protected final Factory factory; - - /** - * Factory method to create a lazily instantiating list. - * - * @param list the list to decorate, must not be null - * @param factory the factory to use for creation, must not be null - * @throws IllegalArgumentException if list or factory is null - */ - public static List decorate(List list, Factory factory) { - return new LazyList(list, factory); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @param factory the factory to use for creation, must not be null - * @throws IllegalArgumentException if list or factory is null - */ - protected LazyList(List list, Factory factory) { - super(list); - if (factory == null) { - throw new IllegalArgumentException("Factory must not be null"); - } - this.factory = factory; - } - - //----------------------------------------------------------------------- - /** - * Decorate the get method to perform the lazy behaviour. - *

                  - * If the requested index is greater than the current size, the list will - * grow to the new size and a new object will be returned from the factory. - * Indexes in-between the old size and the requested size are left with a - * placeholder that is replaced with a factory object when requested. - * - * @param index the index to retrieve - */ - public Object get(int index) { - int size = getList().size(); - if (index < size) { - // within bounds, get the object - Object object = getList().get(index); - if (object == null) { - // item is a place holder, create new one, set and return - object = factory.create(); - getList().set(index, object); - return object; - } else { - // good and ready to go - return object; - } - } else { - // we have to grow the list - for (int i = size; i < index; i++) { - getList().add(null); - } - // create our last object, set and return - Object object = factory.create(); - getList().add(object); - return object; - } - } - - - public List subList(int fromIndex, int toIndex) { - List sub = getList().subList(fromIndex, toIndex); - return new LazyList(sub, factory); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/NodeCachingLinkedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/NodeCachingLinkedList.java deleted file mode 100644 index a0713bcdb5e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/NodeCachingLinkedList.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; - -/** - * A List implementation that stores a cache of internal Node objects - * in an effort to reduce wasteful object creation. - *

                  - * A linked list creates one Node for each item of data added. This can result in - * a lot of object creation and garbage collection. This implementation seeks to - * avoid that by maintaining a store of cached nodes. - *

                  - * This implementation is suitable for long-lived lists where both add and remove - * are used. Short-lived lists, or lists which only grow will have worse performance - * using this class. - *

                  - * Note that this implementation is not synchronized. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Jeff Varszegi - * @author Rich Dougherty - * @author Phil Steitz - * @author Stephen Colebourne - */ -public class NodeCachingLinkedList extends AbstractLinkedList implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 6897789178562232073L; - - /** - * The default value for {@link #maximumCacheSize}. - */ - protected static final int DEFAULT_MAXIMUM_CACHE_SIZE = 20; - - /** - * The first cached node, or null if no nodes are cached. - * Cached nodes are stored in a singly-linked list with - * next pointing to the next element. - */ - protected transient Node firstCachedNode; - - /** - * The size of the cache. - */ - protected transient int cacheSize; - - /** - * The maximum size of the cache. - */ - protected int maximumCacheSize; - - //----------------------------------------------------------------------- - /** - * Constructor that creates. - */ - public NodeCachingLinkedList() { - this(DEFAULT_MAXIMUM_CACHE_SIZE); - } - - /** - * Constructor that copies the specified collection - * - * @param coll the collection to copy - */ - public NodeCachingLinkedList(Collection coll) { - super(coll); - this.maximumCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE; - } - - /** - * Constructor that species the maximum cache size. - * - * @param maximumCacheSize the maximum cache size - */ - public NodeCachingLinkedList(int maximumCacheSize) { - super(); - this.maximumCacheSize = maximumCacheSize; - init(); // must call init() as use super(); - } - - //----------------------------------------------------------------------- - /** - * Gets the maximum size of the cache. - * - * @return the maximum cache size - */ - protected int getMaximumCacheSize() { - return maximumCacheSize; - } - - /** - * Sets the maximum size of the cache. - * - * @param maximumCacheSize the new maximum cache size - */ - protected void setMaximumCacheSize(int maximumCacheSize) { - this.maximumCacheSize = maximumCacheSize; - shrinkCacheToMaximumSize(); - } - - /** - * Reduce the size of the cache to the maximum, if necessary. - */ - protected void shrinkCacheToMaximumSize() { - // Rich Dougherty: This could be more efficient. - while (cacheSize > maximumCacheSize) { - getNodeFromCache(); - } - } - - /** - * Gets a node from the cache. If a node is returned, then the value of - * {@link #cacheSize} is decreased accordingly. The node that is returned - * will have null values for next, previous and element. - * - * @return a node, or null if there are no nodes in the cache. - */ - protected Node getNodeFromCache() { - if (cacheSize == 0) { - return null; - } - Node cachedNode = firstCachedNode; - firstCachedNode = cachedNode.next; - cachedNode.next = null; // This should be changed anyway, but defensively - // set it to null. - cacheSize--; - return cachedNode; - } - - /** - * Checks whether the cache is full. - * - * @return true if the cache is full - */ - protected boolean isCacheFull() { - return cacheSize >= maximumCacheSize; - } - - /** - * Adds a node to the cache, if the cache isn't full. - * The node's contents are cleared to so they can be garbage collected. - * - * @param node the node to add to the cache - */ - protected void addNodeToCache(Node node) { - if (isCacheFull()) { - // don't cache the node. - return; - } - // clear the node's contents and add it to the cache. - Node nextCachedNode = firstCachedNode; - node.previous = null; - node.next = nextCachedNode; - node.setValue(null); - firstCachedNode = node; - cacheSize++; - } - - //----------------------------------------------------------------------- - /** - * Creates a new node, either by reusing one from the cache or creating - * a new one. - * - * @param value value of the new node - * @return the newly created node - */ - protected Node createNode(Object value) { - Node cachedNode = getNodeFromCache(); - if (cachedNode == null) { - return super.createNode(value); - } else { - cachedNode.setValue(value); - return cachedNode; - } - } - - /** - * Removes the node from the list, storing it in the cache for reuse - * if the cache is not yet full. - * - * @param node the node to remove - */ - protected void removeNode(Node node) { - super.removeNode(node); - addNodeToCache(node); - } - - /** - * Removes all the nodes from the list, storing as many as required in the - * cache for reuse. - * - */ - protected void removeAllNodes() { - // Add the removed nodes to the cache, then remove the rest. - // We can add them to the cache before removing them, since - // {@link AbstractLinkedList.removeAllNodes()} removes the - // nodes by removing references directly from {@link #header}. - int numberOfNodesToCache = Math.min(size, maximumCacheSize - cacheSize); - Node node = header.next; - for (int currentIndex = 0; currentIndex < numberOfNodesToCache; currentIndex++) { - Node oldNode = node; - node = node.next; - addNodeToCache(oldNode); - } - super.removeAllNodes(); - } - - //----------------------------------------------------------------------- - /** - * Serializes the data held in this object to the stream specified. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Deserializes the data held in this object to the stream specified. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/PredicatedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/PredicatedList.java deleted file mode 100644 index 5fe9b894ae1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/PredicatedList.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.collection.PredicatedCollection; -import org.apache.commons.collections.iterators.AbstractListIteratorDecorator; - -/** - * Decorates another List to validate that all additions - * match a specified predicate. - *

                  - * This list exists to provide validation for the decorated list. - * It is normally created to decorate an empty list. - * If an object cannot be added to the list, an IllegalArgumentException is thrown. - *

                  - * One usage would be to ensure that no null entries are added to the list. - *

                  List list = PredicatedList.decorate(new ArrayList(), NotNullPredicate.INSTANCE);
                  - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedList extends PredicatedCollection implements List { - - /** Serialization version */ - private static final long serialVersionUID = -5722039223898659102L; - - /** - * Factory method to create a predicated (validating) list. - *

                  - * If there are any elements already in the list being decorated, they - * are validated. - * - * @param list the list to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if list or predicate is null - * @throws IllegalArgumentException if the list contains invalid elements - */ - public static List decorate(List list, Predicate predicate) { - return new PredicatedList(list, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the list being decorated, they - * are validated. - * - * @param list the list to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if list or predicate is null - * @throws IllegalArgumentException if the list contains invalid elements - */ - protected PredicatedList(List list, Predicate predicate) { - super(list, predicate); - } - - /** - * Gets the list being decorated. - * - * @return the decorated list - */ - protected List getList() { - return (List) getCollection(); - } - - //----------------------------------------------------------------------- - public Object get(int index) { - return getList().get(index); - } - - public int indexOf(Object object) { - return getList().indexOf(object); - } - - public int lastIndexOf(Object object) { - return getList().lastIndexOf(object); - } - - public Object remove(int index) { - return getList().remove(index); - } - - //----------------------------------------------------------------------- - public void add(int index, Object object) { - validate(object); - getList().add(index, object); - } - - public boolean addAll(int index, Collection coll) { - for (Iterator it = coll.iterator(); it.hasNext(); ) { - validate(it.next()); - } - return getList().addAll(index, coll); - } - - public ListIterator listIterator() { - return listIterator(0); - } - - public ListIterator listIterator(int i) { - return new PredicatedListIterator(getList().listIterator(i)); - } - - public Object set(int index, Object object) { - validate(object); - return getList().set(index, object); - } - - public List subList(int fromIndex, int toIndex) { - List sub = getList().subList(fromIndex, toIndex); - return new PredicatedList(sub, predicate); - } - - /** - * Inner class Iterator for the PredicatedList - */ - protected class PredicatedListIterator extends AbstractListIteratorDecorator { - - protected PredicatedListIterator(ListIterator iterator) { - super(iterator); - } - - public void add(Object object) { - validate(object); - iterator.add(object); - } - - public void set(Object object) { - validate(object); - iterator.set(object); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SetUniqueList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SetUniqueList.java deleted file mode 100644 index 003d752a1b8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SetUniqueList.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Set; - -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; -import org.apache.commons.collections.iterators.AbstractListIteratorDecorator; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates a List to ensure that no duplicates are present - * much like a Set. - *

                  - * The List interface makes certain assumptions/requirements. - * This implementation breaks these in certain ways, but this is merely the - * result of rejecting duplicates. - * Each violation is explained in the method, but it should not affect you. - * Bear in mind that Sets require immutable objects to function correctly. - *

                  - * The {@link org.apache.commons.collections.set.ListOrderedSet ListOrderedSet} - * class provides an alternative approach, by wrapping an existing Set and - * retaining insertion order in the iterator. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Matthew Hawthorne - * @author Stephen Colebourne - * @author Tom Dunham - */ -public class SetUniqueList extends AbstractSerializableListDecorator { - - /** Serialization version */ - private static final long serialVersionUID = 7196982186153478694L; - - /** - * Internal Set to maintain uniqueness. - */ - protected final Set set; - - /** - * Factory method to create a SetList using the supplied list to retain order. - *

                  - * If the list contains duplicates, these are removed (first indexed one kept). - * A HashSet is used for the set behaviour. - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - public static SetUniqueList decorate(List list) { - if (list == null) { - throw new IllegalArgumentException("List must not be null"); - } - if (list.isEmpty()) { - return new SetUniqueList(list, new HashSet()); - } else { - List temp = new ArrayList(list); - list.clear(); - SetUniqueList sl = new SetUniqueList(list, new HashSet()); - sl.addAll(temp); - return sl; - } - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies) the List and specifies the set to use. - *

                  - * The set and list must both be correctly initialised to the same elements. - * - * @param set the set to decorate, must not be null - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if set or list is null - */ - protected SetUniqueList(List list, Set set) { - super(list); - if (set == null) { - throw new IllegalArgumentException("Set must not be null"); - } - this.set = set; - } - - //----------------------------------------------------------------------- - /** - * Gets an unmodifiable view as a Set. - * - * @return an unmodifiable set view - */ - public Set asSet() { - return UnmodifiableSet.decorate(set); - } - - //----------------------------------------------------------------------- - /** - * Adds an element to the list if it is not already present. - *

                  - * (Violation) - * The List interface requires that this method returns - * true always. However this class may return false - * because of the Set behaviour. - * - * @param object the object to add - * @return true if object was added - */ - public boolean add(Object object) { - // gets initial size - final int sizeBefore = size(); - - // adds element if unique - add(size(), object); - - // compares sizes to detect if collection changed - return (sizeBefore != size()); - } - - /** - * Adds an element to a specific index in the list if it is not already present. - *

                  - * (Violation) - * The List interface makes the assumption that the element is - * always inserted. This may not happen with this implementation. - * - * @param index the index to insert at - * @param object the object to add - */ - public void add(int index, Object object) { - // adds element if it is not contained already - if (set.contains(object) == false) { - super.add(index, object); - set.add(object); - } - } - - /** - * Adds an element to the end of the list if it is not already present. - *

                  - * (Violation) - * The List interface makes the assumption that the element is - * always inserted. This may not happen with this implementation. - * - * @param coll the collection to add - */ - public boolean addAll(Collection coll) { - return addAll(size(), coll); - } - - /** - * Adds a collection of objects to the end of the list avoiding duplicates. - *

                  - * Only elements that are not already in this list will be added, and - * duplicates from the specified collection will be ignored. - *

                  - * (Violation) - * The List interface makes the assumption that the elements - * are always inserted. This may not happen with this implementation. - * - * @param index the index to insert at - * @param coll the collection to add in iterator order - * @return true if this collection changed - */ - public boolean addAll(int index, Collection coll) { - // gets initial size - final int sizeBefore = size(); - - // adds all elements - for (final Iterator it = coll.iterator(); it.hasNext();) { - add(it.next()); - } - - // compares sizes to detect if collection changed - return sizeBefore != size(); - } - - //----------------------------------------------------------------------- - /** - * Sets the value at the specified index avoiding duplicates. - *

                  - * The object is set into the specified index. - * Afterwards, any previous duplicate is removed - * If the object is not already in the list then a normal set occurs. - * If it is present, then the old version is removed. - * - * @param index the index to insert at - * @param object the object to set - * @return the previous object - */ - public Object set(int index, Object object) { - int pos = indexOf(object); - Object removed = super.set(index, object); - if (pos == -1 || pos == index) { - return removed; - } - - // the object is already in the uniq list - // (and it hasn't been swapped with itself) - super.remove(pos); // remove the duplicate by index - set.remove(removed); // remove the item deleted by the set - return removed; // return the item deleted by the set - } - - public boolean remove(Object object) { - boolean result = super.remove(object); - set.remove(object); - return result; - } - - public Object remove(int index) { - Object result = super.remove(index); - set.remove(result); - return result; - } - - public boolean removeAll(Collection coll) { - boolean result = super.removeAll(coll); - set.removeAll(coll); - return result; - } - - public boolean retainAll(Collection coll) { - boolean result = super.retainAll(coll); - set.retainAll(coll); - return result; - } - - public void clear() { - super.clear(); - set.clear(); - } - - public boolean contains(Object object) { - return set.contains(object); - } - - public boolean containsAll(Collection coll) { - return set.containsAll(coll); - } - - public Iterator iterator() { - return new SetListIterator(super.iterator(), set); - } - - public ListIterator listIterator() { - return new SetListListIterator(super.listIterator(), set); - } - - public ListIterator listIterator(int index) { - return new SetListListIterator(super.listIterator(index), set); - } - - public List subList(int fromIndex, int toIndex) { - return new SetUniqueList(super.subList(fromIndex, toIndex), set); - } - - //----------------------------------------------------------------------- - /** - * Inner class iterator. - */ - static class SetListIterator extends AbstractIteratorDecorator { - - protected final Set set; - protected Object last = null; - - protected SetListIterator(Iterator it, Set set) { - super(it); - this.set = set; - } - - public Object next() { - last = super.next(); - return last; - } - - public void remove() { - super.remove(); - set.remove(last); - last = null; - } - } - - /** - * Inner class iterator. - */ - static class SetListListIterator extends AbstractListIteratorDecorator { - - protected final Set set; - protected Object last = null; - - protected SetListListIterator(ListIterator it, Set set) { - super(it); - this.set = set; - } - - public Object next() { - last = super.next(); - return last; - } - - public Object previous() { - last = super.previous(); - return last; - } - - public void remove() { - super.remove(); - set.remove(last); - last = null; - } - - public void add(Object object) { - if (set.contains(object) == false) { - super.add(object); - set.add(object); - } - } - - public void set(Object object) { - throw new UnsupportedOperationException("ListIterator does not support set"); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SynchronizedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SynchronizedList.java deleted file mode 100644 index 3e92859643e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/SynchronizedList.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.Collection; -import java.util.List; -import java.util.ListIterator; - -import org.apache.commons.collections.collection.SynchronizedCollection; - -/** - * Decorates another List to synchronize its behaviour - * for a multi-threaded environment. - *

                  - * Methods are synchronized, then forwarded to the decorated list. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedList extends SynchronizedCollection implements List { - - /** Serialization version */ - private static final long serialVersionUID = -1403835447328619437L; - - /** - * Factory method to create a synchronized list. - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - public static List decorate(List list) { - return new SynchronizedList(list); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - protected SynchronizedList(List list) { - super(list); - } - - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @param lock the lock to use, must not be null - * @throws IllegalArgumentException if list is null - */ - protected SynchronizedList(List list, Object lock) { - super(list, lock); - } - - /** - * Gets the decorated list. - * - * @return the decorated list - */ - protected List getList() { - return (List) collection; - } - - //----------------------------------------------------------------------- - public void add(int index, Object object) { - synchronized (lock) { - getList().add(index, object); - } - } - - public boolean addAll(int index, Collection coll) { - synchronized (lock) { - return getList().addAll(index, coll); - } - } - - public Object get(int index) { - synchronized (lock) { - return getList().get(index); - } - } - - public int indexOf(Object object) { - synchronized (lock) { - return getList().indexOf(object); - } - } - - public int lastIndexOf(Object object) { - synchronized (lock) { - return getList().lastIndexOf(object); - } - } - - /** - * Iterators must be manually synchronized. - *

                  -     * synchronized (coll) {
                  -     *   ListIterator it = coll.listIterator();
                  -     *   // do stuff with iterator
                  -     * }
                  -     * 
                  -     * @return an iterator that must be manually synchronized on the collection
                  -     */
                  -    public ListIterator listIterator() {
                  -        return getList().listIterator();
                  -    }
                  -
                  -    /**
                  -     * Iterators must be manually synchronized.
                  -     * 
                  -     * synchronized (coll) {
                  -     *   ListIterator it = coll.listIterator(3);
                  -     *   // do stuff with iterator
                  -     * }
                  -     * 
                  -     * @return an iterator that must be manually synchronized on the collection
                  -     */
                  -    public ListIterator listIterator(int index) {
                  -        return getList().listIterator(index);
                  -    }
                  -
                  -    public Object remove(int index) {
                  -        synchronized (lock) {
                  -            return getList().remove(index);
                  -        }
                  -    }
                  -
                  -    public Object set(int index, Object object) {
                  -        synchronized (lock) {
                  -            return getList().set(index, object);
                  -        }
                  -    }
                  -
                  -    public List subList(int fromIndex, int toIndex) {
                  -        synchronized (lock) {
                  -            List list = getList().subList(fromIndex, toIndex);
                  -            // the lock is passed into the constructor here to ensure that the sublist is
                  -            // synchronized on the same lock as the parent list
                  -            return new SynchronizedList(list, lock);
                  -        }
                  -    }
                  -
                  -}
                  diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TransformedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TransformedList.java
                  deleted file mode 100644
                  index c602d2ad660..00000000000
                  --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TransformedList.java
                  +++ /dev/null
                  @@ -1,151 +0,0 @@
                  -/*
                  - *  Licensed to the Apache Software Foundation (ASF) under one or more
                  - *  contributor license agreements.  See the NOTICE file distributed with
                  - *  this work for additional information regarding copyright ownership.
                  - *  The ASF licenses this file to You under the Apache License, Version 2.0
                  - *  (the "License"); you may not use this file except in compliance with
                  - *  the License.  You may obtain a copy of the License at
                  - *
                  - *      http://www.apache.org/licenses/LICENSE-2.0
                  - *
                  - *  Unless required by applicable law or agreed to in writing, software
                  - *  distributed under the License is distributed on an "AS IS" BASIS,
                  - *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
                  - *  See the License for the specific language governing permissions and
                  - *  limitations under the License.
                  - */
                  -package org.apache.commons.collections.list;
                  -
                  -import java.util.Collection;
                  -import java.util.List;
                  -import java.util.ListIterator;
                  -
                  -import org.apache.commons.collections.Transformer;
                  -import org.apache.commons.collections.collection.TransformedCollection;
                  -import org.apache.commons.collections.iterators.AbstractListIteratorDecorator;
                  -
                  -/**
                  - * Decorates another List to transform objects that are added.
                  - * 

                  - * The add and set methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedList extends TransformedCollection implements List { - - /** Serialization version */ - private static final long serialVersionUID = 1077193035000013141L; - - /** - * Factory method to create a transforming list. - *

                  - * If there are any elements already in the list being decorated, they - * are NOT transformed. - * - * @param list the list to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if list or transformer is null - */ - public static List decorate(List list, Transformer transformer) { - return new TransformedList(list, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the list being decorated, they - * are NOT transformed. - * - * @param list the list to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if list or transformer is null - */ - protected TransformedList(List list, Transformer transformer) { - super(list, transformer); - } - - /** - * Gets the decorated list. - * - * @return the decorated list - */ - protected List getList() { - return (List) collection; - } - - //----------------------------------------------------------------------- - public Object get(int index) { - return getList().get(index); - } - - public int indexOf(Object object) { - return getList().indexOf(object); - } - - public int lastIndexOf(Object object) { - return getList().lastIndexOf(object); - } - - public Object remove(int index) { - return getList().remove(index); - } - - //----------------------------------------------------------------------- - public void add(int index, Object object) { - object = transform(object); - getList().add(index, object); - } - - public boolean addAll(int index, Collection coll) { - coll = transform(coll); - return getList().addAll(index, coll); - } - - public ListIterator listIterator() { - return listIterator(0); - } - - public ListIterator listIterator(int i) { - return new TransformedListIterator(getList().listIterator(i)); - } - - public Object set(int index, Object object) { - object = transform(object); - return getList().set(index, object); - } - - public List subList(int fromIndex, int toIndex) { - List sub = getList().subList(fromIndex, toIndex); - return new TransformedList(sub, transformer); - } - - /** - * Inner class Iterator for the TransformedList - */ - protected class TransformedListIterator extends AbstractListIteratorDecorator { - - protected TransformedListIterator(ListIterator iterator) { - super(iterator); - } - - public void add(Object object) { - object = transform(object); - iterator.add(object); - } - - public void set(Object object) { - object = transform(object); - iterator.set(object); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TreeList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TreeList.java deleted file mode 100644 index b44b4954a26..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TreeList.java +++ /dev/null @@ -1,916 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.AbstractList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.OrderedIterator; - -/** - * A List implementation that is optimised for fast insertions and - * removals at any index in the list. - *

                  - * This list implementation utilises a tree structure internally to ensure that - * all insertions and removals are O(log n). This provides much faster performance - * than both an ArrayList and a LinkedList where elements - * are inserted and removed repeatedly from anywhere in the list. - *

                  - * The following relative performance statistics are indicative of this class: - *

                  - *              get  add  insert  iterate  remove
                  - * TreeList       3    5       1       2       1
                  - * ArrayList      1    1      40       1      40
                  - * LinkedList  5800    1     350       2     325
                  - * 
                  - * ArrayList is a good general purpose list implementation. - * It is faster than TreeList for most operations except inserting - * and removing in the middle of the list. ArrayList also uses less - * memory as TreeList uses one object per entry. - *

                  - * LinkedList is rarely a good choice of implementation. - * TreeList is almost always a good replacement for it, although it - * does use sligtly more memory. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Joerg Schmuecker - * @author Stephen Colebourne - */ -public class TreeList extends AbstractList { -// add; toArray; iterator; insert; get; indexOf; remove -// TreeList = 1260;7360;3080; 160; 170;3400; 170; -// ArrayList = 220;1480;1760; 6870; 50;1540; 7200; -// LinkedList = 270;7360;3350;55860;290720;2910;55200; - - /** The root node in the AVL tree */ - private AVLNode root; - - /** The current size of the list */ - private int size; - - //----------------------------------------------------------------------- - /** - * Constructs a new empty list. - */ - public TreeList() { - super(); - } - - /** - * Constructs a new empty list that copies the specified list. - * - * @param coll the collection to copy - * @throws NullPointerException if the collection is null - */ - public TreeList(Collection coll) { - super(); - addAll(coll); - } - - //----------------------------------------------------------------------- - /** - * Gets the element at the specified index. - * - * @param index the index to retrieve - * @return the element at the specified index - */ - public Object get(int index) { - checkInterval(index, 0, size() - 1); - return root.get(index).getValue(); - } - - /** - * Gets the current size of the list. - * - * @return the current size - */ - public int size() { - return size; - } - - /** - * Gets an iterator over the list. - * - * @return an iterator over the list - */ - public Iterator iterator() { - // override to go 75% faster - return listIterator(0); - } - - /** - * Gets a ListIterator over the list. - * - * @return the new iterator - */ - public ListIterator listIterator() { - // override to go 75% faster - return listIterator(0); - } - - /** - * Gets a ListIterator over the list. - * - * @param fromIndex the index to start from - * @return the new iterator - */ - public ListIterator listIterator(int fromIndex) { - // override to go 75% faster - // cannot use EmptyIterator as iterator.add() must work - checkInterval(fromIndex, 0, size()); - return new TreeListIterator(this, fromIndex); - } - - /** - * Searches for the index of an object in the list. - * - * @return the index of the object, -1 if not found - */ - public int indexOf(Object object) { - // override to go 75% faster - if (root == null) { - return -1; - } - return root.indexOf(object, root.relativePosition); - } - - /** - * Searches for the presence of an object in the list. - * - * @return true if the object is found - */ - public boolean contains(Object object) { - return (indexOf(object) >= 0); - } - - /** - * Converts the list into an array. - * - * @return the list as an array - */ - public Object[] toArray() { - // override to go 20% faster - Object[] array = new Object[size()]; - if (root != null) { - root.toArray(array, root.relativePosition); - } - return array; - } - - //----------------------------------------------------------------------- - /** - * Adds a new element to the list. - * - * @param index the index to add before - * @param obj the element to add - */ - public void add(int index, Object obj) { - modCount++; - checkInterval(index, 0, size()); - if (root == null) { - root = new AVLNode(index, obj, null, null); - } else { - root = root.insert(index, obj); - } - size++; - } - - /** - * Sets the element at the specified index. - * - * @param index the index to set - * @param obj the object to store at the specified index - * @return the previous object at that index - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object set(int index, Object obj) { - checkInterval(index, 0, size() - 1); - AVLNode node = root.get(index); - Object result = node.value; - node.setValue(obj); - return result; - } - - /** - * Removes the element at the specified index. - * - * @param index the index to remove - * @return the previous object at that index - */ - public Object remove(int index) { - modCount++; - checkInterval(index, 0, size() - 1); - Object result = get(index); - root = root.remove(index); - size--; - return result; - } - - /** - * Clears the list, removing all entries. - */ - public void clear() { - modCount++; - root = null; - size = 0; - } - - //----------------------------------------------------------------------- - /** - * Checks whether the index is valid. - * - * @param index the index to check - * @param startIndex the first allowed index - * @param endIndex the last allowed index - * @throws IndexOutOfBoundsException if the index is invalid - */ - private void checkInterval(int index, int startIndex, int endIndex) { - if (index < startIndex || index > endIndex) { - throw new IndexOutOfBoundsException("Invalid index:" + index + ", size=" + size()); - } - } - - //----------------------------------------------------------------------- - /** - * Implements an AVLNode which keeps the offset updated. - *

                  - * This node contains the real work. - * TreeList is just there to implement {@link java.util.List}. - * The nodes don't know the index of the object they are holding. They - * do know however their position relative to their parent node. - * This allows to calculate the index of a node while traversing the tree. - *

                  - * The Faedelung calculation stores a flag for both the left and right child - * to indicate if they are a child (false) or a link as in linked list (true). - */ - static class AVLNode { - /** The left child node or the predecessor if {@link #leftIsPrevious}.*/ - private AVLNode left; - /** Flag indicating that left reference is not a subtree but the predecessor. */ - private boolean leftIsPrevious; - /** The right child node or the successor if {@link #rightIsNext}. */ - private AVLNode right; - /** Flag indicating that right reference is not a subtree but the successor. */ - private boolean rightIsNext; - /** How many levels of left/right are below this one. */ - private int height; - /** The relative position, root holds absolute position. */ - private int relativePosition; - /** The stored element. */ - private Object value; - - /** - * Constructs a new node with a relative position. - * - * @param relativePosition the relative position of the node - * @param obj the value for the ndoe - * @param rightFollower the node with the value following this one - * @param leftFollower the node with the value leading this one - */ - private AVLNode(int relativePosition, Object obj, AVLNode rightFollower, AVLNode leftFollower) { - this.relativePosition = relativePosition; - value = obj; - rightIsNext = true; - leftIsPrevious = true; - right = rightFollower; - left = leftFollower; - } - - /** - * Gets the value. - * - * @return the value of this node - */ - Object getValue() { - return value; - } - - /** - * Sets the value. - * - * @param obj the value to store - */ - void setValue(Object obj) { - this.value = obj; - } - - /** - * Locate the element with the given index relative to the - * offset of the parent of this node. - */ - AVLNode get(int index) { - int indexRelativeToMe = index - relativePosition; - - if (indexRelativeToMe == 0) { - return this; - } - - AVLNode nextNode = ((indexRelativeToMe < 0) ? getLeftSubTree() : getRightSubTree()); - if (nextNode == null) { - return null; - } - return nextNode.get(indexRelativeToMe); - } - - /** - * Locate the index that contains the specified object. - */ - int indexOf(Object object, int index) { - if (getLeftSubTree() != null) { - int result = left.indexOf(object, index + left.relativePosition); - if (result != -1) { - return result; - } - } - if (value == null ? value == object : value.equals(object)) { - return index; - } - if (getRightSubTree() != null) { - return right.indexOf(object, index + right.relativePosition); - } - return -1; - } - - /** - * Stores the node and its children into the array specified. - * - * @param array the array to be filled - * @param index the index of this node - */ - void toArray(Object[] array, int index) { - array[index] = value; - if (getLeftSubTree() != null) { - left.toArray(array, index + left.relativePosition); - } - if (getRightSubTree() != null) { - right.toArray(array, index + right.relativePosition); - } - } - - /** - * Gets the next node in the list after this one. - * - * @return the next node - */ - AVLNode next() { - if (rightIsNext || right == null) { - return right; - } - return right.min(); - } - - /** - * Gets the node in the list before this one. - * - * @return the previous node - */ - AVLNode previous() { - if (leftIsPrevious || left == null) { - return left; - } - return left.max(); - } - - /** - * Inserts a node at the position index. - * - * @param index is the index of the position relative to the position of - * the parent node. - * @param obj is the object to be stored in the position. - */ - AVLNode insert(int index, Object obj) { - int indexRelativeToMe = index - relativePosition; - - if (indexRelativeToMe <= 0) { - return insertOnLeft(indexRelativeToMe, obj); - } else { - return insertOnRight(indexRelativeToMe, obj); - } - } - - private AVLNode insertOnLeft(int indexRelativeToMe, Object obj) { - AVLNode ret = this; - - if (getLeftSubTree() == null) { - setLeft(new AVLNode(-1, obj, this, left), null); - } else { - setLeft(left.insert(indexRelativeToMe, obj), null); - } - - if (relativePosition >= 0) { - relativePosition++; - } - ret = balance(); - recalcHeight(); - return ret; - } - - private AVLNode insertOnRight(int indexRelativeToMe, Object obj) { - AVLNode ret = this; - - if (getRightSubTree() == null) { - setRight(new AVLNode(+1, obj, right, this), null); - } else { - setRight(right.insert(indexRelativeToMe, obj), null); - } - if (relativePosition < 0) { - relativePosition--; - } - ret = balance(); - recalcHeight(); - return ret; - } - - //----------------------------------------------------------------------- - /** - * Gets the left node, returning null if its a faedelung. - */ - private AVLNode getLeftSubTree() { - return (leftIsPrevious ? null : left); - } - - /** - * Gets the right node, returning null if its a faedelung. - */ - private AVLNode getRightSubTree() { - return (rightIsNext ? null : right); - } - - /** - * Gets the rightmost child of this node. - * - * @return the rightmost child (greatest index) - */ - private AVLNode max() { - return (getRightSubTree() == null) ? this : right.max(); - } - - /** - * Gets the leftmost child of this node. - * - * @return the leftmost child (smallest index) - */ - private AVLNode min() { - return (getLeftSubTree() == null) ? this : left.min(); - } - - /** - * Removes the node at a given position. - * - * @param index is the index of the element to be removed relative to the position of - * the parent node of the current node. - */ - AVLNode remove(int index) { - int indexRelativeToMe = index - relativePosition; - - if (indexRelativeToMe == 0) { - return removeSelf(); - } - if (indexRelativeToMe > 0) { - setRight(right.remove(indexRelativeToMe), right.right); - if (relativePosition < 0) { - relativePosition++; - } - } else { - setLeft(left.remove(indexRelativeToMe), left.left); - if (relativePosition > 0) { - relativePosition--; - } - } - recalcHeight(); - return balance(); - } - - private AVLNode removeMax() { - if (getRightSubTree() == null) { - return removeSelf(); - } - setRight(right.removeMax(), right.right); - if (relativePosition < 0) { - relativePosition++; - } - recalcHeight(); - return balance(); - } - - private AVLNode removeMin() { - if (getLeftSubTree() == null) { - return removeSelf(); - } - setLeft(left.removeMin(), left.left); - if (relativePosition > 0) { - relativePosition--; - } - recalcHeight(); - return balance(); - } - - /** - * Removes this node from the tree. - * - * @return the node that replaces this one in the parent - */ - private AVLNode removeSelf() { - if (getRightSubTree() == null && getLeftSubTree() == null) { - return null; - } - if (getRightSubTree() == null) { - if (relativePosition > 0) { - left.relativePosition += relativePosition + (relativePosition > 0 ? 0 : 1); - } - left.max().setRight(null, right); - return left; - } - if (getLeftSubTree() == null) { - right.relativePosition += relativePosition - (relativePosition < 0 ? 0 : 1); - right.min().setLeft(null, left); - return right; - } - - if (heightRightMinusLeft() > 0) { - // more on the right, so delete from the right - AVLNode rightMin = right.min(); - value = rightMin.value; - if (leftIsPrevious) { - left = rightMin.left; - } - right = right.removeMin(); - if (relativePosition < 0) { - relativePosition++; - } - } else { - // more on the left or equal, so delete from the left - AVLNode leftMax = left.max(); - value = leftMax.value; - if (rightIsNext) { - right = leftMax.right; - } - AVLNode leftPrevious = left.left; - left = left.removeMax(); - if (left == null) { - // special case where left that was deleted was a double link - // only occurs when height difference is equal - left = leftPrevious; - leftIsPrevious = true; - } - if (relativePosition > 0) { - relativePosition--; - } - } - recalcHeight(); - return this; - } - - //----------------------------------------------------------------------- - /** - * Balances according to the AVL algorithm. - */ - private AVLNode balance() { - switch (heightRightMinusLeft()) { - case 1 : - case 0 : - case -1 : - return this; - case -2 : - if (left.heightRightMinusLeft() > 0) { - setLeft(left.rotateLeft(), null); - } - return rotateRight(); - case 2 : - if (right.heightRightMinusLeft() < 0) { - setRight(right.rotateRight(), null); - } - return rotateLeft(); - default : - throw new RuntimeException("tree inconsistent!"); - } - } - - /** - * Gets the relative position. - */ - private int getOffset(AVLNode node) { - if (node == null) { - return 0; - } - return node.relativePosition; - } - - /** - * Sets the relative position. - */ - private int setOffset(AVLNode node, int newOffest) { - if (node == null) { - return 0; - } - int oldOffset = getOffset(node); - node.relativePosition = newOffest; - return oldOffset; - } - - /** - * Sets the height by calculation. - */ - private void recalcHeight() { - height = Math.max( - getLeftSubTree() == null ? -1 : getLeftSubTree().height, - getRightSubTree() == null ? -1 : getRightSubTree().height) + 1; - } - - /** - * Returns the height of the node or -1 if the node is null. - */ - private int getHeight(AVLNode node) { - return (node == null ? -1 : node.height); - } - - /** - * Returns the height difference right - left - */ - private int heightRightMinusLeft() { - return getHeight(getRightSubTree()) - getHeight(getLeftSubTree()); - } - - private AVLNode rotateLeft() { - AVLNode newTop = right; // can't be faedelung! - AVLNode movedNode = getRightSubTree().getLeftSubTree(); - - int newTopPosition = relativePosition + getOffset(newTop); - int myNewPosition = -newTop.relativePosition; - int movedPosition = getOffset(newTop) + getOffset(movedNode); - - setRight(movedNode, newTop); - newTop.setLeft(this, null); - - setOffset(newTop, newTopPosition); - setOffset(this, myNewPosition); - setOffset(movedNode, movedPosition); - return newTop; - } - - private AVLNode rotateRight() { - AVLNode newTop = left; // can't be faedelung - AVLNode movedNode = getLeftSubTree().getRightSubTree(); - - int newTopPosition = relativePosition + getOffset(newTop); - int myNewPosition = -newTop.relativePosition; - int movedPosition = getOffset(newTop) + getOffset(movedNode); - - setLeft(movedNode, newTop); - newTop.setRight(this, null); - - setOffset(newTop, newTopPosition); - setOffset(this, myNewPosition); - setOffset(movedNode, movedPosition); - return newTop; - } - - /** - * Sets the left field to the node, or the previous node if that is null - * - * @param node the new left subtree node - * @param previous the previous node in the linked list - */ - private void setLeft(AVLNode node, AVLNode previous) { - leftIsPrevious = (node == null); - left = (leftIsPrevious ? previous : node); - recalcHeight(); - } - - /** - * Sets the right field to the node, or the next node if that is null - * - * @param node the new left subtree node - * @param next the next node in the linked list - */ - private void setRight(AVLNode node, AVLNode next) { - rightIsNext = (node == null); - right = (rightIsNext ? next : node); - recalcHeight(); - } - -// private void checkFaedelung() { -// AVLNode maxNode = left.max(); -// if (!maxNode.rightIsFaedelung || maxNode.right != this) { -// throw new RuntimeException(maxNode + " should right-faedel to " + this); -// } -// AVLNode minNode = right.min(); -// if (!minNode.leftIsFaedelung || minNode.left != this) { -// throw new RuntimeException(maxNode + " should left-faedel to " + this); -// } -// } -// -// private int checkTreeDepth() { -// int hright = (getRightSubTree() == null ? -1 : getRightSubTree().checkTreeDepth()); -// // System.out.print("checkTreeDepth"); -// // System.out.print(this); -// // System.out.print(" left: "); -// // System.out.print(_left); -// // System.out.print(" right: "); -// // System.out.println(_right); -// -// int hleft = (left == null ? -1 : left.checkTreeDepth()); -// if (height != Math.max(hright, hleft) + 1) { -// throw new RuntimeException( -// "height should be max" + hleft + "," + hright + " but is " + height); -// } -// return height; -// } -// -// private int checkLeftSubNode() { -// if (getLeftSubTree() == null) { -// return 0; -// } -// int count = 1 + left.checkRightSubNode(); -// if (left.relativePosition != -count) { -// throw new RuntimeException(); -// } -// return count + left.checkLeftSubNode(); -// } -// -// private int checkRightSubNode() { -// AVLNode right = getRightSubTree(); -// if (right == null) { -// return 0; -// } -// int count = 1; -// count += right.checkLeftSubNode(); -// if (right.relativePosition != count) { -// throw new RuntimeException(); -// } -// return count + right.checkRightSubNode(); -// } - - /** - * Used for debugging. - */ - public String toString() { - return "AVLNode(" + relativePosition + "," + (left != null) + "," + value + - "," + (getRightSubTree() != null) + ", faedelung " + rightIsNext + " )"; - } - } - - /** - * A list iterator over the linked list. - */ - static class TreeListIterator implements ListIterator, OrderedIterator { - /** The parent list */ - protected final TreeList parent; - /** - * Cache of the next node that will be returned by {@link #next()}. - */ - protected AVLNode next; - /** - * The index of the next node to be returned. - */ - protected int nextIndex; - /** - * Cache of the last node that was returned by {@link #next()} - * or {@link #previous()}. - */ - protected AVLNode current; - /** - * The index of the last node that was returned. - */ - protected int currentIndex; - /** - * The modification count that the list is expected to have. If the list - * doesn't have this count, then a - * {@link java.util.ConcurrentModificationException} may be thrown by - * the operations. - */ - protected int expectedModCount; - - /** - * Create a ListIterator for a list. - * - * @param parent the parent list - * @param fromIndex the index to start at - */ - protected TreeListIterator(TreeList parent, int fromIndex) throws IndexOutOfBoundsException { - super(); - this.parent = parent; - this.expectedModCount = parent.modCount; - this.next = (parent.root == null ? null : parent.root.get(fromIndex)); - this.nextIndex = fromIndex; - this.currentIndex = -1; - } - - /** - * Checks the modification count of the list is the value that this - * object expects. - * - * @throws ConcurrentModificationException If the list's modification - * count isn't the value that was expected. - */ - protected void checkModCount() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - - public boolean hasNext() { - return (nextIndex < parent.size()); - } - - public Object next() { - checkModCount(); - if (!hasNext()) { - throw new NoSuchElementException("No element at index " + nextIndex + "."); - } - if (next == null) { - next = parent.root.get(nextIndex); - } - Object value = next.getValue(); - current = next; - currentIndex = nextIndex++; - next = next.next(); - return value; - } - - public boolean hasPrevious() { - return (nextIndex > 0); - } - - public Object previous() { - checkModCount(); - if (!hasPrevious()) { - throw new NoSuchElementException("Already at start of list."); - } - if (next == null) { - next = parent.root.get(nextIndex - 1); - } else { - next = next.previous(); - } - Object value = next.getValue(); - current = next; - currentIndex = --nextIndex; - return value; - } - - public int nextIndex() { - return nextIndex; - } - - public int previousIndex() { - return nextIndex() - 1; - } - - public void remove() { - checkModCount(); - if (currentIndex == -1) { - throw new IllegalStateException(); - } - if (nextIndex == currentIndex) { - // remove() following previous() - next = next.next(); - parent.remove(currentIndex); - } else { - // remove() following next() - parent.remove(currentIndex); - nextIndex--; - } - current = null; - currentIndex = -1; - expectedModCount++; - } - - public void set(Object obj) { - checkModCount(); - if (current == null) { - throw new IllegalStateException(); - } - current.setValue(obj); - } - - public void add(Object obj) { - checkModCount(); - parent.add(nextIndex, obj); - current = null; - currentIndex = -1; - nextIndex++; - expectedModCount++; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TypedList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TypedList.java deleted file mode 100644 index 2f8f42528bb..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/TypedList.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.List; - -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another List to validate that elements - * added are of a specific type. - *

                  - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedList { - - /** - * Factory method to create a typed list. - *

                  - * If there are any elements already in the list being decorated, they - * are validated. - * - * @param list the list to decorate, must not be null - * @param type the type to allow into the collection, must not be null - * @throws IllegalArgumentException if list or type is null - * @throws IllegalArgumentException if the list contains invalid elements - */ - public static List decorate(List list, Class type) { - return new PredicatedList(list, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedList() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/UnmodifiableList.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/UnmodifiableList.java deleted file mode 100644 index c554d0912c8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/UnmodifiableList.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.list; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; -import org.apache.commons.collections.iterators.UnmodifiableListIterator; - -/** - * Decorates another List to ensure it can't be altered. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableList - extends AbstractSerializableListDecorator - implements Unmodifiable { - - /** Serialization version */ - private static final long serialVersionUID = 6595182819922443652L; - - /** - * Factory method to create an unmodifiable list. - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - public static List decorate(List list) { - if (list instanceof Unmodifiable) { - return list; - } - return new UnmodifiableList(list); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - private UnmodifiableList(List list) { - super(list); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public ListIterator listIterator() { - return UnmodifiableListIterator.decorate(getList().listIterator()); - } - - public ListIterator listIterator(int index) { - return UnmodifiableListIterator.decorate(getList().listIterator(index)); - } - - public void add(int index, Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(int index, Collection coll) { - throw new UnsupportedOperationException(); - } - - public Object remove(int index) { - throw new UnsupportedOperationException(); - } - - public Object set(int index, Object object) { - throw new UnsupportedOperationException(); - } - - public List subList(int fromIndex, int toIndex) { - List sub = getList().subList(fromIndex, toIndex); - return new UnmodifiableList(sub); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/package.html deleted file mode 100644 index aeee4f4df43..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/list/package.html +++ /dev/null @@ -1,45 +0,0 @@ - - - -

                  -This package contains implementations of the -{@link java.util.List List} interface. -

                  -

                  -The following implementations are provided in the package: -

                    -
                  • TreeList - a list that is optimised for insertions and removals at any index in the list
                  • -
                  • CursorableLinkedList - a list that can be modified while the listIterator (cursor) is being used
                  • -
                  • NodeCachingLinkedList - a linked list that caches the storage nodes for a performance gain
                  • -
                  -

                  -

                  -The following decorators are provided in the package: -

                    -
                  • Synchronized - synchronizes method access for multi-threaded environments
                  • -
                  • Unmodifiable - ensures the collection cannot be altered
                  • -
                  • Predicated - ensures that only elements that are valid according to a predicate can be added
                  • -
                  • Typed - ensures that only elements that are of a specific type can be added
                  • -
                  • Transformed - transforms each element added
                  • -
                  • FixedSize - ensures that the size of the list cannot change
                  • -
                  • Lazy - creates objects in the list on demand
                  • -
                  • Growth - grows the list instead of erroring when set/add used with index beyond the list size
                  • -
                  • SetUnique - a list that avoids duplicate entries like a Set
                  • -
                  -

                  - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractHashedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractHashedMap.java deleted file mode 100644 index 2f83dd29653..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractHashedMap.java +++ /dev/null @@ -1,1329 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.AbstractCollection; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.IterableMap; -import org.apache.commons.collections.KeyValue; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.iterators.EmptyIterator; -import org.apache.commons.collections.iterators.EmptyMapIterator; - -/** - * An abstract implementation of a hash-based map which provides numerous points for - * subclasses to override. - *

                  - * This class implements all the features necessary for a subclass hash-based map. - * Key-value entries are stored in instances of the HashEntry class, - * which can be overridden and replaced. The iterators can similarly be replaced, - * without the need to replace the KeySet, EntrySet and Values view classes. - *

                  - * Overridable methods are provided to change the default hashing behaviour, and - * to change how entries are added to and removed from the map. Hopefully, all you - * need for unusual subclasses is here. - *

                  - * NOTE: From Commons Collections 3.1 this class extends AbstractMap. - * This is to provide backwards compatibility for ReferenceMap between v3.0 and v3.1. - * This extends clause will be removed in v4.0. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author java util HashMap - * @author Stephen Colebourne - * @author Christian Siefkes - */ -public class AbstractHashedMap extends AbstractMap implements IterableMap { - - protected static final String NO_NEXT_ENTRY = "No next() entry in the iteration"; - protected static final String NO_PREVIOUS_ENTRY = "No previous() entry in the iteration"; - protected static final String REMOVE_INVALID = "remove() can only be called once after next()"; - protected static final String GETKEY_INVALID = "getKey() can only be called after next() and before remove()"; - protected static final String GETVALUE_INVALID = "getValue() can only be called after next() and before remove()"; - protected static final String SETVALUE_INVALID = "setValue() can only be called after next() and before remove()"; - - /** The default capacity to use */ - protected static final int DEFAULT_CAPACITY = 16; - /** The default threshold to use */ - protected static final int DEFAULT_THRESHOLD = 12; - /** The default load factor to use */ - protected static final float DEFAULT_LOAD_FACTOR = 0.75f; - /** The maximum capacity allowed */ - protected static final int MAXIMUM_CAPACITY = 1 << 30; - /** An object for masking null */ - protected static final Object NULL = new Object(); - - /** Load factor, normally 0.75 */ - protected transient float loadFactor; - /** The size of the map */ - protected transient int size; - /** Map entries */ - protected transient HashEntry[] data; - /** Size at which to rehash */ - protected transient int threshold; - /** Modification count for iterators */ - protected transient int modCount; - /** Entry set */ - protected transient EntrySet entrySet; - /** Key set */ - protected transient KeySet keySet; - /** Values */ - protected transient Values values; - - /** - * Constructor only used in deserialization, do not use otherwise. - */ - protected AbstractHashedMap() { - super(); - } - - /** - * Constructor which performs no validation on the passed in parameters. - * - * @param initialCapacity the initial capacity, must be a power of two - * @param loadFactor the load factor, must be > 0.0f and generally < 1.0f - * @param threshold the threshold, must be sensible - */ - protected AbstractHashedMap(int initialCapacity, float loadFactor, int threshold) { - super(); - this.loadFactor = loadFactor; - this.data = new HashEntry[initialCapacity]; - this.threshold = threshold; - init(); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * default load factor. - * - * @param initialCapacity the initial capacity - * @throws IllegalArgumentException if the initial capacity is less than one - */ - protected AbstractHashedMap(int initialCapacity) { - this(initialCapacity, DEFAULT_LOAD_FACTOR); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor - * @throws IllegalArgumentException if the initial capacity is less than one - * @throws IllegalArgumentException if the load factor is less than or equal to zero - */ - protected AbstractHashedMap(int initialCapacity, float loadFactor) { - super(); - if (initialCapacity < 1) { - throw new IllegalArgumentException("Initial capacity must be greater than 0"); - } - if (loadFactor <= 0.0f || Float.isNaN(loadFactor)) { - throw new IllegalArgumentException("Load factor must be greater than 0"); - } - this.loadFactor = loadFactor; - initialCapacity = calculateNewCapacity(initialCapacity); - this.threshold = calculateThreshold(initialCapacity, loadFactor); - this.data = new HashEntry[initialCapacity]; - init(); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - protected AbstractHashedMap(Map map) { - this(Math.max(2 * map.size(), DEFAULT_CAPACITY), DEFAULT_LOAD_FACTOR); - putAll(map); - } - - /** - * Initialise subclasses during construction, cloning or deserialization. - */ - protected void init() { - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the key specified. - * - * @param key the key - * @return the mapped value, null if no match - */ - public Object get(Object key) { - key = convertKey(key); - int hashCode = hash(key); - HashEntry entry = data[hashIndex(hashCode, data.length)]; // no local for hash index - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) { - return entry.getValue(); - } - entry = entry.next; - } - return null; - } - - /** - * Gets the size of the map. - * - * @return the size - */ - public int size() { - return size; - } - - /** - * Checks whether the map is currently empty. - * - * @return true if the map is currently size zero - */ - public boolean isEmpty() { - return (size == 0); - } - - //----------------------------------------------------------------------- - /** - * Checks whether the map contains the specified key. - * - * @param key the key to search for - * @return true if the map contains the key - */ - public boolean containsKey(Object key) { - key = convertKey(key); - int hashCode = hash(key); - HashEntry entry = data[hashIndex(hashCode, data.length)]; // no local for hash index - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) { - return true; - } - entry = entry.next; - } - return false; - } - - /** - * Checks whether the map contains the specified value. - * - * @param value the value to search for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - if (value == null) { - for (int i = 0, isize = data.length; i < isize; i++) { - HashEntry entry = data[i]; - while (entry != null) { - if (entry.getValue() == null) { - return true; - } - entry = entry.next; - } - } - } else { - for (int i = 0, isize = data.length; i < isize; i++) { - HashEntry entry = data[i]; - while (entry != null) { - if (isEqualValue(value, entry.getValue())) { - return true; - } - entry = entry.next; - } - } - } - return false; - } - - //----------------------------------------------------------------------- - /** - * Puts a key-value mapping into this map. - * - * @param key the key to add - * @param value the value to add - * @return the value previously mapped to this key, null if none - */ - public Object put(Object key, Object value) { - key = convertKey(key); - int hashCode = hash(key); - int index = hashIndex(hashCode, data.length); - HashEntry entry = data[index]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) { - Object oldValue = entry.getValue(); - updateEntry(entry, value); - return oldValue; - } - entry = entry.next; - } - - addMapping(index, hashCode, key, value); - return null; - } - - /** - * Puts all the values from the specified map into this map. - *

                  - * This implementation iterates around the specified map and - * uses {@link #put(Object, Object)}. - * - * @param map the map to add - * @throws NullPointerException if the map is null - */ - public void putAll(Map map) { - int mapSize = map.size(); - if (mapSize == 0) { - return; - } - int newSize = (int) ((size + mapSize) / loadFactor + 1); - ensureCapacity(calculateNewCapacity(newSize)); - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - - /** - * Removes the specified mapping from this map. - * - * @param key the mapping to remove - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key) { - key = convertKey(key); - int hashCode = hash(key); - int index = hashIndex(hashCode, data.length); - HashEntry entry = data[index]; - HashEntry previous = null; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) { - Object oldValue = entry.getValue(); - removeMapping(entry, index, previous); - return oldValue; - } - previous = entry; - entry = entry.next; - } - return null; - } - - /** - * Clears the map, resetting the size to zero and nullifying references - * to avoid garbage collection issues. - */ - public void clear() { - modCount++; - HashEntry[] data = this.data; - for (int i = data.length - 1; i >= 0; i--) { - data[i] = null; - } - size = 0; - } - - //----------------------------------------------------------------------- - /** - * Converts input keys to another object for storage in the map. - * This implementation masks nulls. - * Subclasses can override this to perform alternate key conversions. - *

                  - * The reverse conversion can be changed, if required, by overriding the - * getKey() method in the hash entry. - * - * @param key the key convert - * @return the converted key - */ - protected Object convertKey(Object key) { - return (key == null ? NULL : key); - } - - /** - * Gets the hash code for the key specified. - * This implementation uses the additional hashing routine from JDK1.4. - * Subclasses can override this to return alternate hash codes. - * - * @param key the key to get a hash code for - * @return the hash code - */ - protected int hash(Object key) { - // same as JDK 1.4 - int h = key.hashCode(); - h += ~(h << 9); - h ^= (h >>> 14); - h += (h << 4); - h ^= (h >>> 10); - return h; - } - - /** - * Compares two keys, in internal converted form, to see if they are equal. - * This implementation uses the equals method and assumes neither key is null. - * Subclasses can override this to match differently. - * - * @param key1 the first key to compare passed in from outside - * @param key2 the second key extracted from the entry via entry.key - * @return true if equal - */ - protected boolean isEqualKey(Object key1, Object key2) { - return (key1 == key2 || key1.equals(key2)); - } - - /** - * Compares two values, in external form, to see if they are equal. - * This implementation uses the equals method and assumes neither value is null. - * Subclasses can override this to match differently. - * - * @param value1 the first value to compare passed in from outside - * @param value2 the second value extracted from the entry via getValue() - * @return true if equal - */ - protected boolean isEqualValue(Object value1, Object value2) { - return (value1 == value2 || value1.equals(value2)); - } - - /** - * Gets the index into the data storage for the hashCode specified. - * This implementation uses the least significant bits of the hashCode. - * Subclasses can override this to return alternate bucketing. - * - * @param hashCode the hash code to use - * @param dataSize the size of the data to pick a bucket from - * @return the bucket index - */ - protected int hashIndex(int hashCode, int dataSize) { - return hashCode & (dataSize - 1); - } - - //----------------------------------------------------------------------- - /** - * Gets the entry mapped to the key specified. - *

                  - * This method exists for subclasses that may need to perform a multi-step - * process accessing the entry. The public methods in this class don't use this - * method to gain a small performance boost. - * - * @param key the key - * @return the entry, null if no match - */ - protected HashEntry getEntry(Object key) { - key = convertKey(key); - int hashCode = hash(key); - HashEntry entry = data[hashIndex(hashCode, data.length)]; // no local for hash index - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) { - return entry; - } - entry = entry.next; - } - return null; - } - - //----------------------------------------------------------------------- - /** - * Updates an existing key-value mapping to change the value. - *

                  - * This implementation calls setValue() on the entry. - * Subclasses could override to handle changes to the map. - * - * @param entry the entry to update - * @param newValue the new value to store - */ - protected void updateEntry(HashEntry entry, Object newValue) { - entry.setValue(newValue); - } - - /** - * Reuses an existing key-value mapping, storing completely new data. - *

                  - * This implementation sets all the data fields on the entry. - * Subclasses could populate additional entry fields. - * - * @param entry the entry to update, not null - * @param hashIndex the index in the data array - * @param hashCode the hash code of the key to add - * @param key the key to add - * @param value the value to add - */ - protected void reuseEntry(HashEntry entry, int hashIndex, int hashCode, Object key, Object value) { - entry.next = data[hashIndex]; - entry.hashCode = hashCode; - entry.key = key; - entry.value = value; - } - - //----------------------------------------------------------------------- - /** - * Adds a new key-value mapping into this map. - *

                  - * This implementation calls createEntry(), addEntry() - * and checkCapacity(). - * It also handles changes to modCount and size. - * Subclasses could override to fully control adds to the map. - * - * @param hashIndex the index into the data array to store at - * @param hashCode the hash code of the key to add - * @param key the key to add - * @param value the value to add - */ - protected void addMapping(int hashIndex, int hashCode, Object key, Object value) { - modCount++; - HashEntry entry = createEntry(data[hashIndex], hashCode, key, value); - addEntry(entry, hashIndex); - size++; - checkCapacity(); - } - - /** - * Creates an entry to store the key-value data. - *

                  - * This implementation creates a new HashEntry instance. - * Subclasses can override this to return a different storage class, - * or implement caching. - * - * @param next the next entry in sequence - * @param hashCode the hash code to use - * @param key the key to store - * @param value the value to store - * @return the newly created entry - */ - protected HashEntry createEntry(HashEntry next, int hashCode, Object key, Object value) { - return new HashEntry(next, hashCode, key, value); - } - - /** - * Adds an entry into this map. - *

                  - * This implementation adds the entry to the data storage table. - * Subclasses could override to handle changes to the map. - * - * @param entry the entry to add - * @param hashIndex the index into the data array to store at - */ - protected void addEntry(HashEntry entry, int hashIndex) { - data[hashIndex] = entry; - } - - //----------------------------------------------------------------------- - /** - * Removes a mapping from the map. - *

                  - * This implementation calls removeEntry() and destroyEntry(). - * It also handles changes to modCount and size. - * Subclasses could override to fully control removals from the map. - * - * @param entry the entry to remove - * @param hashIndex the index into the data structure - * @param previous the previous entry in the chain - */ - protected void removeMapping(HashEntry entry, int hashIndex, HashEntry previous) { - modCount++; - removeEntry(entry, hashIndex, previous); - size--; - destroyEntry(entry); - } - - /** - * Removes an entry from the chain stored in a particular index. - *

                  - * This implementation removes the entry from the data storage table. - * The size is not updated. - * Subclasses could override to handle changes to the map. - * - * @param entry the entry to remove - * @param hashIndex the index into the data structure - * @param previous the previous entry in the chain - */ - protected void removeEntry(HashEntry entry, int hashIndex, HashEntry previous) { - if (previous == null) { - data[hashIndex] = entry.next; - } else { - previous.next = entry.next; - } - } - - /** - * Kills an entry ready for the garbage collector. - *

                  - * This implementation prepares the HashEntry for garbage collection. - * Subclasses can override this to implement caching (override clear as well). - * - * @param entry the entry to destroy - */ - protected void destroyEntry(HashEntry entry) { - entry.next = null; - entry.key = null; - entry.value = null; - } - - //----------------------------------------------------------------------- - /** - * Checks the capacity of the map and enlarges it if necessary. - *

                  - * This implementation uses the threshold to check if the map needs enlarging - */ - protected void checkCapacity() { - if (size >= threshold) { - int newCapacity = data.length * 2; - if (newCapacity <= MAXIMUM_CAPACITY) { - ensureCapacity(newCapacity); - } - } - } - - /** - * Changes the size of the data structure to the capacity proposed. - * - * @param newCapacity the new capacity of the array (a power of two, less or equal to max) - */ - protected void ensureCapacity(int newCapacity) { - int oldCapacity = data.length; - if (newCapacity <= oldCapacity) { - return; - } - if (size == 0) { - threshold = calculateThreshold(newCapacity, loadFactor); - data = new HashEntry[newCapacity]; - } else { - HashEntry oldEntries[] = data; - HashEntry newEntries[] = new HashEntry[newCapacity]; - - modCount++; - for (int i = oldCapacity - 1; i >= 0; i--) { - HashEntry entry = oldEntries[i]; - if (entry != null) { - oldEntries[i] = null; // gc - do { - HashEntry next = entry.next; - int index = hashIndex(entry.hashCode, newCapacity); - entry.next = newEntries[index]; - newEntries[index] = entry; - entry = next; - } while (entry != null); - } - } - threshold = calculateThreshold(newCapacity, loadFactor); - data = newEntries; - } - } - - /** - * Calculates the new capacity of the map. - * This implementation normalizes the capacity to a power of two. - * - * @param proposedCapacity the proposed capacity - * @return the normalized new capacity - */ - protected int calculateNewCapacity(int proposedCapacity) { - int newCapacity = 1; - if (proposedCapacity > MAXIMUM_CAPACITY) { - newCapacity = MAXIMUM_CAPACITY; - } else { - while (newCapacity < proposedCapacity) { - newCapacity <<= 1; // multiply by two - } - if (newCapacity > MAXIMUM_CAPACITY) { - newCapacity = MAXIMUM_CAPACITY; - } - } - return newCapacity; - } - - /** - * Calculates the new threshold of the map, where it will be resized. - * This implementation uses the load factor. - * - * @param newCapacity the new capacity - * @param factor the load factor - * @return the new resize threshold - */ - protected int calculateThreshold(int newCapacity, float factor) { - return (int) (newCapacity * factor); - } - - //----------------------------------------------------------------------- - /** - * Gets the next field from a HashEntry. - * Used in subclasses that have no visibility of the field. - * - * @param entry the entry to query, must not be null - * @return the next field of the entry - * @throws NullPointerException if the entry is null - * @since Commons Collections 3.1 - */ - protected HashEntry entryNext(HashEntry entry) { - return entry.next; - } - - /** - * Gets the hashCode field from a HashEntry. - * Used in subclasses that have no visibility of the field. - * - * @param entry the entry to query, must not be null - * @return the hashCode field of the entry - * @throws NullPointerException if the entry is null - * @since Commons Collections 3.1 - */ - protected int entryHashCode(HashEntry entry) { - return entry.hashCode; - } - - /** - * Gets the key field from a HashEntry. - * Used in subclasses that have no visibility of the field. - * - * @param entry the entry to query, must not be null - * @return the key field of the entry - * @throws NullPointerException if the entry is null - * @since Commons Collections 3.1 - */ - protected Object entryKey(HashEntry entry) { - return entry.key; - } - - /** - * Gets the value field from a HashEntry. - * Used in subclasses that have no visibility of the field. - * - * @param entry the entry to query, must not be null - * @return the value field of the entry - * @throws NullPointerException if the entry is null - * @since Commons Collections 3.1 - */ - protected Object entryValue(HashEntry entry) { - return entry.value; - } - - //----------------------------------------------------------------------- - /** - * Gets an iterator over the map. - * Changes made to the iterator affect this map. - *

                  - * A MapIterator returns the keys in the map. It also provides convenient - * methods to get the key and value, and set the value. - * It avoids the need to create an entrySet/keySet/values object. - * It also avoids creating the Map.Entry object. - * - * @return the map iterator - */ - public MapIterator mapIterator() { - if (size == 0) { - return EmptyMapIterator.INSTANCE; - } - return new HashMapIterator(this); - } - - /** - * MapIterator implementation. - */ - protected static class HashMapIterator extends HashIterator implements MapIterator { - - protected HashMapIterator(AbstractHashedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry().getKey(); - } - - public Object getKey() { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - return current.getKey(); - } - - public Object getValue() { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - return current.getValue(); - } - - public Object setValue(Object value) { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - return current.setValue(value); - } - } - - //----------------------------------------------------------------------- - /** - * Gets the entrySet view of the map. - * Changes made to the view affect this map. - * To simply iterate through the entries, use {@link #mapIterator()}. - * - * @return the entrySet view - */ - public Set entrySet() { - if (entrySet == null) { - entrySet = new EntrySet(this); - } - return entrySet; - } - - /** - * Creates an entry set iterator. - * Subclasses can override this to return iterators with different properties. - * - * @return the entrySet iterator - */ - protected Iterator createEntrySetIterator() { - if (size() == 0) { - return EmptyIterator.INSTANCE; - } - return new EntrySetIterator(this); - } - - /** - * EntrySet implementation. - */ - protected static class EntrySet extends AbstractSet { - /** The parent map */ - protected final AbstractHashedMap parent; - - protected EntrySet(AbstractHashedMap parent) { - super(); - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public void clear() { - parent.clear(); - } - - public boolean contains(Object entry) { - if (entry instanceof Map.Entry) { - Map.Entry e = (Map.Entry) entry; - Entry match = parent.getEntry(e.getKey()); - return (match != null && match.equals(e)); - } - return false; - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - if (contains(obj) == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - Object key = entry.getKey(); - parent.remove(key); - return true; - } - - public Iterator iterator() { - return parent.createEntrySetIterator(); - } - } - - /** - * EntrySet iterator. - */ - protected static class EntrySetIterator extends HashIterator { - - protected EntrySetIterator(AbstractHashedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry(); - } - } - - //----------------------------------------------------------------------- - /** - * Gets the keySet view of the map. - * Changes made to the view affect this map. - * To simply iterate through the keys, use {@link #mapIterator()}. - * - * @return the keySet view - */ - public Set keySet() { - if (keySet == null) { - keySet = new KeySet(this); - } - return keySet; - } - - /** - * Creates a key set iterator. - * Subclasses can override this to return iterators with different properties. - * - * @return the keySet iterator - */ - protected Iterator createKeySetIterator() { - if (size() == 0) { - return EmptyIterator.INSTANCE; - } - return new KeySetIterator(this); - } - - /** - * KeySet implementation. - */ - protected static class KeySet extends AbstractSet { - /** The parent map */ - protected final AbstractHashedMap parent; - - protected KeySet(AbstractHashedMap parent) { - super(); - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public void clear() { - parent.clear(); - } - - public boolean contains(Object key) { - return parent.containsKey(key); - } - - public boolean remove(Object key) { - boolean result = parent.containsKey(key); - parent.remove(key); - return result; - } - - public Iterator iterator() { - return parent.createKeySetIterator(); - } - } - - /** - * KeySet iterator. - */ - protected static class KeySetIterator extends EntrySetIterator { - - protected KeySetIterator(AbstractHashedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry().getKey(); - } - } - - //----------------------------------------------------------------------- - /** - * Gets the values view of the map. - * Changes made to the view affect this map. - * To simply iterate through the values, use {@link #mapIterator()}. - * - * @return the values view - */ - public Collection values() { - if (values == null) { - values = new Values(this); - } - return values; - } - - /** - * Creates a values iterator. - * Subclasses can override this to return iterators with different properties. - * - * @return the values iterator - */ - protected Iterator createValuesIterator() { - if (size() == 0) { - return EmptyIterator.INSTANCE; - } - return new ValuesIterator(this); - } - - /** - * Values implementation. - */ - protected static class Values extends AbstractCollection { - /** The parent map */ - protected final AbstractHashedMap parent; - - protected Values(AbstractHashedMap parent) { - super(); - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public void clear() { - parent.clear(); - } - - public boolean contains(Object value) { - return parent.containsValue(value); - } - - public Iterator iterator() { - return parent.createValuesIterator(); - } - } - - /** - * Values iterator. - */ - protected static class ValuesIterator extends HashIterator { - - protected ValuesIterator(AbstractHashedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry().getValue(); - } - } - - //----------------------------------------------------------------------- - /** - * HashEntry used to store the data. - *

                  - * If you subclass AbstractHashedMap but not HashEntry - * then you will not be able to access the protected fields. - * The entryXxx() methods on AbstractHashedMap exist - * to provide the necessary access. - */ - protected static class HashEntry implements Map.Entry, KeyValue { - /** The next entry in the hash chain */ - protected HashEntry next; - /** The hash code of the key */ - protected int hashCode; - /** The key */ - protected Object key; - /** The value */ - protected Object value; - - protected HashEntry(HashEntry next, int hashCode, Object key, Object value) { - super(); - this.next = next; - this.hashCode = hashCode; - this.key = key; - this.value = value; - } - - public Object getKey() { - return (key == NULL ? null : key); - } - - public Object getValue() { - return value; - } - - public Object setValue(Object value) { - Object old = this.value; - this.value = value; - return old; - } - - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - return - (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) && - (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue())); - } - - public int hashCode() { - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (getValue() == null ? 0 : getValue().hashCode()); - } - - public String toString() { - return new StringBuffer().append(getKey()).append('=').append(getValue()).toString(); - } - } - - /** - * Base Iterator - */ - protected static abstract class HashIterator implements Iterator { - - /** The parent map */ - protected final AbstractHashedMap parent; - /** The current index into the array of buckets */ - protected int hashIndex; - /** The last returned entry */ - protected HashEntry last; - /** The next entry */ - protected HashEntry next; - /** The modification count expected */ - protected int expectedModCount; - - protected HashIterator(AbstractHashedMap parent) { - super(); - this.parent = parent; - HashEntry[] data = parent.data; - int i = data.length; - HashEntry next = null; - while (i > 0 && next == null) { - next = data[--i]; - } - this.next = next; - this.hashIndex = i; - this.expectedModCount = parent.modCount; - } - - public boolean hasNext() { - return (next != null); - } - - protected HashEntry nextEntry() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - HashEntry newCurrent = next; - if (newCurrent == null) { - throw new NoSuchElementException(AbstractHashedMap.NO_NEXT_ENTRY); - } - HashEntry[] data = parent.data; - int i = hashIndex; - HashEntry n = newCurrent.next; - while (n == null && i > 0) { - n = data[--i]; - } - next = n; - hashIndex = i; - last = newCurrent; - return newCurrent; - } - - protected HashEntry currentEntry() { - return last; - } - - public void remove() { - if (last == null) { - throw new IllegalStateException(AbstractHashedMap.REMOVE_INVALID); - } - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - parent.remove(last.getKey()); - last = null; - expectedModCount = parent.modCount; - } - - public String toString() { - if (last != null) { - return "Iterator[" + last.getKey() + "=" + last.getValue() + "]"; - } else { - return "Iterator[]"; - } - } - } - - //----------------------------------------------------------------------- - /** - * Writes the map data to the stream. This method must be overridden if a - * subclass must be setup before put() is used. - *

                  - * Serialization is not one of the JDK's nicest topics. Normal serialization will - * initialise the superclass before the subclass. Sometimes however, this isn't - * what you want, as in this case the put() method on read can be - * affected by subclass state. - *

                  - * The solution adopted here is to serialize the state data of this class in - * this protected method. This method must be called by the - * writeObject() of the first serializable subclass. - *

                  - * Subclasses may override if they have a specific field that must be present - * on read before this implementation will work. Generally, the read determines - * what must be serialized here, if anything. - * - * @param out the output stream - */ - protected void doWriteObject(ObjectOutputStream out) throws IOException { - out.writeFloat(loadFactor); - out.writeInt(data.length); - out.writeInt(size); - for (MapIterator it = mapIterator(); it.hasNext();) { - out.writeObject(it.next()); - out.writeObject(it.getValue()); - } - } - - /** - * Reads the map data from the stream. This method must be overridden if a - * subclass must be setup before put() is used. - *

                  - * Serialization is not one of the JDK's nicest topics. Normal serialization will - * initialise the superclass before the subclass. Sometimes however, this isn't - * what you want, as in this case the put() method on read can be - * affected by subclass state. - *

                  - * The solution adopted here is to deserialize the state data of this class in - * this protected method. This method must be called by the - * readObject() of the first serializable subclass. - *

                  - * Subclasses may override if the subclass has a specific field that must be present - * before put() or calculateThreshold() will work correctly. - * - * @param in the input stream - */ - protected void doReadObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - loadFactor = in.readFloat(); - int capacity = in.readInt(); - int size = in.readInt(); - init(); - threshold = calculateThreshold(capacity, loadFactor); - data = new HashEntry[capacity]; - for (int i = 0; i < size; i++) { - Object key = in.readObject(); - Object value = in.readObject(); - put(key, value); - } - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - *

                  - * To implement clone(), a subclass must implement the - * Cloneable interface and make this method public. - * - * @return a shallow clone - */ - protected Object clone() { - try { - AbstractHashedMap cloned = (AbstractHashedMap) super.clone(); - cloned.data = new HashEntry[data.length]; - cloned.entrySet = null; - cloned.keySet = null; - cloned.values = null; - cloned.modCount = 0; - cloned.size = 0; - cloned.init(); - cloned.putAll(this); - return cloned; - - } catch (CloneNotSupportedException ex) { - return null; // should never happen - } - } - - /** - * Compares this map with another. - * - * @param obj the object to compare to - * @return true if equal - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map == false) { - return false; - } - Map map = (Map) obj; - if (map.size() != size()) { - return false; - } - MapIterator it = mapIterator(); - try { - while (it.hasNext()) { - Object key = it.next(); - Object value = it.getValue(); - if (value == null) { - if (map.get(key) != null || map.containsKey(key) == false) { - return false; - } - } else { - if (value.equals(map.get(key)) == false) { - return false; - } - } - } - } catch (ClassCastException ignored) { - return false; - } catch (NullPointerException ignored) { - return false; - } - return true; - } - - /** - * Gets the standard Map hashCode. - * - * @return the hash code defined in the Map interface - */ - public int hashCode() { - int total = 0; - Iterator it = createEntrySetIterator(); - while (it.hasNext()) { - total += it.next().hashCode(); - } - return total; - } - - /** - * Gets the map as a String. - * - * @return a string version of the map - */ - public String toString() { - if (size() == 0) { - return "{}"; - } - StringBuffer buf = new StringBuffer(32 * size()); - buf.append('{'); - - MapIterator it = mapIterator(); - boolean hasNext = it.hasNext(); - while (hasNext) { - Object key = it.next(); - Object value = it.getValue(); - buf.append(key == this ? "(this Map)" : key) - .append('=') - .append(value == this ? "(this Map)" : value); - - hasNext = it.hasNext(); - if (hasNext) { - buf.append(',').append(' '); - } - } - - buf.append('}'); - return buf.toString(); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator.java deleted file mode 100644 index cd1e1c96894..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractInputCheckedMapDecorator.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.lang.reflect.Array; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; -import org.apache.commons.collections.keyvalue.AbstractMapEntryDecorator; -import org.apache.commons.collections.set.AbstractSetDecorator; - -/** - * An abstract base class that simplifies the task of creating map decorators. - *

                  - * The Map API is very difficult to decorate correctly, and involves implementing - * lots of different classes. This class exists to provide a simpler API. - *

                  - * Special hook methods are provided that are called when objects are added to - * the map. By overriding these methods, the input can be validated or manipulated. - * In addition to the main map methods, the entrySet is also affected, which is - * the hardest part of writing map implementations. - *

                  - * This class is package-scoped, and may be withdrawn or replaced in future - * versions of Commons Collections. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -abstract class AbstractInputCheckedMapDecorator - extends AbstractMapDecorator { - - /** - * Constructor only used in deserialization, do not use otherwise. - */ - protected AbstractInputCheckedMapDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - protected AbstractInputCheckedMapDecorator(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Hook method called when a value is being set using setValue. - *

                  - * An implementation may validate the value and throw an exception - * or it may transform the value into another object. - *

                  - * This implementation returns the input value. - * - * @param value the value to check - * @throws UnsupportedOperationException if the map may not be changed by setValue - * @throws IllegalArgumentException if the specified value is invalid - * @throws ClassCastException if the class of the specified value is invalid - * @throws NullPointerException if the specified value is null and nulls are invalid - */ - protected abstract Object checkSetValue(Object value); - - /** - * Hook method called to determine if checkSetValue has any effect. - *

                  - * An implementation should return false if the checkSetValue method - * has no effect as this optimises the implementation. - *

                  - * This implementation returns true. - * - * @return true always - */ - protected boolean isSetValueChecking() { - return true; - } - - //----------------------------------------------------------------------- - public Set entrySet() { - if (isSetValueChecking()) { - return new EntrySet(map.entrySet(), this); - } else { - return map.entrySet(); - } - } - - //----------------------------------------------------------------------- - /** - * Implementation of an entry set that checks additions via setValue. - */ - static class EntrySet extends AbstractSetDecorator { - - /** The parent map */ - private final AbstractInputCheckedMapDecorator parent; - - protected EntrySet(Set set, AbstractInputCheckedMapDecorator parent) { - super(set); - this.parent = parent; - } - - public Iterator iterator() { - return new EntrySetIterator(collection.iterator(), parent); - } - - public Object[] toArray() { - Object[] array = collection.toArray(); - for (int i = 0; i < array.length; i++) { - array[i] = new MapEntry((Map.Entry) array[i], parent); - } - return array; - } - - public Object[] toArray(Object array[]) { - Object[] result = array; - if (array.length > 0) { - // we must create a new array to handle multi-threaded situations - // where another thread could access data before we decorate it - result = (Object[]) Array.newInstance(array.getClass().getComponentType(), 0); - } - result = collection.toArray(result); - for (int i = 0; i < result.length; i++) { - result[i] = new MapEntry((Map.Entry) result[i], parent); - } - - // check to see if result should be returned straight - if (result.length > array.length) { - return result; - } - - // copy back into input array to fulfil the method contract - System.arraycopy(result, 0, array, 0, result.length); - if (array.length > result.length) { - array[result.length] = null; - } - return array; - } - } - - /** - * Implementation of an entry set iterator that checks additions via setValue. - */ - static class EntrySetIterator extends AbstractIteratorDecorator { - - /** The parent map */ - private final AbstractInputCheckedMapDecorator parent; - - protected EntrySetIterator(Iterator iterator, AbstractInputCheckedMapDecorator parent) { - super(iterator); - this.parent = parent; - } - - public Object next() { - Map.Entry entry = (Map.Entry) iterator.next(); - return new MapEntry(entry, parent); - } - } - - /** - * Implementation of a map entry that checks additions via setValue. - */ - static class MapEntry extends AbstractMapEntryDecorator { - - /** The parent map */ - private final AbstractInputCheckedMapDecorator parent; - - protected MapEntry(Map.Entry entry, AbstractInputCheckedMapDecorator parent) { - super(entry); - this.parent = parent; - } - - public Object setValue(Object value) { - value = parent.checkSetValue(value); - return entry.setValue(value); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractLinkedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractLinkedMap.java deleted file mode 100644 index 3746a57f9ee..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractLinkedMap.java +++ /dev/null @@ -1,613 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedIterator; -import org.apache.commons.collections.OrderedMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.ResettableIterator; -import org.apache.commons.collections.iterators.EmptyOrderedIterator; -import org.apache.commons.collections.iterators.EmptyOrderedMapIterator; - -/** - * An abstract implementation of a hash-based map that links entries to create an - * ordered map and which provides numerous points for subclasses to override. - *

                  - * This class implements all the features necessary for a subclass linked - * hash-based map. Key-value entries are stored in instances of the - * LinkEntry class which can be overridden and replaced. - * The iterators can similarly be replaced, without the need to replace the KeySet, - * EntrySet and Values view classes. - *

                  - * Overridable methods are provided to change the default hashing behaviour, and - * to change how entries are added to and removed from the map. Hopefully, all you - * need for unusual subclasses is here. - *

                  - * This implementation maintains order by original insertion, but subclasses - * may work differently. The OrderedMap interface is implemented - * to provide access to bidirectional iteration and extra convenience methods. - *

                  - * The orderedMapIterator() method provides direct access to a - * bidirectional iterator. The iterators from the other views can also be cast - * to OrderedIterator if required. - *

                  - * All the available iterators can be reset back to the start by casting to - * ResettableIterator and calling reset(). - *

                  - * The implementation is also designed to be subclassed, with lots of useful - * methods exposed. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author java util LinkedHashMap - * @author Stephen Colebourne - */ -public class AbstractLinkedMap extends AbstractHashedMap implements OrderedMap { - - /** Header in the linked list */ - protected transient LinkEntry header; - - /** - * Constructor only used in deserialization, do not use otherwise. - */ - protected AbstractLinkedMap() { - super(); - } - - /** - * Constructor which performs no validation on the passed in parameters. - * - * @param initialCapacity the initial capacity, must be a power of two - * @param loadFactor the load factor, must be > 0.0f and generally < 1.0f - * @param threshold the threshold, must be sensible - */ - protected AbstractLinkedMap(int initialCapacity, float loadFactor, int threshold) { - super(initialCapacity, loadFactor, threshold); - } - - /** - * Constructs a new, empty map with the specified initial capacity. - * - * @param initialCapacity the initial capacity - * @throws IllegalArgumentException if the initial capacity is less than one - */ - protected AbstractLinkedMap(int initialCapacity) { - super(initialCapacity); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor - * @throws IllegalArgumentException if the initial capacity is less than one - * @throws IllegalArgumentException if the load factor is less than zero - */ - protected AbstractLinkedMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - protected AbstractLinkedMap(Map map) { - super(map); - } - - /** - * Initialise this subclass during construction. - *

                  - * NOTE: As from v3.2 this method calls - * {@link #createEntry(HashEntry, int, Object, Object)} to create - * the map entry object. - */ - protected void init() { - header = (LinkEntry) createEntry(null, -1, null, null); - header.before = header.after = header; - } - - //----------------------------------------------------------------------- - /** - * Checks whether the map contains the specified value. - * - * @param value the value to search for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - // override uses faster iterator - if (value == null) { - for (LinkEntry entry = header.after; entry != header; entry = entry.after) { - if (entry.getValue() == null) { - return true; - } - } - } else { - for (LinkEntry entry = header.after; entry != header; entry = entry.after) { - if (isEqualValue(value, entry.getValue())) { - return true; - } - } - } - return false; - } - - /** - * Clears the map, resetting the size to zero and nullifying references - * to avoid garbage collection issues. - */ - public void clear() { - // override to reset the linked list - super.clear(); - header.before = header.after = header; - } - - //----------------------------------------------------------------------- - /** - * Gets the first key in the map, which is the most recently inserted. - * - * @return the most recently inserted key - */ - public Object firstKey() { - if (size == 0) { - throw new NoSuchElementException("Map is empty"); - } - return header.after.getKey(); - } - - /** - * Gets the last key in the map, which is the first inserted. - * - * @return the eldest key - */ - public Object lastKey() { - if (size == 0) { - throw new NoSuchElementException("Map is empty"); - } - return header.before.getKey(); - } - - /** - * Gets the next key in sequence. - * - * @param key the key to get after - * @return the next key - */ - public Object nextKey(Object key) { - LinkEntry entry = (LinkEntry) getEntry(key); - return (entry == null || entry.after == header ? null : entry.after.getKey()); - } - - /** - * Gets the previous key in sequence. - * - * @param key the key to get before - * @return the previous key - */ - public Object previousKey(Object key) { - LinkEntry entry = (LinkEntry) getEntry(key); - return (entry == null || entry.before == header ? null : entry.before.getKey()); - } - - //----------------------------------------------------------------------- - /** - * Gets the key at the specified index. - * - * @param index the index to retrieve - * @return the key at the specified index - * @throws IndexOutOfBoundsException if the index is invalid - */ - protected LinkEntry getEntry(int index) { - if (index < 0) { - throw new IndexOutOfBoundsException("Index " + index + " is less than zero"); - } - if (index >= size) { - throw new IndexOutOfBoundsException("Index " + index + " is invalid for size " + size); - } - LinkEntry entry; - if (index < (size / 2)) { - // Search forwards - entry = header.after; - for (int currentIndex = 0; currentIndex < index; currentIndex++) { - entry = entry.after; - } - } else { - // Search backwards - entry = header; - for (int currentIndex = size; currentIndex > index; currentIndex--) { - entry = entry.before; - } - } - return entry; - } - - /** - * Adds an entry into this map, maintaining insertion order. - *

                  - * This implementation adds the entry to the data storage table and - * to the end of the linked list. - * - * @param entry the entry to add - * @param hashIndex the index into the data array to store at - */ - protected void addEntry(HashEntry entry, int hashIndex) { - LinkEntry link = (LinkEntry) entry; - link.after = header; - link.before = header.before; - header.before.after = link; - header.before = link; - data[hashIndex] = entry; - } - - /** - * Creates an entry to store the data. - *

                  - * This implementation creates a new LinkEntry instance. - * - * @param next the next entry in sequence - * @param hashCode the hash code to use - * @param key the key to store - * @param value the value to store - * @return the newly created entry - */ - protected HashEntry createEntry(HashEntry next, int hashCode, Object key, Object value) { - return new LinkEntry(next, hashCode, key, value); - } - - /** - * Removes an entry from the map and the linked list. - *

                  - * This implementation removes the entry from the linked list chain, then - * calls the superclass implementation. - * - * @param entry the entry to remove - * @param hashIndex the index into the data structure - * @param previous the previous entry in the chain - */ - protected void removeEntry(HashEntry entry, int hashIndex, HashEntry previous) { - LinkEntry link = (LinkEntry) entry; - link.before.after = link.after; - link.after.before = link.before; - link.after = null; - link.before = null; - super.removeEntry(entry, hashIndex, previous); - } - - //----------------------------------------------------------------------- - /** - * Gets the before field from a LinkEntry. - * Used in subclasses that have no visibility of the field. - * - * @param entry the entry to query, must not be null - * @return the before field of the entry - * @throws NullPointerException if the entry is null - * @since Commons Collections 3.1 - */ - protected LinkEntry entryBefore(LinkEntry entry) { - return entry.before; - } - - /** - * Gets the after field from a LinkEntry. - * Used in subclasses that have no visibility of the field. - * - * @param entry the entry to query, must not be null - * @return the after field of the entry - * @throws NullPointerException if the entry is null - * @since Commons Collections 3.1 - */ - protected LinkEntry entryAfter(LinkEntry entry) { - return entry.after; - } - - //----------------------------------------------------------------------- - /** - * Gets an iterator over the map. - * Changes made to the iterator affect this map. - *

                  - * A MapIterator returns the keys in the map. It also provides convenient - * methods to get the key and value, and set the value. - * It avoids the need to create an entrySet/keySet/values object. - * - * @return the map iterator - */ - public MapIterator mapIterator() { - if (size == 0) { - return EmptyOrderedMapIterator.INSTANCE; - } - return new LinkMapIterator(this); - } - - /** - * Gets a bidirectional iterator over the map. - * Changes made to the iterator affect this map. - *

                  - * A MapIterator returns the keys in the map. It also provides convenient - * methods to get the key and value, and set the value. - * It avoids the need to create an entrySet/keySet/values object. - * - * @return the map iterator - */ - public OrderedMapIterator orderedMapIterator() { - if (size == 0) { - return EmptyOrderedMapIterator.INSTANCE; - } - return new LinkMapIterator(this); - } - - /** - * MapIterator implementation. - */ - protected static class LinkMapIterator extends LinkIterator implements OrderedMapIterator { - - protected LinkMapIterator(AbstractLinkedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry().getKey(); - } - - public Object previous() { - return super.previousEntry().getKey(); - } - - public Object getKey() { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - return current.getKey(); - } - - public Object getValue() { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - return current.getValue(); - } - - public Object setValue(Object value) { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - return current.setValue(value); - } - } - - //----------------------------------------------------------------------- - /** - * Creates an entry set iterator. - * Subclasses can override this to return iterators with different properties. - * - * @return the entrySet iterator - */ - protected Iterator createEntrySetIterator() { - if (size() == 0) { - return EmptyOrderedIterator.INSTANCE; - } - return new EntrySetIterator(this); - } - - /** - * EntrySet iterator. - */ - protected static class EntrySetIterator extends LinkIterator { - - protected EntrySetIterator(AbstractLinkedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry(); - } - - public Object previous() { - return super.previousEntry(); - } - } - - //----------------------------------------------------------------------- - /** - * Creates a key set iterator. - * Subclasses can override this to return iterators with different properties. - * - * @return the keySet iterator - */ - protected Iterator createKeySetIterator() { - if (size() == 0) { - return EmptyOrderedIterator.INSTANCE; - } - return new KeySetIterator(this); - } - - /** - * KeySet iterator. - */ - protected static class KeySetIterator extends EntrySetIterator { - - protected KeySetIterator(AbstractLinkedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry().getKey(); - } - - public Object previous() { - return super.previousEntry().getKey(); - } - } - - //----------------------------------------------------------------------- - /** - * Creates a values iterator. - * Subclasses can override this to return iterators with different properties. - * - * @return the values iterator - */ - protected Iterator createValuesIterator() { - if (size() == 0) { - return EmptyOrderedIterator.INSTANCE; - } - return new ValuesIterator(this); - } - - /** - * Values iterator. - */ - protected static class ValuesIterator extends LinkIterator { - - protected ValuesIterator(AbstractLinkedMap parent) { - super(parent); - } - - public Object next() { - return super.nextEntry().getValue(); - } - - public Object previous() { - return super.previousEntry().getValue(); - } - } - - //----------------------------------------------------------------------- - /** - * LinkEntry that stores the data. - *

                  - * If you subclass AbstractLinkedMap but not LinkEntry - * then you will not be able to access the protected fields. - * The entryXxx() methods on AbstractLinkedMap exist - * to provide the necessary access. - */ - protected static class LinkEntry extends HashEntry { - /** The entry before this one in the order */ - protected LinkEntry before; - /** The entry after this one in the order */ - protected LinkEntry after; - - /** - * Constructs a new entry. - * - * @param next the next entry in the hash bucket sequence - * @param hashCode the hash code - * @param key the key - * @param value the value - */ - protected LinkEntry(HashEntry next, int hashCode, Object key, Object value) { - super(next, hashCode, key, value); - } - } - - /** - * Base Iterator that iterates in link order. - */ - protected static abstract class LinkIterator - implements OrderedIterator, ResettableIterator { - - /** The parent map */ - protected final AbstractLinkedMap parent; - /** The current (last returned) entry */ - protected LinkEntry last; - /** The next entry */ - protected LinkEntry next; - /** The modification count expected */ - protected int expectedModCount; - - protected LinkIterator(AbstractLinkedMap parent) { - super(); - this.parent = parent; - this.next = parent.header.after; - this.expectedModCount = parent.modCount; - } - - public boolean hasNext() { - return (next != parent.header); - } - - public boolean hasPrevious() { - return (next.before != parent.header); - } - - protected LinkEntry nextEntry() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - if (next == parent.header) { - throw new NoSuchElementException(AbstractHashedMap.NO_NEXT_ENTRY); - } - last = next; - next = next.after; - return last; - } - - protected LinkEntry previousEntry() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - LinkEntry previous = next.before; - if (previous == parent.header) { - throw new NoSuchElementException(AbstractHashedMap.NO_PREVIOUS_ENTRY); - } - next = previous; - last = previous; - return last; - } - - protected LinkEntry currentEntry() { - return last; - } - - public void remove() { - if (last == null) { - throw new IllegalStateException(AbstractHashedMap.REMOVE_INVALID); - } - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - parent.remove(last.getKey()); - last = null; - expectedModCount = parent.modCount; - } - - public void reset() { - last = null; - next = parent.header.after; - } - - public String toString() { - if (last != null) { - return "Iterator[" + last.getKey() + "=" + last.getValue() + "]"; - } else { - return "Iterator[]"; - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractMapDecorator.java deleted file mode 100644 index 2cd4a8e1b5f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractMapDecorator.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -/** - * Provides a base decorator that enables additional functionality to be added - * to a Map via decoration. - *

                  - * Methods are forwarded directly to the decorated map. - *

                  - * This implementation does not perform any special processing with - * {@link #entrySet()}, {@link #keySet()} or {@link #values()}. Instead - * it simply returns the set/collection from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating - * implementation it would provide a loophole around the validation. - * But, you might want that loophole, so this class is kept simple. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Daniel Rall - * @author Stephen Colebourne - */ -public abstract class AbstractMapDecorator implements Map { - - /** The map to decorate */ - protected transient Map map; - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractMapDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractMapDecorator(Map map) { - if (map == null) { - throw new IllegalArgumentException("Map must not be null"); - } - this.map = map; - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected Map getMap() { - return map; - } - - //----------------------------------------------------------------------- - public void clear() { - map.clear(); - } - - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - public boolean containsValue(Object value) { - return map.containsValue(value); - } - - public Set entrySet() { - return map.entrySet(); - } - - public Object get(Object key) { - return map.get(key); - } - - public boolean isEmpty() { - return map.isEmpty(); - } - - public Set keySet() { - return map.keySet(); - } - - public Object put(Object key, Object value) { - return map.put(key, value); - } - - public void putAll(Map mapToCopy) { - map.putAll(mapToCopy); - } - - public Object remove(Object key) { - return map.remove(key); - } - - public int size() { - return map.size(); - } - - public Collection values() { - return map.values(); - } - - public boolean equals(Object object) { - if (object == this) { - return true; - } - return map.equals(object); - } - - public int hashCode() { - return map.hashCode(); - } - - public String toString() { - return map.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractOrderedMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractOrderedMapDecorator.java deleted file mode 100644 index a2143227a52..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractOrderedMapDecorator.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedMap; -import org.apache.commons.collections.OrderedMapIterator; - -/** - * Provides a base decorator that enables additional functionality to be added - * to an OrderedMap via decoration. - *

                  - * Methods are forwarded directly to the decorated map. - *

                  - * This implementation does not perform any special processing with the map views. - * Instead it simply returns the set/collection from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating implementation - * it would provide a loophole around the validation. - * But, you might want that loophole, so this class is kept simple. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractOrderedMapDecorator - extends AbstractMapDecorator implements OrderedMap { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractOrderedMapDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractOrderedMapDecorator(OrderedMap map) { - super(map); - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected OrderedMap getOrderedMap() { - return (OrderedMap) map; - } - - //----------------------------------------------------------------------- - public Object firstKey() { - return getOrderedMap().firstKey(); - } - - public Object lastKey() { - return getOrderedMap().lastKey(); - } - - public Object nextKey(Object key) { - return getOrderedMap().nextKey(key); - } - - public Object previousKey(Object key) { - return getOrderedMap().previousKey(key); - } - - public MapIterator mapIterator() { - return getOrderedMap().mapIterator(); - } - - public OrderedMapIterator orderedMapIterator() { - return getOrderedMap().orderedMapIterator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractReferenceMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractReferenceMap.java deleted file mode 100644 index e6b7354409d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractReferenceMap.java +++ /dev/null @@ -1,981 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.ref.Reference; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.keyvalue.DefaultMapEntry; - -/** - * An abstract implementation of a hash-based map that allows the entries to - * be removed by the garbage collector. - *

                  - * This class implements all the features necessary for a subclass reference - * hash-based map. Key-value entries are stored in instances of the - * ReferenceEntry class which can be overridden and replaced. - * The iterators can similarly be replaced, without the need to replace the KeySet, - * EntrySet and Values view classes. - *

                  - * Overridable methods are provided to change the default hashing behaviour, and - * to change how entries are added to and removed from the map. Hopefully, all you - * need for unusual subclasses is here. - *

                  - * When you construct an AbstractReferenceMap, you can specify what - * kind of references are used to store the map's keys and values. - * If non-hard references are used, then the garbage collector can remove - * mappings if a key or value becomes unreachable, or if the JVM's memory is - * running low. For information on how the different reference types behave, - * see {@link Reference}. - *

                  - * Different types of references can be specified for keys and values. - * The keys can be configured to be weak but the values hard, - * in which case this class will behave like a - * - * WeakHashMap. However, you can also specify hard keys and - * weak values, or any other combination. The default constructor uses - * hard keys and soft values, providing a memory-sensitive cache. - *

                  - * This {@link Map} implementation does not allow null elements. - * Attempting to add a null key or value to the map will raise a - * NullPointerException. - *

                  - * All the available iterators can be reset back to the start by casting to - * ResettableIterator and calling reset(). - *

                  - * This implementation is not synchronized. - * You can use {@link java.util.Collections#synchronizedMap} to - * provide synchronized access to a ReferenceMap. - * - * @see java.lang.ref.Reference - * @since Commons Collections 3.1 (extracted from ReferenceMap in 3.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - * @author Stephen Colebourne - */ -public abstract class AbstractReferenceMap extends AbstractHashedMap { - - /** Constant indicating that hard references should be used */ - public static final int HARD = 0; - - /** Constant indicating that soft references should be used */ - public static final int SOFT = 1; - - /** Constant indicating that weak references should be used */ - public static final int WEAK = 2; - - /** - * The reference type for keys. Must be HARD, SOFT, WEAK. - * @serial - */ - protected int keyType; - - /** - * The reference type for values. Must be HARD, SOFT, WEAK. - * @serial - */ - protected int valueType; - - /** - * Should the value be automatically purged when the associated key has been collected? - */ - protected boolean purgeValues; - - /** - * ReferenceQueue used to eliminate stale mappings. - * See purge. - */ - private transient ReferenceQueue queue; - - //----------------------------------------------------------------------- - /** - * Constructor used during deserialization. - */ - protected AbstractReferenceMap() { - super(); - } - - /** - * Constructs a new empty map with the specified reference types, - * load factor and initial capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - protected AbstractReferenceMap( - int keyType, int valueType, int capacity, - float loadFactor, boolean purgeValues) { - super(capacity, loadFactor); - verify("keyType", keyType); - verify("valueType", valueType); - this.keyType = keyType; - this.valueType = valueType; - this.purgeValues = purgeValues; - } - - /** - * Initialise this subclass during construction, cloning or deserialization. - */ - protected void init() { - queue = new ReferenceQueue(); - } - - //----------------------------------------------------------------------- - /** - * Checks the type int is a valid value. - * - * @param name the name for error messages - * @param type the type value to check - * @throws IllegalArgumentException if the value if invalid - */ - private static void verify(String name, int type) { - if ((type < HARD) || (type > WEAK)) { - throw new IllegalArgumentException(name + " must be HARD, SOFT, WEAK."); - } - } - - //----------------------------------------------------------------------- - /** - * Gets the size of the map. - * - * @return the size - */ - public int size() { - purgeBeforeRead(); - return super.size(); - } - - /** - * Checks whether the map is currently empty. - * - * @return true if the map is currently size zero - */ - public boolean isEmpty() { - purgeBeforeRead(); - return super.isEmpty(); - } - - /** - * Checks whether the map contains the specified key. - * - * @param key the key to search for - * @return true if the map contains the key - */ - public boolean containsKey(Object key) { - purgeBeforeRead(); - Entry entry = getEntry(key); - if (entry == null) { - return false; - } - return (entry.getValue() != null); - } - - /** - * Checks whether the map contains the specified value. - * - * @param value the value to search for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - purgeBeforeRead(); - if (value == null) { - return false; - } - return super.containsValue(value); - } - - /** - * Gets the value mapped to the key specified. - * - * @param key the key - * @return the mapped value, null if no match - */ - public Object get(Object key) { - purgeBeforeRead(); - Entry entry = getEntry(key); - if (entry == null) { - return null; - } - return entry.getValue(); - } - - - /** - * Puts a key-value mapping into this map. - * Neither the key nor the value may be null. - * - * @param key the key to add, must not be null - * @param value the value to add, must not be null - * @return the value previously mapped to this key, null if none - * @throws NullPointerException if either the key or value is null - */ - public Object put(Object key, Object value) { - if (key == null) { - throw new NullPointerException("null keys not allowed"); - } - if (value == null) { - throw new NullPointerException("null values not allowed"); - } - - purgeBeforeWrite(); - return super.put(key, value); - } - - /** - * Removes the specified mapping from this map. - * - * @param key the mapping to remove - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key) { - if (key == null) { - return null; - } - purgeBeforeWrite(); - return super.remove(key); - } - - /** - * Clears this map. - */ - public void clear() { - super.clear(); - while (queue.poll() != null) {} // drain the queue - } - - //----------------------------------------------------------------------- - /** - * Gets a MapIterator over the reference map. - * The iterator only returns valid key/value pairs. - * - * @return a map iterator - */ - public MapIterator mapIterator() { - return new ReferenceMapIterator(this); - } - - /** - * Returns a set view of this map's entries. - * An iterator returned entry is valid until next() is called again. - * The setValue() method on the toArray entries has no effect. - * - * @return a set view of this map's entries - */ - public Set entrySet() { - if (entrySet == null) { - entrySet = new ReferenceEntrySet(this); - } - return entrySet; - } - - /** - * Returns a set view of this map's keys. - * - * @return a set view of this map's keys - */ - public Set keySet() { - if (keySet == null) { - keySet = new ReferenceKeySet(this); - } - return keySet; - } - - /** - * Returns a collection view of this map's values. - * - * @return a set view of this map's values - */ - public Collection values() { - if (values == null) { - values = new ReferenceValues(this); - } - return values; - } - - //----------------------------------------------------------------------- - /** - * Purges stale mappings from this map before read operations. - *

                  - * This implementation calls {@link #purge()} to maintain a consistent state. - */ - protected void purgeBeforeRead() { - purge(); - } - - /** - * Purges stale mappings from this map before write operations. - *

                  - * This implementation calls {@link #purge()} to maintain a consistent state. - */ - protected void purgeBeforeWrite() { - purge(); - } - - /** - * Purges stale mappings from this map. - *

                  - * Note that this method is not synchronized! Special - * care must be taken if, for instance, you want stale - * mappings to be removed on a periodic basis by some - * background thread. - */ - protected void purge() { - Reference ref = queue.poll(); - while (ref != null) { - purge(ref); - ref = queue.poll(); - } - } - - /** - * Purges the specified reference. - * - * @param ref the reference to purge - */ - protected void purge(Reference ref) { - // The hashCode of the reference is the hashCode of the - // mapping key, even if the reference refers to the - // mapping value... - int hash = ref.hashCode(); - int index = hashIndex(hash, data.length); - HashEntry previous = null; - HashEntry entry = data[index]; - while (entry != null) { - if (((ReferenceEntry) entry).purge(ref)) { - if (previous == null) { - data[index] = entry.next; - } else { - previous.next = entry.next; - } - this.size--; - return; - } - previous = entry; - entry = entry.next; - } - - } - - //----------------------------------------------------------------------- - /** - * Gets the entry mapped to the key specified. - * - * @param key the key - * @return the entry, null if no match - */ - protected HashEntry getEntry(Object key) { - if (key == null) { - return null; - } else { - return super.getEntry(key); - } - } - - /** - * Gets the hash code for a MapEntry. - * Subclasses can override this, for example to use the identityHashCode. - * - * @param key the key to get a hash code for, may be null - * @param value the value to get a hash code for, may be null - * @return the hash code, as per the MapEntry specification - */ - protected int hashEntry(Object key, Object value) { - return (key == null ? 0 : key.hashCode()) ^ - (value == null ? 0 : value.hashCode()); - } - - /** - * Compares two keys, in internal converted form, to see if they are equal. - *

                  - * This implementation converts the key from the entry to a real reference - * before comparison. - * - * @param key1 the first key to compare passed in from outside - * @param key2 the second key extracted from the entry via entry.key - * @return true if equal - */ - protected boolean isEqualKey(Object key1, Object key2) { - key2 = (keyType > HARD ? ((Reference) key2).get() : key2); - return (key1 == key2 || key1.equals(key2)); - } - - /** - * Creates a ReferenceEntry instead of a HashEntry. - * - * @param next the next entry in sequence - * @param hashCode the hash code to use - * @param key the key to store - * @param value the value to store - * @return the newly created entry - */ - protected HashEntry createEntry(HashEntry next, int hashCode, Object key, Object value) { - return new ReferenceEntry(this, next, hashCode, key, value); - } - - /** - * Creates an entry set iterator. - * - * @return the entrySet iterator - */ - protected Iterator createEntrySetIterator() { - return new ReferenceEntrySetIterator(this); - } - - /** - * Creates an key set iterator. - * - * @return the keySet iterator - */ - protected Iterator createKeySetIterator() { - return new ReferenceKeySetIterator(this); - } - - /** - * Creates an values iterator. - * - * @return the values iterator - */ - protected Iterator createValuesIterator() { - return new ReferenceValuesIterator(this); - } - - //----------------------------------------------------------------------- - /** - * EntrySet implementation. - */ - static class ReferenceEntrySet extends EntrySet { - - protected ReferenceEntrySet(AbstractHashedMap parent) { - super(parent); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] arr) { - // special implementation to handle disappearing entries - ArrayList list = new ArrayList(); - Iterator iterator = iterator(); - while (iterator.hasNext()) { - Entry e = (Entry) iterator.next(); - list.add(new DefaultMapEntry(e.getKey(), e.getValue())); - } - return list.toArray(arr); - } - } - - //----------------------------------------------------------------------- - /** - * KeySet implementation. - */ - static class ReferenceKeySet extends KeySet { - - protected ReferenceKeySet(AbstractHashedMap parent) { - super(parent); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] arr) { - // special implementation to handle disappearing keys - List list = new ArrayList(parent.size()); - for (Iterator it = iterator(); it.hasNext(); ) { - list.add(it.next()); - } - return list.toArray(arr); - } - } - - //----------------------------------------------------------------------- - /** - * Values implementation. - */ - static class ReferenceValues extends Values { - - protected ReferenceValues(AbstractHashedMap parent) { - super(parent); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] arr) { - // special implementation to handle disappearing values - List list = new ArrayList(parent.size()); - for (Iterator it = iterator(); it.hasNext(); ) { - list.add(it.next()); - } - return list.toArray(arr); - } - } - - //----------------------------------------------------------------------- - /** - * A MapEntry implementation for the map. - *

                  - * If getKey() or getValue() returns null, it means - * the mapping is stale and should be removed. - * - * @since Commons Collections 3.1 - */ - protected static class ReferenceEntry extends HashEntry { - /** The parent map */ - protected final AbstractReferenceMap parent; - - /** - * Creates a new entry object for the ReferenceMap. - * - * @param parent the parent map - * @param next the next entry in the hash bucket - * @param hashCode the hash code of the key - * @param key the key - * @param value the value - */ - public ReferenceEntry(AbstractReferenceMap parent, HashEntry next, int hashCode, Object key, Object value) { - super(next, hashCode, null, null); - this.parent = parent; - this.key = toReference(parent.keyType, key, hashCode); - this.value = toReference(parent.valueType, value, hashCode); // the key hashCode is passed in deliberately - } - - /** - * Gets the key from the entry. - * This method dereferences weak and soft keys and thus may return null. - * - * @return the key, which may be null if it was garbage collected - */ - public Object getKey() { - return (parent.keyType > HARD) ? ((Reference) key).get() : key; - } - - /** - * Gets the value from the entry. - * This method dereferences weak and soft value and thus may return null. - * - * @return the value, which may be null if it was garbage collected - */ - public Object getValue() { - return (parent.valueType > HARD) ? ((Reference) value).get() : value; - } - - /** - * Sets the value of the entry. - * - * @param obj the object to store - * @return the previous value - */ - public Object setValue(Object obj) { - Object old = getValue(); - if (parent.valueType > HARD) { - ((Reference)value).clear(); - } - value = toReference(parent.valueType, obj, hashCode); - return old; - } - - /** - * Compares this map entry to another. - *

                  - * This implementation uses isEqualKey and - * isEqualValue on the main map for comparison. - * - * @param obj the other map entry to compare to - * @return true if equal, false if not - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - - Map.Entry entry = (Map.Entry)obj; - Object entryKey = entry.getKey(); // convert to hard reference - Object entryValue = entry.getValue(); // convert to hard reference - if ((entryKey == null) || (entryValue == null)) { - return false; - } - // compare using map methods, aiding identity subclass - // note that key is direct access and value is via method - return parent.isEqualKey(entryKey, key) && - parent.isEqualValue(entryValue, getValue()); - } - - /** - * Gets the hashcode of the entry using temporary hard references. - *

                  - * This implementation uses hashEntry on the main map. - * - * @return the hashcode of the entry - */ - public int hashCode() { - return parent.hashEntry(getKey(), getValue()); - } - - /** - * Constructs a reference of the given type to the given referent. - * The reference is registered with the queue for later purging. - * - * @param type HARD, SOFT or WEAK - * @param referent the object to refer to - * @param hash the hash code of the key of the mapping; - * this number might be different from referent.hashCode() if - * the referent represents a value and not a key - */ - protected Object toReference(int type, Object referent, int hash) { - switch (type) { - case HARD: return referent; - case SOFT: return new SoftRef(hash, referent, parent.queue); - case WEAK: return new WeakRef(hash, referent, parent.queue); - default: throw new Error(); - } - } - - /** - * Purges the specified reference - * @param ref the reference to purge - * @return true or false - */ - boolean purge(Reference ref) { - boolean r = (parent.keyType > HARD) && (key == ref); - r = r || ((parent.valueType > HARD) && (value == ref)); - if (r) { - if (parent.keyType > HARD) { - ((Reference)key).clear(); - } - if (parent.valueType > HARD) { - ((Reference)value).clear(); - } else if (parent.purgeValues) { - value = null; - } - } - return r; - } - - /** - * Gets the next entry in the bucket. - * - * @return the next entry in the bucket - */ - protected ReferenceEntry next() { - return (ReferenceEntry) next; - } - } - - //----------------------------------------------------------------------- - /** - * The EntrySet iterator. - */ - static class ReferenceEntrySetIterator implements Iterator { - /** The parent map */ - final AbstractReferenceMap parent; - - // These fields keep track of where we are in the table. - int index; - ReferenceEntry entry; - ReferenceEntry previous; - - // These Object fields provide hard references to the - // current and next entry; this assures that if hasNext() - // returns true, next() will actually return a valid element. - Object nextKey, nextValue; - Object currentKey, currentValue; - - int expectedModCount; - - public ReferenceEntrySetIterator(AbstractReferenceMap parent) { - super(); - this.parent = parent; - index = (parent.size() != 0 ? parent.data.length : 0); - // have to do this here! size() invocation above - // may have altered the modCount. - expectedModCount = parent.modCount; - } - - public boolean hasNext() { - checkMod(); - while (nextNull()) { - ReferenceEntry e = entry; - int i = index; - while ((e == null) && (i > 0)) { - i--; - e = (ReferenceEntry) parent.data[i]; - } - entry = e; - index = i; - if (e == null) { - currentKey = null; - currentValue = null; - return false; - } - nextKey = e.getKey(); - nextValue = e.getValue(); - if (nextNull()) { - entry = entry.next(); - } - } - return true; - } - - private void checkMod() { - if (parent.modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - - private boolean nextNull() { - return (nextKey == null) || (nextValue == null); - } - - protected ReferenceEntry nextEntry() { - checkMod(); - if (nextNull() && !hasNext()) { - throw new NoSuchElementException(); - } - previous = entry; - entry = entry.next(); - currentKey = nextKey; - currentValue = nextValue; - nextKey = null; - nextValue = null; - return previous; - } - - protected ReferenceEntry currentEntry() { - checkMod(); - return previous; - } - - public Object next() { - return nextEntry(); - } - - public void remove() { - checkMod(); - if (previous == null) { - throw new IllegalStateException(); - } - parent.remove(currentKey); - previous = null; - currentKey = null; - currentValue = null; - expectedModCount = parent.modCount; - } - } - - /** - * The keySet iterator. - */ - static class ReferenceKeySetIterator extends ReferenceEntrySetIterator { - - ReferenceKeySetIterator(AbstractReferenceMap parent) { - super(parent); - } - - public Object next() { - return nextEntry().getKey(); - } - } - - /** - * The values iterator. - */ - static class ReferenceValuesIterator extends ReferenceEntrySetIterator { - - ReferenceValuesIterator(AbstractReferenceMap parent) { - super(parent); - } - - public Object next() { - return nextEntry().getValue(); - } - } - - /** - * The MapIterator implementation. - */ - static class ReferenceMapIterator extends ReferenceEntrySetIterator implements MapIterator { - - protected ReferenceMapIterator(AbstractReferenceMap parent) { - super(parent); - } - - public Object next() { - return nextEntry().getKey(); - } - - public Object getKey() { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - return current.getKey(); - } - - public Object getValue() { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - return current.getValue(); - } - - public Object setValue(Object value) { - HashEntry current = currentEntry(); - if (current == null) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - return current.setValue(value); - } - } - - //----------------------------------------------------------------------- - // These two classes store the hashCode of the key of - // of the mapping, so that after they're dequeued a quick - // lookup of the bucket in the table can occur. - - /** - * A soft reference holder. - */ - static class SoftRef extends SoftReference { - /** the hashCode of the key (even if the reference points to a value) */ - private int hash; - - public SoftRef(int hash, Object r, ReferenceQueue q) { - super(r, q); - this.hash = hash; - } - - public int hashCode() { - return hash; - } - } - - /** - * A weak reference holder. - */ - static class WeakRef extends WeakReference { - /** the hashCode of the key (even if the reference points to a value) */ - private int hash; - - public WeakRef(int hash, Object r, ReferenceQueue q) { - super(r, q); - this.hash = hash; - } - - public int hashCode() { - return hash; - } - } - - //----------------------------------------------------------------------- - /** - * Replaces the superclass method to store the state of this class. - *

                  - * Serialization is not one of the JDK's nicest topics. Normal serialization will - * initialise the superclass before the subclass. Sometimes however, this isn't - * what you want, as in this case the put() method on read can be - * affected by subclass state. - *

                  - * The solution adopted here is to serialize the state data of this class in - * this protected method. This method must be called by the - * writeObject() of the first serializable subclass. - *

                  - * Subclasses may override if they have a specific field that must be present - * on read before this implementation will work. Generally, the read determines - * what must be serialized here, if anything. - * - * @param out the output stream - */ - protected void doWriteObject(ObjectOutputStream out) throws IOException { - out.writeInt(keyType); - out.writeInt(valueType); - out.writeBoolean(purgeValues); - out.writeFloat(loadFactor); - out.writeInt(data.length); - for (MapIterator it = mapIterator(); it.hasNext();) { - out.writeObject(it.next()); - out.writeObject(it.getValue()); - } - out.writeObject(null); // null terminate map - // do not call super.doWriteObject() as code there doesn't work for reference map - } - - /** - * Replaces the superclassm method to read the state of this class. - *

                  - * Serialization is not one of the JDK's nicest topics. Normal serialization will - * initialise the superclass before the subclass. Sometimes however, this isn't - * what you want, as in this case the put() method on read can be - * affected by subclass state. - *

                  - * The solution adopted here is to deserialize the state data of this class in - * this protected method. This method must be called by the - * readObject() of the first serializable subclass. - *

                  - * Subclasses may override if the subclass has a specific field that must be present - * before put() or calculateThreshold() will work correctly. - * - * @param in the input stream - */ - protected void doReadObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - this.keyType = in.readInt(); - this.valueType = in.readInt(); - this.purgeValues = in.readBoolean(); - this.loadFactor = in.readFloat(); - int capacity = in.readInt(); - init(); - data = new HashEntry[capacity]; - while (true) { - Object key = in.readObject(); - if (key == null) { - break; - } - Object value = in.readObject(); - put(key, value); - } - threshold = calculateThreshold(data.length, loadFactor); - // do not call super.doReadObject() as code there doesn't work for reference map - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractSortedMapDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractSortedMapDecorator.java deleted file mode 100644 index 4699acd3b88..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/AbstractSortedMapDecorator.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Comparator; -import java.util.SortedMap; - -/** - * Provides a base decorator that enables additional functionality to be added - * to a Map via decoration. - *

                  - * Methods are forwarded directly to the decorated map. - *

                  - * This implementation does not perform any special processing with the map views. - * Instead it simply returns the set/collection from the wrapped map. This may be - * undesirable, for example if you are trying to write a validating implementation - * it would provide a loophole around the validation. - * But, you might want that loophole, so this class is kept simple. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractSortedMapDecorator - extends AbstractMapDecorator implements SortedMap { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractSortedMapDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if the collection is null - */ - public AbstractSortedMapDecorator(SortedMap map) { - super(map); - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected SortedMap getSortedMap() { - return (SortedMap) map; - } - - //----------------------------------------------------------------------- - public Comparator comparator() { - return getSortedMap().comparator(); - } - - public Object firstKey() { - return getSortedMap().firstKey(); - } - - public SortedMap headMap(Object toKey) { - return getSortedMap().headMap(toKey); - } - - public Object lastKey() { - return getSortedMap().lastKey(); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - return getSortedMap().subMap(fromKey, toKey); - } - - public SortedMap tailMap(Object fromKey) { - return getSortedMap().tailMap(fromKey); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CaseInsensitiveMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CaseInsensitiveMap.java deleted file mode 100644 index 46b2e565c4c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CaseInsensitiveMap.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Map; - -/** - * A case-insensitive Map. - *

                  - * As entries are added to the map, keys are converted to all lowercase. A new - * key is compared to existing keys by comparing newKey.toString().toLower() - * to the lowercase values in the current KeySet. - *

                  - * Null keys are supported. - *

                  - * The keySet() method returns all lowercase keys, or nulls. - *

                  - * Example: - *

                  
                  - *  Map map = new CaseInsensitiveMap();
                  - *  map.put("One", "One");
                  - *  map.put("Two", "Two");
                  - *  map.put(null, "Three");
                  - *  map.put("one", "Four");
                  - * 
                  - * creates a CaseInsensitiveMap with three entries.
                  - * map.get(null) returns "Three" and map.get("ONE") - * returns "Four". The Set returned by keySet() - * equals {"one", "two", null}. - *

                  - * Note that CaseInsensitiveMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Commons-Collections team - */ -public class CaseInsensitiveMap extends AbstractHashedMap implements Serializable, Cloneable { - - /** Serialisation version */ - private static final long serialVersionUID = -7074655917369299456L; - - /** - * Constructs a new empty map with default size and load factor. - */ - public CaseInsensitiveMap() { - super(DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_THRESHOLD); - } - - /** - * Constructs a new, empty map with the specified initial capacity. - * - * @param initialCapacity the initial capacity - * @throws IllegalArgumentException if the initial capacity is less than one - */ - public CaseInsensitiveMap(int initialCapacity) { - super(initialCapacity); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor - * @throws IllegalArgumentException if the initial capacity is less than one - * @throws IllegalArgumentException if the load factor is less than zero - */ - public CaseInsensitiveMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - /** - * Constructor copying elements from another map. - *

                  - * Keys will be converted to lower case strings, which may cause - * some entries to be removed (if string representation of keys differ - * only by character case). - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - public CaseInsensitiveMap(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Overrides convertKey() from {@link AbstractHashedMap} to convert keys to - * lower case. - *

                  - * Returns null if key is null. - * - * @param key the key convert - * @return the converted key - */ - protected Object convertKey(Object key) { - if (key != null) { - return key.toString().toLowerCase(); - } else { - return AbstractHashedMap.NULL; - } - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - */ - public Object clone() { - return super.clone(); - } - - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CompositeMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CompositeMap.java deleted file mode 100644 index 627526f967d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/CompositeMap.java +++ /dev/null @@ -1,538 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.collection.CompositeCollection; -import org.apache.commons.collections.set.CompositeSet; - -/** - * Decorates a map of other maps to provide a single unified view. - *

                  - * Changes made to this map will actually be made on the decorated map. - * Add and remove operations require the use of a pluggable strategy. If no - * strategy is provided then add and remove are unsupported. - *

                  - * Note that CompositeMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.0 - * @version $Revision: 647116 $ $Date: 2008-04-11 12:23:08 +0100 (Fri, 11 Apr 2008) $ - * - * @author Brian McCallister - */ -public class CompositeMap implements Map { - - /** Array of all maps in the composite */ - private Map[] composite; - - /** Handle mutation operations */ - private MapMutator mutator; - - /** - * Create a new, empty, CompositeMap. - */ - public CompositeMap() { - this(new Map[]{}, null); - } - - /** - * Create a new CompositeMap with two composited Map instances. - * - * @param one the first Map to be composited - * @param two the second Map to be composited - * @throws IllegalArgumentException if there is a key collision - */ - public CompositeMap(Map one, Map two) { - this(new Map[]{one, two}, null); - } - - /** - * Create a new CompositeMap with two composited Map instances. - * - * @param one the first Map to be composited - * @param two the second Map to be composited - * @param mutator MapMutator to be used for mutation operations - */ - public CompositeMap(Map one, Map two, MapMutator mutator) { - this(new Map[]{one, two}, mutator); - } - - /** - * Create a new CompositeMap which composites all of the Map instances in the - * argument. It copies the argument array, it does not use it directly. - * - * @param composite the Maps to be composited - * @throws IllegalArgumentException if there is a key collision - */ - public CompositeMap(Map[] composite) { - this(composite, null); - } - - /** - * Create a new CompositeMap which composites all of the Map instances in the - * argument. It copies the argument array, it does not use it directly. - * - * @param composite Maps to be composited - * @param mutator MapMutator to be used for mutation operations - */ - public CompositeMap(Map[] composite, MapMutator mutator) { - this.mutator = mutator; - this.composite = new Map[0]; - for (int i = composite.length - 1; i >= 0; --i) { - this.addComposited(composite[i]); - } - } - - //----------------------------------------------------------------------- - /** - * Specify the MapMutator to be used by mutation operations. - * - * @param mutator the MapMutator to be used for mutation delegation - */ - public void setMutator(MapMutator mutator) { - this.mutator = mutator; - } - - /** - * Add an additional Map to the composite. - * - * @param map the Map to be added to the composite - * @throws IllegalArgumentException if there is a key collision and there is no - * MapMutator set to handle it. - */ - public synchronized void addComposited(Map map) throws IllegalArgumentException { - for (int i = composite.length - 1; i >= 0; --i) { - Collection intersect = CollectionUtils.intersection(this.composite[i].keySet(), map.keySet()); - if (intersect.size() != 0) { - if (this.mutator == null) { - throw new IllegalArgumentException("Key collision adding Map to CompositeMap"); - } - else { - this.mutator.resolveCollision(this, this.composite[i], map, intersect); - } - } - } - Map[] temp = new Map[this.composite.length + 1]; - System.arraycopy(this.composite, 0, temp, 0, this.composite.length); - temp[temp.length - 1] = map; - this.composite = temp; - } - - /** - * Remove a Map from the composite. - * - * @param map the Map to be removed from the composite - * @return The removed Map or null if map is not in the composite - */ - public synchronized Map removeComposited(Map map) { - int size = this.composite.length; - for (int i = 0; i < size; ++i) { - if (this.composite[i].equals(map)) { - Map[] temp = new Map[size - 1]; - System.arraycopy(this.composite, 0, temp, 0, i); - System.arraycopy(this.composite, i + 1, temp, i, size - i - 1); - this.composite = temp; - return map; - } - } - return null; - } - - //----------------------------------------------------------------------- - /** - * Calls clear() on all composited Maps. - * - * @throws UnsupportedOperationException if any of the composited Maps do not support clear() - */ - public void clear() { - for (int i = this.composite.length - 1; i >= 0; --i) { - this.composite[i].clear(); - } - } - - /** - * Returns true if this map contains a mapping for the specified - * key. More formally, returns true if and only if - * this map contains at a mapping for a key k such that - * (key==null ? k==null : key.equals(k)). (There can be - * at most one such mapping.) - * - * @param key key whose presence in this map is to be tested. - * @return true if this map contains a mapping for the specified - * key. - * - * @throws ClassCastException if the key is of an inappropriate type for - * this map (optional). - * @throws NullPointerException if the key is null and this map - * does not not permit null keys (optional). - */ - public boolean containsKey(Object key) { - for (int i = this.composite.length - 1; i >= 0; --i) { - if (this.composite[i].containsKey(key)) { - return true; - } - } - return false; - } - - /** - * Returns true if this map maps one or more keys to the - * specified value. More formally, returns true if and only if - * this map contains at least one mapping to a value v such that - * (value==null ? v==null : value.equals(v)). This operation - * will probably require time linear in the map size for most - * implementations of the Map interface. - * - * @param value value whose presence in this map is to be tested. - * @return true if this map maps one or more keys to the - * specified value. - * @throws ClassCastException if the value is of an inappropriate type for - * this map (optional). - * @throws NullPointerException if the value is null and this map - * does not not permit null values (optional). - */ - public boolean containsValue(Object value) { - for (int i = this.composite.length - 1; i >= 0; --i) { - if (this.composite[i].containsValue(value)) { - return true; - } - } - return false; - } - - /** - * Returns a set view of the mappings contained in this map. Each element - * in the returned set is a Map.Entry. The set is backed by the - * map, so changes to the map are reflected in the set, and vice-versa. - * If the map is modified while an iteration over the set is in progress, - * the results of the iteration are undefined. The set supports element - * removal, which removes the corresponding mapping from the map, via the - * Iterator.remove, Set.remove, removeAll, - * retainAll and clear operations. It does not support - * the add or addAll operations. - *

                  - * This implementation returns a CompositeSet which - * composites the entry sets from all of the composited maps. - * - * @see CompositeSet - * @return a set view of the mappings contained in this map. - */ - public Set entrySet() { - CompositeSet entries = new CompositeSet(); - for (int i = this.composite.length - 1; i >= 0; --i) { - entries.addComposited(this.composite[i].entrySet()); - } - return entries; - } - - /** - * Returns the value to which this map maps the specified key. Returns - * null if the map contains no mapping for this key. A return - * value of null does not necessarily indicate that the - * map contains no mapping for the key; it's also possible that the map - * explicitly maps the key to null. The containsKey - * operation may be used to distinguish these two cases. - * - *

                  More formally, if this map contains a mapping from a key - * k to a value v such that (key==null ? k==null : - * key.equals(k)), then this method returns v; otherwise - * it returns null. (There can be at most one such mapping.) - * - * @param key key whose associated value is to be returned. - * @return the value to which this map maps the specified key, or - * null if the map contains no mapping for this key. - * - * @throws ClassCastException if the key is of an inappropriate type for - * this map (optional). - * @throws NullPointerException key is null and this map does not - * not permit null keys (optional). - * - * @see #containsKey(Object) - */ - public Object get(Object key) { - for (int i = this.composite.length - 1; i >= 0; --i) { - if (this.composite[i].containsKey(key)) { - return this.composite[i].get(key); - } - } - return null; - } - - /** - * Returns true if this map contains no key-value mappings. - * - * @return true if this map contains no key-value mappings. - */ - public boolean isEmpty() { - for (int i = this.composite.length - 1; i >= 0; --i) { - if (!this.composite[i].isEmpty()) { - return false; - } - } - return true; - } - - /** - * Returns a set view of the keys contained in this map. The set is - * backed by the map, so changes to the map are reflected in the set, and - * vice-versa. If the map is modified while an iteration over the set is - * in progress, the results of the iteration are undefined. The set - * supports element removal, which removes the corresponding mapping from - * the map, via the Iterator.remove, Set.remove, - * removeAll retainAll, and clear operations. - * It does not support the add or addAll operations. - *

                  - * This implementation returns a CompositeSet which - * composites the key sets from all of the composited maps. - * - * @return a set view of the keys contained in this map. - */ - public Set keySet() { - CompositeSet keys = new CompositeSet(); - for (int i = this.composite.length - 1; i >= 0; --i) { - keys.addComposited(this.composite[i].keySet()); - } - return keys; - } - - /** - * Associates the specified value with the specified key in this map - * (optional operation). If the map previously contained a mapping for - * this key, the old value is replaced by the specified value. (A map - * m is said to contain a mapping for a key k if and only - * if {@link #containsKey(Object) m.containsKey(k)} would return - * true.)) - * - * @param key key with which the specified value is to be associated. - * @param value value to be associated with the specified key. - * @return previous value associated with specified key, or null - * if there was no mapping for key. A null return can - * also indicate that the map previously associated null - * with the specified key, if the implementation supports - * null values. - * - * @throws UnsupportedOperationException if no MapMutator has been specified - * @throws ClassCastException if the class of the specified key or value - * prevents it from being stored in this map. - * @throws IllegalArgumentException if some aspect of this key or value - * prevents it from being stored in this map. - * @throws NullPointerException this map does not permit null - * keys or values, and the specified key or value is - * null. - */ - public Object put(Object key, Object value) { - if (this.mutator == null) { - throw new UnsupportedOperationException("No mutator specified"); - } - return this.mutator.put(this, this.composite, key, value); - } - - /** - * Copies all of the mappings from the specified map to this map - * (optional operation). The effect of this call is equivalent to that - * of calling {@link #put(Object,Object) put(k, v)} on this map once - * for each mapping from key k to value v in the - * specified map. The behavior of this operation is unspecified if the - * specified map is modified while the operation is in progress. - * - * @param map Mappings to be stored in this map. - * - * @throws UnsupportedOperationException if the putAll method is - * not supported by this map. - * - * @throws ClassCastException if the class of a key or value in the - * specified map prevents it from being stored in this map. - * - * @throws IllegalArgumentException some aspect of a key or value in the - * specified map prevents it from being stored in this map. - * @throws NullPointerException the specified map is null, or if - * this map does not permit null keys or values, and the - * specified map contains null keys or values. - */ - public void putAll(Map map) { - if (this.mutator == null) { - throw new UnsupportedOperationException("No mutator specified"); - } - this.mutator.putAll(this, this.composite, map); - } - - /** - * Removes the mapping for this key from this map if it is present - * (optional operation). More formally, if this map contains a mapping - * from key k to value v such that - * (key==null ? k==null : key.equals(k)), that mapping - * is removed. (The map can contain at most one such mapping.) - * - *

                  Returns the value to which the map previously associated the key, or - * null if the map contained no mapping for this key. (A - * null return can also indicate that the map previously - * associated null with the specified key if the implementation - * supports null values.) The map will not contain a mapping for - * the specified key once the call returns. - * - * @param key key whose mapping is to be removed from the map. - * @return previous value associated with specified key, or null - * if there was no mapping for key. - * - * @throws ClassCastException if the key is of an inappropriate type for - * the composited map (optional). - * @throws NullPointerException if the key is null and the composited map - * does not not permit null keys (optional). - * @throws UnsupportedOperationException if the remove method is - * not supported by the composited map containing the key - */ - public Object remove(Object key) { - for (int i = this.composite.length - 1; i >= 0; --i) { - if (this.composite[i].containsKey(key)) { - return this.composite[i].remove(key); - } - } - return null; - } - - /** - * Returns the number of key-value mappings in this map. If the - * map contains more than Integer.MAX_VALUE elements, returns - * Integer.MAX_VALUE. - * - * @return the number of key-value mappings in this map. - */ - public int size() { - int size = 0; - for (int i = this.composite.length - 1; i >= 0; --i) { - size += this.composite[i].size(); - } - return size; - } - - /** - * Returns a collection view of the values contained in this map. The - * collection is backed by the map, so changes to the map are reflected in - * the collection, and vice-versa. If the map is modified while an - * iteration over the collection is in progress, the results of the - * iteration are undefined. The collection supports element removal, - * which removes the corresponding mapping from the map, via the - * Iterator.remove, Collection.remove, - * removeAll, retainAll and clear operations. - * It does not support the add or addAll operations. - * - * @return a collection view of the values contained in this map. - */ - public Collection values() { - CompositeCollection keys = new CompositeCollection(); - for (int i = this.composite.length - 1; i >= 0; --i) { - keys.addComposited(this.composite[i].values()); - } - return keys; - } - - /** - * Checks if this Map equals another as per the Map specification. - * - * @param obj the object to compare to - * @return true if the maps are equal - */ - public boolean equals(Object obj) { - if (obj instanceof Map) { - Map map = (Map) obj; - return (this.entrySet().equals(map.entrySet())); - } - return false; - } - - /** - * Gets a hash code for the Map as per the Map specification. - */ - public int hashCode() { - int code = 0; - for (Iterator i = this.entrySet().iterator(); i.hasNext();) { - code += i.next().hashCode(); - } - return code; - } - - /** - * This interface allows definition for all of the indeterminate - * mutators in a CompositeMap, as well as providing a hook for - * callbacks on key collisions. - */ - public static interface MapMutator { - /** - * Called when adding a new Composited Map results in a - * key collision. - * - * @param composite the CompositeMap with the collision - * @param existing the Map already in the composite which contains the - * offending key - * @param added the Map being added - * @param intersect the intersection of the keysets of the existing and added maps - */ - public void resolveCollision( - CompositeMap composite, Map existing, Map added, Collection intersect); - - /** - * Called when the CompositeMap.put() method is invoked. - * - * @param map the CompositeMap which is being modified - * @param composited array of Maps in the CompositeMap being modified - * @param key key with which the specified value is to be associated. - * @param value value to be associated with the specified key. - * @return previous value associated with specified key, or null - * if there was no mapping for key. A null return can - * also indicate that the map previously associated null - * with the specified key, if the implementation supports - * null values. - * - * @throws UnsupportedOperationException if not defined - * @throws ClassCastException if the class of the specified key or value - * prevents it from being stored in this map. - * @throws IllegalArgumentException if some aspect of this key or value - * prevents it from being stored in this map. - * @throws NullPointerException this map does not permit null - * keys or values, and the specified key or value is - * null. - */ - public Object put(CompositeMap map, Map[] composited, Object key, Object value); - - /** - * Called when the CompositeMap.putAll() method is invoked. - * - * @param map the CompositeMap which is being modified - * @param composited array of Maps in the CompositeMap being modified - * @param mapToAdd Mappings to be stored in this CompositeMap - * - * @throws UnsupportedOperationException if not defined - * @throws ClassCastException if the class of the specified key or value - * prevents it from being stored in this map. - * @throws IllegalArgumentException if some aspect of this key or value - * prevents it from being stored in this map. - * @throws NullPointerException this map does not permit null - * keys or values, and the specified key or value is - * null. - */ - public void putAll(CompositeMap map, Map[] composited, Map mapToAdd); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/DefaultedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/DefaultedMap.java deleted file mode 100644 index 9710a81e417..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/DefaultedMap.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.functors.ConstantTransformer; -import org.apache.commons.collections.functors.FactoryTransformer; - -/** - * Decorates another Map returning a default value if the map - * does not contain the requested key. - *

                  - * When the {@link #get(Object)} method is called with a key that does not - * exist in the map, this map will return the default value specified in - * the constructor/factory. Only the get method is altered, so the - * {@link Map#containsKey(Object)} can be used to determine if a key really - * is in the map or not. - *

                  - * The defaulted value is not added to the map. - * Compare this behaviour with {@link LazyMap}, which does add the value - * to the map (via a Transformer). - *

                  - * For instance: - *

                  - * Map map = new DefaultedMap("NULL");
                  - * Object obj = map.get("Surname");
                  - * // obj == "NULL"
                  - * 
                  - * After the above code is executed the map is still empty. - *

                  - * Note that DefaultedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.2 - * @version $Revision: 1.7 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Rafael U.C. Afonso - * @see LazyMap - */ -public class DefaultedMap - extends AbstractMapDecorator - implements Map, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 19698628745827L; - - /** The transformer to use if the map does not contain a key */ - protected final Object value; - - //----------------------------------------------------------------------- - /** - * Factory method to create a defaulting map. - *

                  - * The value specified is returned when a missing key is found. - * - * @param map the map to decorate, must not be null - * @param defaultValue the default value to return when the key is not found - * @throws IllegalArgumentException if map is null - */ - public static Map decorate(Map map, Object defaultValue) { - if (defaultValue instanceof Transformer) { - defaultValue = ConstantTransformer.getInstance(defaultValue); - } - return new DefaultedMap(map, defaultValue); - } - - /** - * Factory method to create a defaulting map. - *

                  - * The factory specified is called when a missing key is found. - * The result will be returned as the result of the map get(key) method. - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - public static Map decorate(Map map, Factory factory) { - if (factory == null) { - throw new IllegalArgumentException("Factory must not be null"); - } - return new DefaultedMap(map, FactoryTransformer.getInstance(factory)); - } - - /** - * Factory method to create a defaulting map. - *

                  - * The transformer specified is called when a missing key is found. - * The key is passed to the transformer as the input, and the result - * will be returned as the result of the map get(key) method. - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - public static Map decorate(Map map, Transformer factory) { - if (factory == null) { - throw new IllegalArgumentException("Transformer must not be null"); - } - return new DefaultedMap(map, factory); - } - - //----------------------------------------------------------------------- - /** - * Constructs a new empty DefaultedMap that decorates - * a HashMap. - *

                  - * The object passed in will be returned by the map whenever an - * unknown key is requested. - * - * @param defaultValue the default value to return when the key is not found - */ - public DefaultedMap(Object defaultValue) { - super(new HashMap()); - if (defaultValue instanceof Transformer) { - defaultValue = ConstantTransformer.getInstance(defaultValue); - } - this.value = defaultValue; - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param value the value to use - * @throws IllegalArgumentException if map or transformer is null - */ - protected DefaultedMap(Map map, Object value) { - super(map); - this.value = value; - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public Object get(Object key) { - // create value for key if key is not currently in the map - if (map.containsKey(key) == false) { - if (value instanceof Transformer) { - return ((Transformer) value).transform(key); - } - return value; - } - return map.get(key); - } - - // no need to wrap keySet, entrySet or values as they are views of - // existing map entries - you can't do a map-style get on them. -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeMap.java deleted file mode 100644 index 8ae518a4f19..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeMap.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.BoundedMap; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another Map to fix the size, preventing add/remove. - *

                  - * Any action that would change the size of the map is disallowed. - * The put method is allowed to change the value associated with an existing - * key however. - *

                  - * If trying to remove or clear the map, an UnsupportedOperationException is - * thrown. If trying to put a new mapping into the map, an - * IllegalArgumentException is thrown. This is because the put method can - * succeed if the mapping's key already exists in the map, so the put method - * is not always unsupported. - *

                  - * Note that FixedSizeMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class FixedSizeMap - extends AbstractMapDecorator - implements Map, BoundedMap, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 7450927208116179316L; - - /** - * Factory method to create a fixed size map. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - public static Map decorate(Map map) { - return new FixedSizeMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - protected FixedSizeMap(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public Object put(Object key, Object value) { - if (map.containsKey(key) == false) { - throw new IllegalArgumentException("Cannot put new key/value pair - Map is fixed size"); - } - return map.put(key, value); - } - - public void putAll(Map mapToCopy) { - for (Iterator it = mapToCopy.keySet().iterator(); it.hasNext(); ) { - if (mapToCopy.containsKey(it.next()) == false) { - throw new IllegalArgumentException("Cannot put new key/value pair - Map is fixed size"); - } - } - map.putAll(mapToCopy); - } - - public void clear() { - throw new UnsupportedOperationException("Map is fixed size"); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException("Map is fixed size"); - } - - public Set entrySet() { - Set set = map.entrySet(); - // unmodifiable set will still allow modification via Map.Entry objects - return UnmodifiableSet.decorate(set); - } - - public Set keySet() { - Set set = map.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = map.values(); - return UnmodifiableCollection.decorate(coll); - } - - public boolean isFull() { - return true; - } - - public int maxSize() { - return size(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeSortedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeSortedMap.java deleted file mode 100644 index 0c5471b8e88..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/FixedSizeSortedMap.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; - -import org.apache.commons.collections.BoundedMap; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another SortedMap to fix the size blocking add/remove. - *

                  - * Any action that would change the size of the map is disallowed. - * The put method is allowed to change the value associated with an existing - * key however. - *

                  - * If trying to remove or clear the map, an UnsupportedOperationException is - * thrown. If trying to put a new mapping into the map, an - * IllegalArgumentException is thrown. This is because the put method can - * succeed if the mapping's key already exists in the map, so the put method - * is not always unsupported. - *

                  - * Note that FixedSizeSortedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedSortedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class FixedSizeSortedMap - extends AbstractSortedMapDecorator - implements SortedMap, BoundedMap, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 3126019624511683653L; - - /** - * Factory method to create a fixed size sorted map. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - public static SortedMap decorate(SortedMap map) { - return new FixedSizeSortedMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - protected FixedSizeSortedMap(SortedMap map) { - super(map); - } - - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected SortedMap getSortedMap() { - return (SortedMap) map; - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public Object put(Object key, Object value) { - if (map.containsKey(key) == false) { - throw new IllegalArgumentException("Cannot put new key/value pair - Map is fixed size"); - } - return map.put(key, value); - } - - public void putAll(Map mapToCopy) { - for (Iterator it = mapToCopy.keySet().iterator(); it.hasNext(); ) { - if (mapToCopy.containsKey(it.next()) == false) { - throw new IllegalArgumentException("Cannot put new key/value pair - Map is fixed size"); - } - } - map.putAll(mapToCopy); - } - - public void clear() { - throw new UnsupportedOperationException("Map is fixed size"); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException("Map is fixed size"); - } - - public Set entrySet() { - Set set = map.entrySet(); - return UnmodifiableSet.decorate(set); - } - - public Set keySet() { - Set set = map.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = map.values(); - return UnmodifiableCollection.decorate(coll); - } - - //----------------------------------------------------------------------- - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap map = getSortedMap().subMap(fromKey, toKey); - return new FixedSizeSortedMap(map); - } - - public SortedMap headMap(Object toKey) { - SortedMap map = getSortedMap().headMap(toKey); - return new FixedSizeSortedMap(map); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap map = getSortedMap().tailMap(fromKey); - return new FixedSizeSortedMap(map); - } - - public boolean isFull() { - return true; - } - - public int maxSize() { - return size(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/Flat3Map.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/Flat3Map.java deleted file mode 100644 index 95a0d9402c9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/Flat3Map.java +++ /dev/null @@ -1,1133 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.AbstractCollection; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.IterableMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.ResettableIterator; -import org.apache.commons.collections.iterators.EmptyIterator; -import org.apache.commons.collections.iterators.EmptyMapIterator; - -/** - * A Map implementation that stores data in simple fields until - * the size is greater than 3. - *

                  - * This map is designed for performance and can outstrip HashMap. - * It also has good garbage collection characteristics. - *

                    - *
                  • Optimised for operation at size 3 or less. - *
                  • Still works well once size 3 exceeded. - *
                  • Gets at size 3 or less are about 0-10% faster than HashMap, - *
                  • Puts at size 3 or less are over 4 times faster than HashMap. - *
                  • Performance 5% slower than HashMap once size 3 exceeded once. - *
                  - * The design uses two distinct modes of operation - flat and delegate. - * While the map is size 3 or less, operations map straight onto fields using - * switch statements. Once size 4 is reached, the map switches to delegate mode - * and only switches back when cleared. In delegate mode, all operations are - * forwarded straight to a HashMap resulting in the 5% performance loss. - *

                  - * The performance gains on puts are due to not needing to create a Map Entry - * object. This is a large saving not only in performance but in garbage collection. - *

                  - * Whilst in flat mode this map is also easy for the garbage collector to dispatch. - * This is because it contains no complex objects or arrays which slow the progress. - *

                  - * Do not use Flat3Map if the size is likely to grow beyond 3. - *

                  - * Note that Flat3Map is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class Flat3Map implements IterableMap, Serializable, Cloneable { - - /** Serialization version */ - private static final long serialVersionUID = -6701087419741928296L; - - /** The size of the map, used while in flat mode */ - private transient int size; - /** Hash, used while in flat mode */ - private transient int hash1; - /** Hash, used while in flat mode */ - private transient int hash2; - /** Hash, used while in flat mode */ - private transient int hash3; - /** Key, used while in flat mode */ - private transient Object key1; - /** Key, used while in flat mode */ - private transient Object key2; - /** Key, used while in flat mode */ - private transient Object key3; - /** Value, used while in flat mode */ - private transient Object value1; - /** Value, used while in flat mode */ - private transient Object value2; - /** Value, used while in flat mode */ - private transient Object value3; - /** Map, used while in delegate mode */ - private transient AbstractHashedMap delegateMap; - - /** - * Constructor. - */ - public Flat3Map() { - super(); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - public Flat3Map(Map map) { - super(); - putAll(map); - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the key specified. - * - * @param key the key - * @return the mapped value, null if no match - */ - public Object get(Object key) { - if (delegateMap != null) { - return delegateMap.get(key); - } - if (key == null) { - switch (size) { - // drop through - case 3: - if (key3 == null) return value3; - case 2: - if (key2 == null) return value2; - case 1: - if (key1 == null) return value1; - } - } else { - if (size > 0) { - int hashCode = key.hashCode(); - switch (size) { - // drop through - case 3: - if (hash3 == hashCode && key.equals(key3)) return value3; - case 2: - if (hash2 == hashCode && key.equals(key2)) return value2; - case 1: - if (hash1 == hashCode && key.equals(key1)) return value1; - } - } - } - return null; - } - - /** - * Gets the size of the map. - * - * @return the size - */ - public int size() { - if (delegateMap != null) { - return delegateMap.size(); - } - return size; - } - - /** - * Checks whether the map is currently empty. - * - * @return true if the map is currently size zero - */ - public boolean isEmpty() { - return (size() == 0); - } - - //----------------------------------------------------------------------- - /** - * Checks whether the map contains the specified key. - * - * @param key the key to search for - * @return true if the map contains the key - */ - public boolean containsKey(Object key) { - if (delegateMap != null) { - return delegateMap.containsKey(key); - } - if (key == null) { - switch (size) { // drop through - case 3: - if (key3 == null) return true; - case 2: - if (key2 == null) return true; - case 1: - if (key1 == null) return true; - } - } else { - if (size > 0) { - int hashCode = key.hashCode(); - switch (size) { // drop through - case 3: - if (hash3 == hashCode && key.equals(key3)) return true; - case 2: - if (hash2 == hashCode && key.equals(key2)) return true; - case 1: - if (hash1 == hashCode && key.equals(key1)) return true; - } - } - } - return false; - } - - /** - * Checks whether the map contains the specified value. - * - * @param value the value to search for - * @return true if the map contains the key - */ - public boolean containsValue(Object value) { - if (delegateMap != null) { - return delegateMap.containsValue(value); - } - if (value == null) { // drop through - switch (size) { - case 3: - if (value3 == null) return true; - case 2: - if (value2 == null) return true; - case 1: - if (value1 == null) return true; - } - } else { - switch (size) { // drop through - case 3: - if (value.equals(value3)) return true; - case 2: - if (value.equals(value2)) return true; - case 1: - if (value.equals(value1)) return true; - } - } - return false; - } - - //----------------------------------------------------------------------- - /** - * Puts a key-value mapping into this map. - * - * @param key the key to add - * @param value the value to add - * @return the value previously mapped to this key, null if none - */ - public Object put(Object key, Object value) { - if (delegateMap != null) { - return delegateMap.put(key, value); - } - // change existing mapping - if (key == null) { - switch (size) { // drop through - case 3: - if (key3 == null) { - Object old = value3; - value3 = value; - return old; - } - case 2: - if (key2 == null) { - Object old = value2; - value2 = value; - return old; - } - case 1: - if (key1 == null) { - Object old = value1; - value1 = value; - return old; - } - } - } else { - if (size > 0) { - int hashCode = key.hashCode(); - switch (size) { // drop through - case 3: - if (hash3 == hashCode && key.equals(key3)) { - Object old = value3; - value3 = value; - return old; - } - case 2: - if (hash2 == hashCode && key.equals(key2)) { - Object old = value2; - value2 = value; - return old; - } - case 1: - if (hash1 == hashCode && key.equals(key1)) { - Object old = value1; - value1 = value; - return old; - } - } - } - } - - // add new mapping - switch (size) { - default: - convertToMap(); - delegateMap.put(key, value); - return null; - case 2: - hash3 = (key == null ? 0 : key.hashCode()); - key3 = key; - value3 = value; - break; - case 1: - hash2 = (key == null ? 0 : key.hashCode()); - key2 = key; - value2 = value; - break; - case 0: - hash1 = (key == null ? 0 : key.hashCode()); - key1 = key; - value1 = value; - break; - } - size++; - return null; - } - - /** - * Puts all the values from the specified map into this map. - * - * @param map the map to add - * @throws NullPointerException if the map is null - */ - public void putAll(Map map) { - int size = map.size(); - if (size == 0) { - return; - } - if (delegateMap != null) { - delegateMap.putAll(map); - return; - } - if (size < 4) { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } else { - convertToMap(); - delegateMap.putAll(map); - } - } - - /** - * Converts the flat map data to a map. - */ - private void convertToMap() { - delegateMap = createDelegateMap(); - switch (size) { // drop through - case 3: - delegateMap.put(key3, value3); - case 2: - delegateMap.put(key2, value2); - case 1: - delegateMap.put(key1, value1); - } - - size = 0; - hash1 = hash2 = hash3 = 0; - key1 = key2 = key3 = null; - value1 = value2 = value3 = null; - } - - /** - * Create an instance of the map used for storage when in delegation mode. - *

                  - * This can be overridden by subclasses to provide a different map implementation. - * Not every AbstractHashedMap is suitable, identity and reference based maps - * would be poor choices. - * - * @return a new AbstractHashedMap or subclass - * @since Commons Collections 3.1 - */ - protected AbstractHashedMap createDelegateMap() { - return new HashedMap(); - } - - /** - * Removes the specified mapping from this map. - * - * @param key the mapping to remove - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key) { - if (delegateMap != null) { - return delegateMap.remove(key); - } - if (size == 0) { - return null; - } - if (key == null) { - switch (size) { // drop through - case 3: - if (key3 == null) { - Object old = value3; - hash3 = 0; - key3 = null; - value3 = null; - size = 2; - return old; - } - if (key2 == null) { - Object old = value3; - hash2 = hash3; - key2 = key3; - value2 = value3; - hash3 = 0; - key3 = null; - value3 = null; - size = 2; - return old; - } - if (key1 == null) { - Object old = value3; - hash1 = hash3; - key1 = key3; - value1 = value3; - hash3 = 0; - key3 = null; - value3 = null; - size = 2; - return old; - } - return null; - case 2: - if (key2 == null) { - Object old = value2; - hash2 = 0; - key2 = null; - value2 = null; - size = 1; - return old; - } - if (key1 == null) { - Object old = value2; - hash1 = hash2; - key1 = key2; - value1 = value2; - hash2 = 0; - key2 = null; - value2 = null; - size = 1; - return old; - } - return null; - case 1: - if (key1 == null) { - Object old = value1; - hash1 = 0; - key1 = null; - value1 = null; - size = 0; - return old; - } - } - } else { - if (size > 0) { - int hashCode = key.hashCode(); - switch (size) { // drop through - case 3: - if (hash3 == hashCode && key.equals(key3)) { - Object old = value3; - hash3 = 0; - key3 = null; - value3 = null; - size = 2; - return old; - } - if (hash2 == hashCode && key.equals(key2)) { - Object old = value3; - hash2 = hash3; - key2 = key3; - value2 = value3; - hash3 = 0; - key3 = null; - value3 = null; - size = 2; - return old; - } - if (hash1 == hashCode && key.equals(key1)) { - Object old = value3; - hash1 = hash3; - key1 = key3; - value1 = value3; - hash3 = 0; - key3 = null; - value3 = null; - size = 2; - return old; - } - return null; - case 2: - if (hash2 == hashCode && key.equals(key2)) { - Object old = value2; - hash2 = 0; - key2 = null; - value2 = null; - size = 1; - return old; - } - if (hash1 == hashCode && key.equals(key1)) { - Object old = value2; - hash1 = hash2; - key1 = key2; - value1 = value2; - hash2 = 0; - key2 = null; - value2 = null; - size = 1; - return old; - } - return null; - case 1: - if (hash1 == hashCode && key.equals(key1)) { - Object old = value1; - hash1 = 0; - key1 = null; - value1 = null; - size = 0; - return old; - } - } - } - } - return null; - } - - /** - * Clears the map, resetting the size to zero and nullifying references - * to avoid garbage collection issues. - */ - public void clear() { - if (delegateMap != null) { - delegateMap.clear(); // should aid gc - delegateMap = null; // switch back to flat mode - } else { - size = 0; - hash1 = hash2 = hash3 = 0; - key1 = key2 = key3 = null; - value1 = value2 = value3 = null; - } - } - - //----------------------------------------------------------------------- - /** - * Gets an iterator over the map. - * Changes made to the iterator affect this map. - *

                  - * A MapIterator returns the keys in the map. It also provides convenient - * methods to get the key and value, and set the value. - * It avoids the need to create an entrySet/keySet/values object. - * It also avoids creating the Map Entry object. - * - * @return the map iterator - */ - public MapIterator mapIterator() { - if (delegateMap != null) { - return delegateMap.mapIterator(); - } - if (size == 0) { - return EmptyMapIterator.INSTANCE; - } - return new FlatMapIterator(this); - } - - /** - * FlatMapIterator - */ - static class FlatMapIterator implements MapIterator, ResettableIterator { - private final Flat3Map parent; - private int nextIndex = 0; - private boolean canRemove = false; - - FlatMapIterator(Flat3Map parent) { - super(); - this.parent = parent; - } - - public boolean hasNext() { - return (nextIndex < parent.size); - } - - public Object next() { - if (hasNext() == false) { - throw new NoSuchElementException(AbstractHashedMap.NO_NEXT_ENTRY); - } - canRemove = true; - nextIndex++; - return getKey(); - } - - public void remove() { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.REMOVE_INVALID); - } - parent.remove(getKey()); - nextIndex--; - canRemove = false; - } - - public Object getKey() { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - switch (nextIndex) { - case 3: - return parent.key3; - case 2: - return parent.key2; - case 1: - return parent.key1; - } - throw new IllegalStateException("Invalid map index"); - } - - public Object getValue() { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - switch (nextIndex) { - case 3: - return parent.value3; - case 2: - return parent.value2; - case 1: - return parent.value1; - } - throw new IllegalStateException("Invalid map index"); - } - - public Object setValue(Object value) { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - Object old = getValue(); - switch (nextIndex) { - case 3: - parent.value3 = value; - case 2: - parent.value2 = value; - case 1: - parent.value1 = value; - } - return old; - } - - public void reset() { - nextIndex = 0; - canRemove = false; - } - - public String toString() { - if (canRemove) { - return "Iterator[" + getKey() + "=" + getValue() + "]"; - } else { - return "Iterator[]"; - } - } - } - - /** - * Gets the entrySet view of the map. - * Changes made to the view affect this map. - * The Map Entry is not an independent object and changes as the - * iterator progresses. - * To simply iterate through the entries, use {@link #mapIterator()}. - * - * @return the entrySet view - */ - public Set entrySet() { - if (delegateMap != null) { - return delegateMap.entrySet(); - } - return new EntrySet(this); - } - - /** - * EntrySet - */ - static class EntrySet extends AbstractSet { - private final Flat3Map parent; - - EntrySet(Flat3Map parent) { - super(); - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public void clear() { - parent.clear(); - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - Object key = entry.getKey(); - boolean result = parent.containsKey(key); - parent.remove(key); - return result; - } - - public Iterator iterator() { - if (parent.delegateMap != null) { - return parent.delegateMap.entrySet().iterator(); - } - if (parent.size() == 0) { - return EmptyIterator.INSTANCE; - } - return new EntrySetIterator(parent); - } - } - - /** - * EntrySetIterator and MapEntry - */ - static class EntrySetIterator implements Iterator, Map.Entry { - private final Flat3Map parent; - private int nextIndex = 0; - private boolean canRemove = false; - - EntrySetIterator(Flat3Map parent) { - super(); - this.parent = parent; - } - - public boolean hasNext() { - return (nextIndex < parent.size); - } - - public Object next() { - if (hasNext() == false) { - throw new NoSuchElementException(AbstractHashedMap.NO_NEXT_ENTRY); - } - canRemove = true; - nextIndex++; - return this; - } - - public void remove() { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.REMOVE_INVALID); - } - parent.remove(getKey()); - nextIndex--; - canRemove = false; - } - - public Object getKey() { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - switch (nextIndex) { - case 3: - return parent.key3; - case 2: - return parent.key2; - case 1: - return parent.key1; - } - throw new IllegalStateException("Invalid map index"); - } - - public Object getValue() { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - switch (nextIndex) { - case 3: - return parent.value3; - case 2: - return parent.value2; - case 1: - return parent.value1; - } - throw new IllegalStateException("Invalid map index"); - } - - public Object setValue(Object value) { - if (canRemove == false) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - Object old = getValue(); - switch (nextIndex) { - case 3: - parent.value3 = value; - case 2: - parent.value2 = value; - case 1: - parent.value1 = value; - } - return old; - } - - public boolean equals(Object obj) { - if (canRemove == false) { - return false; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - Object key = getKey(); - Object value = getValue(); - return (key == null ? other.getKey() == null : key.equals(other.getKey())) && - (value == null ? other.getValue() == null : value.equals(other.getValue())); - } - - public int hashCode() { - if (canRemove == false) { - return 0; - } - Object key = getKey(); - Object value = getValue(); - return (key == null ? 0 : key.hashCode()) ^ - (value == null ? 0 : value.hashCode()); - } - - public String toString() { - if (canRemove) { - return getKey() + "=" + getValue(); - } else { - return ""; - } - } - } - - /** - * Gets the keySet view of the map. - * Changes made to the view affect this map. - * To simply iterate through the keys, use {@link #mapIterator()}. - * - * @return the keySet view - */ - public Set keySet() { - if (delegateMap != null) { - return delegateMap.keySet(); - } - return new KeySet(this); - } - - /** - * KeySet - */ - static class KeySet extends AbstractSet { - private final Flat3Map parent; - - KeySet(Flat3Map parent) { - super(); - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public void clear() { - parent.clear(); - } - - public boolean contains(Object key) { - return parent.containsKey(key); - } - - public boolean remove(Object key) { - boolean result = parent.containsKey(key); - parent.remove(key); - return result; - } - - public Iterator iterator() { - if (parent.delegateMap != null) { - return parent.delegateMap.keySet().iterator(); - } - if (parent.size() == 0) { - return EmptyIterator.INSTANCE; - } - return new KeySetIterator(parent); - } - } - - /** - * KeySetIterator - */ - static class KeySetIterator extends EntrySetIterator { - - KeySetIterator(Flat3Map parent) { - super(parent); - } - - public Object next() { - super.next(); - return getKey(); - } - } - - /** - * Gets the values view of the map. - * Changes made to the view affect this map. - * To simply iterate through the values, use {@link #mapIterator()}. - * - * @return the values view - */ - public Collection values() { - if (delegateMap != null) { - return delegateMap.values(); - } - return new Values(this); - } - - /** - * Values - */ - static class Values extends AbstractCollection { - private final Flat3Map parent; - - Values(Flat3Map parent) { - super(); - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public void clear() { - parent.clear(); - } - - public boolean contains(Object value) { - return parent.containsValue(value); - } - - public Iterator iterator() { - if (parent.delegateMap != null) { - return parent.delegateMap.values().iterator(); - } - if (parent.size() == 0) { - return EmptyIterator.INSTANCE; - } - return new ValuesIterator(parent); - } - } - - /** - * ValuesIterator - */ - static class ValuesIterator extends EntrySetIterator { - - ValuesIterator(Flat3Map parent) { - super(parent); - } - - public Object next() { - super.next(); - return getValue(); - } - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeInt(size()); - for (MapIterator it = mapIterator(); it.hasNext();) { - out.writeObject(it.next()); // key - out.writeObject(it.getValue()); // value - } - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - int count = in.readInt(); - if (count > 3) { - delegateMap = createDelegateMap(); - } - for (int i = count; i > 0; i--) { - put(in.readObject(), in.readObject()); - } - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - * @since Commons Collections 3.1 - */ - public Object clone() { - try { - Flat3Map cloned = (Flat3Map) super.clone(); - if (cloned.delegateMap != null) { - cloned.delegateMap = (HashedMap) cloned.delegateMap.clone(); - } - return cloned; - } catch (CloneNotSupportedException ex) { - throw new InternalError(); - } - } - - /** - * Compares this map with another. - * - * @param obj the object to compare to - * @return true if equal - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (delegateMap != null) { - return delegateMap.equals(obj); - } - if (obj instanceof Map == false) { - return false; - } - Map other = (Map) obj; - if (size != other.size()) { - return false; - } - if (size > 0) { - Object otherValue = null; - switch (size) { // drop through - case 3: - if (other.containsKey(key3) == false) { - return false; - } - otherValue = other.get(key3); - if (value3 == null ? otherValue != null : !value3.equals(otherValue)) { - return false; - } - case 2: - if (other.containsKey(key2) == false) { - return false; - } - otherValue = other.get(key2); - if (value2 == null ? otherValue != null : !value2.equals(otherValue)) { - return false; - } - case 1: - if (other.containsKey(key1) == false) { - return false; - } - otherValue = other.get(key1); - if (value1 == null ? otherValue != null : !value1.equals(otherValue)) { - return false; - } - } - } - return true; - } - - /** - * Gets the standard Map hashCode. - * - * @return the hash code defined in the Map interface - */ - public int hashCode() { - if (delegateMap != null) { - return delegateMap.hashCode(); - } - int total = 0; - switch (size) { // drop through - case 3: - total += (hash3 ^ (value3 == null ? 0 : value3.hashCode())); - case 2: - total += (hash2 ^ (value2 == null ? 0 : value2.hashCode())); - case 1: - total += (hash1 ^ (value1 == null ? 0 : value1.hashCode())); - } - return total; - } - - /** - * Gets the map as a String. - * - * @return a string version of the map - */ - public String toString() { - if (delegateMap != null) { - return delegateMap.toString(); - } - if (size == 0) { - return "{}"; - } - StringBuffer buf = new StringBuffer(128); - buf.append('{'); - switch (size) { // drop through - case 3: - buf.append((key3 == this ? "(this Map)" : key3)); - buf.append('='); - buf.append((value3 == this ? "(this Map)" : value3)); - buf.append(','); - case 2: - buf.append((key2 == this ? "(this Map)" : key2)); - buf.append('='); - buf.append((value2 == this ? "(this Map)" : value2)); - buf.append(','); - case 1: - buf.append((key1 == this ? "(this Map)" : key1)); - buf.append('='); - buf.append((value1 == this ? "(this Map)" : value1)); - } - buf.append('}'); - return buf.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/HashedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/HashedMap.java deleted file mode 100644 index f3b975562c8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/HashedMap.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Map; - -/** - * A Map implementation that is a general purpose alternative - * to HashMap. - *

                  - * This implementation improves on the JDK1.4 HashMap by adding the - * {@link org.apache.commons.collections.MapIterator MapIterator} - * functionality and many methods for subclassing. - *

                  - * Note that HashedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class HashedMap - extends AbstractHashedMap implements Serializable, Cloneable { - - /** Serialisation version */ - private static final long serialVersionUID = -1788199231038721040L; - - /** - * Constructs a new empty map with default size and load factor. - */ - public HashedMap() { - super(DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_THRESHOLD); - } - - /** - * Constructs a new, empty map with the specified initial capacity. - * - * @param initialCapacity the initial capacity - * @throws IllegalArgumentException if the initial capacity is less than one - */ - public HashedMap(int initialCapacity) { - super(initialCapacity); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor - * @throws IllegalArgumentException if the initial capacity is less than one - * @throws IllegalArgumentException if the load factor is less than zero - */ - public HashedMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - public HashedMap(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - */ - public Object clone() { - return super.clone(); - } - - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/IdentityMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/IdentityMap.java deleted file mode 100644 index 4fe9683398e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/IdentityMap.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Map; - -/** - * A Map implementation that matches keys and values based - * on == not equals(). - *

                  - * This map will violate the detail of various Map and map view contracts. - * As a general rule, don't compare this map to other maps. - *

                  - * Note that IdentityMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author java util HashMap - * @author Stephen Colebourne - */ -public class IdentityMap - extends AbstractHashedMap implements Serializable, Cloneable { - - /** Serialisation version */ - private static final long serialVersionUID = 2028493495224302329L; - - /** - * Constructs a new empty map with default size and load factor. - */ - public IdentityMap() { - super(DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_THRESHOLD); - } - - /** - * Constructs a new, empty map with the specified initial capacity. - * - * @param initialCapacity the initial capacity - * @throws IllegalArgumentException if the initial capacity is less than one - */ - public IdentityMap(int initialCapacity) { - super(initialCapacity); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor - * @throws IllegalArgumentException if the initial capacity is less than one - * @throws IllegalArgumentException if the load factor is less than zero - */ - public IdentityMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - public IdentityMap(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Gets the hash code for the key specified. - * This implementation uses the identity hash code. - * - * @param key the key to get a hash code for - * @return the hash code - */ - protected int hash(Object key) { - return System.identityHashCode(key); - } - - /** - * Compares two keys for equals. - * This implementation uses ==. - * - * @param key1 the first key to compare - * @param key2 the second key to compare - * @return true if equal by identity - */ - protected boolean isEqualKey(Object key1, Object key2) { - return (key1 == key2); - } - - /** - * Compares two values for equals. - * This implementation uses ==. - * - * @param value1 the first value to compare - * @param value2 the second value to compare - * @return true if equal by identity - */ - protected boolean isEqualValue(Object value1, Object value2) { - return (value1 == value2); - } - - /** - * Creates an entry to store the data. - * This implementation creates an IdentityEntry instance. - * - * @param next the next entry in sequence - * @param hashCode the hash code to use - * @param key the key to store - * @param value the value to store - * @return the newly created entry - */ - protected HashEntry createEntry(HashEntry next, int hashCode, Object key, Object value) { - return new IdentityEntry(next, hashCode, key, value); - } - - //----------------------------------------------------------------------- - /** - * HashEntry - */ - protected static class IdentityEntry extends HashEntry { - - protected IdentityEntry(HashEntry next, int hashCode, Object key, Object value) { - super(next, hashCode, key, value); - } - - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - return - (getKey() == other.getKey()) && - (getValue() == other.getValue()); - } - - public int hashCode() { - return System.identityHashCode(getKey()) ^ - System.identityHashCode(getValue()); - } - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - */ - public Object clone() { - return super.clone(); - } - - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LRUMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LRUMap.java deleted file mode 100644 index 722189af919..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LRUMap.java +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Map; - -import org.apache.commons.collections.BoundedMap; - -/** - * A Map implementation with a fixed maximum size which removes - * the least recently used entry if an entry is added when full. - *

                  - * The least recently used algorithm works on the get and put operations only. - * Iteration of any kind, including setting the value by iteration, does not - * change the order. Queries such as containsKey and containsValue or access - * via views also do not change the order. - *

                  - * The map implements OrderedMap and entries may be queried using - * the bidirectional OrderedMapIterator. The order returned is - * least recently used to most recently used. Iterators from map views can - * also be cast to OrderedIterator if required. - *

                  - * All the available iterators can be reset back to the start by casting to - * ResettableIterator and calling reset(). - *

                  - * Note that LRUMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * NullPointerException's when accessed by concurrent threads. - * - * @since Commons Collections 3.0 (previously in main package v1.0) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author James Strachan - * @author Morgan Delagrange - * @author Stephen Colebourne - * @author Mike Pettypiece - * @author Mario Ivankovits - */ -public class LRUMap - extends AbstractLinkedMap implements BoundedMap, Serializable, Cloneable { - - /** Serialisation version */ - private static final long serialVersionUID = -612114643488955218L; - /** Default maximum size */ - protected static final int DEFAULT_MAX_SIZE = 100; - - /** Maximum size */ - private transient int maxSize; - /** Scan behaviour */ - private boolean scanUntilRemovable; - - /** - * Constructs a new empty map with a maximum size of 100. - */ - public LRUMap() { - this(DEFAULT_MAX_SIZE, DEFAULT_LOAD_FACTOR, false); - } - - /** - * Constructs a new, empty map with the specified maximum size. - * - * @param maxSize the maximum size of the map - * @throws IllegalArgumentException if the maximum size is less than one - */ - public LRUMap(int maxSize) { - this(maxSize, DEFAULT_LOAD_FACTOR); - } - - /** - * Constructs a new, empty map with the specified maximum size. - * - * @param maxSize the maximum size of the map - * @param scanUntilRemovable scan until a removeable entry is found, default false - * @throws IllegalArgumentException if the maximum size is less than one - * @since Commons Collections 3.1 - */ - public LRUMap(int maxSize, boolean scanUntilRemovable) { - this(maxSize, DEFAULT_LOAD_FACTOR, scanUntilRemovable); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param maxSize the maximum size of the map, -1 for no limit, - * @param loadFactor the load factor - * @throws IllegalArgumentException if the maximum size is less than one - * @throws IllegalArgumentException if the load factor is less than zero - */ - public LRUMap(int maxSize, float loadFactor) { - this(maxSize, loadFactor, false); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param maxSize the maximum size of the map, -1 for no limit, - * @param loadFactor the load factor - * @param scanUntilRemovable scan until a removeable entry is found, default false - * @throws IllegalArgumentException if the maximum size is less than one - * @throws IllegalArgumentException if the load factor is less than zero - * @since Commons Collections 3.1 - */ - public LRUMap(int maxSize, float loadFactor, boolean scanUntilRemovable) { - super((maxSize < 1 ? DEFAULT_CAPACITY : maxSize), loadFactor); - if (maxSize < 1) { - throw new IllegalArgumentException("LRUMap max size must be greater than 0"); - } - this.maxSize = maxSize; - this.scanUntilRemovable = scanUntilRemovable; - } - - /** - * Constructor copying elements from another map. - *

                  - * The maximum size is set from the map's size. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - * @throws IllegalArgumentException if the map is empty - */ - public LRUMap(Map map) { - this(map, false); - } - - /** - * Constructor copying elements from another map. - *

                  - * The maximum size is set from the map's size. - * - * @param map the map to copy - * @param scanUntilRemovable scan until a removeable entry is found, default false - * @throws NullPointerException if the map is null - * @throws IllegalArgumentException if the map is empty - * @since Commons Collections 3.1 - */ - public LRUMap(Map map, boolean scanUntilRemovable) { - this(map.size(), DEFAULT_LOAD_FACTOR, scanUntilRemovable); - putAll(map); - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the key specified. - *

                  - * This operation changes the position of the key in the map to the - * most recently used position (first). - * - * @param key the key - * @return the mapped value, null if no match - */ - public Object get(Object key) { - LinkEntry entry = (LinkEntry) getEntry(key); - if (entry == null) { - return null; - } - moveToMRU(entry); - return entry.getValue(); - } - - //----------------------------------------------------------------------- - /** - * Moves an entry to the MRU position at the end of the list. - *

                  - * This implementation moves the updated entry to the end of the list. - * - * @param entry the entry to update - */ - protected void moveToMRU(LinkEntry entry) { - if (entry.after != header) { - modCount++; - // remove - entry.before.after = entry.after; - entry.after.before = entry.before; - // add first - entry.after = header; - entry.before = header.before; - header.before.after = entry; - header.before = entry; - } else if (entry == header) { - throw new IllegalStateException("Can't move header to MRU" + - " (please report this to commons-dev@jakarta.apache.org)"); - } - } - - /** - * Updates an existing key-value mapping. - *

                  - * This implementation moves the updated entry to the top of the list - * using {@link #moveToMRU(AbstractLinkedMap.LinkEntry)}. - * - * @param entry the entry to update - * @param newValue the new value to store - */ - protected void updateEntry(HashEntry entry, Object newValue) { - moveToMRU((LinkEntry) entry); // handles modCount - entry.setValue(newValue); - } - - /** - * Adds a new key-value mapping into this map. - *

                  - * This implementation checks the LRU size and determines whether to - * discard an entry or not using {@link #removeLRU(AbstractLinkedMap.LinkEntry)}. - *

                  - * From Commons Collections 3.1 this method uses {@link #isFull()} rather - * than accessing size and maxSize directly. - * It also handles the scanUntilRemovable functionality. - * - * @param hashIndex the index into the data array to store at - * @param hashCode the hash code of the key to add - * @param key the key to add - * @param value the value to add - */ - protected void addMapping(int hashIndex, int hashCode, Object key, Object value) { - if (isFull()) { - LinkEntry reuse = header.after; - boolean removeLRUEntry = false; - if (scanUntilRemovable) { - while (reuse != header && reuse != null) { - if (removeLRU(reuse)) { - removeLRUEntry = true; - break; - } - reuse = reuse.after; - } - if (reuse == null) { - throw new IllegalStateException( - "Entry.after=null, header.after" + header.after + " header.before" + header.before + - " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + - " Please check that your keys are immutable, and that you have used synchronization properly." + - " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); - } - } else { - removeLRUEntry = removeLRU(reuse); - } - - if (removeLRUEntry) { - if (reuse == null) { - throw new IllegalStateException( - "reuse=null, header.after=" + header.after + " header.before" + header.before + - " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + - " Please check that your keys are immutable, and that you have used synchronization properly." + - " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); - } - reuseMapping(reuse, hashIndex, hashCode, key, value); - } else { - super.addMapping(hashIndex, hashCode, key, value); - } - } else { - super.addMapping(hashIndex, hashCode, key, value); - } - } - - /** - * Reuses an entry by removing it and moving it to a new place in the map. - *

                  - * This method uses {@link #removeEntry}, {@link #reuseEntry} and {@link #addEntry}. - * - * @param entry the entry to reuse - * @param hashIndex the index into the data array to store at - * @param hashCode the hash code of the key to add - * @param key the key to add - * @param value the value to add - */ - protected void reuseMapping(LinkEntry entry, int hashIndex, int hashCode, Object key, Object value) { - // find the entry before the entry specified in the hash table - // remember that the parameters (except the first) refer to the new entry, - // not the old one - try { - int removeIndex = hashIndex(entry.hashCode, data.length); - HashEntry[] tmp = data; // may protect against some sync issues - HashEntry loop = tmp[removeIndex]; - HashEntry previous = null; - while (loop != entry && loop != null) { - previous = loop; - loop = loop.next; - } - if (loop == null) { - throw new IllegalStateException( - "Entry.next=null, data[removeIndex]=" + data[removeIndex] + " previous=" + previous + - " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + - " Please check that your keys are immutable, and that you have used synchronization properly." + - " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); - } - - // reuse the entry - modCount++; - removeEntry(entry, removeIndex, previous); - reuseEntry(entry, hashIndex, hashCode, key, value); - addEntry(entry, hashIndex); - } catch (NullPointerException ex) { - throw new IllegalStateException( - "NPE, entry=" + entry + " entryIsHeader=" + (entry==header) + - " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + - " Please check that your keys are immutable, and that you have used synchronization properly." + - " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); - } - } - - /** - * Subclass method to control removal of the least recently used entry from the map. - *

                  - * This method exists for subclasses to override. A subclass may wish to - * provide cleanup of resources when an entry is removed. For example: - *

                  -     * protected boolean removeLRU(LinkEntry entry) {
                  -     *   releaseResources(entry.getValue());  // release resources held by entry
                  -     *   return true;  // actually delete entry
                  -     * }
                  -     * 
                  - *

                  - * Alternatively, a subclass may choose to not remove the entry or selectively - * keep certain LRU entries. For example: - *

                  -     * protected boolean removeLRU(LinkEntry entry) {
                  -     *   if (entry.getKey().toString().startsWith("System.")) {
                  -     *     return false;  // entry not removed from LRUMap
                  -     *   } else {
                  -     *     return true;  // actually delete entry
                  -     *   }
                  -     * }
                  -     * 
                  - * The effect of returning false is dependent on the scanUntilRemovable flag. - * If the flag is true, the next LRU entry will be passed to this method and so on - * until one returns false and is removed, or every entry in the map has been passed. - * If the scanUntilRemovable flag is false, the map will exceed the maximum size. - *

                  - * NOTE: Commons Collections 3.0 passed the wrong entry to this method. - * This is fixed in version 3.1 onwards. - * - * @param entry the entry to be removed - */ - protected boolean removeLRU(LinkEntry entry) { - return true; - } - - //----------------------------------------------------------------------- - /** - * Returns true if this map is full and no new mappings can be added. - * - * @return true if the map is full - */ - public boolean isFull() { - return (size >= maxSize); - } - - /** - * Gets the maximum size of the map (the bound). - * - * @return the maximum number of elements the map can hold - */ - public int maxSize() { - return maxSize; - } - - /** - * Whether this LRUMap will scan until a removable entry is found when the - * map is full. - * - * @return true if this map scans - * @since Commons Collections 3.1 - */ - public boolean isScanUntilRemovable() { - return scanUntilRemovable; - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - */ - public Object clone() { - return super.clone(); - } - - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - - /** - * Writes the data necessary for put() to work in deserialization. - */ - protected void doWriteObject(ObjectOutputStream out) throws IOException { - out.writeInt(maxSize); - super.doWriteObject(out); - } - - /** - * Reads the data necessary for put() to work in the superclass. - */ - protected void doReadObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - maxSize = in.readInt(); - super.doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazyMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazyMap.java deleted file mode 100644 index 9f5901e2838..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazyMap.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Map; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.functors.FactoryTransformer; - -/** - * Decorates another Map to create objects in the map on demand. - *

                  - * When the {@link #get(Object)} method is called with a key that does not - * exist in the map, the factory is used to create the object. The created - * object will be added to the map using the requested key. - *

                  - * For instance: - *

                  - * Factory factory = new Factory() {
                  - *     public Object create() {
                  - *         return new Date();
                  - *     }
                  - * }
                  - * Map lazy = Lazy.map(new HashMap(), factory);
                  - * Object obj = lazy.get("NOW");
                  - * 
                  - * - * After the above code is executed, obj will contain - * a new Date instance. Furthermore, that Date - * instance is mapped to the "NOW" key in the map. - *

                  - * Note that LazyMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class LazyMap - extends AbstractMapDecorator - implements Map, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 7990956402564206740L; - - /** The factory to use to construct elements */ - protected final Transformer factory; - - /** - * Factory method to create a lazily instantiated map. - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - public static Map decorate(Map map, Factory factory) { - return new LazyMap(map, factory); - } - - /** - * Factory method to create a lazily instantiated map. - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - public static Map decorate(Map map, Transformer factory) { - return new LazyMap(map, factory); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - protected LazyMap(Map map, Factory factory) { - super(map); - if (factory == null) { - throw new IllegalArgumentException("Factory must not be null"); - } - this.factory = FactoryTransformer.getInstance(factory); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - protected LazyMap(Map map, Transformer factory) { - super(map); - if (factory == null) { - throw new IllegalArgumentException("Factory must not be null"); - } - this.factory = factory; - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public Object get(Object key) { - // create value for key if key is not currently in the map - if (map.containsKey(key) == false) { - Object value = factory.transform(key); - map.put(key, value); - return value; - } - return map.get(key); - } - - // no need to wrap keySet, entrySet or values as they are views of - // existing map entries - you can't do a map-style get on them. -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazySortedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazySortedMap.java deleted file mode 100644 index 52febcc624d..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LazySortedMap.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Comparator; -import java.util.SortedMap; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.Transformer; - -/** - * Decorates another SortedMap to create objects in the map on demand. - *

                  - * When the {@link #get(Object)} method is called with a key that does not - * exist in the map, the factory is used to create the object. The created - * object will be added to the map using the requested key. - *

                  - * For instance: - *

                  - * Factory factory = new Factory() {
                  - *     public Object create() {
                  - *         return new Date();
                  - *     }
                  - * }
                  - * SortedMap lazy = Lazy.sortedMap(new HashMap(), factory);
                  - * Object obj = lazy.get("NOW");
                  - * 
                  - * - * After the above code is executed, obj will contain - * a new Date instance. Furthermore, that Date - * instance is mapped to the "NOW" key in the map. - *

                  - * Note that LazySortedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedSortedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class LazySortedMap - extends LazyMap - implements SortedMap { - - /** Serialization version */ - private static final long serialVersionUID = 2715322183617658933L; - - /** - * Factory method to create a lazily instantiated sorted map. - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - public static SortedMap decorate(SortedMap map, Factory factory) { - return new LazySortedMap(map, factory); - } - - /** - * Factory method to create a lazily instantiated sorted map. - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - public static SortedMap decorate(SortedMap map, Transformer factory) { - return new LazySortedMap(map, factory); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - protected LazySortedMap(SortedMap map, Factory factory) { - super(map, factory); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param factory the factory to use, must not be null - * @throws IllegalArgumentException if map or factory is null - */ - protected LazySortedMap(SortedMap map, Transformer factory) { - super(map, factory); - } - - //----------------------------------------------------------------------- - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected SortedMap getSortedMap() { - return (SortedMap) map; - } - - //----------------------------------------------------------------------- - public Object firstKey() { - return getSortedMap().firstKey(); - } - - public Object lastKey() { - return getSortedMap().lastKey(); - } - - public Comparator comparator() { - return getSortedMap().comparator(); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap map = getSortedMap().subMap(fromKey, toKey); - return new LazySortedMap(map, factory); - } - - public SortedMap headMap(Object toKey) { - SortedMap map = getSortedMap().headMap(toKey); - return new LazySortedMap(map, factory); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap map = getSortedMap().tailMap(fromKey); - return new LazySortedMap(map, factory); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LinkedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LinkedMap.java deleted file mode 100644 index 29e1096525e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/LinkedMap.java +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.AbstractList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -import org.apache.commons.collections.iterators.UnmodifiableIterator; -import org.apache.commons.collections.iterators.UnmodifiableListIterator; -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * A Map implementation that maintains the order of the entries. - * In this implementation order is maintained by original insertion. - *

                  - * This implementation improves on the JDK1.4 LinkedHashMap by adding the - * {@link org.apache.commons.collections.MapIterator MapIterator} - * functionality, additional convenience methods and allowing - * bidirectional iteration. It also implements OrderedMap. - * In addition, non-interface methods are provided to access the map by index. - *

                  - * The orderedMapIterator() method provides direct access to a - * bidirectional iterator. The iterators from the other views can also be cast - * to OrderedIterator if required. - *

                  - * All the available iterators can be reset back to the start by casting to - * ResettableIterator and calling reset(). - *

                  - * The implementation is also designed to be subclassed, with lots of useful - * methods exposed. - *

                  - * Note that LinkedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class LinkedMap - extends AbstractLinkedMap implements Serializable, Cloneable { - - /** Serialisation version */ - private static final long serialVersionUID = 9077234323521161066L; - - /** - * Constructs a new empty map with default size and load factor. - */ - public LinkedMap() { - super(DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_THRESHOLD); - } - - /** - * Constructs a new, empty map with the specified initial capacity. - * - * @param initialCapacity the initial capacity - * @throws IllegalArgumentException if the initial capacity is less than one - */ - public LinkedMap(int initialCapacity) { - super(initialCapacity); - } - - /** - * Constructs a new, empty map with the specified initial capacity and - * load factor. - * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor - * @throws IllegalArgumentException if the initial capacity is less than one - * @throws IllegalArgumentException if the load factor is less than zero - */ - public LinkedMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy - * @throws NullPointerException if the map is null - */ - public LinkedMap(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - */ - public Object clone() { - return super.clone(); - } - - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - - //----------------------------------------------------------------------- - /** - * Gets the key at the specified index. - * - * @param index the index to retrieve - * @return the key at the specified index - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object get(int index) { - return getEntry(index).getKey(); - } - - /** - * Gets the value at the specified index. - * - * @param index the index to retrieve - * @return the key at the specified index - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object getValue(int index) { - return getEntry(index).getValue(); - } - - /** - * Gets the index of the specified key. - * - * @param key the key to find the index of - * @return the index, or -1 if not found - */ - public int indexOf(Object key) { - key = convertKey(key); - int i = 0; - for (LinkEntry entry = header.after; entry != header; entry = entry.after, i++) { - if (isEqualKey(key, entry.key)) { - return i; - } - } - return -1; - } - - /** - * Removes the element at the specified index. - * - * @param index the index of the object to remove - * @return the previous value corresponding the key, - * or null if none existed - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object remove(int index) { - return remove(get(index)); - } - - /** - * Gets an unmodifiable List view of the keys. - *

                  - * The returned list is unmodifiable because changes to the values of - * the list (using {@link java.util.ListIterator#set(Object)}) will - * effectively remove the value from the list and reinsert that value at - * the end of the list, which is an unexpected side effect of changing the - * value of a list. This occurs because changing the key, changes when the - * mapping is added to the map and thus where it appears in the list. - *

                  - * An alternative to this method is to use {@link #keySet()}. - * - * @see #keySet() - * @return The ordered list of keys. - */ - public List asList() { - return new LinkedMapList(this); - } - - /** - * List view of map. - */ - static class LinkedMapList extends AbstractList { - - final LinkedMap parent; - - LinkedMapList(LinkedMap parent) { - this.parent = parent; - } - - public int size() { - return parent.size(); - } - - public Object get(int index) { - return parent.get(index); - } - - public boolean contains(Object obj) { - return parent.containsKey(obj); - } - - public int indexOf(Object obj) { - return parent.indexOf(obj); - } - - public int lastIndexOf(Object obj) { - return parent.indexOf(obj); - } - - public boolean containsAll(Collection coll) { - return parent.keySet().containsAll(coll); - } - - public Object remove(int index) { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object obj) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object[] toArray() { - return parent.keySet().toArray(); - } - - public Object[] toArray(Object[] array) { - return parent.keySet().toArray(array); - } - - public Iterator iterator() { - return UnmodifiableIterator.decorate(parent.keySet().iterator()); - } - - public ListIterator listIterator() { - return UnmodifiableListIterator.decorate(super.listIterator()); - } - - public ListIterator listIterator(int fromIndex) { - return UnmodifiableListIterator.decorate(super.listIterator(fromIndex)); - } - - public List subList(int fromIndexInclusive, int toIndexExclusive) { - return UnmodifiableList.decorate(super.subList(fromIndexInclusive, toIndexExclusive)); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ListOrderedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ListOrderedMap.java deleted file mode 100644 index 50c313f3e7b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ListOrderedMap.java +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.AbstractList; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.ResettableIterator; -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; -import org.apache.commons.collections.keyvalue.AbstractMapEntry; -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * Decorates a Map to ensure that the order of addition is retained - * using a List to maintain order. - *

                  - * The order will be used via the iterators and toArray methods on the views. - * The order is also returned by the MapIterator. - * The orderedMapIterator() method accesses an iterator that can - * iterate both forwards and backwards through the map. - * In addition, non-interface methods are provided to access the map by index. - *

                  - * If an object is added to the Map for a second time, it will remain in the - * original position in the iteration. - *

                  - * Note that ListOrderedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Henri Yandell - * @author Stephen Colebourne - * @author Matt Benson - */ -public class ListOrderedMap - extends AbstractMapDecorator - implements OrderedMap, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 2728177751851003750L; - - /** Internal list to hold the sequence of objects */ - protected final List insertOrder = new ArrayList(); - - /** - * Factory method to create an ordered map. - *

                  - * An ArrayList is used to retain order. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - public static OrderedMap decorate(Map map) { - return new ListOrderedMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructs a new empty ListOrderedMap that decorates - * a HashMap. - * - * @since Commons Collections 3.1 - */ - public ListOrderedMap() { - this(new HashMap()); - } - - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - protected ListOrderedMap(Map map) { - super(map); - insertOrder.addAll(getMap().keySet()); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - // Implement OrderedMap - //----------------------------------------------------------------------- - public MapIterator mapIterator() { - return orderedMapIterator(); - } - - public OrderedMapIterator orderedMapIterator() { - return new ListOrderedMapIterator(this); - } - - /** - * Gets the first key in this map by insert order. - * - * @return the first key currently in this map - * @throws NoSuchElementException if this map is empty - */ - public Object firstKey() { - if (size() == 0) { - throw new NoSuchElementException("Map is empty"); - } - return insertOrder.get(0); - } - - /** - * Gets the last key in this map by insert order. - * - * @return the last key currently in this map - * @throws NoSuchElementException if this map is empty - */ - public Object lastKey() { - if (size() == 0) { - throw new NoSuchElementException("Map is empty"); - } - return insertOrder.get(size() - 1); - } - - /** - * Gets the next key to the one specified using insert order. - * This method performs a list search to find the key and is O(n). - * - * @param key the key to find previous for - * @return the next key, null if no match or at start - */ - public Object nextKey(Object key) { - int index = insertOrder.indexOf(key); - if (index >= 0 && index < size() - 1) { - return insertOrder.get(index + 1); - } - return null; - } - - /** - * Gets the previous key to the one specified using insert order. - * This method performs a list search to find the key and is O(n). - * - * @param key the key to find previous for - * @return the previous key, null if no match or at start - */ - public Object previousKey(Object key) { - int index = insertOrder.indexOf(key); - if (index > 0) { - return insertOrder.get(index - 1); - } - return null; - } - - //----------------------------------------------------------------------- - public Object put(Object key, Object value) { - if (getMap().containsKey(key)) { - // re-adding doesn't change order - return getMap().put(key, value); - } else { - // first add, so add to both map and list - Object result = getMap().put(key, value); - insertOrder.add(key); - return result; - } - } - - public void putAll(Map map) { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - - public Object remove(Object key) { - Object result = getMap().remove(key); - insertOrder.remove(key); - return result; - } - - public void clear() { - getMap().clear(); - insertOrder.clear(); - } - - //----------------------------------------------------------------------- - /** - * Gets a view over the keys in the map. - *

                  - * The Collection will be ordered by object insertion into the map. - * - * @see #keyList() - * @return the fully modifiable collection view over the keys - */ - public Set keySet() { - return new KeySetView(this); - } - - /** - * Gets a view over the keys in the map as a List. - *

                  - * The List will be ordered by object insertion into the map. - * The List is unmodifiable. - * - * @see #keySet() - * @return the unmodifiable list view over the keys - * @since Commons Collections 3.2 - */ - public List keyList() { - return UnmodifiableList.decorate(insertOrder); - } - - /** - * Gets a view over the values in the map. - *

                  - * The Collection will be ordered by object insertion into the map. - *

                  - * From Commons Collections 3.2, this Collection can be cast - * to a list, see {@link #valueList()} - * - * @see #valueList() - * @return the fully modifiable collection view over the values - */ - public Collection values() { - return new ValuesView(this); - } - - /** - * Gets a view over the values in the map as a List. - *

                  - * The List will be ordered by object insertion into the map. - * The List supports remove and set, but does not support add. - * - * @see #values() - * @return the partially modifiable list view over the values - * @since Commons Collections 3.2 - */ - public List valueList() { - return new ValuesView(this); - } - - /** - * Gets a view over the entries in the map. - *

                  - * The Set will be ordered by object insertion into the map. - * - * @return the fully modifiable set view over the entries - */ - public Set entrySet() { - return new EntrySetView(this, this.insertOrder); - } - - //----------------------------------------------------------------------- - /** - * Returns the Map as a string. - * - * @return the Map as a String - */ - public String toString() { - if (isEmpty()) { - return "{}"; - } - StringBuffer buf = new StringBuffer(); - buf.append('{'); - boolean first = true; - Iterator it = entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry) it.next(); - Object key = entry.getKey(); - Object value = entry.getValue(); - if (first) { - first = false; - } else { - buf.append(", "); - } - buf.append(key == this ? "(this Map)" : key); - buf.append('='); - buf.append(value == this ? "(this Map)" : value); - } - buf.append('}'); - return buf.toString(); - } - - //----------------------------------------------------------------------- - /** - * Gets the key at the specified index. - * - * @param index the index to retrieve - * @return the key at the specified index - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object get(int index) { - return insertOrder.get(index); - } - - /** - * Gets the value at the specified index. - * - * @param index the index to retrieve - * @return the key at the specified index - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object getValue(int index) { - return get(insertOrder.get(index)); - } - - /** - * Gets the index of the specified key. - * - * @param key the key to find the index of - * @return the index, or -1 if not found - */ - public int indexOf(Object key) { - return insertOrder.indexOf(key); - } - - /** - * Sets the value at the specified index. - * - * @param index the index of the value to set - * @return the previous value at that index - * @throws IndexOutOfBoundsException if the index is invalid - * @since Commons Collections 3.2 - */ - public Object setValue(int index, Object value) { - Object key = insertOrder.get(index); - return put(key, value); - } - - /** - * Puts a key-value mapping into the map at the specified index. - *

                  - * If the map already contains the key, then the original mapping - * is removed and the new mapping added at the specified index. - * The remove may change the effect of the index. The index is - * always calculated relative to the original state of the map. - *

                  - * Thus the steps are: (1) remove the existing key-value mapping, - * then (2) insert the new key-value mapping at the position it - * would have been inserted had the remove not ocurred. - * - * @param index the index at which the mapping should be inserted - * @param key the key - * @param value the value - * @return the value previously mapped to the key - * @throws IndexOutOfBoundsException if the index is out of range - * @since Commons Collections 3.2 - */ - public Object put(int index, Object key, Object value) { - Map m = getMap(); - if (m.containsKey(key)) { - Object result = m.remove(key); - int pos = insertOrder.indexOf(key); - insertOrder.remove(pos); - if (pos < index) { - index--; - } - insertOrder.add(index, key); - m.put(key, value); - return result; - } else { - insertOrder.add(index, key); - m.put(key, value); - return null; - } - } - - /** - * Removes the element at the specified index. - * - * @param index the index of the object to remove - * @return the removed value, or null if none existed - * @throws IndexOutOfBoundsException if the index is invalid - */ - public Object remove(int index) { - return remove(get(index)); - } - - /** - * Gets an unmodifiable List view of the keys which changes as the map changes. - *

                  - * The returned list is unmodifiable because changes to the values of - * the list (using {@link java.util.ListIterator#set(Object)}) will - * effectively remove the value from the list and reinsert that value at - * the end of the list, which is an unexpected side effect of changing the - * value of a list. This occurs because changing the key, changes when the - * mapping is added to the map and thus where it appears in the list. - *

                  - * An alternative to this method is to use the better named - * {@link #keyList()} or {@link #keySet()}. - * - * @see #keyList() - * @see #keySet() - * @return The ordered list of keys. - */ - public List asList() { - return keyList(); - } - - //----------------------------------------------------------------------- - static class ValuesView extends AbstractList { - private final ListOrderedMap parent; - - ValuesView(ListOrderedMap parent) { - super(); - this.parent = parent; - } - - public int size() { - return this.parent.size(); - } - - public boolean contains(Object value) { - return this.parent.containsValue(value); - } - - public void clear() { - this.parent.clear(); - } - - public Iterator iterator() { - return new AbstractIteratorDecorator(parent.entrySet().iterator()) { - public Object next() { - return ((Map.Entry) iterator.next()).getValue(); - } - }; - } - - public Object get(int index) { - return this.parent.getValue(index); - } - - public Object set(int index, Object value) { - return this.parent.setValue(index, value); - } - - public Object remove(int index) { - return this.parent.remove(index); - } - } - - //----------------------------------------------------------------------- - static class KeySetView extends AbstractSet { - private final ListOrderedMap parent; - - KeySetView(ListOrderedMap parent) { - super(); - this.parent = parent; - } - - public int size() { - return this.parent.size(); - } - - public boolean contains(Object value) { - return this.parent.containsKey(value); - } - - public void clear() { - this.parent.clear(); - } - - public Iterator iterator() { - return new AbstractIteratorDecorator(parent.entrySet().iterator()) { - public Object next() { - return ((Map.Entry) super.next()).getKey(); - } - }; - } - } - - //----------------------------------------------------------------------- - static class EntrySetView extends AbstractSet { - private final ListOrderedMap parent; - private final List insertOrder; - private Set entrySet; - - public EntrySetView(ListOrderedMap parent, List insertOrder) { - super(); - this.parent = parent; - this.insertOrder = insertOrder; - } - - private Set getEntrySet() { - if (entrySet == null) { - entrySet = parent.getMap().entrySet(); - } - return entrySet; - } - - public int size() { - return this.parent.size(); - } - public boolean isEmpty() { - return this.parent.isEmpty(); - } - - public boolean contains(Object obj) { - return getEntrySet().contains(obj); - } - - public boolean containsAll(Collection coll) { - return getEntrySet().containsAll(coll); - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - if (getEntrySet().contains(obj)) { - Object key = ((Map.Entry) obj).getKey(); - parent.remove(key); - return true; - } - return false; - } - - public void clear() { - this.parent.clear(); - } - - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - return getEntrySet().equals(obj); - } - - public int hashCode() { - return getEntrySet().hashCode(); - } - - public String toString() { - return getEntrySet().toString(); - } - - public Iterator iterator() { - return new ListOrderedIterator(parent, insertOrder); - } - } - - //----------------------------------------------------------------------- - static class ListOrderedIterator extends AbstractIteratorDecorator { - private final ListOrderedMap parent; - private Object last = null; - - ListOrderedIterator(ListOrderedMap parent, List insertOrder) { - super(insertOrder.iterator()); - this.parent = parent; - } - - public Object next() { - last = super.next(); - return new ListOrderedMapEntry(parent, last); - } - - public void remove() { - super.remove(); - parent.getMap().remove(last); - } - } - - //----------------------------------------------------------------------- - static class ListOrderedMapEntry extends AbstractMapEntry { - private final ListOrderedMap parent; - - ListOrderedMapEntry(ListOrderedMap parent, Object key) { - super(key, null); - this.parent = parent; - } - - public Object getValue() { - return parent.get(key); - } - - public Object setValue(Object value) { - return parent.getMap().put(key, value); - } - } - - //----------------------------------------------------------------------- - static class ListOrderedMapIterator implements OrderedMapIterator, ResettableIterator { - private final ListOrderedMap parent; - private ListIterator iterator; - private Object last = null; - private boolean readable = false; - - ListOrderedMapIterator(ListOrderedMap parent) { - super(); - this.parent = parent; - this.iterator = parent.insertOrder.listIterator(); - } - - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - last = iterator.next(); - readable = true; - return last; - } - - public boolean hasPrevious() { - return iterator.hasPrevious(); - } - - public Object previous() { - last = iterator.previous(); - readable = true; - return last; - } - - public void remove() { - if (readable == false) { - throw new IllegalStateException(AbstractHashedMap.REMOVE_INVALID); - } - iterator.remove(); - parent.map.remove(last); - readable = false; - } - - public Object getKey() { - if (readable == false) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - return last; - } - - public Object getValue() { - if (readable == false) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - return parent.get(last); - } - - public Object setValue(Object value) { - if (readable == false) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - return parent.map.put(last, value); - } - - public void reset() { - iterator = parent.insertOrder.listIterator(); - last = null; - readable = false; - } - - public String toString() { - if (readable == true) { - return "Iterator[" + getKey() + "=" + getValue() + "]"; - } else { - return "Iterator[]"; - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiKeyMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiKeyMap.java deleted file mode 100644 index ca46a5d70b2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiKeyMap.java +++ /dev/null @@ -1,913 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.IterableMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.keyvalue.MultiKey; - -/** - * A Map implementation that uses multiple keys to map the value. - *

                  - * This class is the most efficient way to uses multiple keys to map to a value. - * The best way to use this class is via the additional map-style methods. - * These provide get, containsKey, put and - * remove for individual keys which operate without extra object creation. - *

                  - * The additional methods are the main interface of this map. - * As such, you will not normally hold this map in a variable of type Map. - *

                  - * The normal map methods take in and return a {@link MultiKey}. - * If you try to use put() with any other object type a - * ClassCastException is thrown. If you try to use null as - * the key in put() a NullPointerException is thrown. - *

                  - * This map is implemented as a decorator of a AbstractHashedMap which - * enables extra behaviour to be added easily. - *

                    - *
                  • MultiKeyMap.decorate(new LinkedMap()) creates an ordered map. - *
                  • MultiKeyMap.decorate(new LRUMap()) creates an least recently used map. - *
                  • MultiKeyMap.decorate(new ReferenceMap()) creates a garbage collector sensitive map. - *
                  - * Note that IdentityMap and ReferenceIdentityMap are unsuitable - * for use as the key comparison would work on the whole MultiKey, not the elements within. - *

                  - * As an example, consider a least recently used cache that uses a String airline code - * and a Locale to lookup the airline's name: - *

                  - * private MultiKeyMap cache = MultiKeyMap.decorate(new LRUMap(50));
                  - * 
                  - * public String getAirlineName(String code, String locale) {
                  - *   String name = (String) cache.get(code, locale);
                  - *   if (name == null) {
                  - *     name = getAirlineNameFromDB(code, locale);
                  - *     cache.put(code, locale, name);
                  - *   }
                  - *   return name;
                  - * }
                  - * 
                  - *

                  - * Note that MultiKeyMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. This class may throw exceptions when accessed - * by concurrent threads without synchronization. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class MultiKeyMap - implements IterableMap, Serializable { - - /** Serialisation version */ - private static final long serialVersionUID = -1788199231038721040L; - - /** The decorated map */ - protected final AbstractHashedMap map; - - //----------------------------------------------------------------------- - /** - * Decorates the specified map to add the MultiKeyMap API and fast query. - * The map must not be null and must be empty. - * - * @param map the map to decorate, not null - * @throws IllegalArgumentException if the map is null or not empty - */ - public static MultiKeyMap decorate(AbstractHashedMap map) { - if (map == null) { - throw new IllegalArgumentException("Map must not be null"); - } - if (map.size() > 0) { - throw new IllegalArgumentException("Map must be empty"); - } - return new MultiKeyMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructs a new MultiKeyMap that decorates a HashedMap. - */ - public MultiKeyMap() { - super(); - map = new HashedMap(); - } - - /** - * Constructor that decorates the specified map and is called from - * {@link #decorate(AbstractHashedMap)}. - * The map must not be null and should be empty or only contain valid keys. - * This constructor performs no validation. - * - * @param map the map to decorate - */ - protected MultiKeyMap(AbstractHashedMap map) { - super(); - this.map = map; - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @return the mapped value, null if no match - */ - public Object get(Object key1, Object key2) { - int hashCode = hash(key1, key2); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2)) { - return entry.getValue(); - } - entry = entry.next; - } - return null; - } - - /** - * Checks whether the map contains the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @return true if the map contains the key - */ - public boolean containsKey(Object key1, Object key2) { - int hashCode = hash(key1, key2); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2)) { - return true; - } - entry = entry.next; - } - return false; - } - - /** - * Stores the value against the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param value the value to store - * @return the value previously mapped to this combined key, null if none - */ - public Object put(Object key1, Object key2, Object value) { - int hashCode = hash(key1, key2); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2)) { - Object oldValue = entry.getValue(); - map.updateEntry(entry, value); - return oldValue; - } - entry = entry.next; - } - - map.addMapping(index, hashCode, new MultiKey(key1, key2), value); - return null; - } - - /** - * Removes the specified multi-key from this map. - * - * @param key1 the first key - * @param key2 the second key - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key1, Object key2) { - int hashCode = hash(key1, key2); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - AbstractHashedMap.HashEntry previous = null; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2)) { - Object oldValue = entry.getValue(); - map.removeMapping(entry, index, previous); - return oldValue; - } - previous = entry; - entry = entry.next; - } - return null; - } - - /** - * Gets the hash code for the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @return the hash code - */ - protected int hash(Object key1, Object key2) { - int h = 0; - if (key1 != null) { - h ^= key1.hashCode(); - } - if (key2 != null) { - h ^= key2.hashCode(); - } - h += ~(h << 9); - h ^= (h >>> 14); - h += (h << 4); - h ^= (h >>> 10); - return h; - } - - /** - * Is the key equal to the combined key. - * - * @param entry the entry to compare to - * @param key1 the first key - * @param key2 the second key - * @return true if the key matches - */ - protected boolean isEqualKey(AbstractHashedMap.HashEntry entry, Object key1, Object key2) { - MultiKey multi = (MultiKey) entry.getKey(); - return - multi.size() == 2 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1))); - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @return the mapped value, null if no match - */ - public Object get(Object key1, Object key2, Object key3) { - int hashCode = hash(key1, key2, key3); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3)) { - return entry.getValue(); - } - entry = entry.next; - } - return null; - } - - /** - * Checks whether the map contains the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @return true if the map contains the key - */ - public boolean containsKey(Object key1, Object key2, Object key3) { - int hashCode = hash(key1, key2, key3); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3)) { - return true; - } - entry = entry.next; - } - return false; - } - - /** - * Stores the value against the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param value the value to store - * @return the value previously mapped to this combined key, null if none - */ - public Object put(Object key1, Object key2, Object key3, Object value) { - int hashCode = hash(key1, key2, key3); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3)) { - Object oldValue = entry.getValue(); - map.updateEntry(entry, value); - return oldValue; - } - entry = entry.next; - } - - map.addMapping(index, hashCode, new MultiKey(key1, key2, key3), value); - return null; - } - - /** - * Removes the specified multi-key from this map. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key1, Object key2, Object key3) { - int hashCode = hash(key1, key2, key3); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - AbstractHashedMap.HashEntry previous = null; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3)) { - Object oldValue = entry.getValue(); - map.removeMapping(entry, index, previous); - return oldValue; - } - previous = entry; - entry = entry.next; - } - return null; - } - - /** - * Gets the hash code for the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @return the hash code - */ - protected int hash(Object key1, Object key2, Object key3) { - int h = 0; - if (key1 != null) { - h ^= key1.hashCode(); - } - if (key2 != null) { - h ^= key2.hashCode(); - } - if (key3 != null) { - h ^= key3.hashCode(); - } - h += ~(h << 9); - h ^= (h >>> 14); - h += (h << 4); - h ^= (h >>> 10); - return h; - } - - /** - * Is the key equal to the combined key. - * - * @param entry the entry to compare to - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @return true if the key matches - */ - protected boolean isEqualKey(AbstractHashedMap.HashEntry entry, Object key1, Object key2, Object key3) { - MultiKey multi = (MultiKey) entry.getKey(); - return - multi.size() == 3 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1))) && - (key3 == null ? multi.getKey(2) == null : key3.equals(multi.getKey(2))); - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @return the mapped value, null if no match - */ - public Object get(Object key1, Object key2, Object key3, Object key4) { - int hashCode = hash(key1, key2, key3, key4); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4)) { - return entry.getValue(); - } - entry = entry.next; - } - return null; - } - - /** - * Checks whether the map contains the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @return true if the map contains the key - */ - public boolean containsKey(Object key1, Object key2, Object key3, Object key4) { - int hashCode = hash(key1, key2, key3, key4); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4)) { - return true; - } - entry = entry.next; - } - return false; - } - - /** - * Stores the value against the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param value the value to store - * @return the value previously mapped to this combined key, null if none - */ - public Object put(Object key1, Object key2, Object key3, Object key4, Object value) { - int hashCode = hash(key1, key2, key3, key4); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4)) { - Object oldValue = entry.getValue(); - map.updateEntry(entry, value); - return oldValue; - } - entry = entry.next; - } - - map.addMapping(index, hashCode, new MultiKey(key1, key2, key3, key4), value); - return null; - } - - /** - * Removes the specified multi-key from this map. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key1, Object key2, Object key3, Object key4) { - int hashCode = hash(key1, key2, key3, key4); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - AbstractHashedMap.HashEntry previous = null; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4)) { - Object oldValue = entry.getValue(); - map.removeMapping(entry, index, previous); - return oldValue; - } - previous = entry; - entry = entry.next; - } - return null; - } - - /** - * Gets the hash code for the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @return the hash code - */ - protected int hash(Object key1, Object key2, Object key3, Object key4) { - int h = 0; - if (key1 != null) { - h ^= key1.hashCode(); - } - if (key2 != null) { - h ^= key2.hashCode(); - } - if (key3 != null) { - h ^= key3.hashCode(); - } - if (key4 != null) { - h ^= key4.hashCode(); - } - h += ~(h << 9); - h ^= (h >>> 14); - h += (h << 4); - h ^= (h >>> 10); - return h; - } - - /** - * Is the key equal to the combined key. - * - * @param entry the entry to compare to - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @return true if the key matches - */ - protected boolean isEqualKey(AbstractHashedMap.HashEntry entry, Object key1, Object key2, Object key3, Object key4) { - MultiKey multi = (MultiKey) entry.getKey(); - return - multi.size() == 4 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1))) && - (key3 == null ? multi.getKey(2) == null : key3.equals(multi.getKey(2))) && - (key4 == null ? multi.getKey(3) == null : key4.equals(multi.getKey(3))); - } - - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - * @return the mapped value, null if no match - */ - public Object get(Object key1, Object key2, Object key3, Object key4, Object key5) { - int hashCode = hash(key1, key2, key3, key4, key5); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4, key5)) { - return entry.getValue(); - } - entry = entry.next; - } - return null; - } - - /** - * Checks whether the map contains the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - * @return true if the map contains the key - */ - public boolean containsKey(Object key1, Object key2, Object key3, Object key4, Object key5) { - int hashCode = hash(key1, key2, key3, key4, key5); - AbstractHashedMap.HashEntry entry = map.data[map.hashIndex(hashCode, map.data.length)]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4, key5)) { - return true; - } - entry = entry.next; - } - return false; - } - - /** - * Stores the value against the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - * @param value the value to store - * @return the value previously mapped to this combined key, null if none - */ - public Object put(Object key1, Object key2, Object key3, Object key4, Object key5, Object value) { - int hashCode = hash(key1, key2, key3, key4, key5); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4, key5)) { - Object oldValue = entry.getValue(); - map.updateEntry(entry, value); - return oldValue; - } - entry = entry.next; - } - - map.addMapping(index, hashCode, new MultiKey(key1, key2, key3, key4, key5), value); - return null; - } - - /** - * Removes the specified multi-key from this map. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - * @return the value mapped to the removed key, null if key not in map - */ - public Object remove(Object key1, Object key2, Object key3, Object key4, Object key5) { - int hashCode = hash(key1, key2, key3, key4, key5); - int index = map.hashIndex(hashCode, map.data.length); - AbstractHashedMap.HashEntry entry = map.data[index]; - AbstractHashedMap.HashEntry previous = null; - while (entry != null) { - if (entry.hashCode == hashCode && isEqualKey(entry, key1, key2, key3, key4, key5)) { - Object oldValue = entry.getValue(); - map.removeMapping(entry, index, previous); - return oldValue; - } - previous = entry; - entry = entry.next; - } - return null; - } - - /** - * Gets the hash code for the specified multi-key. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - * @return the hash code - */ - protected int hash(Object key1, Object key2, Object key3, Object key4, Object key5) { - int h = 0; - if (key1 != null) { - h ^= key1.hashCode(); - } - if (key2 != null) { - h ^= key2.hashCode(); - } - if (key3 != null) { - h ^= key3.hashCode(); - } - if (key4 != null) { - h ^= key4.hashCode(); - } - if (key5 != null) { - h ^= key5.hashCode(); - } - h += ~(h << 9); - h ^= (h >>> 14); - h += (h << 4); - h ^= (h >>> 10); - return h; - } - - /** - * Is the key equal to the combined key. - * - * @param entry the entry to compare to - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @param key5 the fifth key - * @return true if the key matches - */ - protected boolean isEqualKey(AbstractHashedMap.HashEntry entry, Object key1, Object key2, Object key3, Object key4, Object key5) { - MultiKey multi = (MultiKey) entry.getKey(); - return - multi.size() == 5 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1))) && - (key3 == null ? multi.getKey(2) == null : key3.equals(multi.getKey(2))) && - (key4 == null ? multi.getKey(3) == null : key4.equals(multi.getKey(3))) && - (key5 == null ? multi.getKey(4) == null : key5.equals(multi.getKey(4))); - } - - //----------------------------------------------------------------------- - /** - * Removes all mappings where the first key is that specified. - *

                  - * This method removes all the mappings where the MultiKey - * has one or more keys, and the first matches that specified. - * - * @param key1 the first key - * @return true if any elements were removed - */ - public boolean removeAll(Object key1) { - boolean modified = false; - MapIterator it = mapIterator(); - while (it.hasNext()) { - MultiKey multi = (MultiKey) it.next(); - if (multi.size() >= 1 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0)))) { - it.remove(); - modified = true; - } - } - return modified; - } - - /** - * Removes all mappings where the first two keys are those specified. - *

                  - * This method removes all the mappings where the MultiKey - * has two or more keys, and the first two match those specified. - * - * @param key1 the first key - * @param key2 the second key - * @return true if any elements were removed - */ - public boolean removeAll(Object key1, Object key2) { - boolean modified = false; - MapIterator it = mapIterator(); - while (it.hasNext()) { - MultiKey multi = (MultiKey) it.next(); - if (multi.size() >= 2 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1)))) { - it.remove(); - modified = true; - } - } - return modified; - } - - /** - * Removes all mappings where the first three keys are those specified. - *

                  - * This method removes all the mappings where the MultiKey - * has three or more keys, and the first three match those specified. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @return true if any elements were removed - */ - public boolean removeAll(Object key1, Object key2, Object key3) { - boolean modified = false; - MapIterator it = mapIterator(); - while (it.hasNext()) { - MultiKey multi = (MultiKey) it.next(); - if (multi.size() >= 3 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1))) && - (key3 == null ? multi.getKey(2) == null : key3.equals(multi.getKey(2)))) { - it.remove(); - modified = true; - } - } - return modified; - } - - /** - * Removes all mappings where the first four keys are those specified. - *

                  - * This method removes all the mappings where the MultiKey - * has four or more keys, and the first four match those specified. - * - * @param key1 the first key - * @param key2 the second key - * @param key3 the third key - * @param key4 the fourth key - * @return true if any elements were removed - */ - public boolean removeAll(Object key1, Object key2, Object key3, Object key4) { - boolean modified = false; - MapIterator it = mapIterator(); - while (it.hasNext()) { - MultiKey multi = (MultiKey) it.next(); - if (multi.size() >= 4 && - (key1 == null ? multi.getKey(0) == null : key1.equals(multi.getKey(0))) && - (key2 == null ? multi.getKey(1) == null : key2.equals(multi.getKey(1))) && - (key3 == null ? multi.getKey(2) == null : key3.equals(multi.getKey(2))) && - (key4 == null ? multi.getKey(3) == null : key4.equals(multi.getKey(3)))) { - it.remove(); - modified = true; - } - } - return modified; - } - - //----------------------------------------------------------------------- - /** - * Check to ensure that input keys are valid MultiKey objects. - * - * @param key the key to check - */ - protected void checkKey(Object key) { - if (key == null) { - throw new NullPointerException("Key must not be null"); - } - if (key instanceof MultiKey == false) { - throw new ClassCastException("Key must be a MultiKey"); - } - } - - /** - * Clones the map without cloning the keys or values. - * - * @return a shallow clone - */ - public Object clone() { - return new MultiKeyMap((AbstractHashedMap) map.clone()); - } - - /** - * Puts the key and value into the map, where the key must be a non-null - * MultiKey object. - * - * @param key the non-null MultiKey object - * @param value the value to store - * @return the previous value for the key - * @throws NullPointerException if the key is null - * @throws ClassCastException if the key is not a MultiKey - */ - public Object put(Object key, Object value) { - checkKey(key); - return map.put(key, value); - } - - /** - * Copies all of the keys and values from the specified map to this map. - * Each key must be non-null and a MultiKey object. - * - * @param mapToCopy to this map - * @throws NullPointerException if the mapToCopy or any key within is null - * @throws ClassCastException if any key in mapToCopy is not a MultiKey - */ - public void putAll(Map mapToCopy) { - for (Iterator it = mapToCopy.keySet().iterator(); it.hasNext();) { - Object key = it.next(); - checkKey(key); - } - map.putAll(mapToCopy); - } - - //----------------------------------------------------------------------- - public MapIterator mapIterator() { - return map.mapIterator(); - } - - public int size() { - return map.size(); - } - - public boolean isEmpty() { - return map.isEmpty(); - } - - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - public boolean containsValue(Object value) { - return map.containsValue(value); - } - - public Object get(Object key) { - return map.get(key); - } - - public Object remove(Object key) { - return map.remove(key); - } - - public void clear() { - map.clear(); - } - - public Set keySet() { - return map.keySet(); - } - - public Collection values() { - return map.values(); - } - - public Set entrySet() { - return map.entrySet(); - } - - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - return map.equals(obj); - } - - public int hashCode() { - return map.hashCode(); - } - - public String toString() { - return map.toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiValueMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiValueMap.java deleted file mode 100644 index ec4de653f94..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/MultiValueMap.java +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.AbstractCollection; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.Factory; -import org.apache.commons.collections.FunctorException; -import org.apache.commons.collections.MultiMap; -import org.apache.commons.collections.iterators.EmptyIterator; -import org.apache.commons.collections.iterators.IteratorChain; - -/** - * A MultiValueMap decorates another map, allowing it to have - * more than one value for a key. - *

                  - * A MultiMap is a Map with slightly different semantics. - * Putting a value into the map will add the value to a Collection at that key. - * Getting a value will return a Collection, holding all the values put to that key. - *

                  - * This implementation is a decorator, allowing any Map implementation - * to be used as the base. - *

                  - * In addition, this implementation allows the type of collection used - * for the values to be controlled. By default, an ArrayList - * is used, however a Class to instantiate may be specified, - * or a factory that returns a Collection instance. - *

                  - * Note that MultiValueMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. This class may throw exceptions when accessed - * by concurrent threads without synchronization. - * - * @author James Carman - * @author Christopher Berry - * @author James Strachan - * @author Steve Downey - * @author Stephen Colebourne - * @author Julien Buret - * @author Serhiy Yevtushenko - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * @since Commons Collections 3.2 - */ -public class MultiValueMap extends AbstractMapDecorator implements MultiMap { - - /** The factory for creating value collections. */ - private final Factory collectionFactory; - /** The cached values. */ - private transient Collection values; - - /** - * Creates a map which wraps the given map and - * maps keys to ArrayLists. - * - * @param map the map to wrap - */ - public static MultiValueMap decorate(Map map) { - return new MultiValueMap(map, new ReflectionFactory(ArrayList.class)); - } - - /** - * Creates a map which decorates the given map and - * maps keys to collections of type collectionClass. - * - * @param map the map to wrap - * @param collectionClass the type of the collection class - */ - public static MultiValueMap decorate(Map map, Class collectionClass) { - return new MultiValueMap(map, new ReflectionFactory(collectionClass)); - } - - /** - * Creates a map which decorates the given map and - * creates the value collections using the supplied collectionFactory. - * - * @param map the map to decorate - * @param collectionFactory the collection factory (must return a Collection object). - */ - public static MultiValueMap decorate(Map map, Factory collectionFactory) { - return new MultiValueMap(map, collectionFactory); - } - - //----------------------------------------------------------------------- - /** - * Creates a MultiValueMap based on a HashMap and - * storing the multiple values in an ArrayList. - */ - public MultiValueMap() { - this(new HashMap(), new ReflectionFactory(ArrayList.class)); - } - - /** - * Creates a MultiValueMap which decorates the given map and - * creates the value collections using the supplied collectionFactory. - * - * @param map the map to decorate - * @param collectionFactory the collection factory which must return a Collection instance - */ - protected MultiValueMap(Map map, Factory collectionFactory) { - super(map); - if (collectionFactory == null) { - throw new IllegalArgumentException("The factory must not be null"); - } - this.collectionFactory = collectionFactory; - } - - //----------------------------------------------------------------------- - /** - * Clear the map. - */ - public void clear() { - // If you believe that you have GC issues here, try uncommenting this code -// Set pairs = getMap().entrySet(); -// Iterator pairsIterator = pairs.iterator(); -// while (pairsIterator.hasNext()) { -// Map.Entry keyValuePair = (Map.Entry) pairsIterator.next(); -// Collection coll = (Collection) keyValuePair.getValue(); -// coll.clear(); -// } - getMap().clear(); - } - - /** - * Removes a specific value from map. - *

                  - * The item is removed from the collection mapped to the specified key. - * Other values attached to that key are unaffected. - *

                  - * If the last value for a key is removed, null will be returned - * from a subsequant get(key). - * - * @param key the key to remove from - * @param value the value to remove - * @return the value removed (which was passed in), null if nothing removed - */ - public Object remove(Object key, Object value) { - Collection valuesForKey = getCollection(key); - if (valuesForKey == null) { - return null; - } - boolean removed = valuesForKey.remove(value); - if (removed == false) { - return null; - } - if (valuesForKey.isEmpty()) { - remove(key); - } - return value; - } - - /** - * Checks whether the map contains the value specified. - *

                  - * This checks all collections against all keys for the value, and thus could be slow. - * - * @param value the value to search for - * @return true if the map contains the value - */ - public boolean containsValue(Object value) { - Set pairs = getMap().entrySet(); - if (pairs == null) { - return false; - } - Iterator pairsIterator = pairs.iterator(); - while (pairsIterator.hasNext()) { - Map.Entry keyValuePair = (Map.Entry) pairsIterator.next(); - Collection coll = (Collection) keyValuePair.getValue(); - if (coll.contains(value)) { - return true; - } - } - return false; - } - - /** - * Adds the value to the collection associated with the specified key. - *

                  - * Unlike a normal Map the previous value is not replaced. - * Instead the new value is added to the collection stored against the key. - * - * @param key the key to store against - * @param value the value to add to the collection at the key - * @return the value added if the map changed and null if the map did not change - */ - public Object put(Object key, Object value) { - boolean result = false; - Collection coll = getCollection(key); - if (coll == null) { - coll = createCollection(1); - result = coll.add(value); - if (coll.size() > 0) { - // only add if non-zero size to maintain class state - getMap().put(key, coll); - result = false; - } - } else { - result = coll.add(value); - } - return (result ? value : null); - } - - /** - * Override superclass to ensure that MultiMap instances are - * correctly handled. - *

                  - * If you call this method with a normal map, each entry is - * added using put(Object,Object). - * If you call this method with a multi map, each entry is - * added using putAll(Object,Collection). - * - * @param map the map to copy (either a normal or multi map) - */ - public void putAll(Map map) { - if (map instanceof MultiMap) { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - Collection coll = (Collection) entry.getValue(); - putAll(entry.getKey(), coll); - } - } else { - for (Iterator it = map.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - put(entry.getKey(), entry.getValue()); - } - } - } - - /** - * Gets a collection containing all the values in the map. - *

                  - * This returns a collection containing the combination of values from all keys. - * - * @return a collection view of the values contained in this map - */ - public Collection values() { - Collection vs = values; - return (vs != null ? vs : (values = new Values())); - } - - /** - * Checks whether the collection at the specified key contains the value. - * - * @param value the value to search for - * @return true if the map contains the value - */ - public boolean containsValue(Object key, Object value) { - Collection coll = getCollection(key); - if (coll == null) { - return false; - } - return coll.contains(value); - } - - /** - * Gets the collection mapped to the specified key. - * This method is a convenience method to typecast the result of get(key). - * - * @param key the key to retrieve - * @return the collection mapped to the key, null if no mapping - */ - public Collection getCollection(Object key) { - return (Collection) getMap().get(key); - } - - /** - * Gets the size of the collection mapped to the specified key. - * - * @param key the key to get size for - * @return the size of the collection at the key, zero if key not in map - */ - public int size(Object key) { - Collection coll = getCollection(key); - if (coll == null) { - return 0; - } - return coll.size(); - } - - /** - * Adds a collection of values to the collection associated with - * the specified key. - * - * @param key the key to store against - * @param values the values to add to the collection at the key, null ignored - * @return true if this map changed - */ - public boolean putAll(Object key, Collection values) { - if (values == null || values.size() == 0) { - return false; - } - Collection coll = getCollection(key); - if (coll == null) { - coll = createCollection(values.size()); - boolean result = coll.addAll(values); - if (coll.size() > 0) { - // only add if non-zero size to maintain class state - getMap().put(key, coll); - result = false; - } - return result; - } else { - return coll.addAll(values); - } - } - - /** - * Gets an iterator for the collection mapped to the specified key. - * - * @param key the key to get an iterator for - * @return the iterator of the collection at the key, empty iterator if key not in map - */ - public Iterator iterator(Object key) { - if (!containsKey(key)) { - return EmptyIterator.INSTANCE; - } else { - return new ValuesIterator(key); - } - } - - /** - * Gets the total size of the map by counting all the values. - * - * @return the total size of the map counting all values - */ - public int totalSize() { - int total = 0; - Collection values = getMap().values(); - for (Iterator it = values.iterator(); it.hasNext();) { - Collection coll = (Collection) it.next(); - total += coll.size(); - } - return total; - } - - /** - * Creates a new instance of the map value Collection container - * using the factory. - *

                  - * This method can be overridden to perform your own processing - * instead of using the factory. - * - * @param size the collection size that is about to be added - * @return the new collection - */ - protected Collection createCollection(int size) { - return (Collection) collectionFactory.create(); - } - - //----------------------------------------------------------------------- - /** - * Inner class that provides the values view. - */ - private class Values extends AbstractCollection { - public Iterator iterator() { - final IteratorChain chain = new IteratorChain(); - for (Iterator it = keySet().iterator(); it.hasNext();) { - chain.addIterator(new ValuesIterator(it.next())); - } - return chain; - } - - public int size() { - return totalSize(); - } - - public void clear() { - MultiValueMap.this.clear(); - } - } - - /** - * Inner class that provides the values iterator. - */ - private class ValuesIterator implements Iterator { - private final Object key; - private final Collection values; - private final Iterator iterator; - - public ValuesIterator(Object key) { - this.key = key; - this.values = getCollection(key); - this.iterator = values.iterator(); - } - - public void remove() { - iterator.remove(); - if (values.isEmpty()) { - MultiValueMap.this.remove(key); - } - } - - public boolean hasNext() { - return iterator.hasNext(); - } - - public Object next() { - return iterator.next(); - } - } - - /** - * Inner class that provides a simple reflection factory. - */ - private static class ReflectionFactory implements Factory { - private final Class clazz; - - public ReflectionFactory(Class clazz) { - this.clazz = clazz; - } - - public Object create() { - try { - return clazz.newInstance(); - } catch (Exception ex) { - throw new FunctorException("Cannot instantiate class: " + clazz, ex); - } - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedMap.java deleted file mode 100644 index 6481791ae6c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedMap.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.Predicate; - -/** - * Decorates another Map to validate that additions - * match a specified predicate. - *

                  - * This map exists to provide validation for the decorated map. - * It is normally created to decorate an empty map. - * If an object cannot be added to the map, an IllegalArgumentException is thrown. - *

                  - * One usage would be to ensure that no null keys are added to the map. - *

                  Map map = PredicatedSet.decorate(new HashMap(), NotNullPredicate.INSTANCE, null);
                  - *

                  - * Note that PredicatedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedMap - extends AbstractInputCheckedMapDecorator - implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 7412622456128415156L; - - /** The key predicate to use */ - protected final Predicate keyPredicate; - /** The value predicate to use */ - protected final Predicate valuePredicate; - - /** - * Factory method to create a predicated (validating) map. - *

                  - * If there are any elements already in the list being decorated, they - * are validated. - * - * @param map the map to decorate, must not be null - * @param keyPredicate the predicate to validate the keys, null means no check - * @param valuePredicate the predicate to validate to values, null means no check - * @throws IllegalArgumentException if the map is null - */ - public static Map decorate(Map map, Predicate keyPredicate, Predicate valuePredicate) { - return new PredicatedMap(map, keyPredicate, valuePredicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param keyPredicate the predicate to validate the keys, null means no check - * @param valuePredicate the predicate to validate to values, null means no check - * @throws IllegalArgumentException if the map is null - */ - protected PredicatedMap(Map map, Predicate keyPredicate, Predicate valuePredicate) { - super(map); - this.keyPredicate = keyPredicate; - this.valuePredicate = valuePredicate; - - Iterator it = map.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry) it.next(); - Object key = entry.getKey(); - Object value = entry.getValue(); - validate(key, value); - } - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - /** - * Validates a key value pair. - * - * @param key the key to validate - * @param value the value to validate - * @throws IllegalArgumentException if invalid - */ - protected void validate(Object key, Object value) { - if (keyPredicate != null && keyPredicate.evaluate(key) == false) { - throw new IllegalArgumentException("Cannot add key - Predicate rejected it"); - } - if (valuePredicate != null && valuePredicate.evaluate(value) == false) { - throw new IllegalArgumentException("Cannot add value - Predicate rejected it"); - } - } - - /** - * Override to validate an object set into the map via setValue. - * - * @param value the value to validate - * @throws IllegalArgumentException if invalid - * @since Commons Collections 3.1 - */ - protected Object checkSetValue(Object value) { - if (valuePredicate.evaluate(value) == false) { - throw new IllegalArgumentException("Cannot set value - Predicate rejected it"); - } - return value; - } - - /** - * Override to only return true when there is a value transformer. - * - * @return true if a value predicate is in use - * @since Commons Collections 3.1 - */ - protected boolean isSetValueChecking() { - return (valuePredicate != null); - } - - //----------------------------------------------------------------------- - public Object put(Object key, Object value) { - validate(key, value); - return map.put(key, value); - } - - public void putAll(Map mapToCopy) { - Iterator it = mapToCopy.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry) it.next(); - Object key = entry.getKey(); - Object value = entry.getValue(); - validate(key, value); - } - map.putAll(mapToCopy); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedSortedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedSortedMap.java deleted file mode 100644 index c3bfc94a241..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/PredicatedSortedMap.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Comparator; -import java.util.SortedMap; - -import org.apache.commons.collections.Predicate; - -/** - * Decorates another SortedMap to validate that additions - * match a specified predicate. - *

                  - * This map exists to provide validation for the decorated map. - * It is normally created to decorate an empty map. - * If an object cannot be added to the map, an IllegalArgumentException is thrown. - *

                  - * One usage would be to ensure that no null keys are added to the map. - *

                  SortedMap map = PredicatedSortedSet.decorate(new TreeMap(), NotNullPredicate.INSTANCE, null);
                  - *

                  - * Note that PredicatedSortedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedSortedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedSortedMap - extends PredicatedMap - implements SortedMap { - - /** Serialization version */ - private static final long serialVersionUID = 3359846175935304332L; - - /** - * Factory method to create a predicated (validating) sorted map. - *

                  - * If there are any elements already in the list being decorated, they - * are validated. - * - * @param map the map to decorate, must not be null - * @param keyPredicate the predicate to validate the keys, null means no check - * @param valuePredicate the predicate to validate to values, null means no check - * @throws IllegalArgumentException if the map is null - */ - public static SortedMap decorate(SortedMap map, Predicate keyPredicate, Predicate valuePredicate) { - return new PredicatedSortedMap(map, keyPredicate, valuePredicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param keyPredicate the predicate to validate the keys, null means no check - * @param valuePredicate the predicate to validate to values, null means no check - * @throws IllegalArgumentException if the map is null - */ - protected PredicatedSortedMap(SortedMap map, Predicate keyPredicate, Predicate valuePredicate) { - super(map, keyPredicate, valuePredicate); - } - - //----------------------------------------------------------------------- - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected SortedMap getSortedMap() { - return (SortedMap) map; - } - - //----------------------------------------------------------------------- - public Object firstKey() { - return getSortedMap().firstKey(); - } - - public Object lastKey() { - return getSortedMap().lastKey(); - } - - public Comparator comparator() { - return getSortedMap().comparator(); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap map = getSortedMap().subMap(fromKey, toKey); - return new PredicatedSortedMap(map, keyPredicate, valuePredicate); - } - - public SortedMap headMap(Object toKey) { - SortedMap map = getSortedMap().headMap(toKey); - return new PredicatedSortedMap(map, keyPredicate, valuePredicate); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap map = getSortedMap().tailMap(fromKey); - return new PredicatedSortedMap(map, keyPredicate, valuePredicate); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceIdentityMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceIdentityMap.java deleted file mode 100644 index cfb4dc593d9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceIdentityMap.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.lang.ref.Reference; - -/** - * A Map implementation that allows mappings to be - * removed by the garbage collector and matches keys and values based - * on == not equals(). - *

                  - *

                  - * When you construct a ReferenceIdentityMap, you can specify what kind - * of references are used to store the map's keys and values. - * If non-hard references are used, then the garbage collector can remove - * mappings if a key or value becomes unreachable, or if the JVM's memory is - * running low. For information on how the different reference types behave, - * see {@link Reference}. - *

                  - * Different types of references can be specified for keys and values. - * The default constructor uses hard keys and soft values, providing a - * memory-sensitive cache. - *

                  - * This map is similar to - * {@link org.apache.commons.collections.map.ReferenceMap ReferenceMap}. - * It differs in that keys and values in this class are compared using ==. - *

                  - * This map will violate the detail of various Map and map view contracts. - * As a general rule, don't compare this map to other maps. - *

                  - * This {@link java.util.Map Map} implementation does not allow null elements. - * Attempting to add a null key or value to the map will raise a NullPointerException. - *

                  - * This implementation is not synchronized. - * You can use {@link java.util.Collections#synchronizedMap} to - * provide synchronized access to a ReferenceIdentityMap. - * Remember that synchronization will not stop the garbage collecter removing entries. - *

                  - * All the available iterators can be reset back to the start by casting to - * ResettableIterator and calling reset(). - *

                  - * Note that ReferenceIdentityMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - * - * @see java.lang.ref.Reference - * - * @since Commons Collections 3.0 (previously in main package v2.1) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class ReferenceIdentityMap extends AbstractReferenceMap implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = -1266190134568365852L; - - /** - * Constructs a new ReferenceIdentityMap that will - * use hard references to keys and soft references to values. - */ - public ReferenceIdentityMap() { - super(HARD, SOFT, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, false); - } - - /** - * Constructs a new ReferenceIdentityMap that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - */ - public ReferenceIdentityMap(int keyType, int valueType) { - super(keyType, valueType, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, false); - } - - /** - * Constructs a new ReferenceIdentityMap that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceIdentityMap(int keyType, int valueType, boolean purgeValues) { - super(keyType, valueType, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, purgeValues); - } - - /** - * Constructs a new ReferenceIdentityMap with the - * specified reference types, load factor and initial capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - */ - public ReferenceIdentityMap(int keyType, int valueType, int capacity, float loadFactor) { - super(keyType, valueType, capacity, loadFactor, false); - } - - /** - * Constructs a new ReferenceIdentityMap with the - * specified reference types, load factor and initial capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceIdentityMap(int keyType, int valueType, int capacity, - float loadFactor, boolean purgeValues) { - super(keyType, valueType, capacity, loadFactor, purgeValues); - } - - //----------------------------------------------------------------------- - /** - * Gets the hash code for the key specified. - *

                  - * This implementation uses the identity hash code. - * - * @param key the key to get a hash code for - * @return the hash code - */ - protected int hash(Object key) { - return System.identityHashCode(key); - } - - /** - * Gets the hash code for a MapEntry. - *

                  - * This implementation uses the identity hash code. - * - * @param key the key to get a hash code for, may be null - * @param value the value to get a hash code for, may be null - * @return the hash code, as per the MapEntry specification - */ - protected int hashEntry(Object key, Object value) { - return System.identityHashCode(key) ^ - System.identityHashCode(value); - } - - /** - * Compares two keys for equals. - *

                  - * This implementation converts the key from the entry to a real reference - * before comparison and uses ==. - * - * @param key1 the first key to compare passed in from outside - * @param key2 the second key extracted from the entry via entry.key - * @return true if equal by identity - */ - protected boolean isEqualKey(Object key1, Object key2) { - key2 = (keyType > HARD ? ((Reference) key2).get() : key2); - return (key1 == key2); - } - - /** - * Compares two values for equals. - *

                  - * This implementation uses ==. - * - * @param value1 the first value to compare passed in from outside - * @param value2 the second value extracted from the entry via getValue() - * @return true if equal by identity - */ - protected boolean isEqualValue(Object value1, Object value2) { - return (value1 == value2); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceMap.java deleted file mode 100644 index 5808decd1ff..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/ReferenceMap.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -/** - * A Map implementation that allows mappings to be - * removed by the garbage collector. - *

                  - * When you construct a ReferenceMap, you can specify what kind - * of references are used to store the map's keys and values. - * If non-hard references are used, then the garbage collector can remove - * mappings if a key or value becomes unreachable, or if the JVM's memory is - * running low. For information on how the different reference types behave, - * see {@link java.lang.ref.Reference Reference}. - *

                  - * Different types of references can be specified for keys and values. - * The keys can be configured to be weak but the values hard, - * in which case this class will behave like a - * - * WeakHashMap. However, you can also specify hard keys and - * weak values, or any other combination. The default constructor uses - * hard keys and soft values, providing a memory-sensitive cache. - *

                  - * This map is similar to - * {@link org.apache.commons.collections.map.ReferenceIdentityMap ReferenceIdentityMap}. - * It differs in that keys and values in this class are compared using equals(). - *

                  - * This {@link java.util.Map Map} implementation does not allow null elements. - * Attempting to add a null key or value to the map will raise a NullPointerException. - *

                  - * This implementation is not synchronized. - * You can use {@link java.util.Collections#synchronizedMap} to - * provide synchronized access to a ReferenceMap. - * Remember that synchronization will not stop the garbage collecter removing entries. - *

                  - * All the available iterators can be reset back to the start by casting to - * ResettableIterator and calling reset(). - *

                  - * Note that ReferenceMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * NOTE: As from Commons Collections 3.1 this map extends AbstractReferenceMap - * (previously it extended AbstractMap). As a result, the implementation is now - * extensible and provides a MapIterator. - * - * @see java.lang.ref.Reference - * - * @since Commons Collections 3.0 (previously in main package v2.1) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Paul Jack - * @author Stephen Colebourne - */ -public class ReferenceMap extends AbstractReferenceMap implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 1555089888138299607L; - - /** - * Constructs a new ReferenceMap that will - * use hard references to keys and soft references to values. - */ - public ReferenceMap() { - super(HARD, SOFT, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, false); - } - - /** - * Constructs a new ReferenceMap that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - */ - public ReferenceMap(int keyType, int valueType) { - super(keyType, valueType, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, false); - } - - /** - * Constructs a new ReferenceMap that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceMap(int keyType, int valueType, boolean purgeValues) { - super(keyType, valueType, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, purgeValues); - } - - /** - * Constructs a new ReferenceMap with the - * specified reference types, load factor and initial - * capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - */ - public ReferenceMap(int keyType, int valueType, int capacity, float loadFactor) { - super(keyType, valueType, capacity, loadFactor, false); - } - - /** - * Constructs a new ReferenceMap with the - * specified reference types, load factor and initial - * capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceMap(int keyType, int valueType, int capacity, - float loadFactor, boolean purgeValues) { - super(keyType, valueType, capacity, loadFactor, purgeValues); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - doWriteObject(out); - } - - /** - * Read the map in using a custom routine. - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - doReadObject(in); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/SingletonMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/SingletonMap.java deleted file mode 100644 index 0936860f4f3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/SingletonMap.java +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.Serializable; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.BoundedMap; -import org.apache.commons.collections.KeyValue; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.ResettableIterator; -import org.apache.commons.collections.iterators.SingletonIterator; -import org.apache.commons.collections.keyvalue.TiedMapEntry; - -/** - * A Map implementation that holds a single item and is fixed size. - *

                  - * The single key/value pair is specified at creation. - * The map is fixed size so any action that would change the size is disallowed. - * However, the put or setValue methods can change - * the value associated with the key. - *

                  - * If trying to remove or clear the map, an UnsupportedOperationException is thrown. - * If trying to put a new mapping into the map, an IllegalArgumentException is thrown. - * The put method will only suceed if the key specified is the same as the - * singleton key. - *

                  - * The key and value can be obtained by: - *

                    - *
                  • normal Map methods and views - *
                  • the MapIterator, see {@link #mapIterator()} - *
                  • the KeyValue interface (just cast - no object creation) - *
                  - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SingletonMap - implements OrderedMap, BoundedMap, KeyValue, Serializable, Cloneable { - - /** Serialization version */ - private static final long serialVersionUID = -8931271118676803261L; - - /** Singleton key */ - private final Object key; - /** Singleton value */ - private Object value; - - /** - * Constructor that creates a map of null to null. - */ - public SingletonMap() { - super(); - this.key = null; - } - - /** - * Constructor specifying the key and value. - * - * @param key the key to use - * @param value the value to use - */ - public SingletonMap(Object key, Object value) { - super(); - this.key = key; - this.value = value; - } - - /** - * Constructor specifying the key and value as a KeyValue. - * - * @param keyValue the key value pair to use - */ - public SingletonMap(KeyValue keyValue) { - super(); - this.key = keyValue.getKey(); - this.value = keyValue.getValue(); - } - - /** - * Constructor specifying the key and value as a MapEntry. - * - * @param mapEntry the mapEntry to use - */ - public SingletonMap(Map.Entry mapEntry) { - super(); - this.key = mapEntry.getKey(); - this.value = mapEntry.getValue(); - } - - /** - * Constructor copying elements from another map. - * - * @param map the map to copy, must be size 1 - * @throws NullPointerException if the map is null - * @throws IllegalArgumentException if the size is not 1 - */ - public SingletonMap(Map map) { - super(); - if (map.size() != 1) { - throw new IllegalArgumentException("The map size must be 1"); - } - Map.Entry entry = (Map.Entry) map.entrySet().iterator().next(); - this.key = entry.getKey(); - this.value = entry.getValue(); - } - - // KeyValue - //----------------------------------------------------------------------- - /** - * Gets the key. - * - * @return the key - */ - public Object getKey() { - return key; - } - - /** - * Gets the value. - * - * @return the value - */ - public Object getValue() { - return value; - } - - /** - * Sets the value. - * - * @param value the new value to set - * @return the old value - */ - public Object setValue(Object value) { - Object old = this.value; - this.value = value; - return old; - } - - // BoundedMap - //----------------------------------------------------------------------- - /** - * Is the map currently full, always true. - * - * @return true always - */ - public boolean isFull() { - return true; - } - - /** - * Gets the maximum size of the map, always 1. - * - * @return 1 always - */ - public int maxSize() { - return 1; - } - - // Map - //----------------------------------------------------------------------- - /** - * Gets the value mapped to the key specified. - * - * @param key the key - * @return the mapped value, null if no match - */ - public Object get(Object key) { - if (isEqualKey(key)) { - return value; - } - return null; - } - - /** - * Gets the size of the map, always 1. - * - * @return the size of 1 - */ - public int size() { - return 1; - } - - /** - * Checks whether the map is currently empty, which it never is. - * - * @return false always - */ - public boolean isEmpty() { - return false; - } - - //----------------------------------------------------------------------- - /** - * Checks whether the map contains the specified key. - * - * @param key the key to search for - * @return true if the map contains the key - */ - public boolean containsKey(Object key) { - return (isEqualKey(key)); - } - - /** - * Checks whether the map contains the specified value. - * - * @param value the value to search for - * @return true if the map contains the key - */ - public boolean containsValue(Object value) { - return (isEqualValue(value)); - } - - //----------------------------------------------------------------------- - /** - * Puts a key-value mapping into this map where the key must match the existing key. - *

                  - * An IllegalArgumentException is thrown if the key does not match as the map - * is fixed size. - * - * @param key the key to set, must be the key of the map - * @param value the value to set - * @return the value previously mapped to this key, null if none - * @throws IllegalArgumentException if the key does not match - */ - public Object put(Object key, Object value) { - if (isEqualKey(key)) { - return setValue(value); - } - throw new IllegalArgumentException("Cannot put new key/value pair - Map is fixed size singleton"); - } - - /** - * Puts the values from the specified map into this map. - *

                  - * The map must be of size 0 or size 1. - * If it is size 1, the key must match the key of this map otherwise an - * IllegalArgumentException is thrown. - * - * @param map the map to add, must be size 0 or 1, and the key must match - * @throws NullPointerException if the map is null - * @throws IllegalArgumentException if the key does not match - */ - public void putAll(Map map) { - switch (map.size()) { - case 0: - return; - - case 1: - Map.Entry entry = (Map.Entry) map.entrySet().iterator().next(); - put(entry.getKey(), entry.getValue()); - return; - - default: - throw new IllegalArgumentException("The map size must be 0 or 1"); - } - } - - /** - * Unsupported operation. - * - * @param key the mapping to remove - * @return the value mapped to the removed key, null if key not in map - * @throws UnsupportedOperationException always - */ - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - /** - * Unsupported operation. - */ - public void clear() { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - /** - * Gets the entrySet view of the map. - * Changes made via setValue affect this map. - * To simply iterate through the entries, use {@link #mapIterator()}. - * - * @return the entrySet view - */ - public Set entrySet() { - Map.Entry entry = new TiedMapEntry(this, getKey()); - return Collections.singleton(entry); - } - - /** - * Gets the unmodifiable keySet view of the map. - * Changes made to the view affect this map. - * To simply iterate through the keys, use {@link #mapIterator()}. - * - * @return the keySet view - */ - public Set keySet() { - return Collections.singleton(key); - } - - /** - * Gets the unmodifiable values view of the map. - * Changes made to the view affect this map. - * To simply iterate through the values, use {@link #mapIterator()}. - * - * @return the values view - */ - public Collection values() { - return new SingletonValues(this); - } - - /** - * Gets an iterator over the map. - * Changes made to the iterator using setValue affect this map. - * The remove method is unsupported. - *

                  - * A MapIterator returns the keys in the map. It also provides convenient - * methods to get the key and value, and set the value. - * It avoids the need to create an entrySet/keySet/values object. - * It also avoids creating the Map Entry object. - * - * @return the map iterator - */ - public MapIterator mapIterator() { - return new SingletonMapIterator(this); - } - - // OrderedMap - //----------------------------------------------------------------------- - /** - * Obtains an OrderedMapIterator over the map. - *

                  - * A ordered map iterator is an efficient way of iterating over maps - * in both directions. - * - * @return an ordered map iterator - */ - public OrderedMapIterator orderedMapIterator() { - return new SingletonMapIterator(this); - } - - /** - * Gets the first (and only) key in the map. - * - * @return the key - */ - public Object firstKey() { - return getKey(); - } - - /** - * Gets the last (and only) key in the map. - * - * @return the key - */ - public Object lastKey() { - return getKey(); - } - - /** - * Gets the next key after the key specified, always null. - * - * @param key the next key - * @return null always - */ - public Object nextKey(Object key) { - return null; - } - - /** - * Gets the previous key before the key specified, always null. - * - * @param key the next key - * @return null always - */ - public Object previousKey(Object key) { - return null; - } - - //----------------------------------------------------------------------- - /** - * Compares the specified key to the stored key. - * - * @param key the key to compare - * @return true if equal - */ - protected boolean isEqualKey(Object key) { - return (key == null ? getKey() == null : key.equals(getKey())); - } - - /** - * Compares the specified value to the stored value. - * - * @param value the value to compare - * @return true if equal - */ - protected boolean isEqualValue(Object value) { - return (value == null ? getValue() == null : value.equals(getValue())); - } - - //----------------------------------------------------------------------- - /** - * SingletonMapIterator. - */ - static class SingletonMapIterator implements OrderedMapIterator, ResettableIterator { - private final SingletonMap parent; - private boolean hasNext = true; - private boolean canGetSet = false; - - SingletonMapIterator(SingletonMap parent) { - super(); - this.parent = parent; - } - - public boolean hasNext() { - return hasNext; - } - - public Object next() { - if (hasNext == false) { - throw new NoSuchElementException(AbstractHashedMap.NO_NEXT_ENTRY); - } - hasNext = false; - canGetSet = true; - return parent.getKey(); - } - - public boolean hasPrevious() { - return (hasNext == false); - } - - public Object previous() { - if (hasNext == true) { - throw new NoSuchElementException(AbstractHashedMap.NO_PREVIOUS_ENTRY); - } - hasNext = true; - return parent.getKey(); - } - - public void remove() { - throw new UnsupportedOperationException(); - } - - public Object getKey() { - if (canGetSet == false) { - throw new IllegalStateException(AbstractHashedMap.GETKEY_INVALID); - } - return parent.getKey(); - } - - public Object getValue() { - if (canGetSet == false) { - throw new IllegalStateException(AbstractHashedMap.GETVALUE_INVALID); - } - return parent.getValue(); - } - - public Object setValue(Object value) { - if (canGetSet == false) { - throw new IllegalStateException(AbstractHashedMap.SETVALUE_INVALID); - } - return parent.setValue(value); - } - - public void reset() { - hasNext = true; - } - - public String toString() { - if (hasNext) { - return "Iterator[]"; - } else { - return "Iterator[" + getKey() + "=" + getValue() + "]"; - } - } - } - - /** - * Values implementation for the SingletonMap. - * This class is needed as values is a view that must update as the map updates. - */ - static class SingletonValues extends AbstractSet implements Serializable { - private static final long serialVersionUID = -3689524741863047872L; - private final SingletonMap parent; - - SingletonValues(SingletonMap parent) { - super(); - this.parent = parent; - } - - public int size() { - return 1; - } - public boolean isEmpty() { - return false; - } - public boolean contains(Object object) { - return parent.containsValue(object); - } - public void clear() { - throw new UnsupportedOperationException(); - } - public Iterator iterator() { - return new SingletonIterator(parent.getValue(), false); - } - } - - //----------------------------------------------------------------------- - /** - * Clones the map without cloning the key or value. - * - * @return a shallow clone - */ - public Object clone() { - try { - SingletonMap cloned = (SingletonMap) super.clone(); - return cloned; - } catch (CloneNotSupportedException ex) { - throw new InternalError(); - } - } - - /** - * Compares this map with another. - * - * @param obj the object to compare to - * @return true if equal - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map == false) { - return false; - } - Map other = (Map) obj; - if (other.size() != 1) { - return false; - } - Map.Entry entry = (Map.Entry) other.entrySet().iterator().next(); - return isEqualKey(entry.getKey()) && isEqualValue(entry.getValue()); - } - - /** - * Gets the standard Map hashCode. - * - * @return the hash code defined in the Map interface - */ - public int hashCode() { - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (getValue() == null ? 0 : getValue().hashCode()); - } - - /** - * Gets the map as a String. - * - * @return a string version of the map - */ - public String toString() { - return new StringBuffer(128) - .append('{') - .append((getKey() == this ? "(this Map)" : getKey())) - .append('=') - .append((getValue() == this ? "(this Map)" : getValue())) - .append('}') - .toString(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/StaticBucketMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/StaticBucketMap.java deleted file mode 100644 index aee623a5117..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/StaticBucketMap.java +++ /dev/null @@ -1,701 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.AbstractCollection; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.commons.collections.KeyValue; - -/** - * A StaticBucketMap is an efficient, thread-safe implementation of - * java.util.Map that performs well in in a highly - * thread-contentious environment. The map supports very efficient - * {@link #get(Object) get}, {@link #put(Object,Object) put}, - * {@link #remove(Object) remove} and {@link #containsKey(Object) containsKey} - * operations, assuming (approximate) uniform hashing and - * that the number of entries does not exceed the number of buckets. If the - * number of entries exceeds the number of buckets or if the hash codes of the - * objects are not uniformly distributed, these operations have a worst case - * scenario that is proportional to the number of elements in the map - * (O(n)).

                  - * - * Each bucket in the hash table has its own monitor, so two threads can - * safely operate on the map at the same time, often without incurring any - * monitor contention. This means that you don't have to wrap instances - * of this class with {@link java.util.Collections#synchronizedMap(Map)}; - * instances are already thread-safe. Unfortunately, however, this means - * that this map implementation behaves in ways you may find disconcerting. - * Bulk operations, such as {@link #putAll(Map) putAll} or the - * {@link Collection#retainAll(Collection) retainAll} operation in collection - * views, are not atomic. If two threads are simultaneously - * executing - * - *

                  - *   staticBucketMapInstance.putAll(map);
                  - * 
                  - * - * and - * - *
                  - *   staticBucketMapInstance.entrySet().removeAll(map.entrySet());
                  - * 
                  - * - * then the results are generally random. Those two statement could cancel - * each other out, leaving staticBucketMapInstance essentially - * unchanged, or they could leave some random subset of map in - * staticBucketMapInstance.

                  - * - * Also, much like an encyclopedia, the results of {@link #size()} and - * {@link #isEmpty()} are out-of-date as soon as they are produced.

                  - * - * The iterators returned by the collection views of this class are not - * fail-fast. They will never raise a - * {@link java.util.ConcurrentModificationException}. Keys and values - * added to the map after the iterator is created do not necessarily appear - * during iteration. Similarly, the iterator does not necessarily fail to - * return keys and values that were removed after the iterator was created.

                  - * - * Finally, unlike {@link java.util.HashMap}-style implementations, this - * class never rehashes the map. The number of buckets is fixed - * at construction time and never altered. Performance may degrade if - * you do not allocate enough buckets upfront.

                  - * - * The {@link #atomic(Runnable)} method is provided to allow atomic iterations - * and bulk operations; however, overuse of {@link #atomic(Runnable) atomic} - * will basically result in a map that's slower than an ordinary synchronized - * {@link java.util.HashMap}. - * - * Use this class if you do not require reliable bulk operations and - * iterations, or if you can make your own guarantees about how bulk - * operations will affect the map.

                  - * - * @since Commons Collections 3.0 (previously in main package v2.1) - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Berin Loritsch - * @author Gerhard Froehlich - * @author Michael A. Smith - * @author Paul Jack - * @author Leo Sutic - * @author Janek Bogucki - * @author Kazuya Ujihara - */ -public final class StaticBucketMap implements Map { - - /** The default number of buckets to use */ - private static final int DEFAULT_BUCKETS = 255; - /** The array of buckets, where the actual data is held */ - private Node[] buckets; - /** The matching array of locks */ - private Lock[] locks; - - /** - * Initializes the map with the default number of buckets (255). - */ - public StaticBucketMap() { - this(DEFAULT_BUCKETS); - } - - /** - * Initializes the map with a specified number of buckets. The number - * of buckets is never below 17, and is always an odd number (StaticBucketMap - * ensures this). The number of buckets is inversely proportional to the - * chances for thread contention. The fewer buckets, the more chances for - * thread contention. The more buckets the fewer chances for thread - * contention. - * - * @param numBuckets the number of buckets for this map - */ - public StaticBucketMap(int numBuckets) { - int size = Math.max(17, numBuckets); - - // Ensure that bucketSize is never a power of 2 (to ensure maximal distribution) - if (size % 2 == 0) { - size--; - } - - buckets = new Node[size]; - locks = new Lock[size]; - - for (int i = 0; i < size; i++) { - locks[i] = new Lock(); - } - } - - //----------------------------------------------------------------------- - /** - * Determine the exact hash entry for the key. The hash algorithm - * is rather simplistic, but it does the job: - * - *

                  -     *   He = |Hk mod n|
                  -     * 
                  - * - *

                  - * He is the entry's hashCode, Hk is the key's hashCode, and n is - * the number of buckets. - *

                  - */ - private final int getHash(Object key) { - if (key == null) { - return 0; - } - int hash = key.hashCode(); - hash += ~(hash << 15); - hash ^= (hash >>> 10); - hash += (hash << 3); - hash ^= (hash >>> 6); - hash += ~(hash << 11); - hash ^= (hash >>> 16); - hash %= buckets.length; - return (hash < 0) ? hash * -1 : hash; - } - - /** - * Gets the current size of the map. - * The value is computed fresh each time the method is called. - * - * @return the current size - */ - public int size() { - int cnt = 0; - - for (int i = 0; i < buckets.length; i++) { - cnt += locks[i].size; - } - return cnt; - } - - /** - * Checks if the size is currently zero. - * - * @return true if empty - */ - public boolean isEmpty() { - return (size() == 0); - } - - /** - * Gets the value associated with the key. - * - * @param key the key to retrieve - * @return the associated value - */ - public Object get(final Object key) { - int hash = getHash(key); - - synchronized (locks[hash]) { - Node n = buckets[hash]; - - while (n != null) { - if (n.key == key || (n.key != null && n.key.equals(key))) { - return n.value; - } - - n = n.next; - } - } - return null; - } - - /** - * Checks if the map contains the specified key. - * - * @param key the key to check - * @return true if found - */ - public boolean containsKey(final Object key) { - int hash = getHash(key); - - synchronized (locks[hash]) { - Node n = buckets[hash]; - - while (n != null) { - if (n.key == key || (n.key != null && n.key.equals(key))) { - return true; - } - - n = n.next; - } - } - return false; - } - - /** - * Checks if the map contains the specified value. - * - * @param value the value to check - * @return true if found - */ - public boolean containsValue(final Object value) { - for (int i = 0; i < buckets.length; i++) { - synchronized (locks[i]) { - Node n = buckets[i]; - - while (n != null) { - if (n.value == value || (n.value != null && n.value.equals(value))) { - return true; - } - - n = n.next; - } - } - } - return false; - } - - //----------------------------------------------------------------------- - /** - * Puts a new key value mapping into the map. - * - * @param key the key to use - * @param value the value to use - * @return the previous mapping for the key - */ - public Object put(final Object key, final Object value) { - int hash = getHash(key); - - synchronized (locks[hash]) { - Node n = buckets[hash]; - - if (n == null) { - n = new Node(); - n.key = key; - n.value = value; - buckets[hash] = n; - locks[hash].size++; - return null; - } - - // Set n to the last node in the linked list. Check each key along the way - // If the key is found, then change the value of that node and return - // the old value. - for (Node next = n; next != null; next = next.next) { - n = next; - - if (n.key == key || (n.key != null && n.key.equals(key))) { - Object returnVal = n.value; - n.value = value; - return returnVal; - } - } - - // The key was not found in the current list of nodes, add it to the end - // in a new node. - Node newNode = new Node(); - newNode.key = key; - newNode.value = value; - n.next = newNode; - locks[hash].size++; - } - return null; - } - - /** - * Removes the specified key from the map. - * - * @param key the key to remove - * @return the previous value at this key - */ - public Object remove(Object key) { - int hash = getHash(key); - - synchronized (locks[hash]) { - Node n = buckets[hash]; - Node prev = null; - - while (n != null) { - if (n.key == key || (n.key != null && n.key.equals(key))) { - // Remove this node from the linked list of nodes. - if (null == prev) { - // This node was the head, set the next node to be the new head. - buckets[hash] = n.next; - } else { - // Set the next node of the previous node to be the node after this one. - prev.next = n.next; - } - locks[hash].size--; - return n.value; - } - - prev = n; - n = n.next; - } - } - return null; - } - - //----------------------------------------------------------------------- - /** - * Gets the key set. - * - * @return the key set - */ - public Set keySet() { - return new KeySet(); - } - - /** - * Gets the values. - * - * @return the values - */ - public Collection values() { - return new Values(); - } - - /** - * Gets the entry set. - * - * @return the entry set - */ - public Set entrySet() { - return new EntrySet(); - } - - //----------------------------------------------------------------------- - /** - * Puts all the entries from the specified map into this map. - * This operation is not atomic and may have undesired effects. - * - * @param map the map of entries to add - */ - public void putAll(Map map) { - Iterator i = map.keySet().iterator(); - - while (i.hasNext()) { - Object key = i.next(); - put(key, map.get(key)); - } - } - - /** - * Clears the map of all entries. - */ - public void clear() { - for (int i = 0; i < buckets.length; i++) { - Lock lock = locks[i]; - synchronized (lock) { - buckets[i] = null; - lock.size = 0; - } - } - } - - /** - * Compares this map to another, as per the Map specification. - * - * @param obj the object to compare to - * @return true if equal - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map == false) { - return false; - } - Map other = (Map) obj; - return entrySet().equals(other.entrySet()); - } - - /** - * Gets the hash code, as per the Map specification. - * - * @return the hash code - */ - public int hashCode() { - int hashCode = 0; - - for (int i = 0; i < buckets.length; i++) { - synchronized (locks[i]) { - Node n = buckets[i]; - - while (n != null) { - hashCode += n.hashCode(); - n = n.next; - } - } - } - return hashCode; - } - - //----------------------------------------------------------------------- - /** - * The Map.Entry for the StaticBucketMap. - */ - private static final class Node implements Map.Entry, KeyValue { - protected Object key; - protected Object value; - protected Node next; - - public Object getKey() { - return key; - } - - public Object getValue() { - return value; - } - - public int hashCode() { - return ((key == null ? 0 : key.hashCode()) ^ - (value == null ? 0 : value.hashCode())); - } - - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - - Map.Entry e2 = (Map.Entry) obj; - return ( - (key == null ? e2.getKey() == null : key.equals(e2.getKey())) && - (value == null ? e2.getValue() == null : value.equals(e2.getValue()))); - } - - public Object setValue(Object obj) { - Object retVal = value; - value = obj; - return retVal; - } - } - - - /** - * The lock object, which also includes a count of the nodes in this lock. - */ - private final static class Lock { - public int size; - } - - - //----------------------------------------------------------------------- - private class EntryIterator implements Iterator { - - private ArrayList current = new ArrayList(); - private int bucket; - private Map.Entry last; - - - public boolean hasNext() { - if (current.size() > 0) return true; - while (bucket < buckets.length) { - synchronized (locks[bucket]) { - Node n = buckets[bucket]; - while (n != null) { - current.add(n); - n = n.next; - } - bucket++; - if (current.size() > 0) return true; - } - } - return false; - } - - protected Map.Entry nextEntry() { - if (!hasNext()) throw new NoSuchElementException(); - last = (Map.Entry)current.remove(current.size() - 1); - return last; - } - - public Object next() { - return nextEntry(); - } - - public void remove() { - if (last == null) throw new IllegalStateException(); - StaticBucketMap.this.remove(last.getKey()); - last = null; - } - - } - - private class ValueIterator extends EntryIterator { - - public Object next() { - return nextEntry().getValue(); - } - - } - - private class KeyIterator extends EntryIterator { - - public Object next() { - return nextEntry().getKey(); - } - - } - - private class EntrySet extends AbstractSet { - - public int size() { - return StaticBucketMap.this.size(); - } - - public void clear() { - StaticBucketMap.this.clear(); - } - - public Iterator iterator() { - return new EntryIterator(); - } - - public boolean contains(Object obj) { - Map.Entry entry = (Map.Entry) obj; - int hash = getHash(entry.getKey()); - synchronized (locks[hash]) { - for (Node n = buckets[hash]; n != null; n = n.next) { - if (n.equals(entry)) return true; - } - } - return false; - } - - public boolean remove(Object obj) { - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry entry = (Map.Entry) obj; - int hash = getHash(entry.getKey()); - synchronized (locks[hash]) { - for (Node n = buckets[hash]; n != null; n = n.next) { - if (n.equals(entry)) { - StaticBucketMap.this.remove(n.getKey()); - return true; - } - } - } - return false; - } - - } - - - private class KeySet extends AbstractSet { - - public int size() { - return StaticBucketMap.this.size(); - } - - public void clear() { - StaticBucketMap.this.clear(); - } - - public Iterator iterator() { - return new KeyIterator(); - } - - public boolean contains(Object obj) { - return StaticBucketMap.this.containsKey(obj); - } - - public boolean remove(Object obj) { - int hash = getHash(obj); - synchronized (locks[hash]) { - for (Node n = buckets[hash]; n != null; n = n.next) { - Object k = n.getKey(); - if ((k == obj) || ((k != null) && k.equals(obj))) { - StaticBucketMap.this.remove(k); - return true; - } - } - } - return false; - - } - - } - - - private class Values extends AbstractCollection { - - public int size() { - return StaticBucketMap.this.size(); - } - - public void clear() { - StaticBucketMap.this.clear(); - } - - public Iterator iterator() { - return new ValueIterator(); - } - - } - - - /** - * Prevents any operations from occurring on this map while the - * given {@link Runnable} executes. This method can be used, for - * instance, to execute a bulk operation atomically: - * - *
                  -     *    staticBucketMapInstance.atomic(new Runnable() {
                  -     *        public void run() {
                  -     *            staticBucketMapInstance.putAll(map);
                  -     *        }
                  -     *    });
                  -     *  
                  - * - * It can also be used if you need a reliable iterator: - * - *
                  -     *    staticBucketMapInstance.atomic(new Runnable() {
                  -     *        public void run() {
                  -     *            Iterator iterator = staticBucketMapInstance.iterator();
                  -     *            while (iterator.hasNext()) {
                  -     *                foo(iterator.next();
                  -     *            }
                  -     *        }
                  -     *    });
                  -     *  
                  - * - * Implementation note: This method requires a lot of time - * and a ton of stack space. Essentially a recursive algorithm is used - * to enter each bucket's monitor. If you have twenty thousand buckets - * in your map, then the recursive method will be invoked twenty thousand - * times. You have been warned. - * - * @param r the code to execute atomically - */ - public void atomic(Runnable r) { - if (r == null) throw new NullPointerException(); - atomic(r, 0); - } - - private void atomic(Runnable r, int bucket) { - if (bucket >= buckets.length) { - r.run(); - return; - } - synchronized (locks[bucket]) { - atomic(r, bucket + 1); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedMap.java deleted file mode 100644 index d29fcf86f3c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedMap.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.collections.Transformer; - -/** - * Decorates another Map to transform objects that are added. - *

                  - * The Map put methods and Map.Entry setValue method are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

                  - * Note that TransformedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedMap - extends AbstractInputCheckedMapDecorator - implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 7023152376788900464L; - - /** The transformer to use for the key */ - protected final Transformer keyTransformer; - /** The transformer to use for the value */ - protected final Transformer valueTransformer; - - /** - * Factory method to create a transforming map. - *

                  - * If there are any elements already in the map being decorated, they - * are NOT transformed. - * Constrast this with {@link #decorateTransform}. - * - * @param map the map to decorate, must not be null - * @param keyTransformer the transformer to use for key conversion, null means no transformation - * @param valueTransformer the transformer to use for value conversion, null means no transformation - * @throws IllegalArgumentException if map is null - */ - public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) { - return new TransformedMap(map, keyTransformer, valueTransformer); - } - - /** - * Factory method to create a transforming map that will transform - * existing contents of the specified map. - *

                  - * If there are any elements already in the map being decorated, they - * will be transformed by this method. - * Constrast this with {@link #decorate}. - * - * @param map the map to decorate, must not be null - * @param keyTransformer the transformer to use for key conversion, null means no transformation - * @param valueTransformer the transformer to use for value conversion, null means no transformation - * @throws IllegalArgumentException if map is null - * @since Commons Collections 3.2 - */ - public static Map decorateTransform(Map map, Transformer keyTransformer, Transformer valueTransformer) { - TransformedMap decorated = new TransformedMap(map, keyTransformer, valueTransformer); - if (map.size() > 0) { - Map transformed = decorated.transformMap(map); - decorated.clear(); - decorated.getMap().putAll(transformed); // avoids double transformation - } - return decorated; - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the collection being decorated, they - * are NOT transformed. - * - * @param map the map to decorate, must not be null - * @param keyTransformer the transformer to use for key conversion, null means no conversion - * @param valueTransformer the transformer to use for value conversion, null means no conversion - * @throws IllegalArgumentException if map is null - */ - protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) { - super(map); - this.keyTransformer = keyTransformer; - this.valueTransformer = valueTransformer; - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - /** - * Transforms a key. - *

                  - * The transformer itself may throw an exception if necessary. - * - * @param object the object to transform - * @throws the transformed object - */ - protected Object transformKey(Object object) { - if (keyTransformer == null) { - return object; - } - return keyTransformer.transform(object); - } - - /** - * Transforms a value. - *

                  - * The transformer itself may throw an exception if necessary. - * - * @param object the object to transform - * @throws the transformed object - */ - protected Object transformValue(Object object) { - if (valueTransformer == null) { - return object; - } - return valueTransformer.transform(object); - } - - /** - * Transforms a map. - *

                  - * The transformer itself may throw an exception if necessary. - * - * @param map the map to transform - * @throws the transformed object - */ - protected Map transformMap(Map map) { - if (map.isEmpty()) { - return map; - } - Map result = new LinkedMap(map.size()); - for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) { - Map.Entry entry = (Map.Entry) it.next(); - result.put(transformKey(entry.getKey()), transformValue(entry.getValue())); - } - return result; - } - - /** - * Override to transform the value when using setValue. - * - * @param value the value to transform - * @return the transformed value - * @since Commons Collections 3.1 - */ - protected Object checkSetValue(Object value) { - return valueTransformer.transform(value); - } - - /** - * Override to only return true when there is a value transformer. - * - * @return true if a value transformer is in use - * @since Commons Collections 3.1 - */ - protected boolean isSetValueChecking() { - return (valueTransformer != null); - } - - //----------------------------------------------------------------------- - public Object put(Object key, Object value) { - key = transformKey(key); - value = transformValue(value); - return getMap().put(key, value); - } - - public void putAll(Map mapToCopy) { - mapToCopy = transformMap(mapToCopy); - getMap().putAll(mapToCopy); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedSortedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedSortedMap.java deleted file mode 100644 index 7d25881fcd9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TransformedSortedMap.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Comparator; -import java.util.Map; -import java.util.SortedMap; - -import org.apache.commons.collections.Transformer; - -/** - * Decorates another SortedMap to transform objects that are added. - *

                  - * The Map put methods and Map.Entry setValue method are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

                  - * Note that TransformedSortedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedSortedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedSortedMap - extends TransformedMap - implements SortedMap { - - /** Serialization version */ - private static final long serialVersionUID = -8751771676410385778L; - - /** - * Factory method to create a transforming sorted map. - *

                  - * If there are any elements already in the map being decorated, they - * are NOT transformed. - * Constrast this with {@link #decorateTransform}. - * - * @param map the map to decorate, must not be null - * @param keyTransformer the predicate to validate the keys, null means no transformation - * @param valueTransformer the predicate to validate to values, null means no transformation - * @throws IllegalArgumentException if the map is null - */ - public static SortedMap decorate(SortedMap map, Transformer keyTransformer, Transformer valueTransformer) { - return new TransformedSortedMap(map, keyTransformer, valueTransformer); - } - - /** - * Factory method to create a transforming sorted map that will transform - * existing contents of the specified map. - *

                  - * If there are any elements already in the map being decorated, they - * will be transformed by this method. - * Constrast this with {@link #decorate}. - * - * @param map the map to decorate, must not be null - * @param keyTransformer the transformer to use for key conversion, null means no transformation - * @param valueTransformer the transformer to use for value conversion, null means no transformation - * @throws IllegalArgumentException if map is null - * @since Commons Collections 3.2 - */ - public static SortedMap decorateTransform(SortedMap map, Transformer keyTransformer, Transformer valueTransformer) { - TransformedSortedMap decorated = new TransformedSortedMap(map, keyTransformer, valueTransformer); - if (map.size() > 0) { - Map transformed = decorated.transformMap(map); - decorated.clear(); - decorated.getMap().putAll(transformed); // avoids double transformation - } - return decorated; - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the collection being decorated, they - * are NOT transformed.

                  - * - * @param map the map to decorate, must not be null - * @param keyTransformer the predicate to validate the keys, null means no transformation - * @param valueTransformer the predicate to validate to values, null means no transformation - * @throws IllegalArgumentException if the map is null - */ - protected TransformedSortedMap(SortedMap map, Transformer keyTransformer, Transformer valueTransformer) { - super(map, keyTransformer, valueTransformer); - } - - //----------------------------------------------------------------------- - /** - * Gets the map being decorated. - * - * @return the decorated map - */ - protected SortedMap getSortedMap() { - return (SortedMap) map; - } - - //----------------------------------------------------------------------- - public Object firstKey() { - return getSortedMap().firstKey(); - } - - public Object lastKey() { - return getSortedMap().lastKey(); - } - - public Comparator comparator() { - return getSortedMap().comparator(); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap map = getSortedMap().subMap(fromKey, toKey); - return new TransformedSortedMap(map, keyTransformer, valueTransformer); - } - - public SortedMap headMap(Object toKey) { - SortedMap map = getSortedMap().headMap(toKey); - return new TransformedSortedMap(map, keyTransformer, valueTransformer); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap map = getSortedMap().tailMap(fromKey); - return new TransformedSortedMap(map, keyTransformer, valueTransformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedMap.java deleted file mode 100644 index 33aa6f609b1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedMap.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.Map; - -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another Map to validate that elements added - * are of a specific type. - *

                  - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - *

                  - * Note that TypedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * The returned implementation is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedMap { - - /** - * Factory method to create a typed map. - *

                  - * If there are any elements already in the map being decorated, they - * are validated. - * - * @param map the map to decorate, must not be null - * @param keyType the type to allow as keys, must not be null - * @param valueType the type to allow as values, must not be null - * @throws IllegalArgumentException if list or type is null - * @throws IllegalArgumentException if the list contains invalid elements - */ - public static Map decorate(Map map, Class keyType, Class valueType) { - return new PredicatedMap( - map, - InstanceofPredicate.getInstance(keyType), - InstanceofPredicate.getInstance(valueType) - ); - } - - /** - * Restrictive constructor. - */ - protected TypedMap() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedSortedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedSortedMap.java deleted file mode 100644 index 910f4554e06..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/TypedSortedMap.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.util.SortedMap; - -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another SortedMap to validate that elements added - * are of a specific type. - *

                  - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - *

                  - * Note that TypedSortedMap is not synchronized and is not thread-safe. - * If you wish to use this map from multiple threads concurrently, you must use - * appropriate synchronization. The simplest approach is to wrap this map - * using {@link java.util.Collections#synchronizedSortedMap}. This class may throw - * exceptions when accessed by concurrent threads without synchronization. - *

                  - * The returned implementation is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedSortedMap { - - /** - * Factory method to create a typed sorted map. - *

                  - * If there are any elements already in the map being decorated, they - * are validated. - * - * @param map the map to decorate, must not be null - * @param keyType the type to allow as keys, must not be null - * @param valueType the type to allow as values, must not be null - * @throws IllegalArgumentException if list or type is null - * @throws IllegalArgumentException if the list contains invalid elements - */ - public static SortedMap decorate(SortedMap map, Class keyType, Class valueType) { - return new PredicatedSortedMap( - map, - InstanceofPredicate.getInstance(keyType), - InstanceofPredicate.getInstance(valueType) - ); - } - - /** - * Restrictive constructor. - */ - protected TypedSortedMap() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableEntrySet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableEntrySet.java deleted file mode 100644 index ef443ef03c0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableEntrySet.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.lang.reflect.Array; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; -import org.apache.commons.collections.keyvalue.AbstractMapEntryDecorator; -import org.apache.commons.collections.set.AbstractSetDecorator; - -/** - * Decorates a map entry Set to ensure it can't be altered. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableEntrySet - extends AbstractSetDecorator implements Unmodifiable { - - /** - * Factory method to create an unmodifiable set of Map Entry objects. - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static Set decorate(Set set) { - if (set instanceof Unmodifiable) { - return set; - } - return new UnmodifiableEntrySet(set); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - private UnmodifiableEntrySet(Set set) { - super(set); - } - - //----------------------------------------------------------------------- - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return new UnmodifiableEntrySetIterator(collection.iterator()); - } - - public Object[] toArray() { - Object[] array = collection.toArray(); - for (int i = 0; i < array.length; i++) { - array[i] = new UnmodifiableEntry((Map.Entry) array[i]); - } - return array; - } - - public Object[] toArray(Object array[]) { - Object[] result = array; - if (array.length > 0) { - // we must create a new array to handle multi-threaded situations - // where another thread could access data before we decorate it - result = (Object[]) Array.newInstance(array.getClass().getComponentType(), 0); - } - result = collection.toArray(result); - for (int i = 0; i < result.length; i++) { - result[i] = new UnmodifiableEntry((Map.Entry) result[i]); - } - - // check to see if result should be returned straight - if (result.length > array.length) { - return result; - } - - // copy back into input array to fulfil the method contract - System.arraycopy(result, 0, array, 0, result.length); - if (array.length > result.length) { - array[result.length] = null; - } - return array; - } - - //----------------------------------------------------------------------- - /** - * Implementation of an entry set iterator. - */ - final static class UnmodifiableEntrySetIterator extends AbstractIteratorDecorator { - - protected UnmodifiableEntrySetIterator(Iterator iterator) { - super(iterator); - } - - public Object next() { - Map.Entry entry = (Map.Entry) iterator.next(); - return new UnmodifiableEntry(entry); - } - - public void remove() { - throw new UnsupportedOperationException(); - } - } - - //----------------------------------------------------------------------- - /** - * Implementation of a map entry that is unmodifiable. - */ - final static class UnmodifiableEntry extends AbstractMapEntryDecorator { - - protected UnmodifiableEntry(Map.Entry entry) { - super(entry); - } - - public Object setValue(Object obj) { - throw new UnsupportedOperationException(); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableMap.java deleted file mode 100644 index 038e8430c6a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableMap.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.IterableMap; -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.iterators.EntrySetMapIterator; -import org.apache.commons.collections.iterators.UnmodifiableMapIterator; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another Map to ensure it can't be altered. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableMap - extends AbstractMapDecorator - implements IterableMap, Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 2737023427269031941L; - - /** - * Factory method to create an unmodifiable map. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - public static Map decorate(Map map) { - if (map instanceof Unmodifiable) { - return map; - } - return new UnmodifiableMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - private UnmodifiableMap(Map map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object put(Object key, Object value) { - throw new UnsupportedOperationException(); - } - - public void putAll(Map mapToCopy) { - throw new UnsupportedOperationException(); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - public MapIterator mapIterator() { - if (map instanceof IterableMap) { - MapIterator it = ((IterableMap) map).mapIterator(); - return UnmodifiableMapIterator.decorate(it); - } else { - MapIterator it = new EntrySetMapIterator(map); - return UnmodifiableMapIterator.decorate(it); - } - } - - public Set entrySet() { - Set set = super.entrySet(); - return UnmodifiableEntrySet.decorate(set); - } - - public Set keySet() { - Set set = super.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = super.values(); - return UnmodifiableCollection.decorate(coll); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableOrderedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableOrderedMap.java deleted file mode 100644 index ecc939eeac7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableOrderedMap.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.OrderedMap; -import org.apache.commons.collections.OrderedMapIterator; -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.iterators.UnmodifiableMapIterator; -import org.apache.commons.collections.iterators.UnmodifiableOrderedMapIterator; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another OrderedMap to ensure it can't be altered. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableOrderedMap - extends AbstractOrderedMapDecorator - implements Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 8136428161720526266L; - - /** - * Factory method to create an unmodifiable sorted map. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - public static OrderedMap decorate(OrderedMap map) { - if (map instanceof Unmodifiable) { - return map; - } - return new UnmodifiableOrderedMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - private UnmodifiableOrderedMap(OrderedMap map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public MapIterator mapIterator() { - MapIterator it = getOrderedMap().mapIterator(); - return UnmodifiableMapIterator.decorate(it); - } - - public OrderedMapIterator orderedMapIterator() { - OrderedMapIterator it = getOrderedMap().orderedMapIterator(); - return UnmodifiableOrderedMapIterator.decorate(it); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object put(Object key, Object value) { - throw new UnsupportedOperationException(); - } - - public void putAll(Map mapToCopy) { - throw new UnsupportedOperationException(); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - public Set entrySet() { - Set set = super.entrySet(); - return UnmodifiableEntrySet.decorate(set); - } - - public Set keySet() { - Set set = super.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = super.values(); - return UnmodifiableCollection.decorate(coll); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableSortedMap.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableSortedMap.java deleted file mode 100644 index 3fe0c926eab..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/UnmodifiableSortedMap.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.map; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Comparator; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; - -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.collection.UnmodifiableCollection; -import org.apache.commons.collections.set.UnmodifiableSet; - -/** - * Decorates another SortedMap to ensure it can't be altered. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableSortedMap - extends AbstractSortedMapDecorator - implements Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 5805344239827376360L; - - /** - * Factory method to create an unmodifiable sorted map. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - public static SortedMap decorate(SortedMap map) { - if (map instanceof Unmodifiable) { - return map; - } - return new UnmodifiableSortedMap(map); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if map is null - */ - private UnmodifiableSortedMap(SortedMap map) { - super(map); - } - - //----------------------------------------------------------------------- - /** - * Write the map out using a custom routine. - * - * @param out the output stream - * @throws IOException - * @since Commons Collections 3.1 - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(map); - } - - /** - * Read the map in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - * @since Commons Collections 3.1 - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - map = (Map) in.readObject(); - } - - //----------------------------------------------------------------------- - public void clear() { - throw new UnsupportedOperationException(); - } - - public Object put(Object key, Object value) { - throw new UnsupportedOperationException(); - } - - public void putAll(Map mapToCopy) { - throw new UnsupportedOperationException(); - } - - public Object remove(Object key) { - throw new UnsupportedOperationException(); - } - - public Set entrySet() { - Set set = super.entrySet(); - return UnmodifiableEntrySet.decorate(set); - } - - public Set keySet() { - Set set = super.keySet(); - return UnmodifiableSet.decorate(set); - } - - public Collection values() { - Collection coll = super.values(); - return UnmodifiableCollection.decorate(coll); - } - - //----------------------------------------------------------------------- - public Object firstKey() { - return getSortedMap().firstKey(); - } - - public Object lastKey() { - return getSortedMap().lastKey(); - } - - public Comparator comparator() { - return getSortedMap().comparator(); - } - - public SortedMap subMap(Object fromKey, Object toKey) { - SortedMap map = getSortedMap().subMap(fromKey, toKey); - return new UnmodifiableSortedMap(map); - } - - public SortedMap headMap(Object toKey) { - SortedMap map = getSortedMap().headMap(toKey); - return new UnmodifiableSortedMap(map); - } - - public SortedMap tailMap(Object fromKey) { - SortedMap map = getSortedMap().tailMap(fromKey); - return new UnmodifiableSortedMap(map); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/package.html deleted file mode 100644 index d5979c02d97..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/map/package.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -

                  -This package contains implementations of the -{@link java.util.Map Map}, -{@link org.apache.commons.collections.IterableMap IterableMap}, -{@link org.apache.commons.collections.OrderedMap OrderedMap} and -{@link java.util.SortedMap SortedMap} interfaces. -A Map provides a lookup from a key to a value. -A number of implementations also support the new MapIterator interface that enables -simple iteration of map keys and values. -

                  -The following implementations are provided: -

                    -
                  • CaseInsensitiveMap - map that compares keys in a case insensitive way -
                  • CompositeMap - map that combines multiple maps into a single view -
                  • HashedMap - general purpose HashMap replacement supporting MapIterator -
                  • IdentityMap - map that uses == for comparison instead of equals() -
                  • Flat3Map - designed for good performance at size 3 or less -
                  • LinkedMap - a hash map that maintains insertion order, supporting OrderedMapIterator -
                  • MultiKeyMap - map that provides special methods for using more than one key to access the value -
                  • ReferenceMap - allows the garbage collector to collect keys and values using equals() for comparison -
                  • ReferenceIdentityMap - allows the garbage collector to collect keys and values using == for comparison -
                  • SingletonMap - a fully featured map to hold one key-value pair -
                  • StaticBucketMap - internally synchronized and designed for thread-contentious environments -
                  -

                  -The following decorators are provided: -

                    -
                  • Unmodifiable - ensures the collection cannot be altered -
                  • Predicated - ensures that only elements that are valid according to a predicate can be added -
                  • Typed - ensures that only elements that are of a specific type can be added -
                  • Transformed - transforms each element added -
                  • FixedSize - ensures that the size of the map cannot change -
                  • Lazy - creates objects in the map on demand -
                  • ListOrdered - ensures that insertion order is retained -
                  -
                  - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/overview.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/overview.html deleted file mode 100644 index fb75f55aac3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/overview.html +++ /dev/null @@ -1,113 +0,0 @@ - - - -

                  - Commons-Collections contains implementations, enhancements and utilities - that complement the Java Collections Framework. -

                  -

                  - The Apache Jakarta Commons Collections Framework component adds a significant - amount of enhancements to the standard JDK collections. These enhancements - come in the form of new interfaces, new implementations and utility classes. -

                  -

                  - See also the java.util package for the standard Java collections. -

                  - -

                  Main features

                  -

                  - Commons-Collections defines a number of key interfaces: -

                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  InterfaceDescription
                  - {@link org.apache.commons.collections.Bag} - - A new Collection subinterface that stores each object together - with the number of occurances. Methods are provided to get the number of - occurances, and to add and remove a certain number of that object. -
                  - {@link org.apache.commons.collections.Buffer} - - A new Collection subinterface that allows objects to be removed - in some well-defined order. Methods enable the next item to be peeked and removed. -
                  - {@link org.apache.commons.collections.BidiMap} - - A new Map subinterface that allows lookup from key to value and - from value to key with equal ease. -
                  - {@link org.apache.commons.collections.OrderedMap} - - A new Map subinterface that is used when a map has an order, but is - not sorted. Methods enable bidriectional iteration through the map. -
                  - {@link org.apache.commons.collections.MapIterator} - - A new Iterator subinterface specially designed for maps. This iterator - avoids the need for entrySet iteration of a map, and is simpler to use. -
                  - {@link org.apache.commons.collections.ResettableIterator} - - A new Iterator subinterface that allows the iteration to be reset back - to the start. Many iterators in this library have this functionality. -
                  - {@link org.apache.commons.collections.Closure}
                  - {@link org.apache.commons.collections.Predicate}
                  - {@link org.apache.commons.collections.Transformer}
                  - {@link org.apache.commons.collections.Factory}
                  -
                  - A group of functor interfaces that provide plugin behaviour to various - collections and utilities. -
                  -

                  - In addition to the interfaces, there are many implementations. - Consult each subpackage for full details of these. -

                  - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/package.html deleted file mode 100644 index c98dffe72b8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/package.html +++ /dev/null @@ -1,30 +0,0 @@ - - - -

                  -This package contains the interfaces and utilities shared across all the subpackages of this component. -

                  -

                  -The following collection implementations are provided in the package: -

                    -
                  • ArrayStack - a non synchronized Stack that follows the same API as java util Stack -
                  • ExtendedProperties - extends the Properties class to add extra functionality -
                  -

                  - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSerializableSetDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSerializableSetDecorator.java deleted file mode 100644 index 20a548d943e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSerializableSetDecorator.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Set; - -/** - * Serializable subclass of AbstractSetDecorator. - * - * @author Stephen Colebourne - * @since Commons Collections 3.1 - */ -public abstract class AbstractSerializableSetDecorator - extends AbstractSetDecorator - implements Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 1229469966212206107L; - - /** - * Constructor. - */ - protected AbstractSerializableSetDecorator(Set set) { - super(set); - } - - //----------------------------------------------------------------------- - /** - * Write the set out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the set in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSetDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSetDecorator.java deleted file mode 100644 index 06b98387b22..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSetDecorator.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Set; - -import org.apache.commons.collections.collection.AbstractCollectionDecorator; - -/** - * Decorates another Set to provide additional behaviour. - *

                  - * Methods are forwarded directly to the decorated set. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractSetDecorator extends AbstractCollectionDecorator implements Set { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractSetDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - protected AbstractSetDecorator(Set set) { - super(set); - } - - /** - * Gets the set being decorated. - * - * @return the decorated set - */ - protected Set getSet() { - return (Set) getCollection(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSortedSetDecorator.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSortedSetDecorator.java deleted file mode 100644 index 04c3540e7d1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/AbstractSortedSetDecorator.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Comparator; -import java.util.Set; -import java.util.SortedSet; - -/** - * Decorates another SortedSet to provide additional behaviour. - *

                  - * Methods are forwarded directly to the decorated set. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public abstract class AbstractSortedSetDecorator extends AbstractSetDecorator implements SortedSet { - - /** - * Constructor only used in deserialization, do not use otherwise. - * @since Commons Collections 3.1 - */ - protected AbstractSortedSetDecorator() { - super(); - } - - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - protected AbstractSortedSetDecorator(Set set) { - super(set); - } - - /** - * Gets the sorted set being decorated. - * - * @return the decorated set - */ - protected SortedSet getSortedSet() { - return (SortedSet) getCollection(); - } - - //----------------------------------------------------------------------- - public SortedSet subSet(Object fromElement, Object toElement) { - return getSortedSet().subSet(fromElement, toElement); - } - - public SortedSet headSet(Object toElement) { - return getSortedSet().headSet(toElement); - } - - public SortedSet tailSet(Object fromElement) { - return getSortedSet().tailSet(fromElement); - } - - public Object first() { - return getSortedSet().first(); - } - - public Object last() { - return getSortedSet().last(); - } - - public Comparator comparator() { - return getSortedSet().comparator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/CompositeSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/CompositeSet.java deleted file mode 100644 index d90dfd2ab05..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/CompositeSet.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.collection.CompositeCollection; - -/** - * Decorates a set of other sets to provide a single unified view. - *

                  - * Changes made to this set will actually be made on the decorated set. - * Add operations require the use of a pluggable strategy. - * If no strategy is provided then add is unsupported. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Brian McCallister - */ -public class CompositeSet extends CompositeCollection implements Set { - /** - * Create an empty CompositeSet - */ - public CompositeSet() { - super(); - } - - /** - * Create a CompositeSet with just set composited - * @param set The initial set in the composite - */ - public CompositeSet(Set set) { - super(set); - } - - /** - * Create a composite set with sets as the initial set of composited Sets - */ - public CompositeSet(Set[] sets) { - super(sets); - } - - /** - * Add a Set to this composite - * - * @param c Must implement Set - * @throws IllegalArgumentException if c does not implement java.util.Set - * or if a SetMutator is set, but fails to resolve a collision - * @throws UnsupportedOperationException if there is no SetMutator set, or - * a CollectionMutator is set instead of a SetMutator - * @see org.apache.commons.collections.collection.CompositeCollection.CollectionMutator - * @see SetMutator - */ - public synchronized void addComposited(Collection c) { - if (!(c instanceof Set)) { - throw new IllegalArgumentException("Collections added must implement java.util.Set"); - } - - for (Iterator i = this.getCollections().iterator(); i.hasNext();) { - Set set = (Set) i.next(); - Collection intersects = CollectionUtils.intersection(set, c); - if (intersects.size() > 0) { - if (this.mutator == null) { - throw new UnsupportedOperationException( - "Collision adding composited collection with no SetMutator set"); - } - else if (!(this.mutator instanceof SetMutator)) { - throw new UnsupportedOperationException( - "Collision adding composited collection to a CompositeSet with a CollectionMutator instead of a SetMutator"); - } - ((SetMutator) this.mutator).resolveCollision(this, set, (Set) c, intersects); - if (CollectionUtils.intersection(set, c).size() > 0) { - throw new IllegalArgumentException( - "Attempt to add illegal entry unresolved by SetMutator.resolveCollision()"); - } - } - } - super.addComposited(new Collection[]{c}); - } - - /** - * Add two sets to this composite - * - * @throws IllegalArgumentException if c or d does not implement java.util.Set - */ - public synchronized void addComposited(Collection c, Collection d) { - if (!(c instanceof Set)) throw new IllegalArgumentException("Argument must implement java.util.Set"); - if (!(d instanceof Set)) throw new IllegalArgumentException("Argument must implement java.util.Set"); - this.addComposited(new Set[]{(Set) c, (Set) d}); - } - - /** - * Add an array of sets to this composite - * @param comps - * @throws IllegalArgumentException if any of the collections in comps do not implement Set - */ - public synchronized void addComposited(Collection[] comps) { - for (int i = comps.length - 1; i >= 0; --i) { - this.addComposited(comps[i]); - } - } - - /** - * This can receive either a CompositeCollection.CollectionMutator - * or a CompositeSet.SetMutator. If a - * CompositeCollection.CollectionMutator is used than conflicts when adding - * composited sets will throw IllegalArgumentException - *

                  - */ - public void setMutator(CollectionMutator mutator) { - super.setMutator(mutator); - } - - /* Set operations */ - - /** - * If a CollectionMutator is defined for this CompositeSet then this - * method will be called anyway. - * - * @param obj Object to be removed - * @return true if the object is removed, false otherwise - */ - public boolean remove(Object obj) { - for (Iterator i = this.getCollections().iterator(); i.hasNext();) { - Set set = (Set) i.next(); - if (set.contains(obj)) return set.remove(obj); - } - return false; - } - - - /** - * @see Set#equals - */ - public boolean equals(Object obj) { - if (obj instanceof Set) { - Set set = (Set) obj; - if (set.containsAll(this) && set.size() == this.size()) { - return true; - } - } - return false; - } - - /** - * @see Set#hashCode - */ - public int hashCode() { - int code = 0; - for (Iterator i = this.iterator(); i.hasNext();) { - Object next = i.next(); - code += (next != null ? next.hashCode() : 0); - } - return code; - } - - /** - * Define callbacks for mutation operations. - *

                  - * Defining remove() on implementations of SetMutator is pointless - * as they are never called by CompositeSet. - */ - public static interface SetMutator extends CompositeCollection.CollectionMutator { - /** - *

                  - * Called when a Set is added to the CompositeSet and there is a - * collision between existing and added sets. - *

                  - *

                  - * If added and existing still have any intersects - * after this method returns an IllegalArgumentException will be thrown. - *

                  - * @param comp The CompositeSet being modified - * @param existing The Set already existing in the composite - * @param added the Set being added to the composite - * @param intersects the intersection of th existing and added sets - */ - public void resolveCollision(CompositeSet comp, Set existing, Set added, Collection intersects); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/ListOrderedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/ListOrderedSet.java deleted file mode 100644 index c35200b5d7a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/ListOrderedSet.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.commons.collections.iterators.AbstractIteratorDecorator; -import org.apache.commons.collections.list.UnmodifiableList; - -/** - * Decorates another Set to ensure that the order of addition - * is retained and used by the iterator. - *

                  - * If an object is added to the set for a second time, it will remain in the - * original position in the iteration. - * The order can be observed from the set via the iterator or toArray methods. - *

                  - * The ListOrderedSet also has various useful direct methods. These include many - * from List, such as get(int), remove(int) - * and indexOf(int). An unmodifiable List view of - * the set can be obtained via asList(). - *

                  - * This class cannot implement the List interface directly as - * various interface methods (notably equals/hashCode) are incompatable with a set. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Henning P. Schmiedehausen - */ -public class ListOrderedSet extends AbstractSerializableSetDecorator implements Set { - - /** Serialization version */ - private static final long serialVersionUID = -228664372470420141L; - - /** Internal list to hold the sequence of objects */ - protected final List setOrder; - - /** - * Factory method to create an ordered set specifying the list and set to use. - *

                  - * The list and set must both be empty. - * - * @param set the set to decorate, must be empty and not null - * @param list the list to decorate, must be empty and not null - * @throws IllegalArgumentException if set or list is null - * @throws IllegalArgumentException if either the set or list is not empty - * @since Commons Collections 3.1 - */ - public static ListOrderedSet decorate(Set set, List list) { - if (set == null) { - throw new IllegalArgumentException("Set must not be null"); - } - if (list == null) { - throw new IllegalArgumentException("List must not be null"); - } - if (set.size() > 0 || list.size() > 0) { - throw new IllegalArgumentException("Set and List must be empty"); - } - return new ListOrderedSet(set, list); - } - - /** - * Factory method to create an ordered set. - *

                  - * An ArrayList is used to retain order. - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static ListOrderedSet decorate(Set set) { - return new ListOrderedSet(set); - } - - /** - * Factory method to create an ordered set using the supplied list to retain order. - *

                  - * A HashSet is used for the set behaviour. - *

                  - * NOTE: If the list contains duplicates, the duplicates are removed, - * altering the specified list. - * - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if list is null - */ - public static ListOrderedSet decorate(List list) { - if (list == null) { - throw new IllegalArgumentException("List must not be null"); - } - Set set = new HashSet(list); - list.retainAll(set); - - return new ListOrderedSet(set, list); - } - - //----------------------------------------------------------------------- - /** - * Constructs a new empty ListOrderedSet using - * a HashSet and an ArrayList internally. - * - * @since Commons Collections 3.1 - */ - public ListOrderedSet() { - super(new HashSet()); - setOrder = new ArrayList(); - } - - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - protected ListOrderedSet(Set set) { - super(set); - setOrder = new ArrayList(set); - } - - /** - * Constructor that wraps (not copies) the Set and specifies the list to use. - *

                  - * The set and list must both be correctly initialised to the same elements. - * - * @param set the set to decorate, must not be null - * @param list the list to decorate, must not be null - * @throws IllegalArgumentException if set or list is null - */ - protected ListOrderedSet(Set set, List list) { - super(set); - if (list == null) { - throw new IllegalArgumentException("List must not be null"); - } - setOrder = list; - } - - //----------------------------------------------------------------------- - /** - * Gets an unmodifiable view of the order of the Set. - * - * @return an unmodifiable list view - */ - public List asList() { - return UnmodifiableList.decorate(setOrder); - } - - //----------------------------------------------------------------------- - public void clear() { - collection.clear(); - setOrder.clear(); - } - - public Iterator iterator() { - return new OrderedSetIterator(setOrder.iterator(), collection); - } - - public boolean add(Object object) { - if (collection.contains(object)) { - // re-adding doesn't change order - return collection.add(object); - } else { - // first add, so add to both set and list - boolean result = collection.add(object); - setOrder.add(object); - return result; - } - } - - public boolean addAll(Collection coll) { - boolean result = false; - for (Iterator it = coll.iterator(); it.hasNext();) { - Object object = it.next(); - result = result | add(object); - } - return result; - } - - public boolean remove(Object object) { - boolean result = collection.remove(object); - setOrder.remove(object); - return result; - } - - public boolean removeAll(Collection coll) { - boolean result = false; - for (Iterator it = coll.iterator(); it.hasNext();) { - Object object = it.next(); - result = result | remove(object); - } - return result; - } - - public boolean retainAll(Collection coll) { - boolean result = collection.retainAll(coll); - if (result == false) { - return false; - } else if (collection.size() == 0) { - setOrder.clear(); - } else { - for (Iterator it = setOrder.iterator(); it.hasNext();) { - Object object = it.next(); - if (collection.contains(object) == false) { - it.remove(); - } - } - } - return result; - } - - public Object[] toArray() { - return setOrder.toArray(); - } - - public Object[] toArray(Object a[]) { - return setOrder.toArray(a); - } - - //----------------------------------------------------------------------- - public Object get(int index) { - return setOrder.get(index); - } - - public int indexOf(Object object) { - return setOrder.indexOf(object); - } - - public void add(int index, Object object) { - if (contains(object) == false) { - collection.add(object); - setOrder.add(index, object); - } - } - - public boolean addAll(int index, Collection coll) { - boolean changed = false; - for (Iterator it = coll.iterator(); it.hasNext();) { - Object object = it.next(); - if (contains(object) == false) { - collection.add(object); - setOrder.add(index, object); - index++; - changed = true; - } - } - return changed; - } - - public Object remove(int index) { - Object obj = setOrder.remove(index); - remove(obj); - return obj; - } - - /** - * Uses the underlying List's toString so that order is achieved. - * This means that the decorated Set's toString is not used, so - * any custom toStrings will be ignored. - */ - // Fortunately List.toString and Set.toString look the same - public String toString() { - return setOrder.toString(); - } - - //----------------------------------------------------------------------- - /** - * Internal iterator handle remove. - */ - static class OrderedSetIterator extends AbstractIteratorDecorator { - - /** Object we iterate on */ - protected final Collection set; - /** Last object retrieved */ - protected Object last; - - private OrderedSetIterator(Iterator iterator, Collection set) { - super(iterator); - this.set = set; - } - - public Object next() { - last = iterator.next(); - return last; - } - - public void remove() { - set.remove(last); - iterator.remove(); - last = null; - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/MapBackedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/MapBackedSet.java deleted file mode 100644 index 8cab88e0a00..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/MapBackedSet.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -/** - * Decorates a Map to obtain Set behaviour. - *

                  - * This class is used to create a Set with the same properties as - * the key set of any map. Thus, a ReferenceSet can be created by wrapping a - * ReferenceMap in an instance of this class. - *

                  - * Most map implementation can be used to create a set by passing in dummy values. - * Exceptions include BidiMap implementations, as they require unique values. - * - * @since Commons Collections 3.1 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class MapBackedSet implements Set, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = 6723912213766056587L; - - /** The map being used as the backing store */ - protected final Map map; - /** The dummyValue to use */ - protected final Object dummyValue; - - /** - * Factory method to create a set from a map. - * - * @param map the map to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static Set decorate(Map map) { - return decorate(map, null); - } - - /** - * Factory method to create a set from a map. - * - * @param map the map to decorate, must not be null - * @param dummyValue the dummy value to use - * @throws IllegalArgumentException if map is null - */ - public static Set decorate(Map map, Object dummyValue) { - if (map == null) { - throw new IllegalArgumentException("The map must not be null"); - } - return new MapBackedSet(map, dummyValue); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param map the map to decorate, must not be null - * @param dummyValue the dummy value to use - * @throws IllegalArgumentException if map is null - */ - private MapBackedSet(Map map, Object dummyValue) { - super(); - this.map = map; - this.dummyValue = dummyValue; - } - - //----------------------------------------------------------------------- - public int size() { - return map.size(); - } - - public boolean isEmpty() { - return map.isEmpty(); - } - - public Iterator iterator() { - return map.keySet().iterator(); - } - - public boolean contains(Object obj) { - return map.containsKey(obj); - } - - public boolean containsAll(Collection coll) { - return map.keySet().containsAll(coll); - } - - public boolean add(Object obj) { - int size = map.size(); - map.put(obj, dummyValue); - return (map.size() != size); - } - - public boolean addAll(Collection coll) { - int size = map.size(); - for (Iterator it = coll.iterator(); it.hasNext();) { - Object obj = it.next(); - map.put(obj, dummyValue); - } - return (map.size() != size); - } - - public boolean remove(Object obj) { - int size = map.size(); - map.remove(obj); - return (map.size() != size); - } - - public boolean removeAll(Collection coll) { - return map.keySet().removeAll(coll); - } - - public boolean retainAll(Collection coll) { - return map.keySet().retainAll(coll); - } - - public void clear() { - map.clear(); - } - - public Object[] toArray() { - return map.keySet().toArray(); - } - - public Object[] toArray(Object[] array) { - return map.keySet().toArray(array); - } - - public boolean equals(Object obj) { - return map.keySet().equals(obj); - } - - public int hashCode() { - return map.keySet().hashCode(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSet.java deleted file mode 100644 index 2811818b526..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSet.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Set; - -import org.apache.commons.collections.Predicate; -import org.apache.commons.collections.collection.PredicatedCollection; - -/** - * Decorates another Set to validate that all additions - * match a specified predicate. - *

                  - * This set exists to provide validation for the decorated set. - * It is normally created to decorate an empty set. - * If an object cannot be added to the set, an IllegalArgumentException is thrown. - *

                  - * One usage would be to ensure that no null entries are added to the set. - *

                  Set set = PredicatedSet.decorate(new HashSet(), NotNullPredicate.INSTANCE);
                  - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedSet extends PredicatedCollection implements Set { - - /** Serialization version */ - private static final long serialVersionUID = -684521469108685117L; - - /** - * Factory method to create a predicated (validating) set. - *

                  - * If there are any elements already in the set being decorated, they - * are validated. - * - * @param set the set to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if set or predicate is null - * @throws IllegalArgumentException if the set contains invalid elements - */ - public static Set decorate(Set set, Predicate predicate) { - return new PredicatedSet(set, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the set being decorated, they - * are validated. - * - * @param set the set to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if set or predicate is null - * @throws IllegalArgumentException if the set contains invalid elements - */ - protected PredicatedSet(Set set, Predicate predicate) { - super(set, predicate); - } - - /** - * Gets the set being decorated. - * - * @return the decorated set - */ - protected Set getSet() { - return (Set) getCollection(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSortedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSortedSet.java deleted file mode 100644 index 0b0c6b2b96c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/PredicatedSortedSet.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Comparator; -import java.util.SortedSet; - -import org.apache.commons.collections.Predicate; - -/** - * Decorates another SortedSet to validate that all additions - * match a specified predicate. - *

                  - * This set exists to provide validation for the decorated set. - * It is normally created to decorate an empty set. - * If an object cannot be added to the set, an IllegalArgumentException is thrown. - *

                  - * One usage would be to ensure that no null entries are added to the set. - *

                  SortedSet set = PredicatedSortedSet.decorate(new TreeSet(), NotNullPredicate.INSTANCE);
                  - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Paul Jack - */ -public class PredicatedSortedSet extends PredicatedSet implements SortedSet { - - /** Serialization version */ - private static final long serialVersionUID = -9110948148132275052L; - - /** - * Factory method to create a predicated (validating) sorted set. - *

                  - * If there are any elements already in the set being decorated, they - * are validated. - * - * @param set the set to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if set or predicate is null - * @throws IllegalArgumentException if the set contains invalid elements - */ - public static SortedSet decorate(SortedSet set, Predicate predicate) { - return new PredicatedSortedSet(set, predicate); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the set being decorated, they - * are validated. - * - * @param set the set to decorate, must not be null - * @param predicate the predicate to use for validation, must not be null - * @throws IllegalArgumentException if set or predicate is null - * @throws IllegalArgumentException if the set contains invalid elements - */ - protected PredicatedSortedSet(SortedSet set, Predicate predicate) { - super(set, predicate); - } - - /** - * Gets the sorted set being decorated. - * - * @return the decorated sorted set - */ - private SortedSet getSortedSet() { - return (SortedSet) getCollection(); - } - - //----------------------------------------------------------------------- - public SortedSet subSet(Object fromElement, Object toElement) { - SortedSet sub = getSortedSet().subSet(fromElement, toElement); - return new PredicatedSortedSet(sub, predicate); - } - - public SortedSet headSet(Object toElement) { - SortedSet sub = getSortedSet().headSet(toElement); - return new PredicatedSortedSet(sub, predicate); - } - - public SortedSet tailSet(Object fromElement) { - SortedSet sub = getSortedSet().tailSet(fromElement); - return new PredicatedSortedSet(sub, predicate); - } - - public Object first() { - return getSortedSet().first(); - } - - public Object last() { - return getSortedSet().last(); - } - - public Comparator comparator() { - return getSortedSet().comparator(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSet.java deleted file mode 100644 index 058ddeffa95..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSet.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Set; - -import org.apache.commons.collections.collection.SynchronizedCollection; - -/** - * Decorates another Set to synchronize its behaviour for a - * multi-threaded environment. - *

                  - * Methods are synchronized, then forwarded to the decorated set. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedSet extends SynchronizedCollection implements Set { - - /** Serialization version */ - private static final long serialVersionUID = -8304417378626543635L; - - /** - * Factory method to create a synchronized set. - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static Set decorate(Set set) { - return new SynchronizedSet(set); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - protected SynchronizedSet(Set set) { - super(set); - } - - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @param lock the lock object to use, must not be null - * @throws IllegalArgumentException if set is null - */ - protected SynchronizedSet(Set set, Object lock) { - super(set, lock); - } - - /** - * Gets the decorated set. - * - * @return the decorated set - */ - protected Set getSet() { - return (Set) collection; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSortedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSortedSet.java deleted file mode 100644 index deaa6b285ad..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/SynchronizedSortedSet.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Comparator; -import java.util.SortedSet; - -import org.apache.commons.collections.collection.SynchronizedCollection; - -/** - * Decorates another SortedSet to synchronize its behaviour - * for a multi-threaded environment. - *

                  - * Methods are synchronized, then forwarded to the decorated set. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class SynchronizedSortedSet extends SynchronizedCollection implements SortedSet { - - /** Serialization version */ - private static final long serialVersionUID = 2775582861954500111L; - - /** - * Factory method to create a synchronized set. - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static SortedSet decorate(SortedSet set) { - return new SynchronizedSortedSet(set); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - protected SynchronizedSortedSet(SortedSet set) { - super(set); - } - - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @param lock the lock object to use, must not be null - * @throws IllegalArgumentException if set is null - */ - protected SynchronizedSortedSet(SortedSet set, Object lock) { - super(set, lock); - } - - /** - * Gets the decorated set. - * - * @return the decorated set - */ - protected SortedSet getSortedSet() { - return (SortedSet) collection; - } - - //----------------------------------------------------------------------- - public SortedSet subSet(Object fromElement, Object toElement) { - synchronized (lock) { - SortedSet set = getSortedSet().subSet(fromElement, toElement); - // the lock is passed into the constructor here to ensure that the - // subset is synchronized on the same lock as the parent - return new SynchronizedSortedSet(set, lock); - } - } - - public SortedSet headSet(Object toElement) { - synchronized (lock) { - SortedSet set = getSortedSet().headSet(toElement); - // the lock is passed into the constructor here to ensure that the - // headset is synchronized on the same lock as the parent - return new SynchronizedSortedSet(set, lock); - } - } - - public SortedSet tailSet(Object fromElement) { - synchronized (lock) { - SortedSet set = getSortedSet().tailSet(fromElement); - // the lock is passed into the constructor here to ensure that the - // tailset is synchronized on the same lock as the parent - return new SynchronizedSortedSet(set, lock); - } - } - - public Object first() { - synchronized (lock) { - return getSortedSet().first(); - } - } - - public Object last() { - synchronized (lock) { - return getSortedSet().last(); - } - } - - public Comparator comparator() { - synchronized (lock) { - return getSortedSet().comparator(); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSet.java deleted file mode 100644 index 00f2f751275..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSet.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Set; - -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.collection.TransformedCollection; - -/** - * Decorates another Set to transform objects that are added. - *

                  - * The add methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedSet extends TransformedCollection implements Set { - - /** Serialization version */ - private static final long serialVersionUID = 306127383500410386L; - - /** - * Factory method to create a transforming set. - *

                  - * If there are any elements already in the set being decorated, they - * are NOT transformed. - * - * @param set the set to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if set or transformer is null - */ - public static Set decorate(Set set, Transformer transformer) { - return new TransformedSet(set, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the set being decorated, they - * are NOT transformed. - * - * @param set the set to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if set or transformer is null - */ - protected TransformedSet(Set set, Transformer transformer) { - super(set, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSortedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSortedSet.java deleted file mode 100644 index a454b6051b8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TransformedSortedSet.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Comparator; -import java.util.SortedSet; - -import org.apache.commons.collections.Transformer; - -/** - * Decorates another SortedSet to transform objects that are added. - *

                  - * The add methods are affected by this class. - * Thus objects must be removed or searched for using their transformed form. - * For example, if the transformation converts Strings to Integers, you must - * use the Integer form to remove objects. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public class TransformedSortedSet extends TransformedSet implements SortedSet { - - /** Serialization version */ - private static final long serialVersionUID = -1675486811351124386L; - - /** - * Factory method to create a transforming sorted set. - *

                  - * If there are any elements already in the set being decorated, they - * are NOT transformed. - * - * @param set the set to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if set or transformer is null - */ - public static SortedSet decorate(SortedSet set, Transformer transformer) { - return new TransformedSortedSet(set, transformer); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - *

                  - * If there are any elements already in the set being decorated, they - * are NOT transformed. - * - * @param set the set to decorate, must not be null - * @param transformer the transformer to use for conversion, must not be null - * @throws IllegalArgumentException if set or transformer is null - */ - protected TransformedSortedSet(SortedSet set, Transformer transformer) { - super(set, transformer); - } - - /** - * Gets the decorated set. - * - * @return the decorated set - */ - protected SortedSet getSortedSet() { - return (SortedSet) collection; - } - - //----------------------------------------------------------------------- - public Object first() { - return getSortedSet().first(); - } - - public Object last() { - return getSortedSet().last(); - } - - public Comparator comparator() { - return getSortedSet().comparator(); - } - - //----------------------------------------------------------------------- - public SortedSet subSet(Object fromElement, Object toElement) { - SortedSet set = getSortedSet().subSet(fromElement, toElement); - return new TransformedSortedSet(set, transformer); - } - - public SortedSet headSet(Object toElement) { - SortedSet set = getSortedSet().headSet(toElement); - return new TransformedSortedSet(set, transformer); - } - - public SortedSet tailSet(Object fromElement) { - SortedSet set = getSortedSet().tailSet(fromElement); - return new TransformedSortedSet(set, transformer); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSet.java deleted file mode 100644 index a4073229702..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSet.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Set; - -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another Set to validate that elements - * added are of a specific type. - *

                  - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedSet { - - /** - * Factory method to create a typed set. - *

                  - * If there are any elements already in the set being decorated, they - * are validated. - * - * @param set the set to decorate, must not be null - * @param type the type to allow into the collection, must not be null - * @throws IllegalArgumentException if set or type is null - * @throws IllegalArgumentException if the set contains invalid elements - */ - public static Set decorate(Set set, Class type) { - return new PredicatedSet(set, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedSet() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSortedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSortedSet.java deleted file mode 100644 index a7ea23e0e77..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/TypedSortedSet.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.SortedSet; - -import org.apache.commons.collections.functors.InstanceofPredicate; - -/** - * Decorates another SortedSet to validate that elements - * added are of a specific type. - *

                  - * The validation of additions is performed via an instanceof test against - * a specified Class. If an object cannot be added to the - * collection, an IllegalArgumentException is thrown. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - * @author Matthew Hawthorne - */ -public class TypedSortedSet { - - /** - * Factory method to create a typed sorted set. - *

                  - * If there are any elements already in the set being decorated, they - * are validated. - * - * @param set the set to decorate, must not be null - * @param type the type to allow into the collection, must not be null - * @throws IllegalArgumentException if set or type is null - * @throws IllegalArgumentException if the set contains invalid elements - */ - public static SortedSet decorate(SortedSet set, Class type) { - return new PredicatedSortedSet(set, InstanceofPredicate.getInstance(type)); - } - - /** - * Restrictive constructor. - */ - protected TypedSortedSet() { - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSet.java deleted file mode 100644 index 78bc4ab6424..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSet.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; - -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; - -/** - * Decorates another Set to ensure it can't be altered. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableSet - extends AbstractSerializableSetDecorator - implements Unmodifiable { - - /** Serialization version */ - private static final long serialVersionUID = 6499119872185240161L; - - /** - * Factory method to create an unmodifiable set. - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static Set decorate(Set set) { - if (set instanceof Unmodifiable) { - return set; - } - return new UnmodifiableSet(set); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - private UnmodifiableSet(Set set) { - super(set); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSortedSet.java b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSortedSet.java deleted file mode 100644 index bb5622100f9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/UnmodifiableSortedSet.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.collections.set; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.SortedSet; - -import org.apache.commons.collections.Unmodifiable; -import org.apache.commons.collections.iterators.UnmodifiableIterator; - -/** - * Decorates another SortedSet to ensure it can't be altered. - *

                  - * This class is Serializable from Commons Collections 3.1. - * - * @since Commons Collections 3.0 - * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $ - * - * @author Stephen Colebourne - */ -public final class UnmodifiableSortedSet - extends AbstractSortedSetDecorator - implements Unmodifiable, Serializable { - - /** Serialization version */ - private static final long serialVersionUID = -725356885467962424L; - - /** - * Factory method to create an unmodifiable set. - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - public static SortedSet decorate(SortedSet set) { - if (set instanceof Unmodifiable) { - return set; - } - return new UnmodifiableSortedSet(set); - } - - //----------------------------------------------------------------------- - /** - * Write the collection out using a custom routine. - * - * @param out the output stream - * @throws IOException - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeObject(collection); - } - - /** - * Read the collection in using a custom routine. - * - * @param in the input stream - * @throws IOException - * @throws ClassNotFoundException - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - collection = (Collection) in.readObject(); - } - - //----------------------------------------------------------------------- - /** - * Constructor that wraps (not copies). - * - * @param set the set to decorate, must not be null - * @throws IllegalArgumentException if set is null - */ - private UnmodifiableSortedSet(SortedSet set) { - super(set); - } - - //----------------------------------------------------------------------- - public Iterator iterator() { - return UnmodifiableIterator.decorate(getCollection().iterator()); - } - - public boolean add(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean addAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public void clear() { - throw new UnsupportedOperationException(); - } - - public boolean remove(Object object) { - throw new UnsupportedOperationException(); - } - - public boolean removeAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - public boolean retainAll(Collection coll) { - throw new UnsupportedOperationException(); - } - - //----------------------------------------------------------------------- - public SortedSet subSet(Object fromElement, Object toElement) { - SortedSet sub = getSortedSet().subSet(fromElement, toElement); - return new UnmodifiableSortedSet(sub); - } - - public SortedSet headSet(Object toElement) { - SortedSet sub = getSortedSet().headSet(toElement); - return new UnmodifiableSortedSet(sub); - } - - public SortedSet tailSet(Object fromElement) { - SortedSet sub = getSortedSet().tailSet(fromElement); - return new UnmodifiableSortedSet(sub); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/package.html b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/package.html deleted file mode 100644 index 7792a6bb5b4..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/src/org/apache/commons/collections/set/package.html +++ /dev/null @@ -1,43 +0,0 @@ - - - -

                  -This package contains implementations of the -{@link java.util.Set Set} and -{@link java.util.SortedSet SortedSet} interfaces. -

                  -The implementations are in the form of direct implementations and decorators. -A decorator wraps another implementation of the interface to add some -specific additional functionality. -

                  -The following implementations are provided in the package: -

                    -
                  • CompositeSet - a set that combines multiple sets into one -
                  -The following decorators are provided in the package: -
                    -
                  • Synchronized - synchronizes method access for multi-threaded environments -
                  • Unmodifiable - ensures the collection cannot be altered -
                  • Predicated - ensures that only elements that are valid according to a predicate can be added -
                  • Typed - ensures that only elements that are of a specific type can be added -
                  • Transformed - transforms each element added -
                  • ListOrdered - ensures that insertion order is retained -
                  • MapBackedSet - a set formed by decorating a Map -
                  -
                  - diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/JavaBeanWithApiDoc.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/JavaBeanWithApiDoc.java deleted file mode 100644 index 0a5d146ed06..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/JavaBeanWithApiDoc.java +++ /dev/null @@ -1,30 +0,0 @@ - -public class JavaBeanWithAPIDoc { - - /** - * Not to count - */ - private String testVar; - - /** - * To count - */ - public String testVar2; - - /** - * This api doc should not be counted not its complexity - * @return - */ - public String getTest() { - return testVar; - } - - /** - * This api doc should be counted - * @return - */ - public String getTest2() { - return "test"; - } - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/PureJavaBean.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/PureJavaBean.java deleted file mode 100644 index 226accd5cb5..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/accessors/PureJavaBean.java +++ /dev/null @@ -1,94 +0,0 @@ - -public class PureJavaBean { - - private String testVar; - - public String testVar2; - - String testVar3; - - private boolean booleanTest; - - // OK - public String getTest() { - return testVar; - } - - // OK - public String getTest2() { - return testVar; - } - - // NOT OK - public String getTest3() { - testVar = "test"; - return testVar; - } - - // NOT OK - public String getTest4() { - return testVar + "concat"; - } - - // NOT OK - public void getTest5() { - // do something; - } - - // NOT OK - public String getTest6() { - return "test"; - } - - // NOT OK testVar2 is public - public String getTest7() { - return testVar2; - } - - // OK - public String getTest8() { - // some comments - return testVar; - } - - // OK - public void setTest(String test) { - this.testVar = test; - } - - // NOT OK - public void setTest(String test, String test2) { - this.testVar = test; - } - - // NOT OK - public void setTest() { - this.testVar = test; - } - - // NOT OK - public void setTest2(String test) { - this.testVar = ""; - } - - // NOT OK - public void setTest3(String test) { - this.testVar += test; - } - - // OK - public void setTest4(String test) { - // do something - this.testVar = test; - } - - // NOT OK - public boolean isTest() { - return true; - } - - // OK - public boolean isTest2() { - return booleanTest; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/ComplexBranches.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/ComplexBranches.java deleted file mode 100644 index ca108445824..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/ComplexBranches.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.ArrayList; - -public class ComplexBranchesTest { - private int n; - - public ComplexBranchesTest(int n) { - this.n = n; - } - - public int getN() { - if (n==1) { - return -1; - } else if (n==2) { - return -2; - } else if (n==3) { - throw new RuntimeException("Error"); - } - return -1; - } - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/NoBranches.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/NoBranches.java deleted file mode 100644 index 952306c7d2b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/NoBranches.java +++ /dev/null @@ -1,17 +0,0 @@ -public class NoBranches { - private int n; - private String s; - - public NoBranches(int n, String s) { - this.n = n; - this.s = s; - } - - public int getN() { - return n; - } - - public String getS() { - return s; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/SimpleBranches.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/SimpleBranches.java deleted file mode 100644 index 50092f8641e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/branches/SimpleBranches.java +++ /dev/null @@ -1,52 +0,0 @@ -import java.util.ArrayList; - -public class SimpleBranches { - private int n; - private String s; - - public SimpleBranches(int n, String s) { - this.n = n; - this.s = s; - } - - public int getN() { - return n; - } - - public String getS() { - return s; - } - - private void simpleIf() { - if (s.equals("road") && n != 1) { - n++; - } - } - - private void ifWithOr() { - if (s.equals("road") || n != 1) { - n++; - } - } - - private void simpleSwitch() { - switch (n) { - case 1: - break; - case 2: - break; - default: - break; - } - } - - private void simpleFor() { - for (int i = 0; i < 4; i++) { - int j = 4; - } - for (String toto : new ArrayList()) { - int k = 0; - } - } - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AbstractClass.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AbstractClass.java deleted file mode 100644 index fb3135d8d13..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AbstractClass.java +++ /dev/null @@ -1,5 +0,0 @@ - -public abstract class AbstractClass { - - //comment -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AnonymousInnerClass.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AnonymousInnerClass.java deleted file mode 100644 index 7d817b69bc7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/AnonymousInnerClass.java +++ /dev/null @@ -1,20 +0,0 @@ -import java.util.Comparator; - -class AnonymousInnerClass { - - public void doJob(){ - - Comparator comparator1 = new Comparator() { - public int compare(String o1, String o2) { - return 0; - } - }; - - Comparator comparator2 = new Comparator() { - public int compare(String o1, String o2) { - return 0; - } - }; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/ClassCounterEnum.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/ClassCounterEnum.java deleted file mode 100644 index d0070da489e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/ClassCounterEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -public enum Planet { - MERCURY(3.303e+23, 2.4397e6), VENUS(4.869e+24, 6.0518e6), EARTH(5.976e+24, 6.37814e6), MARS(6.421e+23, 3.3972e6), JUPITER( - 1.9e+27, 7.1492e7), SATURN(5.688e+26, 6.0268e7), URANUS(8.686e+25, 2.5559e7), NEPTUNE(1.024e+26, 2.4746e7), PLUTO( - 1.27e+22, 1.137e6); - - private final double mass; // in kilograms - private final double radius; // in meters - - Planet(double mass, double radius) { - this.mass = mass; - this.radius = radius; - } - - public double mass() { - return mass; - } - - public double radius() { - return radius; - } - - // universal gravitational constant (m3 kg-1 s-2) - public static final double G = 6.67300E-11; - - public double surfaceGravity() { - return G * mass / (radius * radius); - } - - public double surfaceWeight(double otherMass) { - return otherMass * surfaceGravity(); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/InnerClassTests.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/InnerClassTests.java deleted file mode 100644 index ddc52ade76e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/InnerClassTests.java +++ /dev/null @@ -1,19 +0,0 @@ -class InnerClassTests { - - int someInt = 0; - - private void bar() {}; - - private class TestPrivateInnerClass { - - public void foo() {}; - - } - - public class TestPublicInnerClass { - - public void foos() {}; - - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Interface.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Interface.java deleted file mode 100644 index 9ca83958581..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Interface.java +++ /dev/null @@ -1,2 +0,0 @@ -interface Interface { -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Test003.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Test003.java deleted file mode 100644 index 1b1182ebbca..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/classes/Test003.java +++ /dev/null @@ -1,21 +0,0 @@ -public class Car { - private int n; - private String s; - - public AClass(int n, String s) { - this.n = n; - this.s = s; - } - - public int getN() { - return n; - } - - public String getS() { - return s; - } - - private class Wheel{} -} - -public class AnotherCar{} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/CommentedCode.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/CommentedCode.java deleted file mode 100644 index 7fa37a2e113..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/CommentedCode.java +++ /dev/null @@ -1,25 +0,0 @@ -public class CommentedCode { - - - public CommentedCode(){ - //This is a comment - //if (true) { - int i = 2; - } - - /** - * No detection of commented code line in Javadoc bloc - * - * public void main(){ - * - * } - */ - public void analyse(){ - /* - for(Visitor visitor : visitors){ - visitor.scan(line); - } - */ - - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/org/foo/CommentedOutFile.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/org/foo/CommentedOutFile.java deleted file mode 100644 index 810c32b70be..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/commentedCode/org/foo/CommentedOutFile.java +++ /dev/null @@ -1,5 +0,0 @@ -//package org.foo; -// -//public class CommentedOutFile { -// -//} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/complexity/InstanceAndStaticInitBlocks.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/complexity/InstanceAndStaticInitBlocks.java deleted file mode 100644 index b50a130e193..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/complexity/InstanceAndStaticInitBlocks.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Car { - - static{ - int j = 4; - } - - { - int i =2; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithComments.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithComments.java deleted file mode 100644 index 272d55bb5d9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithComments.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Header - */ - - -import nothing; -//single comment 1 -/** - * Javadoc 1 - * blablab - * blabla - */ -public class Something { - - public int var = 0; - - /** - * Documented var - */ - public int var2 = 0; - - /** - * Non api documented var - */ - private int var3 = 0; - - /** - * Constructor API doc - * should be included in api doc counter - */ - public Something() { - super(); - /** - * Inner constructor javadoc - * Should not be counted as API doc - */ - } - - public Something(Strng test) { - super(); - } - - /** - * Javadoc 2 - */ - public void sleep(); - - /* - * non javadoc - */ - public void run() { - /** - * Inner javadoc - * - * Should not be counted as API doc - */ - int i = 5; - } - - /** - * Javadoc - */ - private void test() { - } -} -// ncss = 8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithCommentsOnLineOfCode.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithCommentsOnLineOfCode.java deleted file mode 100644 index e39c272870b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithCommentsOnLineOfCode.java +++ /dev/null @@ -1,14 +0,0 @@ - - -public class ClassWithCommentsOnLineOfCode { - - public void run() { - int i = 5; // comment on line of code, ncloc should not be impacted - int j = 5; /** test comment - tst 2 comment - **/ - int k = 5; /* another test comment - */ - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeader.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeader.java deleted file mode 100644 index b402a30a944..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeader.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Header - * - * multi lines - */ - - -import nothing; -//single comment 1 -/** - * Javadoc 1 - * blablab - * blabla - */ -public class Something { - public Something() { - super(); - } - - /** - * Javadoc 2 - */ - public void sleep(); - - /* - * non javadoc - */ - public void run() { - int i = 5; - } -} -// ncss = 8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndBlankLines.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndBlankLines.java deleted file mode 100644 index c06dbc0de38..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndBlankLines.java +++ /dev/null @@ -1,17 +0,0 @@ -/* -this header file - -has many blank lines - -blank lines in comments block - -should no be counted - -*/ - - -public interface ClassWithHeaderAndBlankLines { - void reset(); - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackage.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackage.java deleted file mode 100644 index f3acca29907..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackage.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Header - * - * but no package - */ -import nothing; -//single comment 1 -/** - * Javadoc 1 - * blablab - * blabla - */ -public class Something { - public Something() { - super(); - } - - /** - * Javadoc 2 - */ - public void sleep(); - - /* - * non javadoc - */ - public void run() { - int i = 5; - } -} -// ncss = 8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackageNoImports.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackageNoImports.java deleted file mode 100644 index cad4070ce9c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithHeaderAndNoPackageNoImports.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Header - * - * but no package and no import, should be detected as a license header - */ -public class Something { - public Something() { - super(); - } - - /** - * Javadoc 2 - */ - public void sleep(){} - - /* - * non javadoc - */ - public void run() { - int i = 5; - } -} -// ncss = 8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithVars.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithVars.java deleted file mode 100644 index 542b66c7d17..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithVars.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Header - */ - - -import nothing; -//single comment 1 -/** - * Javadoc 1 - */ -public class ClassWithVars { - - /** - * Api doc for this public var - */ - public int publicVar = 0; - - /** - * Not Api doc for this public const, we exclude public final static var to avoid too much noise on pure Constants Classes - */ - public final static int PUBLIC_CONST = 0; - - /** - * Api doc for private var should not be counted as apidoc, but non apidoc - */ - private int pirvateVar = 0; - - - public Something() { - super(); - /** - * Inner constructor javadoc - * Should not be counted as API doc - */ - } - - /** - * Javadoc 2 - */ - public void sleep(); - - /* - * non javadoc - */ - public void run() { - /** - * Inner javadoc - * - * Should not be counted as API doc - */ - int i = 5; - } - - /** - * Javadoc - */ - private void test() { - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithoutHeaderAndWithCComment.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithoutHeaderAndWithCComment.java deleted file mode 100644 index 7f17fe29cef..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/ClassWithoutHeaderAndWithCComment.java +++ /dev/null @@ -1,16 +0,0 @@ - - -import nothing; - -/* - * Javadoc 1 - * blablab - * blabla - */ -public class Something { - - public Something() { - super(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/Constants.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/Constants.java deleted file mode 100644 index da20288279a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/Constants.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * $Id: Constants.java 471754 2006-11-06 14:55:09Z husted $ - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - - -/** - *

                  Global constants for the Chain of Responsibility Library.

                  - */ -public final class Constants { - // -------------------------------------------------- Context Attribute Keys - - /** - *

                  The default context attribute under which the ForwardConfig for the - * current request will be stored.

                  - */ - public static final String FORWARD_CONFIG_KEY = "forwardConfig"; - - /** - *

                  The default context attribute under which the include path for the - * current request will be stored.

                  - */ - public static final String INCLUDE_KEY = "include"; - - /** - *

                  The default context attribute under which the Locale for the current - * request will be stored.

                  - */ - public static final String LOCALE_KEY = "locale"; - - /** - *

                  The default context attribute under which the MessageResources for - * the current request will be stored.

                  - */ - public static final String MESSAGE_RESOURCES_KEY = "messageResources"; - - /** - *

                  The default context attribute under which the ModuleConfig for the - * current request will be stored.

                  - */ - public static final String MODULE_CONFIG_KEY = "moduleConfig"; - - /** - *

                  The default context attribute key under which a Boolean is stored, - * indicating the valid state of the current request. If not present, a - * value of Boolean.FALSE should be assumed. - */ - public static final String VALID_KEY = "valid"; - - // --------------------------------------------------------- Other Constants - - /** - *

                  The base part of the context attribute under which a Map containing - * the Action instances associated with this module are stored. This value - * must be suffixed with the module prefix in order to create a unique key - * per module.

                  - */ - public static final String ACTIONS_KEY = "actions"; -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/EmptyConstructor.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/EmptyConstructor.java deleted file mode 100644 index 26a1c1e821b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/EmptyConstructor.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Header - */ - - -public class EmptyConstructor { - - - public EmptyConstructor(){ - - } - - public EmptyConstructor(String param){ - - } - - public void doSomething(){ - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/InterfaceWithComments.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/InterfaceWithComments.java deleted file mode 100644 index 87d6bc220fc..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/InterfaceWithComments.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Header - */ - - -public interface Something { - - /** - * Documented test constant, not part of API docs - */ - public final static int TEST_CONST = "test"; - - /** - * Test javadoc1 - */ - void something(); - - - /** - * Test javadoc2 - */ - public void somethingElse(); - - - /* - * Test comment - * comment line 2 - */ - public void somethingStillElse(); - - void somethingNoComments(); - - public void somethingStillNoComments(); - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/MethodsWithOverrideAnnotation.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/MethodsWithOverrideAnnotation.java deleted file mode 100644 index 0835f5fea9a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/MethodsWithOverrideAnnotation.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Header - */ - - -public class MethodsWithOverrideAnnotation { - - - @Override - @Deprecated - public void doSomething(){ - - } - - @java.lang.Override - public void doSomethingElse(){ - - } - - public void doAnotherThing(){ - - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/foo/ClassWithPackageAndJavadocHeader.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/foo/ClassWithPackageAndJavadocHeader.java deleted file mode 100644 index a3523c52627..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/javadoc/foo/ClassWithPackageAndJavadocHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * File header as javadoc - * should be detected as a header - * - */ -package foo; - -/** - * This is a class comment - */ -public class ClassWithPackageAndJavadocHeader { - - public static void doJob1() { - int i = 3; - if (i == 4) { - i++; - } - } - - /** - * - * qsdfqsdf - */ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - //mlkqjdsf - } - } - } - public class Toto{ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - } - } - } - - } - - - - - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test001.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test001.java deleted file mode 100644 index 76a4f9e9392..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test001.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Header - */ - - -import nothing; -//single comment 1 -/** - * Javadoc 1 - */ -public class Something { - public Something() { - super(); - } - - /** - * Javadoc 2 - */ - public void sleep(); - - public void run() { - int i = 5; - } -} -// ncss = 8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test002.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test002.java deleted file mode 100644 index fec4832be51..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/loc/Test002.java +++ /dev/null @@ -1,19 +0,0 @@ -import InputNeuron; -import java.util.*; - -public interface Neuron { - - public FloatPoint getWeight(); - public void setWeight(FloatPoint fpWeight); - - public float distanceTo(Neuron nOtherNeuron); - - public void moveTo(InputNeuron inGoalNeuron, int netDistance); - /*schaufelt alle neuen Gewichte zu den alten um*/ - public void move(); - - public void addNeighbor(Neuron neuron); - public void addMetaNeighbor(Neuron neuron); - public Enumeration getNeighbors(); - public Enumeration getMetaNeighbors(); -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithDifferentMethodSignatures.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithDifferentMethodSignatures.java deleted file mode 100644 index 73c1ce0d0e6..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithDifferentMethodSignatures.java +++ /dev/null @@ -1,26 +0,0 @@ -public abstract class ClassWithDifferentMethodSignatures { - - public ClassWithDifferentMethodSignatures(){} - - public ClassWithDifferentMethodSignatures(List toto){} - - public static void method(); - - public static String method(int a); - - public static double[] method(int a); - - public static void method(String a); - - public static void method(String[][] a); - - public static void method(java.util.ArrayList a); - - public void unusedPrivateMethod(java.util.List list, int[] measures); - - public static void method(Map.Entry a); - - public static Squid[] method(int a, double[] b); - - public static java.Squid[] method(Map toto); -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithStaticMethods.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithStaticMethods.java deleted file mode 100644 index 92e33d64f2e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/ClassWithStaticMethods.java +++ /dev/null @@ -1,30 +0,0 @@ -public class ClassWithStaticMethods { - - public static void doJob1() { - int i = 3; - if (i == 4) { - i++; - } - } - - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - } - } - } - public class Toto{ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - } - } - } - - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/MethodWithAnonymousInnerClass.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/MethodWithAnonymousInnerClass.java deleted file mode 100644 index a5af21ff2ce..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/methods/MethodWithAnonymousInnerClass.java +++ /dev/null @@ -1,20 +0,0 @@ -public class MethodWithAnonymousInnerClass { - - public double doJob() { - Job job = new Job(){ - public double doJob(){ - return 0; - } - }; - return job.doJob(); - } - - public double doAnotherJob() { - Job job = new Job(){ - public double doJob(){ - return 0; - } - }; - return job.doJob(); - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNcloc.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNcloc.java deleted file mode 100644 index b9a4ac51bcd..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNcloc.java +++ /dev/null @@ -1,39 +0,0 @@ -public class ClassWithStaticMethods { - - public static void doJob1() { - int i = 3; - if (i == 4) { - i++; - } - } - - /** - * qsdfqsdf - */ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - //mlkqjdsf - } - } - } - public class Toto{ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - } - } - } - - } - - - - - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithClassComment.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithClassComment.java deleted file mode 100644 index 74a049aa6eb..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithClassComment.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This is a nice javadoc comments header - * - * And it should ne be included in ncloc - * - */ -public class ClassWithStaticMethodsAndCommentHeader { - - public static void doJob1() { - int i = 3; - if (i == 4) { - i++; - } - } - - /** - * - * qsdfqsdf - */ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - //mlkqjdsf - } - } - } - public class Toto{ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - } - } - } - - } - - - - - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithHeader.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithHeader.java deleted file mode 100644 index 7df94e49655..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/ncloc/TestNclocWithHeader.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * License test - * header - * - * with blank - * - * lines - */ - - - -/** - * This is a nice comments header - * - * And it should ne be included in ncloc - * - */ -public class ClassWithStaticMethodsAndCommentHeader { - - public static void doJob1() { - int i = 3; - if (i == 4) { - i++; - } - } - - /** - * - * qsdfqsdf - */ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - //mlkqjdsf - // - //another comment - } - } - } - public class Toto{ - public static void doJob2() { - int i = 3; - if (i == 4) { - if (i == 3) { - i--; - } - } - } - - } - - - - - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/packages/org/foo/SimpleBean.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/packages/org/foo/SimpleBean.java deleted file mode 100644 index 9cd3eb7de1b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/packages/org/foo/SimpleBean.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.foo; - -public class SimpleBean { - - /** - * Not to count - */ - private String testVar; - - /** - * To count - */ - public String testVar2; - - /** - * This api doc should not be counted not its complexity - * @return - */ - public String getTest() { - return testVar; - } - - /** - * This api doc should be counted - * @return - */ - public String getTest2() { - return "test"; - } - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/metrics/statements/NoStatements.java b/plugins/sonar-squid-java-plugin/test-resources/metrics/statements/NoStatements.java deleted file mode 100644 index 22a69f1c21a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/metrics/statements/NoStatements.java +++ /dev/null @@ -1,32 +0,0 @@ -public class Car { - @TestAnnotation - private int n; - private String s; - - public Car(int n, String s) { - this.n = n; - this.s = s; - assert true : "not true"; - } - - public int getN() { - int i =4; - return n; - } - - public String getS() { - return s; - } - - @SuppressWarnings("deprecation") - public void simpleIf(@TestAnnotation String var){ - @TestAnnotation - int varDecl = -1; - if( s.equals("toto") ){ - n = 4; - } else { - n = 3; - } - assert true : "not true"; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/rules/ClassWithSuppressWarningsAnnotation.java b/plugins/sonar-squid-java-plugin/test-resources/rules/ClassWithSuppressWarningsAnnotation.java deleted file mode 100644 index b91bb86843b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/rules/ClassWithSuppressWarningsAnnotation.java +++ /dev/null @@ -1,42 +0,0 @@ -@SuppressWarnings("all") -class ClassWithSuppressWarningsAnnotation { - - @java.lang.SuppressWarnings("all") - public void fullyQualifiedName() { - } - - @SuppressWarnings("all") - public void singleValue() { - } - - @SuppressWarnings(value = { "all" }) - public void arrayWithSingleValue() { - } - - @SuppressWarnings(value = { "null", "all" }) - public void arrayWithMultipleValues() { - } - - public void doJob() { - Object o = new Object() { - @SuppressWarnings("all") - public void methodInAnonymousInnerClass() { - } - }; - } - - // Currently Sonar is unable to properly handle following cases - - @SuppressWarnings("a" + "ll") - public void notHandled() { - } - - @SuppressWarnings(false ? "null" : "all") - public void notHandled2() { - } - - private static final String SUPPRESS = "all"; - @SuppressWarnings(SUPPRESS) - public void notHandled3() { - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/rules/CommentedCode.java b/plugins/sonar-squid-java-plugin/test-resources/rules/CommentedCode.java deleted file mode 100644 index 49e23cc1508..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/rules/CommentedCode.java +++ /dev/null @@ -1,91 +0,0 @@ -/* No detection of commented-out code in header - * for (Visitor visitor : visitors) { - * continue; - * } - */ - -/** - * No detection of commented-out code in Javadoc for class - * for (Visitor visitor : visitors) { - * continue; - * } - */ -public class CommentedCode { - - /** - * No detection of commented-out code in Javadoc for field - * for (Visitor visitor : visitors) { - * continue; - * } - */ - private int field; - - /** - * No detection of commented-out code in Javadoc for constructor - * for (Visitor visitor : visitors) { - * continue; - * } - */ - public CommentedCode(int field) { - this.field = field; - // This is a comment, but next line is a commented-out code - // for (Visitor visitor : visitors) { - // continue; - // } - - /* - This is a comment, but next line is a commented-out code - for (Visitor visitor : visitors) { - continue; - } - */ - - /* This is a comment, but next line is a commented-out code */ - /* for (Visitor visitor : visitors) { */ - /* continue; */ - /* } */ - - /** - * This is not Javadoc, even if it looks like Javadoc and before declaration of variable - * for (Visitor visitor : visitors) { - * continue; - * } - */ - int a; - } - - /** - * From GWT documentation: - * JSNI methods are declared native and contain JavaScript code in a specially formatted comment block - * between the end of the parameter list and the trailing semicolon. - */ - public static native void alert(String msg) /* not JSNI comment */ /*-{ - for (i=0;i<=5;i++) { - $wnd.alert(msg); - } - }-*/; /*-{ - This is not JSNI comment block, even if it looks like - for (Visitor visitor : visitors) { - continue; - } - }-*/ - - /* - * This is not a documentation comment - * for (Visitor visitor : visitors) { - * continue; - * } - */ - public void method() { - } - - /** - * No detection of commented-out code in Javadoc for method - * for (Visitor visitor : visitors) { - * continue; - * } - */ - public int getField() { - return field; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/rules/FileWithNOSONARTags.java b/plugins/sonar-squid-java-plugin/test-resources/rules/FileWithNOSONARTags.java deleted file mode 100644 index dca60016282..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/rules/FileWithNOSONARTags.java +++ /dev/null @@ -1,16 +0,0 @@ -public class FileWithNO_SONARTags { - - - public FileWithNO_SONARTags(){ - System.out.println("log"); //NOSONAR - } - - - public void analyse(){ - /* NOSONAR - for(Visitor visitor : visitors){ - visitor.scan(line); - } - */ - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/rules/FileWithoutNOSONARTags.java b/plugins/sonar-squid-java-plugin/test-resources/rules/FileWithoutNOSONARTags.java deleted file mode 100644 index f865e829fec..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/rules/FileWithoutNOSONARTags.java +++ /dev/null @@ -1,16 +0,0 @@ -public class FileWithoutNO_SONARTags { - - - public FileWithNO_SONARTags(){ - System.out.println("log"); - } - - - public void analyse(){ - /* - for(Visitor visitor : visitors){ - visitor.scan(line); - } - */ - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/rules/UndocumentedApi.java b/plugins/sonar-squid-java-plugin/test-resources/rules/UndocumentedApi.java deleted file mode 100644 index 729a0a7fe89..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/rules/UndocumentedApi.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * no violation, because documented - */ -class UndocumentedApi { - private String key; - - public UndocumentedApi() { // no violation, because empty constructor - } - - public UndocumentedApi(String key) { // violation - this.key = key; - } - - public void run() { // violation - } - - public interface InnerUndocumentedInterface { // violation - } - - /** - * no violation, because documented - */ - public void run2() { - } - - public void setKey(String key) { // no violation, because setter - this.key = key; - } - - public String getKey() { // no violation, because getter - return key; - } - - @Override - public String toString() { // no violation, because method with override annotation - return key; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/AnnotationDefinition.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/AnnotationDefinition.java deleted file mode 100644 index 5984ae8b838..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/AnnotationDefinition.java +++ /dev/null @@ -1,18 +0,0 @@ - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Nice javadoc - * with 2 lines - */ -@Retention(RetentionPolicy.RUNTIME) -public @interface AnnotationDefinition { - String value() default ""; - - /** - * This is a javadoc annotation - * @return - */ - String value2() default ""; -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/InterfaceWithAnnotation.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/InterfaceWithAnnotation.java deleted file mode 100644 index 740518a3692..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/annotations/InterfaceWithAnnotation.java +++ /dev/null @@ -1,11 +0,0 @@ - -public interface InterfaceWithAnnotation { - - @Deprecated - public static final String MY_PARAM = "param"; - - public void getToto(); - - public void getTata(); - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/ClassWithOnlyComment.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/ClassWithOnlyComment.java deleted file mode 100644 index 3a7f265cc2b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/ClassWithOnlyComment.java +++ /dev/null @@ -1 +0,0 @@ -// only a comment, valid according to java specs \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/EmptyFileWithBlankLines.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/EmptyFileWithBlankLines.java deleted file mode 100644 index 3f2ff2d6cc8..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/EmptyFileWithBlankLines.java +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/foo/ClassWithPackageImportsComment.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/foo/ClassWithPackageImportsComment.java deleted file mode 100644 index 98fac7dfd5f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/emptyFiles/foo/ClassWithPackageImportsComment.java +++ /dev/null @@ -1,7 +0,0 @@ -// some comment -package foo; - -import java.lang.Runtime; -import org.apache.commons.*; - -// another comment \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/CP1252Encoding.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/CP1252Encoding.java deleted file mode 100644 index fd02cce8fce..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/CP1252Encoding.java +++ /dev/null @@ -1,21 +0,0 @@ -public class Car { - private int n; - private String s; - - public AClaèss(int n, String s) { - this.n = n; - this.s = s; - } - - public int geëstN() { - return n; - } - - public int explicação() { - return 1; - } - - public String getS() { - return s; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/MacRomanEncoding.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/MacRomanEncoding.java deleted file mode 100644 index 5bd904e19b7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/MacRomanEncoding.java +++ /dev/null @@ -1,21 +0,0 @@ -public class Car { - private int n; - private String s; - - public AClass(int n, String s) { - this.n = n; - this.s = s; - } - - public int ge‘tN() { - return n; - } - - public int explica‹o() { - return 1; - } - - public String getS() { - return s; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/Utf8Encoding.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/Utf8Encoding.java deleted file mode 100644 index cd82566a5c0..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/encoding/Utf8Encoding.java +++ /dev/null @@ -1,21 +0,0 @@ -public class Car { - private int n; - private String s; - - public AClaèss(int n, String s) { - this.n = n; - this.s = s; - } - - public int geëstN() { - return n; - } - - public int explicação() { - return 1; - } - - public String getS() { - return s; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class1WithGenerics.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class1WithGenerics.java deleted file mode 100644 index 47417d623ba..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class1WithGenerics.java +++ /dev/null @@ -1,5 +0,0 @@ - -public class Class1WithGenerics { - public T foo() { return null; } -} - diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class2WithGenerics.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class2WithGenerics.java deleted file mode 100644 index 9ad86d4a141..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/generics/Class2WithGenerics.java +++ /dev/null @@ -1,5 +0,0 @@ - -public class Class1WithGenerics extends Class2WithGenerics { - public T bar() { return this.foo(); } - public T foo() { return super.foo(); } - } diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/gwt/JavaClassWithGWTNativeCode.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/gwt/JavaClassWithGWTNativeCode.java deleted file mode 100644 index 4f4f361f110..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/gwt/JavaClassWithGWTNativeCode.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Javadoc for this class - * @author freddy - * - */ -public class JavaClassWithGWTNativeCode { - - //Java method declaration... - native String flipName(String name) /*-{ - - // ...implemented with JavaScript - var re = /(\w+)\s(\w+)/; - return name.replace(re, '$2, $1'); - - }-*/; - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/packageInfo/org/apache/cxf/jaxrs/ext/logging/package-info.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/packageInfo/org/apache/cxf/jaxrs/ext/logging/package-info.java deleted file mode 100644 index f569bf6138b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/packageInfo/org/apache/cxf/jaxrs/ext/logging/package-info.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * JAX-RS specific logging support. Based on java.util.logging (JUL) - * with use of different logging frameworks factored out; assumes that client - * with source code logging to other systems, like Log4J, can bridge - * to this implementation applying SLF4J - * that JAXRS already depends on. - */ -@javax.xml.bind.annotation.XmlSchema(xmlns = { - @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://cxf.apache.org/jaxrs/log", prefix = "log") - }) -package org.apache.cxf.jaxrs.ext.logging; - diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/CheckstyleBug.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/CheckstyleBug.java deleted file mode 100644 index b312a4e7c83..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/CheckstyleBug.java +++ /dev/null @@ -1,17 +0,0 @@ -import java.util.List; - -interface Foo { - public List bar(T foobar); -} - -public class CheckstyleBug { - - public void foo() { - Foo foo = new Foo() { - public List bar(T foobar) { - return null; - } - }; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/LineCommentAtTheEndOfFile.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/LineCommentAtTheEndOfFile.java deleted file mode 100644 index a9b876911a4..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/LineCommentAtTheEndOfFile.java +++ /dev/null @@ -1,3 +0,0 @@ -public class LineCommentAtTheEndOfFile -{ -} // EOF on this line \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/UnicodeEscape.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/UnicodeEscape.java deleted file mode 100644 index 38ea3a84081..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/parsingErrors/UnicodeEscape.java +++ /dev/null @@ -1,9 +0,0 @@ -public class UnicodeEscape { - - public void foo() { - char a = '\u005Cr'; - char b = '\uuuu005Cr'; - char c = '\u005c\u005c'; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/CommentedOutFile.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/CommentedOutFile.java deleted file mode 100644 index 88f9cf0144b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/CommentedOutFile.java +++ /dev/null @@ -1,7 +0,0 @@ -//package org.foo; -// -//public class GoodPackage { -// -// private int i; -// -//} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/GoodPackage.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/GoodPackage.java deleted file mode 100644 index 08e93ee0c7a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/GoodPackage.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.foo; - -public class GoodPackage { - - private int i; - -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/WrongPackage.java b/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/WrongPackage.java deleted file mode 100644 index 00b7237ac1c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/special_cases/wrongPackages/org/foo/WrongPackage.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.somewhere; - -public class WrongPackage { - - private int i; - -} \ No newline at end of file -- 2.39.5

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 Xr%OM`*d$U7{MX8o%#&HNk<9~Spqlq8jM;Tv_ z81=#&UZ-Bw)Z0EjU*7>7plHIxl7UQ^AP|h7m5A+AV?%g#-f$?BtadE!+;LB8JW7UCOZFJD)l<)ENhK`R_e8lR ztcP>1#6`zzNZS_fA%kI4qSke^b(=r&Qm^Zjw1~K<=5CcFa{8O>6Zm06NZi)s7tq}xNA|%>0JKLd_O9^9g@}kF_Zr!qXkX^ s5{MF>K!$u1#1$w@KA6S~y$NzpVwS3;5kU%bS6ot=i)27DQ*7#GGDhO>sgX^jwMOV=ZmAanBA)T5gGMR|4q_LwTu+Z3oMMqq%qzF6ywkV!w1Ywp?tZL)cwL6WRsu$0CXR(R9wm2%R#@jf#CO zBl+y#2xFv92zHn*9?M>b-QW)#8?BOP(EEx0g9Gfr;y*18@o-tz2D{VJ1FQX4kXLy_ i_3nk^3RYN~sIt}=t;1o&VdpZy&v{(F32UqsG`|6>+HBJR diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/bin/ArchitectureCheckToSqlFromUI.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/bin/ArchitectureCheckToSqlFromUI.class deleted file mode 100644 index bf8f8c0c33d1206a07d1c23f63f6d5c8e7ec7bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmaJ;+e*Vg5Ix(*#-`EMUcJ;x->QPa=ZYYOq7YO_?fW(^c55y+*$94?J}CI$2l!Fq zq^(dv+<}2JGiT1s?C00}2Y_Sj8Cbza9%WPvR8iAW*U@0eoyb6{Q-(&zp72L*#Z%96 z6j#C*f$HuL8MIz_D;SEl48&#Pk3=-!Bab3wJ9N1>%qT60S-j z(Hjf*eh@lSuOEf}%|(|XAODCjRR5A@Fq|-nT+x@QSo^ - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-bytecode - jar - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckDateForbidden.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckDateForbidden.java deleted file mode 100644 index be4c58f3e4e..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckDateForbidden.java +++ /dev/null @@ -1,11 +0,0 @@ -import java.sql.Date; -import java.util.Calendar; - -public class ArchitectureCheckDateForbidden { - - public ArchitectureCheckDateForbidden() { - Date dateSql = new Date(200000); - java.util.Date dateUtil = Calendar.getInstance().getTime(); - long time = dateUtil.getTime(); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckOneErrorMessage.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckOneErrorMessage.java deleted file mode 100644 index 46f02755655..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckOneErrorMessage.java +++ /dev/null @@ -1,8 +0,0 @@ -import java.util.regex.Pattern; - -public class ArchitectureCheckOneErrorMessage { - - public ArchitectureCheckOneErrorMessage() { - Pattern.compile("*.java"); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckToSqlFromUI.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckToSqlFromUI.java deleted file mode 100644 index eaa2d7f462f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/architecture/src/ArchitectureCheckToSqlFromUI.java +++ /dev/null @@ -1,7 +0,0 @@ -import java.sql.Statement; - -public class ArchitectureCheckToSqlFromUI { - public ArchitectureCheckToSqlFromUI(Statement statement) { - System.out.println(statement); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/EmptyMethodProperty.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/EmptyMethodProperty.class deleted file mode 100644 index c679a6596e793743761059f9dde49bf192c365f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503 zcmaJ;O-sW-6r7iA5{*%7tKv!Y<_9!*ZV^Njg!%zW@0)b7TiPTfTcJP8liScMFsoZE)gg2AS%a7 zBW$Q;KcQ8jtEe!!j7{xA@SoFZ9;;hj202)<`MaP!l5aAAfI~R^KMSEzHiu)GyoQg_ zNX14R!{U*Yj{uJV4p)~^$UE`woPB`a`C!50>Qa);?G%#JB%#mY|&jx w{fcrcqf)+Kx6I`hO9E_i<$*1X&MRX!U)t0O{FMY$TL}JjEG&~WxLVlx1@CuUs{jB1 diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/InheritedMethodsProperty.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/InheritedMethodsProperty.class deleted file mode 100644 index dd34d7ebcb58ff5e8ccb2f42d0dd52032a684211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcma)2Jxc>Y5Pf_3I1^(Mqlq>aB0{3zVPg}q5d`7}wkymP??zOqg}TS14mZ-_X)$XDa?G$9j*K1&W2G1e$7&#qw4#3^>_GR&=abe$ zn|3H|Q*AOJ?qVL%mU=TB@_QacT-^j`-J$5&cI%o3bnZFm}+TaeuhY&pAr{PCc0DIqwG=kGLJ6KNEQ-iW73^6 V-9!ad;xH`!Enfaryp{+peE^)lb8r9v diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class deleted file mode 100644 index b95a647c5837462a8c170ad1809cd234eff4f53f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3781 zcmai0>37t06uoIXYr{5Bq*S4ZVmk#Y;tql{g-WptIxGSzq%)Z|m`TP=Qmrev@B4a= z-~GY|w^omy<5$n|kMek5lF6i_+(#TZ$dD``9@H>RAbrD4gYokl&4=hJXxw~>JhFO7vPUcifKET-{N8ZXPi zSJHS@yk8UZdJ0#wxD^#K*V1@H);HzYTVmc8^NyHz#k?oxeK8-T@L>ucDd@4Znyw%> zc|}{$MorC{8!fqxVa**F&H;Vdk_-C6=vBR3!x)BL>Ix zs^*y_wb^Uvrrv0j!gL21{aU%qP1`wVxbuag$C}Sn$28MqMv^tZwhFdRu1MQry_vd9 z#jDjzu2-!p*c~8=N(xrxSo1;2p0?dW_!2@HrFq*kD@DB!5Gm=dD|J`NI2O$I_$~2f zEWO~&d4Ur4bV_1-UYS)b@=;kD&uJJ7dSRBa^$bl6Q%{Kn&GaaYTjEbw5Z)etQetqC z>aWC#uale>6MpPWZQ3X)37yDFvj89m23a?UGR52+?$)aZQpUFC< zYcdkDoD$j#>?(&xKE-D#e6HdPd`W`776uQb@Rf?MF&6FI6I~r-UlzRvJG0R^Zb=(D zDo*+DIiZ`Ty-USC!s;MKSQbBsSi2QH!>owMH~5x08C3Bdj;c6^r&K(N2UR>RR~N-R zE9R2yX?{LBbT|8?^@5q%D}M8Kv#U7e;t~rU9g?<8@@c^|74(M({0xuTrb%bRw){ge z)Y4+Z)oUC~w#Oa}XQyG0p5mN!nMYl#amED2TDi@P)#Z?B$y@7n-6E}haa!T9ZXZfv zmI$17?cfx4aqj%^LVC1>>*O4A*|1rNn3- z;@v59^9tCW{~b#HFLa&%9o^M%6CrXUs=DYx>Y}t@f|?A+NGMS@ zCZcQ22cL+*9|^&G^SN87VD`hd7TkJ90}3OF z2@Z~vF{s`Mii0`ic`sMtnauV7itR0wpz>3c;B*Wj86lLSddE9pV0BMF5p!;Jz-gQb zUoUAA@eTZiTREm~V~qxuu_L#WhFaXQjKS5AXMD(@Dgz-O0^n?@M1FZf@F`|Oz&8#2 zfc5zSVka&yW7qY8R-XpRI?wrcf%ETT47#aEy5l^jtfc8e1brri?pp=TQrsSc4@!H9 z@Rtcci_Ivjg!Tx%um&`LG~AGNlI85c`XxfYOz2nEfaXt;5PF+SMVgv|dY#?OV`NtH7PEAV+VIGp}Y^3s%cArDHl`+jh zzN-x1rf+c2X7nMCJPjkeKv_bbk#8Nmf<4d5i)4ct=p&*yZW^#e5hz~%As!la diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/ResourceTouchedProperty.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/ResourceTouchedProperty.class deleted file mode 100644 index a7cd080e2b080dfc8519f046b30d268e01f0d01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmaixO-~d-5Qg8L{TOB#Wm#GLLJ{HtFmYoHTrgftNHnVwARN5)?o`+&LpSzzZ^D1# z!hx80@CW##2-UNj-4$cZBvn(@^>#f~{rl$UF92__o}!MYDQZ}m!?T3_^BAi!Uc^`v znD^QbDBn|5r=izI=SGsO>Nvq z-6yLY<)6v*4FlHcyO#xD(%P6o{n|aHp4;90#s#MQ|8tb_Ia6D&1+v`iTQ!u9KAEmS zdRP+dsQ|w651`j!F&XBOWq5>4pf;3+rwl0)f%X4SB+!`db_B$b)6{|2I_wH-{6cjI z#EAHtL&C2Zg*NPKoM!~K_c&^^7a_a#1LCSIyU#X=feIGbhSDHwV39pHoQPkQG3V|I zlNljHkA)Ag#PZN}hke98s$2$(Y0IosE{{&f%23h5GHV1LPMW_h;}Ll@1xQP2166MN lH+>Wq&%yw)&6Q!Yc&k~tM)mF$OT2{E%oXuuj>jeQlUrI{jpzUX diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Comment.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Comment.class deleted file mode 100644 index d91c42367225e5d7bd51ba08682137dc21102ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmX^0Z`VEs1_nb0c6J6&40*nmIK$3}p1prQk7a9Nn diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Content.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Content.class deleted file mode 100644 index 95a0af082b27fb1839a26d5504dfd2adc2cdde78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmYk0Jqp4=5QX2w{Ai3Cyn&rs7_1c=!76B>*l*$zSKb2=m&HL6da=@SeLW|#+=(P-(vOQ&TFJ>p@9)8!WZI^c{SpgRK#9;eF~EHpWT-|nCVpBtggX(9Lm^T#qA diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/File.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/File.class deleted file mode 100644 index a2484b0618143ed63371dd72dbb6d5191dab877c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1185 zcma))&u-H|5XQf?lQ_63O+y>n@~A7CCn1t`WQy zoGO9D1MpCY*|kZXq>;!WJ3IS*znPu&?>|3&0eBAIMGYMX4_sL2)bY^4BM18owVsTn z>ND7$f5=c7BqxGlZ75^$Hk%xa^nf2nlxYo*;D)qidR@6s%&ag66JUkCx%Sd#| z8wz#6!&hI%;!MdTX4v%nTv1MwvXTmZ!r)G&#M<_b{NX45nFpDYQ7}lNNQ^Z`>rW#d zGO#0tYa_H>!0mxCf6hrvjtG7h_a!t8sCdH=&=jta(nV(xAlDsvcm1!ca? zMNV;_S$p-ArbYK{=lXeyKA0K!*Ry{^?_BBVmENG=b>K0)xw^wy<$t#8j*=`L3;o12 ze7!u=GiksuGaoJxl`Rh}E zlZso$|HSZ!IbV3SWMqYLox~L?r%N``f^85lO@_*{`QlB(Xp>$yl{c@W8`vPvC2iB3 zw+;0so$HG&r*15vZee?ds(aiidK}S-O;o#8(M{T=32zzPZhky%(#9>^CX?1`u!TDm W=kK7;?v_g3Lw%I%TL!u`Kn1>{x$ diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Language.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Language.class deleted file mode 100644 index f8e661f880c9259d39b5ee012c8eaaacc9afa444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmY+8y$ZrW5QJy*t1>T%e-5&s^=y@>FcF}RsB{*}Ht7<_ohoe2gS{4UM=!Pnn>-rSQawnpUNk1%Nk?lpP zwEse@I;ykYu0(PULXju6NaT#*ZHu~$5G2D&mZ;IcZ5!G#8^|Cwzx;jtsMSPl4Z%Y8EX diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Line.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/Line.class deleted file mode 100644 index 474ca6342951aaf064e3dae0856ce9b4337b2cd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmX|*y$ZrW5QJy*t1)Wu4eZpyV6E5)RzV9T{UsiH5)+7t?`0)e_y9hXxEI7-7wQ+eRB6J1)g)!2bfxr7ju( diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/SourceFile.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/SourceFile.class deleted file mode 100644 index 5be7fccdca02aa248349eef5b6c69c725cec6ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 895 zcmZuvZEF)j5PmiYy_yhb=;_OD+Xv@Lw&fGK4%ri5;et-W7U<1z`EMv{WZ3hLc*>G^jq2sQFj*TvQ z72I=h9}g_7Tksi5Gp;5K_247_#QliJp+8WmjKdcUl_(kWXggL6Y@5M0W{|`o**gqn z9hxyT-k%j*%M8s{5=COHWD+y9=D1wR$UpH@B6}din5#S$481c!o2OIsDR601#!~ee zikJbd+eEM{60L7hcd^~6}$4Rvt=7b(&-*XVwkrhGq;nR2m;ri+LA zzh^2~B(|{O;t?Lxzu`orqAjyFkLk>EVd063r+7v}|ErujX*^m5bwi6_s4Yx(KT~2# z-AZzrX>;CFnfPyM;EKjB_>>gQtNqu_V9hirqA@l*r-#uU;RdbQGVNd)He8&eR{<-i zn!5(i+;ud}P0~U8VBY5m$8?|QyhNTpiu3|%y(6&R4;0=Vq4*7@1B1Ryr(SJf2_?#N zg9L;75s@6HAL_hnd}( z-Pil^1hB-2Bj*@!3>mmqVJ|DiFrLkKLF$`0N*$RMLqg)tICW!~kb04KDe7RXD7>}m z9E^7~m6k?38R{#UO#h6nzt+)gwV|D?^!4?uw#L#@LWzrLPVjdD-P6Qb>9jbUE|kWQ jH)`RlO1aQuU}#ab>8VzSp@S|!y$4Qg5?Q2#vIg}(XsSKz diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/TagException.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/TagException.class deleted file mode 100644 index ae384ce7df42bbcb60e6c8401dbd3795f5c465ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmZWkF;2rk5S+CgJD89VCl4T9f&>;dhz3DrXcDErnA35{oRNJ&Jd0FF6g+@OA@&S% zB5}p6W_MH6Tlh9F#;TRF^rHz7!kq?ZM3~4_|w^v5L}h_k}$}$k$3B-m8=$G zRd6TC%3KsnQEA8jnt^@LHDQ!lq3U!Y)b(pFpRF#D*S@D5sg1>nfKw+N~Jw2An!|4;_SrJ`axC=m{(T?c*c1@vRgS`21h@Jdg`xjF_cd yiEHQh9kgl2T}C$sTlN@xzXHVAXGY8q7@hfqYoklNH>Mu8)^Nw_x7L268vFpf%}XBu diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/TagName.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/TagName.class deleted file mode 100644 index 668433f6011a2697d7e7e3e3396950a7f7c6d1ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmZXQ%SyvQ6o&svFKN=)i@kVTxoaa>Tq}YUy9#yD()~0JaY~v zCQWIfS)4iloO8Z^a(@55e*j$J%ti?v3q^EI9GN&aal%lH_);(&dJF!-2O*Dw!9*o8 z3a%N-H!_mymZ8(zFZX9OJd7V{xbDeFj91IKNTz%qX1Lhr;fyCz>-@5)o@B~U^Ar!# z!ITGMvL+id5K5;E?OuQ1h`|!CzIawLju@Id4a1P9DFN(Byh?mAlG@tI!I%1n98_@X zpbV2HH@5d%nzOlE`!}{rc$hDQuNVrw{tV}|v=S|m_M};q8I)IGQM5^oNE>w8?iZMQ z@d@KS>#0(#p+Hfu-KJQDL#n&(#sO9JXJ=GKv^p9&^Nvo5?gxxF5(WWuyDroS US>M4~IZi*dNe|VyRyNcA2e(;aHUIzs diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/impl/FixMe$1.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/tags/impl/FixMe$1.class deleted file mode 100644 index 7581dc25b8a10b5220d47ce581ab20636a4f2127..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmZuvO>fgc5Pj=>xHg8SX&TCB3#7$PB|;>`C8ZLIs8lJ1L#x~!cX79J?8x#cou5dvQfvji6=IVrzW16=$P0MsORS@ z>%0_L8|8kO_0;q->K&@9V>zI6U&Sgv5NNqeUT-W=9VTZ|V0ENo`F=K?$n?~oL`0gS zB=DoLpDJxHz^YCq00HMHj%7NG{4A41*30CbK9gHPGQIRud7At`|B*oLqZTT#;f^l+ zPkt}*s`>^~Tudzfk8mOo&E9>*D`X;b-HP9uiNl zVDKf<-TMmB{SM;`Ed#f?>PVo4J6xUOY-1HoTAV2HIm2u2n!%`i*6WSPb`ja0dl!-V z#s+nW##?f<7aVVhY7VQr_Y0M8sFtbbBIZ=qKPn4%u}O+5?iH!;<3X`M#3SximiicL LJlVWcfqJX;w=1p{AMlJVD z+{c1}2PV>ZWZ-cRo|wp>XkgL6Qv*u^-HWd8M*K+T@|yywQt-(Z$W~q7UTf92?QlbG zd$jadgPQat5b`>lWyUN_q*yGrdVkTxJ zm#^;1FS5{zT(3|HJkPF0Zs0S@tOfOk3}qCA0>g2XCw+%e+D?5&rPp1@mr*OE%JhH8 z7GrfKSzIEON>rv?XPO-yM@gv)@!(zT7Aec&j zhp!z?HaCtE80c^xLz(1y&qF;hA&(b-s&=vBMfln&c4csxcr+mluf z=HgN5nD6{1uHyo)A1lDSnBtpl<2u0IHWGY*@tH%2eI)jgJV5FQU0a9fuFf97I6%*b zAB;#~kn1q7D$q-o3tY1pBIg+ShO|#JG3F9?L%hc$7^RNDWn3X%>6MVwdYL1nx2S1W z#dn%xa#Ono2^{Sp%(My9^j@Wyz_>6wn_ zeONINM@~mx#|s^+8X});$I{SWaLr01yGbRdA?nywtD#}MaA1BhvrX4_vTOCad0em? zF8%QxyHYjXW}P?ZFN(=4xB_8vtGp1)+g00Tx^ODJ%cSeIGOrGbf2(=8Z`F(DzR(yc z)JmqaYu0ViePhJ^Y?I88!n6;MoNTdHt`T;kJN)>lb!EIKHecNEc<2qwl^Qh+qyiNS zC%w{gB~$5uj~=sJ7N(s`UR_=xj%W9~=b1Gmn+faqrb9iuy?;Q+oQfa^A{!m*TnQP;l5j|191|R_w@{ss1O_prVYEZD zy-^7aVChKW6&wHY@SzW`G_zjU^;UOEpvv@ z-YLQ-h)|4DjGaLLL3bFFJO}tIXN16m1f8OmP}gx4)6}kYS!Sqdn8kHJ**lLG5X&qw zMF&^D1t6&?X$j_pr^kFu#(Sk`0d(;x^cyT%m9oZPDJ7cuiO6>fige5~P6fzD&yf|2 zf}6)pAFk+=H3+9K{zBjTUcxi{K+OgS8*Rb{Zef8qopy*%Ww?zyM3&yaWrP$S3V-Wi zI~PC=wNYiFsV-FU32K^8gq{qaMcm~n_?!N0jWfjeMvPPR_jY9=(3KYZi#XrIlFvEV aWW5(I9e}&M$!Za^1XR*}{w>IwKKu{y1{dD| diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/bin/CallToDeprecatedMethod.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/bin/CallToDeprecatedMethod.class deleted file mode 100644 index 3aa564be7a87091a2300898e732ef2751a2ee42e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmZvY!A`9{A8j_8G?xL)jwuq%>4$3G%h!(hTt@|q$HJMpD_Or$TA>|aYYjQeMV zpQt2=2D*MEoBcq|n+Z5d+O!gCNgB - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-bytecode - jar - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/src/CallToDeprecatedMethod.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/src/CallToDeprecatedMethod.java deleted file mode 100644 index 4a6af6cd41b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/callToDeprecatedMethod/src/CallToDeprecatedMethod.java +++ /dev/null @@ -1,8 +0,0 @@ - -public class CallToDeprecatedMethod { - - public CallToDeprecatedMethod() { - String string = new String("my string"); - string.getBytes(1, 1, new byte[3], 7); //call to deprecated method - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/ExclusionOfFieldNamesFromLcom4Calculation.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/ExclusionOfFieldNamesFromLcom4Calculation.class deleted file mode 100644 index bfa2977a941bf15d7c0565c4d6f19210ff49c30a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182 zcma)*-*eJH5XZjeb~oSq?C#~)?;k$_Y~ZDi>sU=2KX@;K1GjUI zXZXT#`<;uLRK_e<= zY9~ldD;k8gNX6wMipE%RX{;DU)T64?f_XwL5MnVRI6^2Y-M+ z$~apI5JQNUnRjOQ*?D)qzCS(zoTFsH#7+(db}b5f8SH0pz+gTK9tI2rcj!HNwa|B)Pqoi>9;IkeRin%(n`iG}FC^BmPBEP{Q?NY+=UEO}`=acd)Yno3p{&iM`?v!9sKd diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4Exclusions.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4Exclusions.class deleted file mode 100644 index 53c65ec0981eea6bc90e7d0606d07c34f93d7139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 zcmZuuO>fgc5Ph4tapIVMgd`BY+wzeViKxJ>2nkgn4lb2wRU~eXy|i0gFE}=WU&MtA zJrs!pS0sKE;;o%FZmA`|nVp?^^JezX-=Dt#tYXDM9XB1=xMg6mL0B@d?BF);*tl!s zo{hdh?VXZQxGK={_We)(F!JNw;Z~Zccz5mi_92}oDpu)JfogxSBVeuTPzua>DweOZ zgON3D1!g!+w6-U~G4!H4wA zhD`T#C@>r9XQOeN_(57+SCcGeTcQyoKW2VJ#!kN^dULcdgLG~1mI*rdPY*S@7jU+8 zmIU&JGJ@M@G(9j|aB%^%E-o9mWWYhwg^Q+*fr}oln9)zqA}~MQU(t%~r=izb92YAp zMV)$FuqJLh7Yk6gn*FoTS}1DaUDLez(NW*$lrW&}E@1;GT#^d-TR}W zZ!A;{=kUGnd(3<9oB8^F`v7o?l8pp%7V=3HY{al@Vb4O5A#pA}sV*3da;3vyHvGO| zNITLKH{(%Pgtxrw5|efO9(OxDlzRRnO*N1aL&cO8kIoo! zqsg5Yjf21s=R5_BCJo<<6!%nzyJHH-mn+VYKk=H&y~kQxh0=Q@x!v~1VNYC1y~M$~ zoT^r)U?ItHv~XDpZUrLbO8VaAb58`ip(j_XRV~_QD6Vs6$SnL?-J$3yhC=!Os+A57 z5vO0)#{kpIP~D)ZM#u=`$5XIZYGSadCT1kVCiSV`3xr!VF>KGp^_dx9za#dLHKs5> jR~*bG2Yc?2MuvQJ{0X6sH?qddiZr<-HRjTt*{$pk`M-0k diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4WithWorkers.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/bin/LCOM4WithWorkers.class deleted file mode 100644 index 7ab3f59ce131f5c8481bac2db5bde0f0f5ddd9fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 991 zcmb7?OK;Oa6orrTvg5dUI1RMr)$&XXG^BKcC~P7s7AZvvO4d$dQn!wcoCy;D3J?T| z1wVivg*X#O&Vz1{<+(FwX1;sxv48*h`3pb;hdMTJOT%s!2KICgw>8|6@va>1WpN)5 zG*oreU}<=$;*pBS3exXg#~UaxTj%yiyYAWku-+D->kpqR$Q-%8D_$x{R%;yvsb(;6 z6ck#n@4T6edQSMx?s-(qR?xS-jvcykJr`5r%pJ?UR`c}auTAdIg58FShJgb-jTPoAuBV{1aPYKu?)1fq z)c!OU&WKh96K+(Zp537SmR<`w?${$5Q=TzaWv2Zg4|zWCRsS`s*1;Y>@dp0`1qs<0 zXBp1fE=QBAXVewOob>~WWhTBO`Gv~_${ck@c{Rnj$(a!yMFm%8Iz5?V>WmVTw!R_x znUe@0b5UHnoQ^MV$2Gj*>8OS&QkI!ssUeRf5n0xt^T{otaxrQrMjg%T(5)#leAVuv zn~0PrsX$(FiKNFQes&V1G0k~VrLWM;>=e3;ImUHh85&VVA{G{vVj%yW{{?OlxJ}^B LrNA3Ab8r3yBY2)A diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/pom.xml b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/pom.xml deleted file mode 100644 index 2dd1a2361e1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-bytecode - jar - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/ExclusionOfFieldNamesFromLcom4Calculation.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/ExclusionOfFieldNamesFromLcom4Calculation.java deleted file mode 100644 index 760389da3bb..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/ExclusionOfFieldNamesFromLcom4Calculation.java +++ /dev/null @@ -1,32 +0,0 @@ - - -import java.util.logging.Level; -import java.util.logging.Logger; - -public class ExclusionOfFieldNamesFromLcom4Calculation { - - private final Logger LOG = Logger.getLogger("log"); - private boolean killAccessorBlockA; - private boolean killAccessorBlockB; - - public void firstMethodBlockA(){ - secondMethodBlockA(); - LOG.log(Level.INFO, "a message"); - } - - public void secondMethodBlockA(){ - LOG.log(Level.INFO, "a message"); - killAccessorBlockA = true; - } - - public void firstMethodBlockB(){ - secondMethodBlockB(); - LOG.log(Level.INFO, "a message"); - } - - public void secondMethodBlockB(){ - LOG.log(Level.INFO, "a message"); - killAccessorBlockB = true; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4AccessorMethodAndField.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4AccessorMethodAndField.java deleted file mode 100644 index 799619d244b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4AccessorMethodAndField.java +++ /dev/null @@ -1,19 +0,0 @@ - - -public class LCOM4AccessorMethodAndField { - - public static String field; - - public String getField() { - return field; - } - - public String doSomethingWithFieldDirect() { - return field; - } - - public String doSomethingWithFieldIndirect() { - return getField(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4Exclusions.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4Exclusions.java deleted file mode 100644 index 25f4e8ed464..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4Exclusions.java +++ /dev/null @@ -1,27 +0,0 @@ - - -public abstract class LCOM4Exclusions implements Runnable { - - public static String field1; - public static String field2; - - public LCOM4Exclusions(){} - - public static void doWork(){} - - public void emptyMethod(){} - - public abstract void doAbstractWork(); - - public void run(){ - run2(); - } - - public void run2(){ - run(); - } - - public boolean equals(Object object){ - return (field1 == null) ? false : field1.equals(field2); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithIsolatedMethods.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithIsolatedMethods.java deleted file mode 100644 index 6e310f01703..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithIsolatedMethods.java +++ /dev/null @@ -1,11 +0,0 @@ -public class LCOM4WithIsolatedMethods { - - public void myUnsupportedMethod(){ - throw new UnsupportedOperationException("..."); - } - - public String myConstantValue() { - return "..."; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithWorkers.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithWorkers.java deleted file mode 100644 index a4f966e0ed3..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lcom4/src/LCOM4WithWorkers.java +++ /dev/null @@ -1,27 +0,0 @@ -public class LCOM4WithWorkers { - private String field = "toto"; - - public String getField() { - return field; - } - - public void doSomething() { - task1(); - field = "tata"; - } - - public void doSomethingElse() { - task2(); - getField(); - } - - public void task1() { - System.out.println("Hello 1"); - System.out.println("Hello 2"); - } - - public void task2() { - System.out.println("Hello 1"); - System.out.println("Hello 2"); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/lib/hello.jar b/plugins/sonar-squid-java-plugin/test-resources/bytecode/lib/hello.jar deleted file mode 100644 index 8861321be319540bb35c6c0c395c9a58e0806b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2150 zcmWIWW@h1H0D&uw^R2-QD8UJ&eO*Hwbv^yu^aG&EI2bMil^H(n_RRxIw*avSvNB&s zKTkK;;1E4ux6i(3PWyQ4>RsgZ*3~+9=KSU$gDb`lo)+nNojal9t?R_W{$xqm6fx}s zDiu5DbO#B02L+eR)mkee!!0z~I7qZc_;k=`pp2JsvDbk|2WRg5S?TB6S*a=cGgF{b zBzFCjoC&&VRcs&Ip6!X*6T<*=9|PEZKqtWg3y_sxln(a+rV5bvK`M&#^Ad~js1ra@ zSCU#>QVdrO376G{`&iT&85qt0u{0Ld9;rDw`FhDYiN(da6VCe`au7JSUsHGMQYNMP zJynY(-ZE$GnIXXM!Y}cTJ1@cWty-?($F(LGXHJ zKU{d1TW~#mWbk0m>&4F(`+o>C@-<^f!rO&zd;s4ha zZUyVV>{Z#KrZw4ocKgmV?~m9_Wm_(;G`BNGGFJ3%(NeBM35!0b2EFik;;Gra$z$DF zKAZj@+rm23oysNNM`_G?<-2b}a%#cCTx;WP9CmDiHdiXI&n|A+7yrL&heqi{*lV@&XS!y0U zGBDG!Jf>n`jO&48Tn{xSF*R!t)|{8Gi)so7!y)#BYX-)o@rz@D3 zvCecpSXVhStNH({dr~uZX;iT{y7daO?q-|WByg5}#f&YVpZeUHDf#O8J<+GBduwlA zU%$IK;qTw5s_*Jsj&1$K9y*`_0vwf9$Gek;(b^YbAU@AZ@CF8^MOHC z48&$623bK-enDzcNoHzsaGC#EZ(T1PPv1a~RUsdIb-d3$4&pnh5nABs8)je@Vqmh_ z$Yi6@wvd7{-arE*gAGr#prw@Q72^xM-->xSzJ1_-=%s&3U-yI0#!gpjj~=7f)2FYUjsQy^MkWzv+{Gx+A3z|$@YWGT!&5Cn8}?!qq! - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-squid-sample-bytecode-project - jar - Sonar Squid Sample Bytecode project - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/EmptyMethodProperty.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/EmptyMethodProperty.java deleted file mode 100644 index aa143f5053c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/EmptyMethodProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package properties; - -public abstract class EmptyMethodProperty{ - - public void notEmptyMethod(){ - int i =1; - } - - public void emptyMethod(){ - } - - public abstract void emptyAbstractMethod(); -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/InheritedMethodsProperty.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/InheritedMethodsProperty.java deleted file mode 100644 index 1d3fd60bad9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/InheritedMethodsProperty.java +++ /dev/null @@ -1,15 +0,0 @@ -package properties; - -public class InheritedMethodsProperty implements Runnable { - - public void notInheritedMethod(){ - } - - public boolean equals(Object object){ - return false; - } - - public void run(){ - - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java deleted file mode 100644 index e4bec7fa721..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java +++ /dev/null @@ -1,136 +0,0 @@ -package properties; - -import java.util.ArrayList; - -public class JavaBean { - - private String name; - private boolean french; - ArrayList firstNames = new ArrayList(); - private static String staticMember; - private String FirstName; - private int myIncrement = 1; - private int myDifferentIncrement = 2; - - public String getName() { - return name; - } - - public String getNameIndirect() { - return getName(); - } - - public String getNameOrEmpty() { - return (getName() == null) ? "" : name; - } - - public void setName(String name){ - this.name = name; - } - - public boolean isFrench(){ - return french; - } - - public void setFrench(boolean french){ - this.french = french; - } - - public void anotherMethod(){ - - } - - public void addFirstName(String firstName) { - firstNames.add(firstName); - } - - public String getNameOrDefault() { - return (name == null) ? "Freddy" : name; - } - - public static void uselessStaticMethod() { - - } - - public void accessorWithABunchOfCalls() { - uselessStaticMethod(); - ArrayList myList = new ArrayList(); - myList.add("Banana"); - myList.add("Peach"); - myList.add("Strawberry"); - - firstNames.addAll(myList); - } - - public void dumpStuff() { - System.out.println("Stuff 1"); - System.out.println("Stuff 2"); - System.out.println("Stuff 3"); - } - - public void accessNameAndDumpStuffSoNotAccessor() { - this.name = "BusinessEnabler"; - dumpStuff(); - } - - public void iShouldBeAStaticSetter() { - staticMember = "Hello!"; - } - - public String getFirstName() { - return FirstName; - } - - public String getFirstNameAndOneArgument(String argument) { - return FirstName + " " + argument; - } - - public int recursiveAbs(int value) { - if (value < 0) { - return recursiveAbs(value + myIncrement); - } else return value; - } - - public int recursiveAbsNotAccessor(int value) { - if (value < 0) { - return recursiveAbs(value + myIncrement); - } else { - iShouldBeAStaticSetter(); - return value; - } - } - - public int recursiveAbsSameIncrementA(int value) { - if (value < 0) { - return recursiveAbsSameIncrementB(value + myIncrement); - } else return value; - } - - public int recursiveAbsSameIncrementB(int value) { - if (value < 0) { - return recursiveAbsSameIncrementA(value + myIncrement); - } else return value; - } - - public int recursiveAbsDifferentIncrementA(int value) { - if (value < 0) { - return recursiveAbsDifferentIncrementB(value + myIncrement); - } else return value; - } - - public int recursiveAbsDifferentIncrementB(int value) { - if (value < 0) { - return recursiveAbsSameIncrementA(value + myDifferentIncrement); - } else return value; - } - - public void fakeRec() { - int a = myDifferentIncrement; - fakeRec(); - } - - public void trueRec() { - trueRec(); - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/MethodBodyLoadedProperty.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/MethodBodyLoadedProperty.java deleted file mode 100644 index 4b7aaa9ad31..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/MethodBodyLoadedProperty.java +++ /dev/null @@ -1,8 +0,0 @@ -package properties; - -public abstract class MethodBodyLoadedProperty implements Runnable { - - public void doJob(){ - run(); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/ResourceTouchedProperty.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/ResourceTouchedProperty.java deleted file mode 100644 index 413cf1593e2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/ResourceTouchedProperty.java +++ /dev/null @@ -1,22 +0,0 @@ -package properties; - -public class ResourceTouchedProperty implements Runnable { - - private String unusedField; - private String usedField; - - public void notInheritedMethod(){ - } - - public boolean equals(Object object){ - return false; - } - - public void run(){ - doPrivateJob(); - } - - private void doPrivateJob(){ - usedField = "value"; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Comment.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Comment.java deleted file mode 100644 index 7e981522b29..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Comment.java +++ /dev/null @@ -1,5 +0,0 @@ -package tags; - -public interface Comment { - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Content.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Content.java deleted file mode 100644 index fb4180e57ec..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Content.java +++ /dev/null @@ -1,6 +0,0 @@ -package tags; - -public class Content { - - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/File.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/File.java deleted file mode 100644 index 148b5af55c2..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/File.java +++ /dev/null @@ -1,26 +0,0 @@ -package tags; - -import java.util.Collection; - -public class File extends Content { - - public TagException getTagException() { - return new TagException(); - } - - public void read() throws TagException { - - } - - public Collection read(boolean flag) throws TagException { - return null; - } - - public String[] read(String name) throws TagException { - return null; - } - - public String read(Collection files, String name) throws RuntimeException { - return ""; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Language.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Language.java deleted file mode 100644 index 0972c10891b..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Language.java +++ /dev/null @@ -1,5 +0,0 @@ -package tags; - -public class Language { - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Line.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Line.java deleted file mode 100644 index 95e693b8f0c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Line.java +++ /dev/null @@ -1,5 +0,0 @@ -package tags; - -public class Line { - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/SourceFile.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/SourceFile.java deleted file mode 100644 index 163be9336e1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/SourceFile.java +++ /dev/null @@ -1,22 +0,0 @@ -package tags; - -import java.util.Collection; -import java.util.ArrayList; - -public class SourceFile extends File { - - public static String path; - private int localInt; - private long localLong; - private String[] paths; - private Collection stringCollection = new ArrayList(); - - public void readSourceFile() { - try { - read(); - } catch (TagException e) { - System.out.println("There is an issue"); - } - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Tag.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Tag.java deleted file mode 100644 index 75bf8bf5f78..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/Tag.java +++ /dev/null @@ -1,11 +0,0 @@ -package tags; - -import java.util.Collection; - -public interface Tag extends Comment { - - public TagName getName(); - - public Collection getLines(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagException.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagException.java deleted file mode 100644 index 6ab5b0a9753..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagException.java +++ /dev/null @@ -1,9 +0,0 @@ -package tags; - -public class TagException extends Exception { - - public String getMessage() { - return "Tag Exception!"; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagName.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagName.java deleted file mode 100644 index 3f5b063cae7..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/TagName.java +++ /dev/null @@ -1,18 +0,0 @@ -package tags; - -import java.util.Collection; - -public class TagName { - - private final String name; - - public TagName(String name) { - this.name = name; - } - - public String getName() { - Class exception = TagException.class; - return name; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/FixMe.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/FixMe.java deleted file mode 100644 index 97cefdf78c9..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/FixMe.java +++ /dev/null @@ -1,37 +0,0 @@ -package tags.impl; - -import java.util.Collection; - -import tags.File; -import tags.Line; -import tags.SourceFile; -import tags.Tag; -import tags.TagName; - -public class FixMe implements Tag { - - public FixMe() { - System.out.println(SourceFile.path); - File file = new File(); - file.getTagException().getMessage(); - } - - public Collection getLines() { - Comparable comparator = new Comparable() { - public int compareTo(FixMe fixMe){ - return 0; - } - }; - return null; - } - - public TagName getName() { - return new TagName("FIXME"); - } - - - public int coucouc(String s, Integer integer) { - return 0; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/Todo.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/Todo.java deleted file mode 100644 index 17036afa90a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/tags/impl/Todo.java +++ /dev/null @@ -1,44 +0,0 @@ -package tags.impl; - -import java.util.ArrayList; -import java.util.Collection; - -import tags.File; -import tags.Language; -import tags.Line; -import tags.SourceFile; -import tags.Tag; -import tags.TagException; -import tags.TagName; - -public class Todo implements Tag { - - private File file = new SourceFile(); - - private ArrayList lines = new ArrayList(); - - public void setFile(File file) { - this.file = file; - } - - public File getFile() { - return file; - } - - public void addLine(Line line) { - lines.add(line); - } - - public boolean useSourceFile(SourceFile file) throws TagException { - return false; - } - - public TagName getName() { - return new TagName("TODO"); - } - - public Collection getLines() { - return lines; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/bin/UnusedGenericPrivateMethod.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/bin/UnusedGenericPrivateMethod.class deleted file mode 100644 index 04c839d251408eea1c87e77841cdd54b5e4e96bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmah{%T59@6g}nrQV|7}n5c;+=tAPsK-ie*W_$%@Uxo%s#*Qf+5l#k22oQ zpeRV3MSJh*J!j6n?fb{;8-Np3bBJRjjmTpl?xQ!SNYR-_4dEMixUvC>NRlgA-fstO_kt5Tvp7KBV*2o-*A?NzaaPq9lPH|R* zq4L}P)8khM`!lu8dG!{xkZsGp;wI2EiPQgW|EXeI$+i7JyW(8hk?t&>+Oh4ifCQ2Z z)x~Ah>vR~`-Jx&|_7J1{wO)H40b9iOm|PaFf+PT(sciq2N68@2lz*c zFSW3Pj6mM6@B6%$eE)oY0k}dx0LQ+MCL#|99u67&S7F3TT4@-fcq!ImlnK2UO|4OS zal_EQRa)6QhUVaW#=yto8fqylA*VG-b1pK zsl^$61*flJXt-|j8gvLo8K0tSvW#qN_yP7-l>@p15`pBLguCR0eERJXPk8}Fm2S0y(|3O5@beyI*mC_WWeUlDMIyC78qr{1Dggj*w zE0(Sp#n0RhXS7%o4!;O`E$&@fEgPPdn%lPQE6Wqgj+}9MBYZ}=+B+xkdFQPs2A1S+ zxV&*Y6_6=vMsx2yA$h%Z%iFMainUv7V3mbi)~djZymb zhc@p^;X1xaN3a3!4ByzEexvH#eZmk9qm8K-CX-AmGs=X*8@z8@ZM0yuSkegFa=MZD zib*d~p?bW*eb*i!FB|;X4Kyjz6i8v0Yr>b6>uRZrCfT?%TGG_xD5GSLTYlhiblA8? zX8!I7KK6%W*qg$hOvprEh10E^VjQWa=sK1JBcsx^nwc1_Fx_+mug%Ye+Jm(jqdrmt z%}|2O49$~?4$MeGiQ(KQnunGSSE0$VSho12mn}PVSL>rOGb)VnXSU`07p^>a1E({Q zvNZ(iP0&jyH*XdD2cZirO%3xnYm8vbes`ZJgj7Z#2(gx6*|G}|+ z562d5M>-l%p@w0^KjVyr_ihTHS- GR{Ra~F#-7i diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/pom.xml b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/pom.xml deleted file mode 100644 index 2dd1a2361e1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-bytecode - jar - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedGenericPrivateMethod.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedGenericPrivateMethod.java deleted file mode 100644 index 6af140ad51f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedGenericPrivateMethod.java +++ /dev/null @@ -1,9 +0,0 @@ - - -import java.util.List; - -public class UnusedGenericPrivateMethod { - - private void transactionValidation(String transaction, List containers) { - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateConstructor.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateConstructor.java deleted file mode 100644 index 6268bd737af..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateConstructor.java +++ /dev/null @@ -1,14 +0,0 @@ - -public class UnusedPrivateConstructor { - - private String parameter; - - private UnusedPrivateConstructor() { - - } - - private UnusedPrivateConstructor(String parameter) { - this.parameter = parameter; - } - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateMethod.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateMethod.java deleted file mode 100644 index 26e13ac9bda..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedPrivateMethod/src/UnusedPrivateMethod.java +++ /dev/null @@ -1,36 +0,0 @@ - - -import java.io.Serializable; - -public class UnusedPrivateMethod implements Serializable { - - public UnusedPrivateMethod() { - init(); - } - - private void init() { - - } - - private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { - //those methods should not be considered as dead code, see Serializable contract - } - - private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { - //those methods should not be considered as dead code, see Serializable contract - } - - private Object writeReplace() throws java.io.ObjectStreamException{ - //those methods should not be considered as dead code, see Serializable contract - return null; - } - - private Object readResolve() throws java.io.ObjectStreamException{ - //those methods should not be considered as dead code, see Serializable contract - return null; - } - - private int unusedPrivateMethod(java.util.List list, int[] measures) { - return 1; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/Job.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/Job.class deleted file mode 100644 index ca86879f2710ce2e15d6ab68fe144b43bffe9877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmXYrv2MaJ6h*HSCxH|i${%zq3`Cu&I#7wBipoI6?j#0`LM(;Ae|17)-~;%mikq|^ z-o5wuJ^S5$FINDs7=~~W1sDW)67b(lY3g?Y_hqyakRLYJ0#Ra0{dL@@y82dWK{8Bi zrizuSOq2hitheSM;3c0nolNCYuLG{LGh#wjU0ju9a2Oav}Ujw=b0m*GR3@OQ} Jyz949k9UVeFNy#F diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/UnusedProtectedMethod.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/UnusedProtectedMethod.class deleted file mode 100644 index 60add67586b777990e5f372643f345a4f2bfd7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcma)4-EPw`6#m?1ZJL#JbQ>FkvX(*B0ixoTPLlvJX(;??g-K{vZeu!6X*@a3fVYCH zNg(k6JQU)@iC6^@o1)k`$LISwC;s{C+YbPb(DhJ3+ru0>RowPaM!Sm5D()~;wq+#E z4nw)Ob->^}Q-NS;_%af&lIck3w|o>*rs=CO4-dGOX`Ck=b0lMiRsUU-#3Fd3l@Vhj zf|tS^sbD~KDLKPRQgqJH?fJ+2l=l-O!@d;|gTuY8*`$mO@l?W8-P-sEz~D{=j}tA( zO6hQqp*ED0h#Sf?_t_$ z9aXq>EWl-0I&b}n*8H?vK;83 zfkl!@9qiJc3c24=et!n%3w>t>GJMnG+gVMHr)pe9)AGAm!ZIONEbbcRRxdWSR%mMN vVqmKfcpd9`HxEcZ9Ycxz-A88zS<3skL6r{G-=wv536Ac6IT&u)8EpIp5Ph^V diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/UnusedProtectedMethodFromAbstractClass.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/bin/UnusedProtectedMethodFromAbstractClass.class deleted file mode 100644 index 476b7c4f02119f16f2adb171fb9135923a59e9d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 632 zcma)3T}uK%6g{(k?7CT&W}h$h5?avGYl6X?2 diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/pom.xml b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/pom.xml deleted file mode 100644 index 2dd1a2361e1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-bytecode - jar - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/Job.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/Job.java deleted file mode 100644 index 1688225eeac..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/Job.java +++ /dev/null @@ -1,8 +0,0 @@ - -public abstract class Job { - - public abstract void doJob(); - - protected abstract void doBeforeJob(); - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethod.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethod.java deleted file mode 100644 index 156d5012c0c..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethod.java +++ /dev/null @@ -1,40 +0,0 @@ - - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -public class UnusedProtectedMethod extends Job { - - public UnusedProtectedMethod() { - init(); - } - - private void init() { - - } - - protected List unusedProtectedMethod(Locale locale, int[] measures) { - return new ArrayList(); - } - - @Override - public void doJob(){ - - } - - @Override - protected void doBeforeJob(){ - //this method should not be considered as dead code as it implements an protected and expected behavior - } - - protected Object writeReplace() throws java.io.ObjectStreamException{ - //this method should not be considered as dead code, see Serializable contract - return null; - } - - protected Object readResolve() throws java.io.ObjectStreamException{ - //this method should not be considered as dead code, see Serializable contract - return null; - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethodFromAbstractClass.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethodFromAbstractClass.java deleted file mode 100644 index 1648b2ae95f..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/unusedProtectedMethod/src/UnusedProtectedMethodFromAbstractClass.java +++ /dev/null @@ -1,12 +0,0 @@ - - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -public abstract class UnusedProtectedMethodFromAbstractClass extends Job { - - protected List unusedProtectedMethod(Locale locale, int[] measures) { - return new ArrayList(); - } -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/bin/Animal.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/bin/Animal.class deleted file mode 100644 index a70d01538a9984e04ee97f512841f6ce49cfc714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmZXO&uYRz5XQeT|1?@neFJaWg2A(;Py|n*J+ye=#6?%u4aCIv@+9=o2k1i;XA_Zv zdzjhpoB7Sm@89qEJ>}O}E^t1EHO~8MPOB&QprY5W>&ADl)lLmh3jg=}sI)4=y}j+E|3hnz0sU z6Mv*TnUxr!#pl`A0-pnqqt7blOq{)^Gw4*81CD-eI%xC1*EFDmkd=$>4Sr^A;XBa# N2htTJ9%Q#aTmX3ZFHZmf diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/bin/Dog.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/bin/Dog.class deleted file mode 100644 index 28248ffe0d29f2b19967a0cb74ffb8c10ca78cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmZWkyH3ME5S(-TNQ@y6NT}&T3M}dX5&}_KG(qVv=Hwi*&(b;Ozi2?B-~;$5#GDg} zf@W7UJ2Sic{qy++;1Z`Xe2ilBa2(+z!dM`@(nfD?1bWl+rGS4|KP!P@rj2@RtCg}( za#fNUWpysgrL@}N9qDh@x)BJn`?{Djt5MSCYk~1Jdy%g)Eu|^a#l~t=%w77RsVhZ~ zDO}(`i9o!lTbru~?N;`gdf`L~0)z=B2ze$+Zn`zPk|m*S4bJ$G&j$eyyapj_M3k}% z_F(n_@z#y|tZoci2CT_efEas3f_R_RnXlPB_F(o7@6Q}}WXOF{7ckk1b^(;*07F^@ J4r%sq^b0?}J_-N; diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/pom.xml b/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/pom.xml deleted file mode 100644 index 2dd1a2361e1..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - 4.0.0 - org.codehaus.sonar - 0.1-SNAPSHOT - sonar-bytecode - jar - - - src - bin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Animal.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Animal.java deleted file mode 100644 index 624828d4e85..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Animal.java +++ /dev/null @@ -1,7 +0,0 @@ - - -public class Animal { - - protected void run(){}; - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Dog.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Dog.java deleted file mode 100644 index 785452c6a4a..00000000000 --- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/virtualMethodsLinker/src/Dog.java +++ /dev/null @@ -1,9 +0,0 @@ - - -public class Dog extends Animal { - - public void search(String something){ - run(); - }; - -} diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ArrayStack.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ArrayStack.class deleted file mode 100644 index 4ef20e316b012245fe968086995daf6a8feb361d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1919 zcma)6-%}f96g^+E$%Z9Rq)?3s3Mw@uN^EJH+EQ$xw9?7c2P{g*mnHdth0Si<-BhXL zTVM30&;2!yKW2QXZFNSN@kjNk&iD`XzpN|qxp z*Q-m?`_NpnndvXNWx|>S=Y2D&1*?`XkT1F3O2Mp| zF&~)a_0y!t&MBsD#Y?60)^);*If0n0)`E>t$yJusq+Aym$c~lP%xh-BHl3Bi2TNl2vKBH33=*|tVU>V2x26E={;I&??C!FTPij^m`EdX4a=PYA(<>8guoD`4 z(aUwulTN@=H`GkY7L}|>rZhk7Iqu1-dyUN-^KRWM%L|q=`oOkXd%qrJHb6b8SaRj4DOsH@H7j?X!#2h&7;vR#Vt}ic3?}}5A-m>j} z)&dk5+vCY?)dB~%#f9mT<+JP2JrEk)w9fLwmcm7#l~J=&d5+OslfIqHLC58%b<_4S z!uO;Xbd=Z2=)(&<`}v|pa1aK+(^tk9nVH}zc*b&D5I=_{FEJV{1&Yvc5-EO5Hi`(A z=A8n_Fe-p4R;t=~F1>}wPK0T`zcV4ip+;2`f%O=|E5s0Z6~j%eLU^ylY$AG}pb;oB zai)RG9fgeGHC8Dhi-?94DL$-CrthKqcf=OA5dSNe)+(FOAGHAc*%$CJwJo9xS82~D zZ5mTejWG=1^-$v*tkx(Z#%lzlO+v{t%3sooFkR6qXEJx&NHZNM*GRX{+1NDD2`Psg z5G`BMP0B9L>oCb9XeWPj-`ys5cDq6K*Gc~cyZv(C-DWYyo|V04DMigWk;`wQ>!bWO zeq&d@;+Vc}!%ehWN+5?kQ3T$?+fB5eh!rDRQF%w_w5iM;Cn!vl~(I^YbsoF4cz4*dW=3bAp5 zgeo}Lvya)G-TnOf*aMhj=40yP%EvWBPzbv)wYChC_+i6$JXKs5>ErW8cRaG2B4-EEijrGXHnaU!TXu1h9Ii}V=Hgx|5)SToF>f|! zxG`ms@>ia}h%`6bt|*_5)#B8$q7SOsZ85tj*RpkdmENeeT0<#^#E_#8US zD5Eppc;~e*;3N0~j{iwY8Z%{bnDHk6$?5r)^XJP+fBgCK4L~Ngg8TJ=HXIe z?bYPO97Ai&Ft?)0j-sZtsA^;~Mm9$^oz~R6&c~C=)+j@*4T&!MMCYog)j8 z+V}qenoSh+<-`^=%Ul+5!t?Vh$w36M5PNkJxPSjz53o+Eiym*G1ys2b!n}(Sw zIN1|(;uFn;!)l6}tSUM&8E*JB(yhSI=uTkVFpna!>bo0fvA@saQh^8UUfk%8uJZ#! zgOi-3Yxd0vJo|O&1Yvd@&>L4{CDWN<*gA&#h-piWoOqR0$%jKg+6VsfGtgH(TZz?58*o6 zO7T>9dEOnv(~b^{rxRVJcq+X-?~mcRftwajH+U!cBXM_B^3r_rG^NLS9K9vMK`;1w zNpPPP0ZT?_+rEjs`L8gnYuH?@Zd9-xj#pShyni)swg%x#)4!^mG%^iw+k diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$1.class deleted file mode 100644 index a94614c44697fd3f6e1b2367e80820f5bbae5384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcma)3$xg#C5PefxQbNSO?;r#PBqGj59Eya5RN6x;?rw04QEFFC%6Gv95C=Yhk3vk+ zASyV(!LvNS=b7=mf4sf{IL3~P0u~ap=wb=W4ptnjI#?r&o+_>4Gr~ye;F^#>H#d?n zSyfur`rVeaP0sUgxA8VB+tNne5)b?2;QaE(w>JRiXIks(0dE_@U4pzuvlIe)-@xL?|fT>&Ho7 zzxV{VVfr?Z7b@x8%W54bL=O&%9@eqpVAI1Ewh5*G_DY!gS&T>hL*4uuPFg}SHjUUS z-671ChUXff{29~V6)MJr{7nSsUW9#FZxi;1zbDfSKa)wyJXoH$&Fkg;=lJl{oQ-kh zv*(qeaQF;*Os`$GqbXR!ILF?Azz$VX diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$10.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$10.class deleted file mode 100644 index 9619f3b041cd415e048790e6ddc07e5029149e8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 zcma)5-*3`T6#i~O3Z=?qY{uV+$S6!;iY8`86BkVuaeF{X^zG7Jp|iA2DP;Sfe9*+X zsENM&Uzlk0uP~ll8n#6q=)*lfdd_#h^PTql-_KtG)Nofr8aGnVP?E<=8am4IFf>$9 zRk51HO${n)D(Wg4D%Kd1V{R9%K==%~)-E6O`Y5pM`X*&~;QH$fsrJ4T^hIEq42hs` z4T}wia?AC5b?$MqFY2Z{7`V=mtZfT3u%!P;aOWBKs6TPva;)G1!^63oW)U$u4Dk(j zM=)esmLs-CgRbzO^R7*qY|Ayd-Qm6^<0u)IWEsGqZ#s_fH*7u}3d&UHBwt)>5P!AL zhg)JVV2G8CS46@IgIw8|(6qVJt8aIAX>zKLy%GD8PblTdR|#JX+%d5w92!PzyCdHe zPb@ir9_dw+eLAuz=vcs69j9?d$3AO$Mg+rm4NIUW~^mBkBl5-lx!^|SZIr8pNb&PDL zatKzb9zdzA9w7FfQVN#nOi&@%Z!D9qOP@f`;R0DEcN4)h$;x+Hq`4csGU8WC{BTjr|JYmM1L{oQ4#xk`9u}H54M? mCe0U8`vUc4HhGBDw<+FaxIZ(fDYzb16>*-dMhF^Ndj0{Qmi#3E diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$11.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$11.class deleted file mode 100644 index 9d0d8d35eb46390130c422e03dd11cb8ac469980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1343 zcmb7ETTc@~6#k|yUAin6OYstK3l`|MNU7olK}{f-kQ8`8N$_o0#&&VL+ia%<{*w=y zh(t;B-5+G4M&g<6rj*!++J`-tJ@cJ!&Ud!o&%S&GFpH-;29Zm_fTbS!0Suv_9y2=b zVpc;@hlY}dd;PetBZYYl4>UZ~@Q9)RfV){oihv(uv^T{R0bL2CI=RF_l zM#S1?NUZpKf?>Gqcw(bj+ZDk}zUxvZUG{D6Zu7uVagwF9K)>Y**_%3+vjanD(%=S#C)YQFIU zGor3Aml&)bnUzWmBj^2FgQN+DsSCTvFx49-O|~LPuc_R>GISMf^FKGUQ`asnNYt^; z)>|@gyvm}r4U@jlL0ZTm#7I`sl>AHd5rZONwfq{0UgTaEw@f z<{0r0l#1aBJ(E-j_6JwVH1a{UzAP8iIbp#Oavct{;!KcTZ<7-hf124)K+YM|2<#xX%H zMrkg0$cvGm#bnfUo~lFIr%3Ij^%D$yYooU=e%6I{3{zp%G_I3P6Q)5{{WSVhoP+Tf DVCp&$ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$2.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$2.class deleted file mode 100644 index e5a39a4155c9bb9f4a75d64b921d1fa43c147c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 694 zcma)4+fLg+5IyTSb}%kYxfNP2;nLuMgr&YxRVqf6kW%^p3gU6&F3BQi9jzU{3tm71 zi4WkTP-mS)An^bXyEAk4%-NaQeSErm0I-WK4=xs5EE@a8!&fYMu(0f6#l@kM7zvL?09I7-pW6qAu4w&V}}|hIJPk zJ~r{q@ahb~d)r{BK1&YkrYXFUeKPJ_XogCj9_L!B4#RBlvgIL4b9!;ZnCZk+{Vy7W z9UL|yW1>b2H8}L%BuSsZqD3uJG)Z1amfj2H?OU+x;@GF%DZmy!knax(n8GKDXuz1E z-6S8tF665Bu+DaFP%7QPzD4zo!k^F!`P2dH8ebEITpzTkf*1Vv#ES)lSC D9|4-v diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$3.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$3.class deleted file mode 100644 index 86c7cfbd29e183adb5be5838d6d129150517129a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcma)3%T59@6g}nP;5b1=e7}t`fQhqkiE*Kci3#cg!ctSl0yQ%o(iuqnE8VDZ;RpCp z#@hiS(Ss#b>bVVPAXVOq$M}QLO_*bYLOpU>zG4HXUqXo1ygIUKwV77Nb%BP&dAY6Ph6x zhxJ%X)nO=>#^)NM^cnf@3Mcn5wQmi$-xpVHhTZYM841SUF#IZwl%YM-Vrla!Iy5h3 zlN7n+X<5itp1~fIYn$vu0$yW^VrNJoKTR3Ui&?Tpd_>+nm)n0r>ILZsic|R3-z55l ZA!no~HVT+al*NQUk34yskPLac{{*`ln_U0^ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$4.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$4.class deleted file mode 100644 index 6762c9d226e14afee71fde7488d9690068017c03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcma)3%T59@6g@?7V4R3gd_SWGHE}lXFfJr9F+o{C*q5Jx37Mm}bli~<0~ow3rGzPmJcYDfVPD>2A*l-oKwCOS&6f1Z9p8FwJZNJ*QBYx>{9Ad~w)$7N$ zuQ5J@Tho0Lh)ZcZ_l9qsSfU39Sq~f7bg<=N8#@fe|Mto-^ZPNf`iHvyWlk7|Y^-as zk*dwGP#pC&KJktbMy@Mm>jzlClj!RDXP5zfpVU9hgnbz+)(kD_41AYv)VS~i{3zq? zFh-&aUGzRq&*{Cl_x!n zP;5#iE(g7iFfHB*2`M#oz{55-(&j0ci|=H_00!?|DPbBRk0L?HK~tNq&-*;M6Mmq3 zJ*^`0VJL!F+W1s(b;0|)$2Eq@*l-oyYSUxbt2FQVkozH5UH__cPyAZ-H^h*asy~Qr zU%&Va?zJA6K%7b2xtG>DvP2IK3Le(6;b7Cl7Pc8G|Lv7w=4UY)^$&IHYdB#T3bDS9 zjZ|HR`O5fQBa}X4_PfHlibdC|oFNYf;_8-RfBbt=&G<8^q(+0~Xxp@2+JA-)O-TlL2hZ~So@d7M{_*+--~ih$ikP=%!Nnq$94tFnaj?ozI+9AJ#|-)EUW1`z)b4nY5jI!&(QH=)pnR!y48dYhNC z888rC=%V-Do}Sa*)BExH_70$keH&>kM`6XrD%LElTiCF$$uM;$l?=}rlKH|7L#nKA z1w*bXmAD@Cn!+@A(cU9PDC`A^+cA8D@VzMppk&H@?jY!;lGe zJv36a85Z-CzJ@4$MsEB<#n+r1T6f$Zh+2!`aPo6Tipfi2L5WPIXwo!Vntg&6Ii_8f zDwi^i3+dw*u&4OgrZ^RY_n4;I84@VxXh)7QM==tgQI4+5oIE4(isU2J35@j*v3_~T Y8R?0Qc`U@r#hAZ@8Ok;xDav&I1(SfBYXATM diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$8.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$8.class deleted file mode 100644 index 6a864c02cf8175e12f77efc30449a81498ea0160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcma)3%TB^T6g`7rp*FtXZ;dgaiQSq&T&OWIL0M?n4|RYs?F^Z=e1iUtZq&H&1NRvma$@C)xw&Eb%ybZR5ChY7%P_Q4B0b% zCm5!xQio0iKv+-nQh z(?OtBNZ$8_7s(_(6!+x=P&%509xoWw!#y#=NrBR3>Csiko zlDT*98wdT<8^d*C@^b}kI{nKz6*QJlfA{xQ`r_Bee# Wu`!FeR5_pW7cfcQCL~Lq?!N(8Qk_Wv diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$9.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BeanMap$9.class deleted file mode 100644 index f00b6c624fbecda603a09c32478e6214c17066c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BidiMap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BidiMap.class deleted file mode 100644 index 82c968b8846398ba14ad6f869c5b8b34f2e9d764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmah`O-sW-5Pj2+q&Brye}uFilB>|02SKd#Ab8)VL)@~-hV3TcU-RG(@JET$5ER-% z4!du8yqS4#_WS4a3qXvU5LY2)A+8BguF5CRPI>DH@qDqeE=yFY(sxc$o9DLJ3mU_z z*N6AZzkW&Rmz5{n&sRHDtHh`xOV*p6XqTtV;*=r;8T)7cAl#nmake6IoZFh;l&P37 z)kV#2&kuU5#TwzRJ3^}!`{P$zxs)HZkyewIj}KYIP{$(vCeDtti;0ffX5$;f;y54> hdUE>mH^Tv8fFU3lAZ&1iiw4InMwp0_a4B~W(_c1|hc5sC diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BinaryHeap$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BinaryHeap$1.class deleted file mode 100644 index f44f618f75a55f258dcbd3f5938661325bad5199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1745 zcmb7DOKcle6g}4-d+Ny$Cr+9I0a_phe~6s~D4&EtnbZzXgT+JeKW#7O5rQ-@EVJ^X|QK z;p(U70A#UG!vIEONFXakPKvP@#xbF>^{|RZG^jFR9FMBlr9s1}#?E6h^0>5~km5-x zCZ(8C@sx^b6;Bf)mQxlh1j-ZoZKLk*7kCLuayIhH?7$R=+ABXy9V%(!Jih!-qJ zEHtVm;TK>d<76Z$&U zf>!WUIz;on@C@Je2&qk@ax1Hgb?a5`l2%<5!6SKm125mK?V4elqRy*1#>=_?RyONK zv>PKS?nh5`(W>vW9J$i`f$$sGzSAqtDPw7qOjVIwSBsu6#dhlIzyOoaS52v-BDxts%6A$O)** zDwOa?oEu<9We#1sDb@pcu!U9T$`UJ^K85Hz=s64Z&}nQrpO)CnF@1=&azs*Y7K*V_ zCQi1iB;gcq2R|edR;!l(8Tl(C@M%_QVsv){C$B%~9+SL&;D_bn&}D3)Z_r2IB17L{lD@}0 z{eUC%BTDoWmg#4_Nx$N4`VAk@@A#Om;3RF}Ed7CV^d~ORU${tr;}ZRY%k(dPp{uw; k|25k`#4Rr2b)>nD9PdVJ5Fuomqk9PVvDWx3!J2>n1ITcr!2kdN diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BinaryHeap.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BinaryHeap.class deleted file mode 100644 index 13f277f853287dcb2e9aed656b2b94744bf489f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5712 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 S;G6iCykdrb5!$v!zu|xF9y412 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedCollection.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedCollection.class deleted file mode 100644 index bf9d485d18acfacfcff4ed107ee00b052ae4c3b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmZXOO$x#=5QX2^+Gtg9A)Y}ujb~6OxN^~*yO@TWk~Y#G5s&7=19&JgEr<&j!(%?? zy*ID-;|Uyqa+gL}^r&sL;lGA}Kp433 U-0K6M;A03l4Zs{Bj5?0-2c*L|IsgCw diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedFifoBuffer$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedFifoBuffer$1.class deleted file mode 100644 index efb69856c202329e600dd1bc723bff3fee659b57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1970 zcmbVNO-~zV5Prs9ykIr~97B?tkTh`;Y(8u+AEgbY2^3PdE@^QZRHCX~%nNK}??&r2 zB2q7vdhNMVE=^BddPt;_SgBNc?zz9G>CD<-OX&sM(mNmT>@zdZjMsnv`}$7+lUR>p z2xbokF%`u$W<;Bn<2^CwM0;Pf52CEy(lH-J6sCASlw(21M^T(@cy5d5jvR|}EXnb) zj%6JyI_?s>Y-daD6DUs@C|gy3P5Cv?QCsr`2m%c|ttqA$8N2H0A$x823s_O|kF5qgSG9Di5&c8QVZZO8T(2s5Ln zhe|ylXiM&vBJ>q(N3GT>o65UyZI;;+E4U@A{J`>Tv71g!3MYVIv_D36j@* zyPR2di?!13a#>ZB<1g=*)MFWpfmPfy@CCjkTy9mG=fUk*<)Ux-sx5W`;|A6Qy(mxJ zm*XpN2j*#~pUe^ZTlpHy@T^+(=6&T^zUvXPrv+y=tx`!K#q+mF=jhh^n9wVu4zHJ+W|`I;r}h=ad9*4mCm*sX4Y)=kQ1Ym9yU@NyvKw5 zN+X2h*oktHv5GNfMsT)c58w|@}{2gUU^4n=9TIMI^F2V5n zQw*@s8kxF(fvz1u3;)K~4fu$JQg0h%;skOG<4s5p;Q(?j{SrM-(fbFYU%x`{QJQPl zrEKlEe9`MLq@|#_Gc3By=O_7w(8c-s(MJQ^P7K3z4r3H=%RhILe}ex<0`BN`z&Y@j zpoN}E0cW{@z9X?4iNeo=aKm{fp=~v_uvrYx zAH4bJt&4NvOFe5mQ9qA1}y;_Jak*pkYlt%s z7tl`$jLE3^5;J)O3n-b diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedFifoBuffer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BoundedFifoBuffer.class deleted file mode 100644 index 98f77e0681a0db826c9d2268d0648f846cb8a30f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4449 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 K31nRa9g{ad!ZS$# diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferOverflowException.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferOverflowException.class deleted file mode 100644 index 83eba936f1d0c3a0f7a9ccdae28a77125f2f800d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmbVJ%Wl(95IxsP0Jr)Y3{+z$OAgtL|^jjbr3TRpnej6B6@k~N9tW3UZ~`(oL?Qrt_;p) z;_JF<*0Zsn3cMJ`iRZ{m>5i4-#$gyoDZfFW+|1Yct9&$4$@?pnjDq<3^^L18^$)J^ z_U3e*W{Dqp2U>?2sx*}zrL6u95U>}F&EaMSHCIdBE)-buRCXfsl*F68{=yLf>om?2 zSH1D|;kN%FeplbKgBGj~Of2baO@|eM=l^#OfvwpaeaxfG57qQmc*^H(^38b>y^mR) zIoC6`SslV)23Yn4!WQ3Qd}U>z!*~}p#y%%(P7H8|Ri{Mr-!d!Bv{Er06K$|(+5<5` zZAN1i?LEraFDN!jSVh4B+@m;AkgZi@ABfS*+xB3By8Uc{u9tLnL?6cm>5~#ZC2d!v nq`*3T8?3w7sOX(y9ni49!T7>GrQs&qz}q>ajj7Si0(Jin)-$KJ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferUnderflowException.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferUnderflowException.class deleted file mode 100644 index fedc67bdc3a5919411a353011ac5bd02f87ba421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 zcmbVJ%TC)+5IxstwKr0(3@s&Ie zlt6dzS$>gDAS2H?y)EwxG!Oj9&t41EdRu1#^`rQL?8Si}sgpcBSIKGFzdVRt8Jx+) z*SIRyv$3BFyc)!b=g3Rxj+NuaVHig#zd@kf%-8v0J{qayQ*@z{Q4n7pe|6QR{=@m* z-i)zfmiUpkuZ@_YN>l04%ktj@0eeo{4DW73t<_Su0|gd5l^w}ErSN)hYi^5xHH`Db zRquU$xs89h@9T?p(1O*0i3Odl=&&TP_n!w5*esqY&-}nSiHEs6J`PlClK9Zw{x9#l->h{hYUvIhDJMM8< wh;Ekjsc5?rr36;Fw?W*+S|#rkJ1LGU#lnXam20qLz+L$i7Ua%hi0TGs~QUCw| diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/BufferUtils.class deleted file mode 100644 index eefe2b73dce7f300035037432ce94da830112521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 zcmb7GTT|0O6#f=UL(?LNckqH&XhEuisDQU3Xt5~Jg2NN0X@F=hOqx2v_!E5hFZihA zjCOR!M<4uAj%SmSVr-|&bY{gdE=(?RyQkV zp0Y`-S%zg%b=d>R>#bO(UD7wamkP;_g zh`T%6bq$KJhF8iPC2c6yW_rd@%H;!u8sUr#hjU>FT5}!6DsR}1Sr6%*a7ZmKej&hi z4iIg;9+D$)-}jR+bWW>At;xuFyW*(YoX%THk6%V!TNveONT3%-BxDnqN1ueJ+@6t; z<92}$&m=sTu*j!_5|+3fmaxoinjzUj`a{Q2cJi*GzUD;v1bT3o>ZFC&z91>&`e{8c zzM^KzaJz+n(Q88Ke1o3XS<+P7q1(eSE{2i`HL@{5w}0Evx@a-AZbLP7nf(OR;$I3g zv~EF7C1ry=o8$_fGskVO|IfRz2>{=TY=#eFIbwz zX-*e~#-sE!MwXH7NPPqQOp`VoqfsWyKQJOl<2cO{{wAEjNqUMASYHhw9RO6(_KE)V z0ivG6I=+O>i#YVh!g~4QH0J6(Jlc)jv>0Gz|3K0~+u`mV$sJ_(0_5 zh1N!)U2d2kDGd0bVScV)@IPI{Rdj~EKQ_@dgruh{h2cgxu`tfpCO9Lw>fwx11%>lW y@yKDEUrlhX;X3(u;zm%igI)@O?jMM+MZO_Xh4ckoym*;cyngL*8Dq58hVj2{H|_QS diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Closure.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/Closure.class deleted file mode 100644 index 016844a5654c94432b054eb58b9321914385184a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmX^0Z`VEs1_nI_PId-%b_Nbc2KLm7)a25VR7M6-4WF#UvPAuy#JqHU|D>$c37>y7XQ6?k*%m(Xv!4IU>GQgoi-#BIwk3phLC{UBrP~3v}IFl#a1gzMv~KI zO4;{yfLVZ9*=N|7QU?yp2hN#uhL8LU^DoTTnYmArW!dB$%V$pf;k~E#?)}|W_g(p) z|M}u;06X!8h|6(22@T~Wbd*IHsED`+rU(nRh$@yvT!s^TbyCDBoaV!?_;5zVy*SH< z`$XK22l()yfQJ%zSi~kg(v3&)n1ILm{Dgof`TSHjp2joXcoxs`;dueS?#4E}AmT;5 z#86te2vNkW9 zDu4DiqjpKP7W^qui$oY~om^aF0L$_$wG$n7Vd_AEVR@GE)wN=d;W7w#i%qtas zc8-udAJeY>S%$tq2TBb;&b?fvQ}!Q3Kv+8p~CvTc}j)?+vY(rQvBVw(gPp@?^>9ce@Dr@n;u@V81v0IT#9&}3of_V9?<$7f zZ2*?4dY-bx8ub0?XJR5do0}V-otR`84vR8-@Q}|x8kQ;0()!HZMa9nQmM!afO2E+a zrvi=YNLcyJ4cEPEaBCdtpxlObTh{H&0^Vy}v>kP40R*ZR%9{0G&2n~y4bMbNvo#c! zG23Vit_jPNYrcGYS8)da%3Rm<64OVhsg#Xn%GB*a2Crf4cgwO96K~7;TBT2&gj4Nv z3Kj27^a0sGr7em@K#W6^P`#?ou%(GSSnV4i^(K3qjB$t6M``spc&G%_B*Hs=J0euA!#=!}9#W8B$2 zK$HWkQAS!R7l@MXHV<=={iqMX!K$^})L6dJ_UjzU8i_LxVBnkyf_C{shMmD_f> zx40B!{RmNVb+5rL;!oli*zMtrA>vR8=}e@Ccq`CD0U!a_V$=Z=e4sJxX$8upqpJYD z&;-Qw;6E3VYxGO(^?)#YDKY8! zmokR@yS@d8#T_8mxxtKafq2MoAxQ4r9OgX8KoYVVHnc)s9MDa`t(YgvI1qOb&mHQ1 zR@LoCK*LSCwE}U-+kD*)dyv6^ZEV$SzXMn=8%J=|@%ioWnArgNDnWbqvuQSy{s-25 ziA{%ldd}m5Z_;c9o4fEWdS}xs*h2L)+8h0fdUifuI1||wqwSwC>hHEPjK;UdS8x%- z%NXLTiy1L)8x;n6V_St4T*6SpPjeaf=~8~!n|nCM-v00R1DPE)q#Al(kBwBl?m`#4 z8&M`B!4}cO3Iw6xO16XyD`JS1Fv3(EV8^JhJPw6vuvi((Ovfo^I5yuxb}isi+=08v zZR3<>G8U=Akgdo&e(1tk6r2b}aRv%StqYgX*%G-pLRI-F^~obtdPj(c1wpm!Grq){#k$O>r+NV8sAWMx2B z$?AZtk+llxI=`&<%LYMCW6QdR3mVpJUD?tg7}a!nXlJOlGZgKpZHy+v9pU%_K|w?F zs&$*TE?e2u)Ua$_f8{DNA$Zh=u7U1Bm^^>V)2gJP`f5Gzd!37(9v|{jKfkgP%$iFTs5^KF&#9qn1x zm<-25$(R}?7@>XQ2^)CYu|1NwyeDdzL6DW`X-&pMZCswy7KE=z4+Q1OB>ZyiWb41Cnu!1#zrqT$M(P^WipPFq?QL6swj<-m@aJn*F#E~ub&ecL0^cEP$Kq#w=; zSH;8ak+x7Wyui`Z%azn4$uQkVKjKV%s&vX&+1;t7g38lpL%VK|#g}w;E{_S8oT1dq zI%A2RIAvyZ`rGU;g7V>{NG)T8Z;y0ZDlI!h2|Tz_hHUz2G(o+HRl^xlT$dujbftQY z_1Iiv&=WQV10FGw3gY2JPiHdi91I#)D79VnaNv0PGcwy^bnNC(lIe?K{SSbNzM3D2 zcK7s?F*Cf2s{LaaFwQd*Vf9bJ#b;;)k6Aq!r%@%+nY8p(is+`lo5$cR)c6Ilp5y?i z@@(DKgf(x68S;K78U>rrP!g}ny=ktWzWtzdo$$SQ(~zWdEq_SS6m_%+z-mF}qj?Q{+IeI3^ zFqsN!yoz`X=n>CVPdzLv;*?>wD#I^ri1u`8)zq|tgCN^1&;;wL1^TMb>X0q(E=7o2qYql4j#z7028ENPI!16GwmX)wj1`0Vz0Cw2T^wlL=r8rq%$!X5AW2b%!}b~{Ja#lM}it?nx`k~rUrgN#;9Yl2zB z#o$sFsP=HXM-$TP3hi2JxzLc>l52K6tj(kqHktOlHP{u~8BPuAJ#|m)j<)TH$D*X^ z;Ut(o6qp_*`$<;V6YYw%N48r#h4d44#&k%#1M9~iKe@ZRKg-2Ku=IG-vd&Nx8YM%Kc%PG>I^SR3n!w}sD-=+0+!T7~txdzr4gf*>x(6%5(* z4#C|(1aTW~C+qa13qy$=+#qm`Yz*Qn_0)yC&j-Z6`d{DNN09khg@gdw2 zlpVTR%1uj0$pn*!*}*Lhk=o_>PEfAEi+<@0N|$~{gAx-;@rr_xm!_#rTu`o*xL*=} zq2`~G_Mr6W)Pr~;C_8aQ5TD0^ARgDtK^)f0k)T|qknB=OPU87~Vyd>XTLC$Ve^} zcbB!t!ih3nZ1snAWi&>b*-%MSFn)bB(bL@>i!;HO*(I_}oxZLt%H-mg8wABeP6^75 zvez#+1?6T6Cb!VA_#UCh_waqegfxFG*sEgJ*42Z?#C1EuWo_;TsjRCfk+f7${jJnC zV>o{rn9+jxsciPktwH&K+!n+yq}4CC2l0}8&@XocZCl2eX@T?DA5w$#W>tbb24~Slo{&o4(sVfs!g=)Z|9O!8S@O;>4mOU zLbG{_m^bfsj*1AjV~)UNk552y4!tO)Jlwivtf@cIO^ zu;8Mh;`K~=s^NTHeacB4i-zDkcvIxf8%l(RIq&o#Svy2$mX*TdJyG)loX&`XMW-*2 z8}t1dsQIT)VBIMl-+Nf=9v*qPV-jClg!#6^;7bd(KD;Z|qQK9Y5N+0Y?c}#}_$mC% zs5}h$B5w?I@v84PfQ#V63PgDqv?n2kZhp(gm5AE}WC~2q2D*>I*mM|XbLA2ETB>-d z^BqIRCeqEU%P7vMItssmjl~&9ktL|hEY3WNY{5Rv)4KqN{N|jjVt>sM2(K_mO`t>0N_siNPpxen0PgTx;d;JKs^#mGJ-7jxqB+jY96>vU1q>DpbVTjM(2O(_UDViH84LLp>K<~K7S3j{4SP8g1; z<{iWE5Jqh5?R(v$Y9T!t_!52i5R=GZOu-RM!%<6>N)jzVk;Twd@~+qwj@a2KbHvWZ z&A7$R8hDDaqw_aZ9>qwWfLYi5n8vRZs=3+`YIGIvDAZAmGO(}jHQ%GXm|_c_o>Mt+ zj`=7l+qq#Xr3Su%d_2dOy3b=ezKI$552n3uV;R1KHFyE*@O@X8LX5L?F;M5;QA*tE zWPlC$fRzEVbyMr;@&e;q5!!MLqnQE6G!0Oq!IrP3iU1cHIF2Izuk#iAPGUq=&Ept* z6vZYs_M*6|<`{}L75ffhoNwD76EVX8LN);2E07A3=usXm8(-d;<;AhYS{-fN*On21>=m z+2X@&$-o@(W4>frqAw!bvoXRFT>)O;I@bcnxj5g71g&y2tw=C2k}7J_^-+ntTqRc1 zA+)58@9%K=mDHznAN;;v_&k1-N!=lnEHMi0g)Z~)u4muvl7G{|sMSmU6RLh1G`hif z9@bh{>k$VgsBddM91corL4PQ%x+gP{FS9U0W}{HfMTyKorOZXO%qNU>SSAb5Bnxqg z)ZsUJ*~s50T#OdkjMZ`pLb3%> zxfEB*Wk^cM!bT%z4r5E5$i&4cb?!h%)Sf{9?X)6>iHlKmCp!j%&h`=9Ya>Fpvk{q5 zc>*<6Cs0AXy=kr3lM&8Rq%vv_^!EKy(osG^I}eG`HM%iYuEa!%QERDpuCnCR z+&ht-*?pABWIRvA{ghapdya<)JG7z5!`(7hpXA6b-d0Lopnv~=t6y{zEa~}n{A2sp-X2?f90!?z0+)P)X znJy@wVr8}kdY0Y%|+AM@TLWxjvNa71q%EaWA*?>v)`T~k2B>RWUM}ch4LjVl|%H= z!&oIxy1rO~2~^@?3OJhS@M=6l?3N;r4MoJV_G(wL)od_&Eu=q-&pC?S%{i*rOa|Qv zR8zHb8*8`nk5z4~BCEdG_nH-0FL?sXcE%I@anVW6`#Q$SH>mw{Oft_iu)gIw;|NPo z4I15L{EOp)DYOmtMX6BvS3K&7x7%@qDhgLl;ie35gmedB3+H>(lcjBc{2>wj5nbTN zG}2Ef*v~!YPgQd;Qd2Qe<(mKV_<|$G77DFm7h3I+)r}lRZF6N6i`fiMFO;XV)EcuX+IU#Vm6No&!NJz23TXVZHzi!m6lX1I|Qrs zb|#&vx9^8(f3nPC7|1eAj5T~HGcxFknV4;4VJ?56ru#O{Wo7gm%@JDj%dH%tn$C0O zo#)7_V_&pP>&nIiKb{w6ZzM5cnsR1%pgB2!Id zrW2VNe-|=5uXp6V)bW|3L44+%ji*4fh|ny?7{e~Wnl8b{ITa;EPUz+_Ri~WhAe(MG zJ8g7Wjc_+W>X@@nWzs^OS0dk7<-vah`}P~i46OHde#q*_gd2bBDBxm;$w+!;zU`G3 zmjkD$5`xcYMS;=o;WE-yWu(IeY{gRk#FrTkmwk@^*Lt#%bq+9*ESZI@HkoO)&gb#^ zpLj&D-M)v4?!*Y=DjIkfn~L2`#aE-oxW+Z^ShBZE<0Ptk)CvGF2c^KMb;Yc8#e5RS z95I(uOf6#tRVU#$dl9H)Gr|x|w;NWAXxwJ;vs=UhH^mg-%jBnJ_bc4$*zj(4D2^i` zOW{#U(#pGbXup~c?U9{UtL4h#Ge@h{ z5PbHN&%@;N2>E<^2tLo?S%=S89X>I-ix!p=v%c!7MWy5SE2Gj`HW#agyg5*z#}F`B z_l(Cd&UoBnq&owGXmbcwYN$gR{JQwjG< zM=&?tKH0W;-lI#d+q&g)JD4Q7=SW76viM@nCMvoq)ztg~YyZ4`7{}T_ueq8=ny)=t zj^1(qcEG4-M_a@JcCJ{e%6ahE?Be=K`vO7;;~o_ zejJOP-Mu}WM&<^V0~o*JS=`GA8m~~HUt@ytI#c8um}b0*TH`l3$9Nm(8t-7C@jEOr z-bIV?d#pG9fGx%!(P8`6p633$7hspyf2i%2=$_qK0G9fW8oQe6*XR8pYaGSTR?+SNcj6O*`2fus;;d$}~n+ zhA~GY+Z=IQl1%dkiZ! zjchuM=BF!3yyZZ%4y2G-NqH&{Vbvk5=ADI4^V1M1l2RGZy_S8da}VK$xrjUV#Wczi zOf{FH%3OxI=5o}V4OniTkCo;H*kE3WZDu1n%!|-zu0W63gk5Gct~FcexT|oxxdwNd zYw4)#=&0-Qq`85Px)CSMi}6i!6TW9|#t+O(@MCieeraBY*UW8r(+o+r*($kan-rPb zWxUxT6U-g1Q&+i8J=b;HPSiWwkSCongYK?l&$6kWfJr=&`nEbMcj#I;_>Xrdtu&R* zjQAbfq2xNclLo;v=0e+N3TTpf)`7ypUOdV%T2IFq{XA9U*aIA6j>+ek=9s5AbQ6c@ zEt5Eu_LhRZBCdzL(Ti=IM3d{Jw8@=Gv^LGmNej4(_nPwv){y?$!yB|jyZ?K+G5wfp z(#v_=2J<=?=JkxbJs4%)fbr&ym}c(f*5xMDnK#p{x1iCy6>H27V7+-8wwSkLtNB4h z%sUV@@5EK+hj6ud7xtKU)4cc4ydP#xx(^SU`|vUIetg_~08g9t?ob=!MmFub$v0>` zy`wR>QFV=hXB=Y~jPe&8V|*7cI>s1JV`y&qoDI9Cal*bM|sH`(94> zFxJVd`6^xXH6r#VOT$|zFn@zW^KFbXe@l0L2W95(aF+S5#os;~ABF#BL~GPe!4KKT zsJfG_eupoI`O4r&R_Pk2KY4Pb+r}9>zfccF>;vQG>J!MSX0PGh{aQ_;`3K~fe?-3d zCyX}#V)3=N7KLu1EX4mw=C`|MfVv4T_RlZ_W z`_g;DDb)OD_&I4*legwR^_=OhrG9~5I#`^JbXz>q>3x$ilyuW6T`i@XN$F-$x^pSr z97;Ej(#?0V8&0~H+?OhKlwPsR)PtW((+z~>%DxthqP;c9bi3J1p4;m?#B843JMU2O zx9PMFLFW~R&aZj$Z*MVb`Kd@|&{&rZ6z5utj2&4SjyTzTVKCU@tpgX^+nj-mUw2Ol z`f0Fj;A%VNo{B{3Z1N4hudp@fM<+Cp&S!@};w}7!>$CB;yEpGgr*$BmBSX+h?T&xz tz8*i+HdgVCzA&X?hUPEAx5=Sp!Gj;kbd{{XcH>TYvxn diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ComparatorUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ComparatorUtils.class deleted file mode 100644 index 620b02b33d648c475f7e818fef81bdad9f1abeba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmbtXU2_vv7=BJZ*k+po4NxebRZ-HkG*CaG1q=ZM32ki)nxeoaUE0NDw{EtGUg@a6 zz+1-)9EV%K3o@d2IQ#+~z3^H`e}ej)-EDS5lZhESojqqy-}AiBdESq+een0U_W+Eb zreYgTC$JS~6uhW%JgcCfB97Av&UIlzg@Q@>KGltvFfAW53WgQTs#uTnDlXt<1+S>+ zMNz?=icPrKjVNAK@ft2ExUArcKx!g4dwx1sxSXFnHt%}!1W^cAjY*R|}jV^p$v ztGcAwnq%2x0_(;N({PRoMAL&81Y&t>UKiL5Cnr2}3}fX~3aCTU)>g#NC4ljJK08 zU>TM(FJ+;eBaK?DDnHip)Q$O2w`ZJf{km?~8l`>+epRp5@M=Jpu`XFwMc2%5@cPqp zEx9Eeds#na*fob*&dFR^u2c%vo8kQ_xpvxESPU<2acs@3UA63LBmKEXb?WrnX+B$r zvs)jvJ8)_X40nRbqN^IFz=Y4QqL~ZX$FaB2fuwBykO|3mobIOCF#Rs3MT-0HB_LhPluPR87K!rC=$EH^96b zX@eTl#{e=$cxps!fT~wyv?-Y9mC$J zI9ATKwYLP)tNk^czJq?V46k(-!{clF&E^H&X|kM?ZK#cO0Q#bZGY_l2X>vRO!-k9BY`KRy_bpElO`>j$e}`x>nwcrahGuRfCU<#Wy0QSQ#(MZCCzb%p4Wotb+#F_76gdLKP^p%hbHD@c4l z#D#C5z8?{{{`qYvaJZXafZ)em7cSAkW%S_+k65CsOW2Qjm&gEJs66f+)2X&+EBl?>zCZ)0Ns;%Wb3XmcFT z;8}O`b9FW{hH`T%VAEU7L|2dskUTm!Y5581d>TSb)#)5+gBWXq_!SYqCgMs{#KRc# z4>&d`v;^?lApk!_#7Rs)aYx)zPKhw!C{5RrP*HOlU!1KrvieNa-nUr;hD^P@%D)P*? zD4n19FU~)1;rw^H`h(8@B;;QmJMY5DdZXCm5(Jdn==%~8*($=Neu!_UxE8?+{{qgR BX_x>2 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$Cursor.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$Cursor.class deleted file mode 100644 index 413734e233c2a7a0143bd82bc618e5dc0eae2204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2972 zcmbtWZEqA+6n<`dyW5>kw@anfwulH7+AVaE7ZJ-#VdZ6^1*A}DD=gF5+ji)5W}Tg_ z#hCaKjmAV{qA`JwCPMsVOxh)pM7|n7_>+w1%+AiP(hp`y(|gZ-d(QKmd(NHx^Y7n& z2QZ2S4ZS#?Ko3rEb5g@NPQ`IrLmRRh&AiRiXEf}`S#HkphVyLYxVgZq7rB|>W->vm zm*Tjrp_`A7<4PRw#Bnu_YXY(Ss$p9N0WnJhf5|Eh?iV;b;d+Z1qiC2*Dr34UE3Q+b z-nNzLTWn{`Udi>0d0S0b&ax^@SS5cHN#`D3P$4E zET^E>C{j6r&Z4JQEw^0CRp(lVhG{n8s5QSfV-zT=Jwp?Bja4IK8_r_p^88(j-x%u> zE=zc3NuX8PejL{Y+Bu|EttXn|T{}T*$e1}E*AHB%MYV1PGu9N}gL2XxG0 zPRG04+`?@gc^uMlhZ}=e=dnkJ$xQ(V1cn1IW#6(hS=TYko~Imt(k)mEmib>lifO&o zL@9+yM=9IPVZNoDue>mcs%CGUcWvG9UE0&Mi)wNnY=WUc(o>7Xl8Q5UNCZwcmyls` z22VwvE`weSu1taPq2cGP8p+j6RIMPrYpE~rS94Tr0AtU`>)A)+xrN3{%D)msjjc<8 z>drj9n*LSgmpzB;Sj#uOZCmnctw>LqDp2BQ-LgYrYRfMvgEpqh&cE*#uhK`T7XmM$ zg+6aoveb5S{nFevvH^|$si~D=oKR z2eti(0rCc7avB}-8dCBmdgKiH!hC_!3f-%tk1Z^{q z5qnDes^~G=0eLGx(%D9Ph$N8y-{*}@&yQel=>JE^K=65z7EiB}+I6&7kf?UrNCh2} zZ11f=4|}bG&a~J-GCi}7E_r7IU2LV;O4XyYllVd^NV$LkxrkkI38T`&L3tO)OYFodF-R#A%dc{4;gTLBo5+G$oCH#b5w0XY+BZ_g}6Q>DnwBbuSe)(vjS}- zoFxTJxV~MhZ`Y&kiH7Zos?;P+wFf%unnuw64x^&d60v$@g(v z-ot|Y0L${jhAglneRiOV9t#|fRQ(dFnq!*G{vrB8v!;%8)YT_&n_d_)31#&-D$3HTI8Asqd#C^C^E<0_EyqlA| z!%p^sofb>$=FIhJs7un6cii?0xvZVm(3rHRCwbXUA92%zZXxSw(Bc}5WY(Vc;@Px4 zt)a>rbMospYuL6B_w-sb@{*og;K|g zOI;XpbA#@L%V%T6E#y-6kRw&vI$zms5*AFhT--ztHkeq8E)(m~6+za7i>Qfi5ivwH z>|RV=o0t^S{di8??X8W&ka<>v>VVxs90eE`!3~FX!Xg5(S%5r!e zL+yNRzJ)cuPM}h!&FRRQuePeEeHQfzUuokk>Nd`4wDb6VLaD$O%Kc~n^e<7Pe~Nnj zGc46VM~D6e*6Lqjz5X@&^lvbre~ZKVcS!2rV^seEQx5GWNaC(|(tOtwRhPw1&mf}G46Wxq+6`jsLJed46-xgNwfgUj?GMKGC!+ctY}fz7 zL1yH*(tP|aywgF%yU<6BL>A)b_{E+O^(j9JAS$S}0F7}CD??mdm_{b7?i#UNr`van zPz(uIu?AGccW3%eqD3eD|42>Cebg9b)EIYB!;@ttYWT#z=75^B^H8H|iN{2(s>4#X z1RbgYQPqg;s)^JrB{j|eLCszagwz}gscDWC6IxmEF0n8vB^H{b2UIJ)w$bZK)Tsx` z*k~@Y!4K?zp`7%Flp96LnTGi(UrlFg%AAxa-;cr2iAV5Kvu!^38K|CFEI)M}=8;=y zWlgr-exI5Ob?lWD)Rn$zV?#rA(Rw$-=s|;uqEW@rsy6uEq#qjjE8tNakknIut{>Vk zRTF6pOE_G;(4v zNZodZumh&riDuQun%j*tY7cDHk8!mZo*KX!$Izt?VzY{4mpbIbkO@Io#XR z9pQR8y;lhsj`cT%?GBdFDwfgQXsVZjQ%6v*5@=D!%HmueI;g;~uYCj$a&4mFYW{Rw KN7>1B8}K&)aEns_ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$Listable.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList$Listable.class deleted file mode 100644 index 477342196dbdf28e5f90245f835a648d13485462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1522 zcmbtTU279T6g{)E`E+e++QwF`#?3oqYbapGZoBM=9Iq`MN zv4X0=qr!OY#;hKqR%{UQn!7{3WJsRc=(d~6+lrjZ*4>tAH%!msb$?S2_AIhZk9^f5 z?J|^ptxz0~ADKx&T_Q70P(x$|621yHLbtDvX(S70v^&xDpr{dbUM>tb9?3-yRJ$XP z-gLWOOWm;eZq1FlENd*pKn5!Yk~m?&;Nc`D5-1C-k8}M5CI?+2@4_w1t!yefIoo;= zou(|X<}3fv4taW2agbq<&{zY#J&k3AGby1tL0<-wly!=thxA{kd9m~yq9mR{<3aME zmsWUL=H)6apHP~HER72U4fz_nJU~jm#Dsi>DftGo@-61&J1ofen4-K=1dZvC05!o3 zMS|NQN0Amrr-_!ND2LfTsS3@U6)Qc3d`v;qmX$$%2%(KA;Rt$WWU)3_{ApzI9L^9N z+wpg2eX#iR$l|j&*DtOTPnHyCmyflD=F1<1_!DXQD@4sl`9};5@FCHwr`waKh;?2h RM2)UOn&x!)?=n(I{sDW;NHG8a diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/CursorableLinkedList.class deleted file mode 100644 index 432357fd56d585331f06e31c9d673dec26bad5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12211 zcmb_i3w&Hvng5@ACz)h2P1Ce#o2F?~=p&g)n$ia?Ns~U(S7@4+78?4%GEFA!z;q@g z6R3!a(8X00Wmi-RXen)@Yj*{Klv<^rQhb3Ae4{Rk;;wH+SzVFr|2yZ*o!c}l{DMEq zopaCQJOA(fopbZ$S3dnHfVt}O5EkLtLTtqkgZNPhE`BU8|0$2>g7`@YK{NbQ8GAm& z?w`ry=Rv#>#4kc9#)KsDLg@UR`7KB4;j4BSPv8p79PZp?g1*(*A)%XH6K@dM1 zRAnJ7Qxj$7Bza7h<>m62QlKgb0xt&D)DYIHN_k9^o}Wu=I)SPxdCZWMEvgQ`v;zooyoFWsvUZcU})y)DUDUthdWp`b0%mubz!Iij1f z-O0E@NngA-5le23_x2^ysmoedDX5DT#$KK3VFNw z64!H`YL)ihc&tmIxh>thr#{vb>)ac!?@aI8$F=-TCgYtM678!uh-AaIMC$5zmmrxb z59w-DDBQI#-PMxrPi2U0SEt5L#3gN4#jcIj_h%BxdYR3c`AZY2M5bB6t*+Us5NJtv z5zJVUjkovj+a2${)UZ|BmhL21G4jSOY-b>|H$k$CMgy07yRj}ZTUKpQC1a^Q^&59z zMIIY#wo@Q!h0=3}6ed=;p4+X#_w{#nl82t&IO*mkQeE-=G|G4~zArA4$mf15l1YVf zyQLOHizipJEh$X&$;mgY;3P<9f^SsRAIqeB$<353tdXb|aO*XR-aal5ve_1sR$gZ^ z9uw>7Os6ujM2ezx<4Fz#dh~cvwqJwJH)^DHRM(6~;4_WU5b3h&);CB&B`D4KHT|)q zVBQla<}x9w&C9PyGRINN`2+$VVTPi?Rrv)UG#l~zl?2}lQLXpL{|eifVIL^stX7Ln*%y{{+pX1-U8r4=Ns7R9zKM6E=hc8los znO3nVp&w3K*B9N3>iw(4vwSNnJi&N==NrxMjqgieO9{BWBE>@UsudpW+)I}bQ&t37 zWJatg-D_jCh$;w}7!=H;SM>JAD44S9njJosShu9f z#?1Km5l5@5N9Z1zkcv_6ne>)SZz8paK9!ZAhH82xLhSCRv?u$Jn4y*Z-Q96RfVOaQmGeFOZrp8@sCTSsDngTEE6}=7%3<3 z?oG$KIvGi_oVR3M{M@0ceSa%Jn@9_FZkCm?!iZ?-K+?jDTGn$RPt#UkK%L~pCDabd))-p}(U~yNgRj`h4S18PT-SXRFQjkckHLNZs3bkIK zd{rJ_5fp){<|gu2kppv1BnsnJ(cfOx7REcMPPIWE?Lus$JT~EUP+byMo27e;x-^WZ zR9jG87FJuOr$Z$A3~p0c@Vas5T#eaNLt{YLqE9c0>rJ9Ge!=e6jh_0l8rGRwABNh~ znKj}8zA3klE_!Ff;y*sa%Gri-7R>6rM<>h$uI>hJ-3?TW451BTSEF7wOw4pf3u!v6pwb7zPX24WKwPt-Am5O^|qQVO2w~Z&gAjClk?7kWp+4AV;-!t6g2|=VTx)P zrPQ?8f)tz4fwVShOFc`s+5IWvP_DF~Xp*)P^GXS?$EzSpvU75U!<4MU8@m2NfmYHL z?~e5+GadfoqCl4#t#XhKu;3$(^0R69a=gMgOJXxGG|U#XGnOG;B!C&bJX!>YcQYNx z!xZeq6;OB+@4X!C!U4(fY#)#Wt$&%L^)C}Lf9G;83jsc_;#)WJ*#fE~C!iwk!*C*} z;BHe&oj~AWa1W!i8+BSNOB}> z=wcsId{dJD?VjrpAPt}-5_t%Dg9xeUAc{Hy$Ju9ShxGU=UbU^(v?iMQmKImy8uXHy zQ0=o+e@Uu&q_Dq&RGmWzM`{NV?ifI#;w}{F&LdcO3S+jNLNU1+Tk!}=1~IO*l#gtC zJlnE-5EBMbb^;SmM+PzJPF~FopdeB)h{^4$?wEcJ))9F_AW|Nv<3>dtImygMA#q%e z0&F7(+c6G1P)RMdQ%Ae_UkX>^I_gBEw2+v0VKOq*mCKPr^s^NZK0I#s<66!ZE$!#J zUdlpA^Z+jy`RaL!u@qLc=C1Lqi6Z?mwTBP=nHo!l}DOC($I zQH138APPl6mB&YvDi@J~hP?7T%fdvFv%DGj4S|877kv2V5;a)l6@t3P-89a7P=$}u zMGnzb?nM(0V=eBZ!yKVPj%t3IiElP8w4z^xIac&dn6CK|W7_F)yVFy`PR+M)`}Pq` zT9G;0^t6#p`T-imr(VOPZybTDA^K{L@>x=S^fjomDzci{!(VZ~=``)>Z8Q~aBjeei zY&-Z@lKY~d`g_Tn_G%i zud?FVpxRaKQCwJOIXjA|iXKCeqD{;=iqhyAltiUHi1TRDf#bE?+9}ly14CbNb8%v# z_W0+x<4>r_=dlFOVI^MBs3P3201ddA{^TIUu>;!2h{03pDld-wljl!q&K7@~G0cfd zBU$G;|KQMX+~Yp$Gcf*0A9|6Y=}&a_KhuW(qG1@Xnc;0Y!+K57ib?F~7QEAnX(2(2 zqlZpm=C+7?0<-Stn+b|KP^&Uc)dbg&r79Hu*-~gG1<|gdP%#398lTd#6gVI6(m_Va zA;{8tiIl_(Zj45bi4LNVWA;HEUmnA3MtX)AtIl@S5KwhTadCOTQ)n~grA@0^F;vbt zh7x5YcodTdFkbqy5)EB7yX@gEdtYN0o;)otcM_e5aYbOM z<;HsS1v!tNT{695uXbo=Om_ewb-uUy zZcjzxIijK)1VW(8ucuHptay5wc9bE-L=&y2A)}`dV@6I--ZD>5TsB-!zLn?d>5J6S zSLqK=p;|pn{d^7c)i-F6Phq)w1}*Aa*rmQr{d@;W^*yBde!Y6u)6)b`Pm?@7t@rfQ z?$gr^o}O;7dJ6jV#0#U>CE@2slrS%d?CK2dL_*jSUm-lpUkJ0>Eu~P0RlcV%cUy!B zq&}xn6O(>L$^4q%*ng|{HIZ+L$H@{e@*VOL$s^ofqQxfbe>PUE%*Beu;+~~8ScIf9 zoX31~24%S-AlvH&kJG-yplfdRG84hynU`Kcts25yGTr1TtaKc#;#j+rrxBaVV2uqX zA=U%g%3zbn#U`&ZIOL^*Zp%ffP6Znznzd`BbvX%@3ZG6H@|}q&aweg~ne6QemdfTd zBrQ|Z=kuIof?5$h{9ab~F12>pt45C7J(s&IM=ns*X_56+micazlyL2JHqTZ@*ICC)3sYZoUgPBeQ3!Eq}a%$1&)S=m_ z_mEFSgvIj_VyR#fl_V(@(sGZR<+i9%EUmNIF2&hmb@uEr?F{4$CZ#du)|Tz1o}>4B zIWSx5=v3e=M#x!$GUp;xISn|^S*r1fy_NB=8II`_An98aELvY}?~u2*WW(&v%=X@z@u8mP4za6C-~JxwWm9RFrxK_Agcv@J8oE;+g`;31aYzpy+o+>HBZ z#uTRW-;$m;xGVfGWW{;-%OjBaeE>%>Zl_V7{@0Bfpdj3kOlPBRmXO%kB zIB(ONm`s!B>Ge4N-7db5WCcKzEdDJ2a)L58HkHj3GkvLfa&)R>a;khwE}j1-eJf@=@4-C&HafR?+)Ao7{FL#um`$)v7F+>qlK;Rb2`|K&L@H=Wu*Y$~ z1^jIbxHI~wKt7DgJQrR#h{f{u2$npCi}-I;Y-oZ<5Q+*ZwZ+Glj)l&>DCB5W3kgyawi_pELNe#W09X(EQ_DB_P*U-tF%Q+ z8<Hj! z%|hn{6?PJ<_}=cE!e!29G-nd!C-HvDMAvdEDjVgud&=94hww1@kSh`1f9aFzjkGX{ zZu6NfOQwo&??XYw)FUX8lz9Tprz;L(j2<{dD`xOo#xyzg1eWJ;n)vkvjB}nqxpRiz z`y{>hOB$Cs5YG3cJ73FGTw*>R(FPQd4`vq4_lZU;?Hl-oGA9BGkRcU!c! zjyH8YeMOHV94+SoYQ+HWzUURYEr;xItu$Bqx>vF?8bpiV<1eJY!ucNk;QLGqKcLY( zOV~d|)cFw;>5sA4`3a5ar%a~LW3}@$iuwgy>iohpB0}_7>cA;R0AZ;EpJ7YVKnK6D zNph>QDhW_M{N!ZW{3=IeR&qF-U2-F7T$}|$u{7yHOd%`e(vWpsvHb9VM)Q?sV#qg9 zdSznBObp3nu8r__RqldgK9ew<-;?)0koP|_;J(N}`)8)nmsmjj1?!x@VvF-P>~LO2 zxAO|Fc7`YGCNa+WRg4awumd%?U^Jgb*hT=?TPP4wqWnZU|ww2u$@7|wok61 zvn9^~n=1nN96oRLe#lB^IUyIG#2VkFWu>_scnoXX8N$~+i9&W%$<@?zGWitNZi}8k z>q%Vfz<2qoZ!+EUG2WetN_Q4!y0Z~+t5N4hu*{8mp`nuY{slZi4njEJp8IiDNpl8I z5@i5i^w2&*>4`J0KNoGo*=Qfb%!WXD;7R(P0gZ{}0or8=Sy`X$${!f|e9j2<6{b6% zz!wnsLda;DBZkX!Ka}ZUiIdMvw}SQgoLo1Lyg-``EMjEmte8Gne3QL6A96kyayBb4$GBN4PSz9qXiw}?X$T|49FL0 zYc(`)t%qh0w0G5A_gZ==q#g#rd&I8~$GwBNcM|s%#Qi3Ue;37nB{9da(A`bUUG$W= zPwbVR*e6)A1I?bWn{6xz@rvKvDh1?g_CJgRo_NpUAW07Pk%JUDNRxvea&Qef=p_ez zdiuuyF(q-bxPMMh@Oi4sIj|?;r;^k%ODb!2xn`3pse_ z8_kbN3NuA=C9aV4eeo*uA&BU2`x&FC>v_eV7#qLHtQHWF!Z~e!RRX8eK)Tr zZ)FI54<@+p#boz3RJre?!M`8X?(G_+$@Mj!QPkjTyhG>bWtPxqbYlDl0Z4)TO@eub z_vr@OCmCWTX|xd97V}kZ*mtz+@)OOeoq4 zDw=AgwXLAVVnI-_6)RRq1QoR6{cf#_+OK`khx*Vyv=8k=ZU5_>Gn47boQ4k`vS#1T zZ|}AC+H0?!*S|V>3czIiF^D{9>h#h{fz+L4B#yddUGtAN^6+jlt{MKnVn|1-Kq;GIyw^Z6n|qeE1Zr> zxuGkWN+ivenAH@GZ?Ymy{A{)c)!do10(e_Pk+ev^2BR?^w~`GpGnKMZ8s?r4`_c@K zljzNz30dTzInj7DJy*l5>hnR)ZfvYs#U(c+B3$HP>R~PJ>S(c&E1hMRHzmSmY?Yae zO5JT#>Gmjfn0oFLuIOsX7$;`iR<$M*9U8Po4F%~0)d|NeGpV7lT9#7~rDnsMHkw<^ zx~_CIR@a!el4d%Qq~b+Ux2$1gbxr;;Diytn>JUbLAevgx(V4!{u3yi3I#HiYnying zu36^*VrIOpZb{2V?kuOMuFlh(f2d|^7?x)=*BMU4(`GbILyf5JKT8c)qEYek{$1SE zq}7qwLJdls!op}$_Ih|m-~U~1&>7TZ+WufhBK5JDh6;C5+kOpMubpjA9H#MdOqbJ5 zE0MtEQ@YazSajgU&P+DHB%_~Q8(rO)pC{Al(Rjq#N@ly6YIi)1Br%TtZDGoya#v&s zxyrfwo7=<3$_V^65q~fQ%ZQ*}}ZAlygjEr+F@O4C)@9VmUQ7%XVY8 zR7NMWl4%*^9NM?fD-`ramvcYYeQ_`6Yx~&dZduKR0lCjDR%;^3^PropJpKILV#d1U zgj+H0dzpIxvIeNXKm$k&DrM9UZ(5j0HY7R{JP^SJTft%Xqu?G^d% zfyrV84xDfCG6awBds@I3*1UqlQy8`y^Jf@jAqxYfXIBDP_Nf!lG1fje=Rflp=aKNj&B?$JvIiwSFhZI%^q}+*0@`7ey0spZk$)IN zL-tq|;b=BgR_%8PntaL+`8&AEA(z`jtL%a5Fhcg?4r9Cw6G)W};dmLx8Ot~+mmjLC zj2y=h`{QF6dK~3XQqcl5QpPccmg#}gkD*xaMVWpQ!&EQEsi#q`PGFKciRtQD%u>%` zo;rnP>NMi&d2CiMV7qz|x2rSQsb0b^^)mLVSMaEM6_2Uca8$j4r_`G`qu#>%>K&X_ z@8Way9=^pnLyn>GZ8Wh)lVcG#NV7|ev4ks=wxui;vUM4jJ6ptH!ZeV56GA;0#=qfB zwI?t_!yXJ{VWfuD{28U;@PEGSQ*bN-RPaM6^%08I$0%24QK3G;#p+XxSD)Dn8tGu& z1r=j7R$wJ3(9M?8?v z3Hc%~gaOzGQsIUCg^(}vLKwh(AfvtN{FRWu`9RjYka<*GHY8}2W^y#SOZ<41Ue*3d-oJc!EeP8@UQ2$wDlhNf&k2jpl^ZLM8kGgsR z&rxAsqw$9Hfn4l`1PCe03*imxr`b4_jYjrj2{_43A%cZm-#V?QP~e!R=PyvxYDd;lJE zB$u~{p|6l9tHeH8V=-u;;9#a&BWqmA?K2NPx=$Rsah5h087 zLYQ#7kY)XxZgSr}S|(1WFDGUNg8E7u_5U0%vk^??{R~&4dz6$(!Q@p$z z$Xh=Ej}MHzJliWg+b5VMz7tD;rcC@q2G!I{Wdh|J8+$T2R7*4i0XGDt>1;4^}De{-)U<< z&Cw-z8fU0cH?fAB=hOUP6nJp%)ny&h;3p6K1y9#D}$Fe&C{{;r1XDw87L0i~{0nBM2KGSwf<0RpZ)^X$)~Cjh!}A%c3uYfy)T zGN+X3Rwfxi3O%)Gz-bL%y7|Ji%WKzr4HX9Jo#~jDJ~iHx@`L`?U+rs z8itNmM0GS`kB%nn)zOT7I$E$_!=R2K4C^?KPJ!6=hOkN5s0!vfaK|_Zlm@ws;4(l^VBF7jtHoZ*ATk9RlkWn0iW2>XKv;fvie$v72U$( z%9XGR>`k%l{|}bmL#==cE3D9c=+}*DG78dT66*Qqx30x9Oa7 z)9L0eZUecB+PUEkp`}#uj?UfO=G;Z+?iY9U|2@yx`}@vGa$4fUeERe|-}x@T>-&4Z z@8pgDo<0L$Ha_rU8NTVqa_k+!-acs_lxDw79FXRqG>5!6?8gWk3E&|d4d7us62PPA zmF8Qr;4zu_wlv@I;+P+0cwB~`2w*&(4B#nQKVHNLYyFMi_1PZa`}MLU`^ zW;&Wlr4@qB$)uTHk%;#6m^}){wytQm!l;%TqBlotvzd6Jc1^Tk!m+(b3AFT&35fD)9a!;5*#UONyVax4bgO5-t9pn z(;26X*)6GbM{Tq_8tXJ`W2vsLRI-Q9M8b?^;?iGf?u=#=8Ja=EX-Qf2FylnETbu2U zwzn&U>;;KvvZMCu9XC+WqMA*#Hl_Pwj`q$uuTWlOSF>#M#8TO0M!}n0k?M|1kV>d# zd4jR1aGJ6rZ?o3s;UbgPD2gz|AF6N|?pRIHu}<2mSH~5`I+o=UMZZ0dx%Z7@=xkJP*C{>YC!7QcG9rX5waq)zRLuFJ9}u zw`!kEr^?ON=DW$*+ zP_ga|-OM3w4w$<$>1Zs|67Qk-vLWJSOyCqxwwt>ZE^_3+p7OD}ZJ&IZRBI+3Pj(QN zIVrkstWnBw@5t^{81L}Wnz}5zbEkIHAB{;?rq$KeDa^SbMu(QWK*+V58%MP6NfN4= zcuc|Hn#!hQ=H+qCEkicUmdfUem1cL^j72kMdl2^`8ALO#3SuQz1#vm92;xdjDF z@p;_s#qY$L-v`knq3FRMg2;+p8Egt-4{nj>Rxkb-#GmlzApU}+7k>@nef*6!J7Px4 z?uaIqr#rGj2&-6&-NN8pw64>vB0*PmWqUGJJItzNDmg2eO(d$K$@VH!=s_&_J4;22 z)5nf3U<<$H1tm^wky|$h@elk{nt$=FQ9A!-XD0uz58^(2QDNps2@cDlpvyWsSc%om za>SGtY}0k;?#{Bd78W@+9JP=;e$F3aK@|iRP6JkJVK|p3G8%bxEsL7gB=uuxHQH(% zC&Frz?DwJP(@=Lb2bJ7t?$Mo*1^rg|SAE2qbr4F0;eNQn>LlD@_emJic%Ig~ zTG*Du!?qCy=I~NmkCD8+j=>_V;b_p>Pf1tv&7kaSY}rxDc5$qti0p8r4O3E!kwi1fO$2miq5dOB+Ez(W{-f+a|gZCH(x**n8-)F%fcH^z+-G@C@K$PZl&1l+ujsD0e55&BQ{R#hkpP8H`-*OQOSkI z#LC0)8oe;w$J_-ACc#U2o8ZT0#%>F(xE?jw$|!C_6QbI(Fm;xr8g0yyTeRnGTxQ!S zW7lz3GPaS@tPJkwyJV-{y(BV#pu*Z&11MG4iz#9DMk@4SRD)5u55ADG*EViR@40s? zhufE+q%P(+$q$?qang-hJTU8!*7nV#mPr^z54Py&)aUK1r#D+^jf-oyan?l{HP}wS z+#KcEYFm1>eiuCC<0`Qnz(oogbpX%%}Iuv-YUTZw~DXd^7JRoJQ(V)^VZrCI@7 zK&NK_qg^QYXCdG&2Lb|l>jQZNwC7{Goa#kbX?PH28zcP~(}%Ic#og}^SDF`BY6nBf z<-m6QWjZeSUTsKeBkFXve(uOwCgvpqJoy5Dr*-;GM7LAM9DCU3|G`#m}&nA;KwKgtR@7I_il_rc>n7I^{V*UTJ11vA=*ix0_|mE#G+ zy`GZudZz8K<-OiQbQ*DwSH z=s9NcjP_bkyOI#PQF}d?{wFjpX?x!5Ej9u|tS#|h>WjBCJ9+hd3V-;-k3KjeZ=vcn zt;YhU&z7m=VrTE4XYco0ahRyi!{wU}3I4nUUR7-gih`D zN8*do8NVs42&l<4LpW!bdx_9vKR&jW#Xen=TB9M=tdF0oq{ri@(G#xlkk=YYA{8FZ zYzk$S*>J9nHsQLV5KBf_)#P_x7l!6rrp zs*VwyLon2nS?6N1n#bkyQKuRRf&~P?LabMp;yTrcm|BdTY6()R30bvFJA5r&speHi zXwkz1Y%Xpl4G=&)!gjGI2luXgoOk63GHb`#Ppa5W(r}ZGcIeCqT=>~#!=+IEx^BaY zKSB;ETGg!Wun443{`_XMB@|9JN+8@KuJc5+I&$YM+E3t<6r$w&*cO%~U&!62+`UBC z+bPUkJL@cb4DBpuX!VUxZDnY;A)vNnl!{`kifKJ^Q<0lg4t(Wy4Y@FuL6Q4OfPZbc zok3CZd2H)mz^Cw7sl|jm5l&(D@Mt6)(a6D2fuGH`kXl=ahe8}@goWX(W3$J$&%mAe z&C4{mlSyqBtyMfijG>bJTmy9*F?_p2T8>Q(`PIQT<$C%jw}gr0fglq@YTt*_LDX$5 zo70c_=fe?Rr-$8X)ZG+(59#V&RI2;50*h-W=EFJBzS|nO3!f|EwR?ET9&p&1^V%gp z4cMEXp_RgV%Lg%+)jF>wU#)Uf>sp<`4oh{dl$fu<2pI=4I>N%6??T(1#<|{eAM~Dk zJ5o?QomV`l{qU&+C{qV9K^-FX9>#2S1Py#HR!6Z^J**8A%B>-p-a}}RpmDLTHMbaK z`|QJ|1kM*|ZW(HI4ar@Ozxx#N-ZPxH9xvj(lHU&O&F|aZ#|F_r?-#U0$`cBJZf#gWefDZ5xcW}ERP z+)pPfc)^y-wu?;mWqgHC`LHY0Nk7!En33iRUv3_JRe!mCjhjG3Kfu<7uj3o~eFa-T Ml}y4iTn69&06gY5!vFvP diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DefaultMapEntry.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DefaultMapEntry.class deleted file mode 100644 index 68bcd25f058dff1c121e39d9148edaed168a1c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2001 zcmb7ETW=dh6#mBc?%K{a4$g%p+*(r7#CGFCxg<>!pt-cAc0nzQR3wll&L-Zl*){8R zQD2Kd@CT6Ki6`=s2P%pyKtk{oi64bHXLhhRsS)DAbIy#v`OZ1tIkSKM^~-Mn=5Z^J zQ7jC>#9|IbTxM^Hy(<=0@?;ko@Fsgp?7d~-?L3CCki}KDtGujbvCekG!Zi!mE!+@D zf9%{BDAxAmJz4dnzgvBGYtLy!O9I9{>2(|d^NQ=c(F$Q_=Qag0tHCy%7HY2V-0JLa zIpOv-^<=y45Yy?|IM+_(dR2m-i}9S9;qX;~@qq||^ZIJC%qI(H zCUe(`Zn7|AvvW@(=>N9uOLEC{pa zv_hvLBWK&jX-wL92{SgvF=1nly{9o@;T?fdHAcrC7oH~{~X)jwX$KMvHB-^HiOO8dd z6jJmUT)(D&h2tze*-@nEJ&)0vVo~YEr&v<5dCmr76nMjrt z`2D1IX8jd;>XLqX5?x`5CBdJ@SH*gG(+bK~fZe zMo)*Sl8xnfg!B&tN`d7t)#2@dQk=)EzPzHPFiU01uU~gw)%PI`e3Yoy?4@Mtlmt({ z=1L}FoJ?eAU?L@y_2t_XkgK*!k6_d}8>7ZSYxe11F?9Da y?Bb~|hGY6daU}MMxX{H@{jS8+-zBK0HFX-VDH&eJ8)Shq^y5ctVi_-(xxWF&$#G5q diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$1$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$1$1.class deleted file mode 100644 index 7b94935a17132a27079a8e5b5753f4b49a13aeb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 zcmbVL&2G~`5dOw>;x@RXKntZ5D8)d2P@M=0haxUPK%_L4DC&JK+NdUp`XPMN!ROGqL36BO!ABN&sL}M97YBEt-&NNMBWD?82P}5N=_jD|^jCaLx z(A^;{?0?A2Sehha{AWp)nCFD2jdNi2n+F89r(#K{50Xp{r<0M?Zv{IgTpp-Mqz6JL zR-RqDHX*`xd2dDR&Pj(reNG})ucR5u6GK>TGzUlGy$Dm09fo_OBTk?5tnI6*j^xY4 z2D5Uu6kFE9$6W+I7IDvqhYLRLqse70T~*tm7U6YS!?Qv4jnu*@O<4W^uWnf{U9N?Q zBAMqwr^EGocb;B1%XW-AuwB~GPBBtTJmBVyG*g|)c*x`Bq0NJ4Il_~&fdtl$qX|pa zjqtdnMd1k>yuejnZQcMoRCaAy0v!GpagpUZb3M%Q3)EZfZ=m(Ba9ZsznEO;HF7a7q zMc@}M@p-i{t~1~jme>f(Sm8UD|6H2^hD@zRrS%!^M`j%SgZW*+_@@dp7ze9`)^*gF YZZg^J{> z{w07jcrA@lJZ)eMvpUWih~pU@bNi4$MK$MjJZoSc&l#A&1p^oHyc$+jb4fJ|Ixg#2 z6i5b}PCGX#P_BFaM#`hs+y;jR}+qBK5v;#-=FL|A{rd;vYr7zc)tnG?GdiA;+ zY|6l~>FB)UI>Efa%tT~Q`G$a2_12}pXx(w;a;LQ>{i_z^2^^?F{gPP-7=>`(}nGS{7EjQCrUt2CFT(D4F$ z%iW^PMovoYqraptTi!JmQENNz(!?k7HKMSa(qgI{vG9gv+p5$ix~WhJ)v zB4e%$9j*aMm0Dy4=6VNYSNu~7&q`!Gp&N$ZOFLBg*kC@qCRkqicE@V+64?zstwL`_ z4qb_Q=t8Xd29ER7F~+Y5?<#e;Xb*A(==^7p<@gYLGl=mA7=@dN6^frhe8N!-53@~j z4e&1xvo*VY1LJsvBY{WpSl@#dzWW04*9+QBXdiRMu!p;QdN@XeA%+k6T}yD!h2mF8 ze1JrJr+5d6rBk<&6j&~N3c;=}a0e;v7SeOtxb`(N<68U{jMF!;?|tanN6_Ls{kTVn z9k|C_zeO6~VFceZ;~)5y{IQE=CXCn1hLQ0&P7uuqrtk!wB>F6hILWy<_Z-GkC_rUd z>|?&&!@L*;^U-0x#A5i-?%{sV)hMdJVf diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$2$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$2$1.class deleted file mode 100644 index cde0c21584110aacf73cebee5a3cd05b3b1ca2ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmbVMU2oGc6g^HuLrYi(Y%s=vu?6S{G;O!R!w@e;K%~-24DH=b&6+7qD#u0RUx5T- z;(;H)k3w9hMW9JMc!}bhYu}IKbFcmL*Y_U)nrM|#!mTnKY?M&MZ9Uv6<1RKG+;gza zP*me6^V$yXGl0Pjl0?XE%(F~n3_HD49{GIA!?EzgbTUbkjAR^(P(}LxMLHYCVjxFC ziqRWB^*Z|urGt-&8VePL6#rS2MCv)i)9N{51+_y4yPJ*#L!}obqCcAqg?z^;DZ|xX z8uIv%%Sh{sNn3A-Vb469*Cy=NNsEC6w24vrN~pd#Q4A~9TJM;D;C{@LBY!YFrtOn$ z`5>LiP`r#ZnANjXG_{9|2YBdW2~`&t;ku}y;oy;r$7mA0#_Z}!`3$d39nXRbl#pDd zl40%tOKsCE9pZ$Cp~y0Cw?#a@KTpkTrj?^g>=`H8&s%Gm8eP2=Y9gR1{&&3l{ z6rT1YD7&Vl&GY@?t)qDx7;k5uJ@~gxyXj=gr9K&i$~Q!XO}Z%@xBc2_nKZzn zZwVFBm+7yI0=+<`-Z%x@_y()q_=>{k-0%vGMKT22rXaxe+_{2lSRsv^u$s@=xPi4r zz#Xz750vU(U>8nt;S(tq{)Y1MP#O;zEkaqinOm*n63H#tv@(B+3+d3TXIpgfZK00! E-=(!~iU0rr diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$2.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$2.class deleted file mode 100644 index 929a4aea63aebd3cc86f61a0c5b0b7ca99003ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1620 zcmbVL-%ry}6#nkk(XLbw6#NAWIB^?F*%+VqbEkele3f%=7?>w(kD&Tr5mUZsc}E0gcuvEm zt}9;K4Jm+dQy#G_TZJZdf{~(ZoB-rtf-f-x5!4DZ$jB z_RF#@0|qV_7)OR^A98py#Y{nluB+HEa2+=cJix4hhuAbQhq8g&61FfjEEU^R?{Pf{ zeQt%jg6Q2i4}VoDgE?ds45RI+l#GU;9<%cmTF0*;u7r*xhKTSxI&iUDz0@Al+L@K zNWRW1r%*nVM?b>+nFu6xj8G&i(Y5?nuoI*{4aDdB;SE zVkoFllzA-&cNxIo21z1hC+1luGKO|Hm4`l`@NgvjFddK6BqJHeB2AGja$l<%pmOc2lO*`p$!lgbLgvvKWg$=qX9J)j3lw*C!Pt^O4YpL4@YG#1DZ?0|v*S99kwu3(uoa>7bJXX6@H z=KtQ!u8y04Hrmm!lsqkQY}j6g}6TWNc@WQj-JO*6Blzx<`f8)w-cjL)Hu(hkM&Q`qwjH{9A0HapZ2<&U-S<^k^XyJX@nmIG z^1=!O$+(dU?I;KZv&B;5j(yjzbR*ZR)Z=r$F*@!&x|1%J>NIcyKeAn)j5Edld(ZZ7 zS2lOPXrQZ-+NHWD`qNG?cgqTOgdud-~`i&=ZUb!98cN2W?Za7&UPHt=@eF%D2ZDmSCYvr zjamSvHnm5#+*Z&H9d*^!MV~pWwzE2s7LMU53wcyn=n>^wSSc)P)2k-lweSK?TDXRJ z3w69_;e9krT(|H%=1go@*u)1GZs4ZHCL`DK$XtTCp@`OZI#Fml(XdE@i%*i*0nGLS&Bg#g7B69;NB!~us>L^H(l2PJ z-(gl`$jnFa!Q789jr%atLyjqJAwDv)i{ldZxaRvP1FnUbE5q~^@CsQ3r*JwB;Ct>3 zvX;`-#fQiWHqJamPVfVs)wJA92=4UDWQlGsZ(^Ij782_Cg4?^q0^%KJ9cZ8bD}QRP#HPeK)!`3-yKn# v43@CW7g}E$OJj`bKn@EdDXlS_>q)CG(iB!`l%hOOaL#iz$ytANb@=%oVkE;f diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$4$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$4$1.class deleted file mode 100644 index bb059b89ad86fa256ef51d3a86fd3d56649e1923..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmbVMTW`}a6#krM4b8$jV1qFRjIBT~(6p=rp&?$1fJmj4*tB;yHEX6csT>!Le+3eV z35opxeiY(3jRcy+Ll!GOKK8kM=VJf*{o@Qk6D=Dh+_GU|ql6-E>*^UlSv#UM8i<{D$wg!@oX51fgA}b zM(_Bv(%EAu?SG2YSg61!`!9khP%jytRWD%6s~s|!-FPGz%Do^G{n=zFiJYOwT6QSc<5jWRR@>gIH;jv;gN&KXi|D}XIEFsWq6xc@jN(B3CUF~ z8P@)P)XwXr!?4JGUnJB~&s&tp4;LwVEpO?l6uY?{?WMi7Or5UY3pJCG81>UWGw0-K zUKACrM^HL>vo`l5)zqu%(2!k1L=3e80l#KKQ90$fj(%eaOW;z$Xr>7I!j zSj!CVkPK;{RR0RIaEgV`#2EN%>MS*-@sLnv%D~N3Y8{J2w_wuA{3~YEqTPyV(95@l HI@bRHsTFVu diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$4.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$4.class deleted file mode 100644 index 3519bcc0275fead58973da6feb8048552b7c156e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1621 zcmbVM-%ry}6#nkk(ydex6#NB>IB^?F84M5s6N52XobZ6b=-XX)WhGrp+K!0-jE}zf zpoxN!#3vt&i7_VXpJP0?t7DnGj4iw8-rIA&bI$jj?(3hAp8!l^DGeQY9le;)a6?BD zH+8x;U{7sW@bE_sy%d6KtHz4ac!U}D! z6?-V(-AWMp+zQtP@jHJU{z_5@v&$+-xqtKVKMcm0h z0QqJNNO{Pfq!XaguMel_+)ukA67&W1{5}%-iT7Y{>6D-tpoe^*{={k88*)#GXKKI{~tVB=c-+}ExecciNxh+1`s$du+ar|=J zLt4g9?4hR<;7bHB6g8TT0f00v;c}FEv;|copCqLplTaU^Eys|l$MMDROK8d~D9OVd zCuM~C4Jq|I`qdv%uF)n+E7w?@D@7B21!I(j$+?ajn2V}t5s*HVK$kVEzo4nVk02q1 rYZxaFDWn-=sIt&b1==-KaXr$oISmP9BeruGB0E4}I$8OVG|=ZSU?^t$ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$5$1.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$5$1.class deleted file mode 100644 index 702dd6e7357f36cd2af6f2c69c1b71f3c3f37f27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 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 t{ei6f6Bp%QxFY}FrEh+Zz7gt+;atnh+b7%kn diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$Node.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/DoubleOrderedMap$Node.class deleted file mode 100644 index 18391ab3f048f8c91817b4d447162e45a49d5e7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5154 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 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/EnumerationUtils.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/EnumerationUtils.class deleted file mode 100644 index a66e3ba222c0671eadeec9ac24fb938d6304d2a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmah{+e*Vg5IviwjZLGims+hC@Ih@w8l>P$i!Y)e1bt8oK5k=Zx8x$Z_+9#>DEI+> zlsFq(jEXc5J3BLH&zYIb`^U>0fEG4&6tJYBszbrDjv7`ptZJw;6uQC}@exC=(d;p( z$HA?`P_~5coF`u239oqHrO1L6*xc>$P)L6qRO6wD7!Ir;9GLu$+e62+1J4Wmh^*^6 zb}Z!m#7{gYKV{5!_b{lxrk-mLHMJGvvE*ztZ7&`Foz8Wa|+k*Iv6Tx=PvgL z=0$%*(_*OqI}Z9g`%@Gqg{5sW>}0tnxxaJ87V@+o@>9U%T<9#4*Cxxz=J%e!9@Df= zr(7an8!C2DqMPvrB0Ec7k%mzo6C5I!=8RV;H$;+qhWbDlg*ZTxlDwVaFi^of#c179 G)Z!<_=eS+~ diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties$PropertiesReader.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties$PropertiesReader.class deleted file mode 100644 index a8c0df7d490c1c29a1323125b1939396a91b50b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1249 zcmbtUOH&g;5dJy|Nm!Tn)A&L`$;%`tz5o%3Sf&g}iG`2bW-}yfCA)EVgIMYh;pCAk zUV?>H9zF1*)SgWM1um9*=;@j6`MUe-p56bs_Z>hASp^*!4Pi`y4_6haxTatnQ7K|l z#1$lvl-hOal9D1FLMDU>LU6_~4R@B%7tO!XHng;1rJo6{DD3Ij8X=Iiih|IUH%zfy zuNH*;Tq{)gq&IKrT4hbM4Y_X}2HdjY5V}`vt0rvM5Ka?{pyo_d*x8EaID$PM<}JIF z)@qtw7HQq8RxQ)vwNeqfYe;=@(-me>6pxU`j?`9uoV@L2$`Oy}&Jm@pb>}^yKN@TL zR5Y`cUUhB5EKM^)p}xK@Y{Kvf>w;%tpFo9+mlb>b{C!_p+|)(Q%Q=J_1ZCB#+q!sU zNREb1R*{kzDmu|c7(9;Gj3}))RZJoh!YviI5m9jmcU9cOR0z{5W^iA{EFP$s!@PY5t^YI1(OUWO2oNSBWP_}>V(GFw#AhVm|3P2{pWTAs<=%Ke5 zBpc)8AVn^wsE#?>K$hMiN1Irt4_Kv-Sffu~H6zVDTh)ZIf^#^}wRGSKF5n_Zxx`Td Xd@{oNWiRd(4DhP(naaPbeuRGm&`UC8 diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties$PropertiesTokenizer.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties$PropertiesTokenizer.class deleted file mode 100644 index 4469da7e30e5d21d64124325be16a388e0d87977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcmb_cTTc^F5dNkuZCMtIrGSWNRg~VOfZ`2AprUC~j1hv-w{3eUtIKY)yEVk0p-;qD zBVI7bOEH@G1Nc$uoTZk8;)96~J9B2voH^foGiUdIe)|Dn6nDe8q#%M3DH0(h6$Fq{ z(1nEbq!navS>eE}6k~FCT#5;4UJ2o92$O{Ny9ORlY( zl_^4J&N3ZWGu;)qQRbM!76FS zie~H5Za4$(n(h#K9@x^_RjXsCm;AcFxcoM{v;nf@N2-T2(8piEPPQ zUuR^j4MUV%U9J~4Tw#_)`7qh=;j)>RiwZhkd0gF^<}6ya@HY7he$wQA zM6$I`LYpgLa;9Q!byZ?L*%CGH?eJ~Nl2x-y;+`&9=x+r%DrqNBMnw;o5JgjsRdysPuvS*KR~)BCu@R^r9Jp|y{JBxiuBVfgy=Q;+3q`t<9vf`@d=#v@{$~yMz$<#;=Q)i9{k(9 z@bNJqD4q1iOQRkHG}4e9C-z7vJ7{AtK>j-dPxjDONYxSC#3bhmEoQzVyosT7#-FL9 zJy5PgsiWgDgO+LwYMT9W5#0Kz$iKxz*~gr9U`=a7`?|JeL$K%VuC*L z-)I|C^cgd>gE`vufW{e23@M!BDkVet2IMg2a2^*Jv=77H4Ht2WwZfh*{_zbU{2Ksr BJiY(` diff --git a/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties.class b/plugins/sonar-squid-java-plugin/test-resources/commons-collections-3.2.1/bin/org/apache/commons/collections/ExtendedProperties.class deleted file mode 100644 index 7ccd00808627569e1344663d794bf3286b261a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19188 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 z
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 diff --git a/plugins/sonar-squid-java-plugin/src/test/resources/struts-core-1.3.9.jar b/plugins/sonar-squid-java-plugin/src/test/resources/struts-core-1.3.9.jar deleted file mode 100644 index 7555f3adcf524944cf2b4fa33575104d22d83678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329088 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

_c8`&BR`$NqA^Y(ep+Bcy|#T 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