diff --git a/Kieker.WebGUI/.pmd b/Kieker.WebGUI/.pmd index 8305b0f7e8abc632746c5f9ef4f8578f9128fb42..7b9043677dd900577bb4b0367b6bd7965422946a 100644 --- a/Kieker.WebGUI/.pmd +++ b/Kieker.WebGUI/.pmd @@ -4,440 +4,416 @@ <ruleSetFile>.ruleset</ruleSetFile> <rules> <rule> - <name>AvoidDecimalLiteralsInBigDecimalConstructor</name> - <ruleset>Basic Rules</ruleset> - </rule> - <rule> - <name>AvoidMultipleUnaryOperators</name> - <ruleset>Basic Rules</ruleset> + <name>AbstractClassWithoutAbstractMethod</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidThreadGroup</name> - <ruleset>Basic Rules</ruleset> + <name>AbstractClassWithoutAnyMethod</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidUsingHardCodedIP</name> - <ruleset>Basic Rules</ruleset> + <name>AbstractNaming</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>AvoidUsingOctalValues</name> - <ruleset>Basic Rules</ruleset> + <name>AccessorClassGeneration</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>BigIntegerInstantiation</name> - <ruleset>Basic Rules</ruleset> + <name>AddEmptyString</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>BooleanInstantiation</name> - <ruleset>Basic Rules</ruleset> + <name>AppendCharacterWithChar</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>BrokenNullCheck</name> - <ruleset>Basic Rules</ruleset> + <name>AssignmentToNonFinalStatic</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>CheckResultSet</name> - <ruleset>Basic Rules</ruleset> + <name>AtLeastOneConstructor</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>ClassCastExceptionWithToArray</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidAccessibilityAlteration</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>CollapsibleIfStatements</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidArrayLoops</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>DoubleCheckedLocking</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidAssertAsIdentifier</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>EmptyCatchBlock</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidCallingFinalize</name> + <ruleset>Finalizer Rules</ruleset> </rule> <rule> - <name>EmptyFinallyBlock</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidCatchingThrowable</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>EmptyIfStmt</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidConstantsInterface</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>EmptyInitializer</name> + <name>AvoidDecimalLiteralsInBigDecimalConstructor</name> <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>EmptyStatementNotInLoop</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidDeeplyNestedIfStmts</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>EmptyStaticInitializer</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidDollarSigns</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>EmptySwitchStatements</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidEnumAsIdentifier</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>EmptySynchronizedBlock</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidFieldNameMatchingMethodName</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>EmptyTryBlock</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidFieldNameMatchingTypeName</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>EmptyWhileStmt</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidInstanceofChecksInCatchClause</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>ForLoopShouldBeWhileLoop</name> + <name>AvoidMultipleUnaryOperators</name> <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>JumbledIncrementer</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidProtectedFieldInFinalClass</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>MisplacedNullCheck</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidReassigningParameters</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>OverrideBothEqualsAndHashcode</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidRethrowingException</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>ReturnFromFinallyBlock</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidStringBufferField</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>UnconditionalIfStatement</name> + <name>AvoidThreadGroup</name> <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>UnnecessaryConversionTemporary</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidThrowingNewInstanceOfSameException</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>UnnecessaryReturn</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidThrowingRawExceptionTypes</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>UnusedNullCheckInEquals</name> + <name>AvoidUsingHardCodedIP</name> <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>UselessOperationOnImmutable</name> - <ruleset>Basic Rules</ruleset> + <name>AvoidUsingNativeCode</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>UselessOverridingMethod</name> + <name>AvoidUsingOctalValues</name> <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>ForLoopsMustUseBraces</name> - <ruleset>Braces Rules</ruleset> - </rule> - <rule> - <name>IfElseStmtsMustUseBraces</name> - <ruleset>Braces Rules</ruleset> - </rule> - <rule> - <name>IfStmtsMustUseBraces</name> - <ruleset>Braces Rules</ruleset> - </rule> - <rule> - <name>WhileLoopsMustUseBraces</name> - <ruleset>Braces Rules</ruleset> - </rule> - <rule> - <name>CloneThrowsCloneNotSupportedException</name> - <ruleset>Clone Implementation Rules</ruleset> - </rule> - <rule> - <name>ProperCloneImplementation</name> - <ruleset>Clone Implementation Rules</ruleset> - </rule> - <rule> - <name>AssignmentInOperand</name> + <name>AvoidUsingShortType</name> <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>AtLeastOneConstructor</name> - <ruleset>Controversial Rules</ruleset> + <name>BadComparison</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidAccessibilityAlteration</name> - <ruleset>Controversial Rules</ruleset> + <name>BigIntegerInstantiation</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>AvoidUsingNativeCode</name> - <ruleset>Controversial Rules</ruleset> + <name>BooleanGetMethodName</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>AvoidUsingShortType</name> - <ruleset>Controversial Rules</ruleset> + <name>BooleanInstantiation</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> <name>BooleanInversion</name> <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>DefaultPackage</name> - <ruleset>Controversial Rules</ruleset> + <name>BrokenNullCheck</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>DoNotCallGarbageCollectionExplicitly</name> - <ruleset>Controversial Rules</ruleset> + <name>ByteInstantiation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>DontImportSun</name> - <ruleset>Controversial Rules</ruleset> + <name>CheckResultSet</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>NullAssignment</name> - <ruleset>Controversial Rules</ruleset> + <name>ClassCastExceptionWithToArray</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>SuspiciousOctalEscape</name> - <ruleset>Controversial Rules</ruleset> + <name>ClassNamingConventions</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>UnnecessaryParentheses</name> - <ruleset>Controversial Rules</ruleset> + <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AbstractClassWithoutAbstractMethod</name> - <ruleset>Design Rules</ruleset> + <name>CloneMethodMustImplementCloneable</name> + <ruleset>Type Resolution Rules</ruleset> </rule> <rule> - <name>AbstractClassWithoutAnyMethod</name> - <ruleset>Design Rules</ruleset> + <name>CloneThrowsCloneNotSupportedException</name> + <ruleset>Clone Implementation Rules</ruleset> </rule> <rule> - <name>AccessorClassGeneration</name> + <name>CloseResource</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AssignmentToNonFinalStatic</name> - <ruleset>Design Rules</ruleset> + <name>CollapsibleIfStatements</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>AvoidConstantsInterface</name> + <name>CompareObjectsWithEquals</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidDeeplyNestedIfStmts</name> - <ruleset>Design Rules</ruleset> + <name>ConsecutiveLiteralAppends</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>AvoidInstanceofChecksInCatchClause</name> + <name>ConstructorCallsOverridableMethod</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidProtectedFieldInFinalClass</name> + <name>DefaultLabelNotLastInSwitchStmt</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidReassigningParameters</name> - <ruleset>Design Rules</ruleset> + <name>DefaultPackage</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>BadComparison</name> - <ruleset>Design Rules</ruleset> + <name>DoNotCallGarbageCollectionExplicitly</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name> - <ruleset>Design Rules</ruleset> + <name>DoNotCallSystemExit</name> + <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>CloseResource</name> - <ruleset>Design Rules</ruleset> + <name>DoNotExtendJavaLangError</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>CompareObjectsWithEquals</name> - <ruleset>Design Rules</ruleset> + <name>DoNotThrowExceptionInFinally</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>ConstructorCallsOverridableMethod</name> - <ruleset>Design Rules</ruleset> + <name>DoNotUseThreads</name> + <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>DefaultLabelNotLastInSwitchStmt</name> - <ruleset>Design Rules</ruleset> + <name>DontImportJavaLang</name> + <ruleset>Import Statement Rules</ruleset> </rule> <rule> - <name>EmptyMethodInAbstractClassShouldBeAbstract</name> - <ruleset>Design Rules</ruleset> + <name>DontImportSun</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>EqualsNull</name> - <ruleset>Design Rules</ruleset> + <name>DoubleCheckedLocking</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>FinalFieldCouldBeStatic</name> - <ruleset>Design Rules</ruleset> + <name>DuplicateImports</name> + <ruleset>Import Statement Rules</ruleset> </rule> <rule> - <name>IdempotentOperations</name> - <ruleset>Design Rules</ruleset> + <name>EmptyCatchBlock</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>ImmutableField</name> - <ruleset>Design Rules</ruleset> + <name>EmptyFinalizer</name> + <ruleset>Finalizer Rules</ruleset> </rule> <rule> - <name>InstantiationToGetClass</name> - <ruleset>Design Rules</ruleset> + <name>EmptyFinallyBlock</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>MissingBreakInSwitch</name> - <ruleset>Design Rules</ruleset> + <name>EmptyIfStmt</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>MissingStaticMethodInNonInstantiatableClass</name> - <ruleset>Design Rules</ruleset> + <name>EmptyInitializer</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>NonCaseLabelInSwitchStatement</name> + <name>EmptyMethodInAbstractClassShouldBeAbstract</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>NonStaticInitializer</name> - <ruleset>Design Rules</ruleset> + <name>EmptyStatementNotInLoop</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>NonThreadSafeSingleton</name> - <ruleset>Design Rules</ruleset> + <name>EmptyStaticInitializer</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>OptimizableToArrayCall</name> - <ruleset>Design Rules</ruleset> + <name>EmptySwitchStatements</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>PositionLiteralsFirstInComparisons</name> - <ruleset>Design Rules</ruleset> + <name>EmptySynchronizedBlock</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>PreserveStackTrace</name> - <ruleset>Design Rules</ruleset> + <name>EmptyTryBlock</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>ReturnEmptyArrayRatherThanNull</name> - <ruleset>Design Rules</ruleset> + <name>EmptyWhileStmt</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>SimpleDateFormatNeedsLocale</name> + <name>EqualsNull</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>SimplifyBooleanExpressions</name> - <ruleset>Design Rules</ruleset> + <name>ExceptionAsFlowControl</name> + <ruleset>Strict Exception Rules</ruleset> </rule> <rule> - <name>SimplifyBooleanReturns</name> + <name>FinalFieldCouldBeStatic</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>SimplifyConditional</name> - <ruleset>Design Rules</ruleset> + <name>FinalizeDoesNotCallSuperFinalize</name> + <ruleset>Finalizer Rules</ruleset> </rule> <rule> - <name>SingularField</name> - <ruleset>Design Rules</ruleset> + <name>FinalizeOnlyCallsSuperFinalize</name> + <ruleset>Finalizer Rules</ruleset> </rule> <rule> - <name>SwitchDensity</name> - <ruleset>Design Rules</ruleset> + <name>FinalizeOverloaded</name> + <ruleset>Finalizer Rules</ruleset> </rule> <rule> - <name>SwitchStmtsShouldHaveDefault</name> - <ruleset>Design Rules</ruleset> + <name>FinalizeShouldBeProtected</name> + <ruleset>Finalizer Rules</ruleset> </rule> <rule> - <name>TooFewBranchesForASwitchStatement</name> - <ruleset>Design Rules</ruleset> + <name>ForLoopShouldBeWhileLoop</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>UncommentedEmptyConstructor</name> - <ruleset>Design Rules</ruleset> + <name>ForLoopsMustUseBraces</name> + <ruleset>Braces Rules</ruleset> </rule> <rule> - <name>UncommentedEmptyMethod</name> + <name>IdempotentOperations</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UnnecessaryLocalBeforeReturn</name> - <ruleset>Design Rules</ruleset> + <name>IfElseStmtsMustUseBraces</name> + <ruleset>Braces Rules</ruleset> </rule> <rule> - <name>UnsynchronizedStaticDateFormatter</name> - <ruleset>Design Rules</ruleset> + <name>IfStmtsMustUseBraces</name> + <ruleset>Braces Rules</ruleset> </rule> <rule> - <name>UseCollectionIsEmpty</name> + <name>ImmutableField</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UseLocaleWithCaseConversions</name> - <ruleset>Design Rules</ruleset> + <name>ImportFromSamePackage</name> + <ruleset>Import Statement Rules</ruleset> </rule> <rule> - <name>UseNotifyAllInsteadOfNotify</name> - <ruleset>Design Rules</ruleset> + <name>InefficientEmptyStringCheck</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>UseSingleton</name> + <name>InefficientStringBuffering</name> + <ruleset>String and StringBuffer Rules</ruleset> + </rule> + <rule> + <name>InstantiationToGetClass</name> <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidCallingFinalize</name> - <ruleset>Finalizer Rules</ruleset> + <name>InsufficientStringBufferDeclaration</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>EmptyFinalizer</name> - <ruleset>Finalizer Rules</ruleset> + <name>IntegerInstantiation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>FinalizeDoesNotCallSuperFinalize</name> - <ruleset>Finalizer Rules</ruleset> + <name>JumbledIncrementer</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>FinalizeOnlyCallsSuperFinalize</name> - <ruleset>Finalizer Rules</ruleset> + <name>JUnit4SuitesShouldUseSuiteAnnotation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>FinalizeOverloaded</name> - <ruleset>Finalizer Rules</ruleset> + <name>JUnit4TestShouldUseAfterAnnotation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>FinalizeShouldBeProtected</name> - <ruleset>Finalizer Rules</ruleset> + <name>JUnit4TestShouldUseBeforeAnnotation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>DontImportJavaLang</name> - <ruleset>Import Statement Rules</ruleset> + <name>JUnit4TestShouldUseTestAnnotation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>DuplicateImports</name> - <ruleset>Import Statement Rules</ruleset> + <name>JUnitAssertionsShouldIncludeMessage</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>ImportFromSamePackage</name> - <ruleset>Import Statement Rules</ruleset> + <name>JUnitSpelling</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>TooManyStaticImports</name> - <ruleset>Import Statement Rules</ruleset> + <name>JUnitStaticSuite</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>DoNotCallSystemExit</name> - <ruleset>J2EE Rules</ruleset> + <name>JUnitTestsShouldIncludeAssert</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>DoNotUseThreads</name> - <ruleset>J2EE Rules</ruleset> + <name>JUnitUseExpected</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> <name>LocalHomeNamingConvention</name> @@ -448,112 +424,96 @@ <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>MDBAndSessionBeanNamingConvention</name> - <ruleset>J2EE Rules</ruleset> - </rule> - <rule> - <name>RemoteInterfaceNamingConvention</name> - <ruleset>J2EE Rules</ruleset> + <name>LocalVariableCouldBeFinal</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>RemoteSessionInterfaceNamingConvention</name> - <ruleset>J2EE Rules</ruleset> + <name>LongInstantiation</name> + <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>StaticEJBFieldShouldBeFinal</name> - <ruleset>J2EE Rules</ruleset> + <name>LooseCoupling</name> + <ruleset>Type Resolution Rules</ruleset> </rule> <rule> - <name>UseProperClassLoader</name> + <name>MDBAndSessionBeanNamingConvention</name> <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>ProperLogger</name> - <ruleset>Jakarta Commons Logging Rules</ruleset> - </rule> - <rule> - <name>UseCorrectExceptionLogging</name> - <ruleset>Jakarta Commons Logging Rules</ruleset> - </rule> - <rule> - <name>JUnitAssertionsShouldIncludeMessage</name> - <ruleset>JUnit Rules</ruleset> - </rule> - <rule> - <name>JUnitSpelling</name> - <ruleset>JUnit Rules</ruleset> + <name>MethodArgumentCouldBeFinal</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>JUnitStaticSuite</name> - <ruleset>JUnit Rules</ruleset> + <name>MethodNamingConventions</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>JUnitTestsShouldIncludeAssert</name> - <ruleset>JUnit Rules</ruleset> + <name>MethodWithSameNameAsEnclosingClass</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>SimplifyBooleanAssertion</name> - <ruleset>JUnit Rules</ruleset> + <name>MisleadingVariableName</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>TestClassWithoutTestCases</name> - <ruleset>JUnit Rules</ruleset> + <name>MisplacedNullCheck</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>UnnecessaryBooleanAssertion</name> - <ruleset>JUnit Rules</ruleset> + <name>MissingBreakInSwitch</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UseAssertEqualsInsteadOfAssertTrue</name> - <ruleset>JUnit Rules</ruleset> + <name>MissingStaticMethodInNonInstantiatableClass</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UseAssertNullInsteadOfAssertTrue</name> - <ruleset>JUnit Rules</ruleset> + <name>NonCaseLabelInSwitchStatement</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UseAssertSameInsteadOfAssertTrue</name> - <ruleset>JUnit Rules</ruleset> + <name>NonStaticInitializer</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidAssertAsIdentifier</name> - <ruleset>Migration Rules</ruleset> + <name>NonThreadSafeSingleton</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidEnumAsIdentifier</name> - <ruleset>Migration Rules</ruleset> + <name>NoPackage</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>ByteInstantiation</name> - <ruleset>Migration Rules</ruleset> + <name>OptimizableToArrayCall</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>IntegerInstantiation</name> - <ruleset>Migration Rules</ruleset> + <name>OverrideBothEqualsAndHashcode</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>JUnit4SuitesShouldUseSuiteAnnotation</name> - <ruleset>Migration Rules</ruleset> + <name>PositionLiteralsFirstInComparisons</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>JUnit4TestShouldUseAfterAnnotation</name> - <ruleset>Migration Rules</ruleset> + <name>PreserveStackTrace</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>JUnit4TestShouldUseBeforeAnnotation</name> - <ruleset>Migration Rules</ruleset> + <name>ProperCloneImplementation</name> + <ruleset>Clone Implementation Rules</ruleset> </rule> <rule> - <name>JUnit4TestShouldUseTestAnnotation</name> - <ruleset>Migration Rules</ruleset> + <name>ProperLogger</name> + <ruleset>Jakarta Commons Logging Rules</ruleset> </rule> <rule> - <name>JUnitUseExpected</name> - <ruleset>Migration Rules</ruleset> + <name>RemoteInterfaceNamingConvention</name> + <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>LongInstantiation</name> - <ruleset>Migration Rules</ruleset> + <name>RemoteSessionInterfaceNamingConvention</name> + <ruleset>J2EE Rules</ruleset> </rule> <rule> <name>ReplaceEnumerationWithIterator</name> @@ -567,53 +527,65 @@ <name>ReplaceVectorWithList</name> <ruleset>Migration Rules</ruleset> </rule> + <rule> + <name>ReturnEmptyArrayRatherThanNull</name> + <ruleset>Design Rules</ruleset> + </rule> + <rule> + <name>ReturnFromFinallyBlock</name> + <ruleset>Basic Rules</ruleset> + </rule> <rule> <name>ShortInstantiation</name> <ruleset>Migration Rules</ruleset> </rule> <rule> - <name>AbstractNaming</name> + <name>ShortMethodName</name> <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>AvoidDollarSigns</name> - <ruleset>Naming Rules</ruleset> + <name>SimpleDateFormatNeedsLocale</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidFieldNameMatchingMethodName</name> - <ruleset>Naming Rules</ruleset> + <name>SimplifyBooleanAssertion</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>AvoidFieldNameMatchingTypeName</name> - <ruleset>Naming Rules</ruleset> + <name>SimplifyBooleanExpressions</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>BooleanGetMethodName</name> - <ruleset>Naming Rules</ruleset> + <name>SimplifyBooleanReturns</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>ClassNamingConventions</name> - <ruleset>Naming Rules</ruleset> + <name>SimplifyConditional</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>MethodNamingConventions</name> - <ruleset>Naming Rules</ruleset> + <name>SimplifyStartsWith</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>MethodWithSameNameAsEnclosingClass</name> - <ruleset>Naming Rules</ruleset> + <name>SingularField</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>MisleadingVariableName</name> - <ruleset>Naming Rules</ruleset> + <name>StaticEJBFieldShouldBeFinal</name> + <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>NoPackage</name> - <ruleset>Naming Rules</ruleset> + <name>StringBufferInstantiationWithChar</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>ShortMethodName</name> - <ruleset>Naming Rules</ruleset> + <name>StringInstantiation</name> + <ruleset>String and StringBuffer Rules</ruleset> + </rule> + <rule> + <name>StringToString</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> <name>SuspiciousConstantFieldName</name> @@ -628,112 +600,124 @@ <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>VariableNamingConventions</name> - <ruleset>Naming Rules</ruleset> + <name>SuspiciousOctalEscape</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>AddEmptyString</name> - <ruleset>Optimization Rules</ruleset> + <name>SwitchDensity</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidArrayLoops</name> - <ruleset>Optimization Rules</ruleset> + <name>SwitchStmtsShouldHaveDefault</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>LocalVariableCouldBeFinal</name> - <ruleset>Optimization Rules</ruleset> + <name>TestClassWithoutTestCases</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>MethodArgumentCouldBeFinal</name> - <ruleset>Optimization Rules</ruleset> + <name>TooFewBranchesForASwitchStatement</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>SimplifyStartsWith</name> - <ruleset>Optimization Rules</ruleset> + <name>TooManyStaticImports</name> + <ruleset>Import Statement Rules</ruleset> </rule> <rule> - <name>UnnecessaryWrapperObjectCreation</name> - <ruleset>Optimization Rules</ruleset> + <name>UncommentedEmptyConstructor</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UseArrayListInsteadOfVector</name> - <ruleset>Optimization Rules</ruleset> + <name>UncommentedEmptyMethod</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UseArraysAsList</name> - <ruleset>Optimization Rules</ruleset> + <name>UnconditionalIfStatement</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>UseStringBufferForStringAppends</name> - <ruleset>Optimization Rules</ruleset> + <name>UnnecessaryBooleanAssertion</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>AvoidCatchingThrowable</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnnecessaryCaseChange</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>AvoidRethrowingException</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnnecessaryConversionTemporary</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>AvoidThrowingNewInstanceOfSameException</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnnecessaryLocalBeforeReturn</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AvoidThrowingRawExceptionTypes</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnnecessaryParentheses</name> + <ruleset>Controversial Rules</ruleset> </rule> <rule> - <name>DoNotExtendJavaLangError</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnnecessaryReturn</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>DoNotThrowExceptionInFinally</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnnecessaryWrapperObjectCreation</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>ExceptionAsFlowControl</name> - <ruleset>Strict Exception Rules</ruleset> + <name>UnsynchronizedStaticDateFormatter</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>AppendCharacterWithChar</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UnusedFormalParameter</name> + <ruleset>Unused Code Rules</ruleset> </rule> <rule> - <name>AvoidStringBufferField</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UnusedImports</name> + <ruleset>Type Resolution Rules</ruleset> </rule> <rule> - <name>ConsecutiveLiteralAppends</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UnusedLocalVariable</name> + <ruleset>Unused Code Rules</ruleset> </rule> <rule> - <name>InefficientEmptyStringCheck</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UnusedNullCheckInEquals</name> + <ruleset>Basic Rules</ruleset> </rule> <rule> - <name>InefficientStringBuffering</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UnusedPrivateField</name> + <ruleset>Unused Code Rules</ruleset> </rule> <rule> - <name>InsufficientStringBufferDeclaration</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UnusedPrivateMethod</name> + <ruleset>Unused Code Rules</ruleset> </rule> <rule> - <name>StringBufferInstantiationWithChar</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UseArrayListInsteadOfVector</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>StringInstantiation</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UseArraysAsList</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>StringToString</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UseAssertEqualsInsteadOfAssertTrue</name> + <ruleset>JUnit Rules</ruleset> </rule> <rule> - <name>UnnecessaryCaseChange</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UseAssertNullInsteadOfAssertTrue</name> + <ruleset>JUnit Rules</ruleset> + </rule> + <rule> + <name>UseAssertSameInsteadOfAssertTrue</name> + <ruleset>JUnit Rules</ruleset> + </rule> + <rule> + <name>UseCollectionIsEmpty</name> + <ruleset>Design Rules</ruleset> + </rule> + <rule> + <name>UseCorrectExceptionLogging</name> + <ruleset>Jakarta Commons Logging Rules</ruleset> </rule> <rule> <name>UseEqualsToCompareStrings</name> @@ -743,41 +727,49 @@ <name>UseIndexOfChar</name> <ruleset>String and StringBuffer Rules</ruleset> </rule> + <rule> + <name>UselessOperationOnImmutable</name> + <ruleset>Basic Rules</ruleset> + </rule> + <rule> + <name>UselessOverridingMethod</name> + <ruleset>Basic Rules</ruleset> + </rule> <rule> <name>UselessStringValueOf</name> <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>UseStringBufferLength</name> - <ruleset>String and StringBuffer Rules</ruleset> + <name>UseLocaleWithCaseConversions</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>CloneMethodMustImplementCloneable</name> - <ruleset>Type Resolution Rules</ruleset> + <name>UseNotifyAllInsteadOfNotify</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>LooseCoupling</name> - <ruleset>Type Resolution Rules</ruleset> + <name>UseProperClassLoader</name> + <ruleset>J2EE Rules</ruleset> </rule> <rule> - <name>UnusedImports</name> - <ruleset>Type Resolution Rules</ruleset> + <name>UseSingleton</name> + <ruleset>Design Rules</ruleset> </rule> <rule> - <name>UnusedFormalParameter</name> - <ruleset>Unused Code Rules</ruleset> + <name>UseStringBufferForStringAppends</name> + <ruleset>Optimization Rules</ruleset> </rule> <rule> - <name>UnusedLocalVariable</name> - <ruleset>Unused Code Rules</ruleset> + <name>UseStringBufferLength</name> + <ruleset>String and StringBuffer Rules</ruleset> </rule> <rule> - <name>UnusedPrivateField</name> - <ruleset>Unused Code Rules</ruleset> + <name>VariableNamingConventions</name> + <ruleset>Naming Rules</ruleset> </rule> <rule> - <name>UnusedPrivateMethod</name> - <ruleset>Unused Code Rules</ruleset> + <name>WhileLoopsMustUseBraces</name> + <ruleset>Braces Rules</ruleset> </rule> </rules> <includeDerivedFiles>false</includeDerivedFiles> diff --git a/Kieker.WebGUI/config/quality-config/pmdrules.xml b/Kieker.WebGUI/config/quality-config/pmdrules.xml index 3dc278260a401fc8161b174c0dfcca556c9fd07f..6f91926fd458895477aecb3c1c2bf65517f9aab2 100644 --- a/Kieker.WebGUI/config/quality-config/pmdrules.xml +++ b/Kieker.WebGUI/config/quality-config/pmdrules.xml @@ -30,6 +30,7 @@ <exclude name="UnnecessaryConstructor"/> <exclude name="UseConcurrentHashMap"/> <exclude name="AssignmentInOperand"/> + <exclude name="NullAssignment"/> </rule> <!--<rule ref="rulesets/coupling.xml">--> diff --git a/Kieker.WebGUI/pom.xml b/Kieker.WebGUI/pom.xml index 7f1069d599b639b8ee175c37fb90e438ba6c707f..2325abc30bc1d6ecc5cc31d2387e7539d68ecc76 100644 --- a/Kieker.WebGUI/pom.xml +++ b/Kieker.WebGUI/pom.xml @@ -45,6 +45,11 @@ </repositories> <dependencies> + <dependency> + <groupId>com.google.code.findbugs</groupId> + <artifactId>jsr305</artifactId> + <version>2.0.1</version> + </dependency> <dependency> <groupId>net.vidageek</groupId> <artifactId>mirror</artifactId> diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java index 433753eef018e913303e4ca1b2aa4d1667828893..f93a98c97e6baba668d575031cd21924334aeac2 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java @@ -24,7 +24,6 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.lang.ref.WeakReference; -import java.lang.reflect.Modifier; import java.net.MalformedURLException; import java.net.URL; import java.security.AccessController; @@ -38,11 +37,16 @@ import java.util.Map.Entry; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.Nullable; import javax.annotation.PostConstruct; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; import com.google.common.io.Files; import kieker.analysis.AnalysisController; +import kieker.analysis.analysisComponent.AbstractAnalysisComponent; import kieker.analysis.model.analysisMetaModel.MIAnalysisMetaModelFactory; import kieker.analysis.model.analysisMetaModel.MIProject; import kieker.analysis.plugin.filter.AbstractFilterPlugin; @@ -62,6 +66,7 @@ import kieker.webgui.persistence.IProjectDAO; import kieker.webgui.persistence.impl.util.Class2ModelInstanceConverter; import kieker.webgui.persistence.impl.util.CloseableURLClassLoader; import kieker.webgui.persistence.impl.util.PluginFinder; +import kieker.webgui.persistence.impl.util.SimpleCastFunction; import org.primefaces.model.UploadedFile; @@ -166,28 +171,28 @@ public class FSProjectDAOImpl implements IProjectDAO, ReleaseListener { final List<RepositoryDecorator> repositories, final URL lib, final ClassLoader classLoader, final ClassAndMethodContainer classAndMethodContainer) throws IOException { // FInd the available classes within the library - final List<Class<AbstractRepository>> repositoryClasses = this.pluginFinder.getAllRepositoriesWithinJar(lib, classLoader, classAndMethodContainer); - final List<Class<AbstractFilterPlugin>> filterClasses = this.pluginFinder.getAllFiltersWithinJar(lib, classLoader, classAndMethodContainer); - final List<Class<AbstractReaderPlugin>> readerClasses = this.pluginFinder.getAllReadersWithinJar(lib, classLoader, classAndMethodContainer); - - // Convert the repositories into model instances - for (final Class<AbstractRepository> repository : repositoryClasses) { - if (!(Modifier.isAbstract(repository.getModifiers()) || this.class2ModelInstanceConverter.isProgrammaticOnly(repository, classAndMethodContainer))) { - repositories.add(this.class2ModelInstanceConverter.convertRepositoryClass2ModelInstance(repository, classAndMethodContainer)); - } - } - - // Convert the plugins into model instances - for (final Class<AbstractReaderPlugin> reader : readerClasses) { - if (!(Modifier.isAbstract(reader.getModifiers()) || this.class2ModelInstanceConverter.isProgrammaticOnly(reader, classAndMethodContainer))) { - readers.add(this.class2ModelInstanceConverter.convertReaderClass2ModelInstance(reader, classAndMethodContainer)); - } - } - for (final Class<AbstractFilterPlugin> filter : filterClasses) { - if (!(Modifier.isAbstract(filter.getModifiers()) || this.class2ModelInstanceConverter.isProgrammaticOnly(filter, classAndMethodContainer))) { - filters.add(this.class2ModelInstanceConverter.convertFilterClass2ModelInstance(filter, classAndMethodContainer)); - } - } + final Collection<Class<AbstractRepository>> repositoryClasses = this.pluginFinder.getAllRepositoriesWithinJar(lib, classLoader, classAndMethodContainer); + final Collection<Class<AbstractFilterPlugin>> filterClasses = this.pluginFinder.getAllFiltersWithinJar(lib, classLoader, classAndMethodContainer); + final Collection<Class<AbstractReaderPlugin>> readerClasses = this.pluginFinder.getAllReadersWithinJar(lib, classLoader, classAndMethodContainer); + + // Rule those out which are for programmatic purposes only and transform the remaining with the converter service into model instances. + final Collection<RepositoryDecorator> repositoryModelInstances = Collections2.transform(Collections2.transform( + Collections2.filter(repositoryClasses, new IsNotProgrammaticOnly(classAndMethodContainer)), + new SimpleCastFunction<Class<? extends AbstractAnalysisComponent>, Class<AbstractRepository>>()), new ConvertRepositoryClass2ModelInstanceFunction( + classAndMethodContainer)); + final Collection<FilterDecorator> filterModelInstances = Collections2.transform(Collections2.transform( + Collections2.filter(filterClasses, new IsNotProgrammaticOnly(classAndMethodContainer)), + new SimpleCastFunction<Class<? extends AbstractAnalysisComponent>, Class<AbstractFilterPlugin>>()), new ConvertFilterClass2ModelInstanceFunction( + classAndMethodContainer)); + final Collection<ReaderDecorator> readerModelInstances = Collections2.transform(Collections2.transform( + Collections2.filter(readerClasses, new IsNotProgrammaticOnly(classAndMethodContainer)), + new SimpleCastFunction<Class<? extends AbstractAnalysisComponent>, Class<AbstractReaderPlugin>>()), new ConvertReaderClass2ModelInstanceFunction( + classAndMethodContainer)); + + // Add the model instances to our lists. + repositories.addAll(repositoryModelInstances); + readers.addAll(readerModelInstances); + filters.addAll(filterModelInstances); } private static void createDirectoryIfNecessary(final String dirName) throws IOException { @@ -862,4 +867,72 @@ public class FSProjectDAOImpl implements IProjectDAO, ReleaseListener { } } + /** + * A predicate which can be used to check whether a class is for programmatic purposes only or not. + * + * @author Nils Christian Ehmke + */ + private class IsNotProgrammaticOnly implements Predicate<Class<? extends AbstractAnalysisComponent>> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public IsNotProgrammaticOnly(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + public boolean apply(@Nullable final Class<? extends AbstractAnalysisComponent> elem) { + return !FSProjectDAOImpl.this.class2ModelInstanceConverter.isProgrammaticOnly(elem, this.classAndMethodContainer); + } + + } + + private class ConvertRepositoryClass2ModelInstanceFunction implements Function<Class<AbstractRepository>, RepositoryDecorator> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public ConvertRepositoryClass2ModelInstanceFunction(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + @Nullable + public RepositoryDecorator apply(@Nullable final Class<AbstractRepository> repository) { + return FSProjectDAOImpl.this.class2ModelInstanceConverter.convertRepositoryClass2ModelInstance(repository, this.classAndMethodContainer); + } + + } + + private class ConvertReaderClass2ModelInstanceFunction implements Function<Class<AbstractReaderPlugin>, ReaderDecorator> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public ConvertReaderClass2ModelInstanceFunction(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + @Nullable + public ReaderDecorator apply(@Nullable final Class<AbstractReaderPlugin> repository) { + return FSProjectDAOImpl.this.class2ModelInstanceConverter.convertReaderClass2ModelInstance(repository, this.classAndMethodContainer); + } + + } + + private class ConvertFilterClass2ModelInstanceFunction implements Function<Class<AbstractFilterPlugin>, FilterDecorator> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public ConvertFilterClass2ModelInstanceFunction(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + @Nullable + public FilterDecorator apply(@Nullable final Class<AbstractFilterPlugin> repository) { + return FSProjectDAOImpl.this.class2ModelInstanceConverter.convertFilterClass2ModelInstance(repository, this.classAndMethodContainer); + } + + } + } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/Class2ModelInstanceConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/Class2ModelInstanceConverter.java index 0a854cfb36cccfdcde91c154008f7c204edbc510..9cd4a18fe676ef8484f75f995099587772888d72 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/Class2ModelInstanceConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/Class2ModelInstanceConverter.java @@ -70,14 +70,44 @@ public class Class2ModelInstanceConverter { // No code necessary } + /** + * Converts the given {@link AbstractReaderPlugin} instance into a model instance using the given parameters. + * + * @param clazz + * The class to convert. + * @param classAndMethodContainer + * The container which will be used during the reflection calls. + * + * @return A model instance representing the given class as a meta model component. + */ public ReaderDecorator convertReaderClass2ModelInstance(final Class<AbstractReaderPlugin> clazz, final ClassAndMethodContainer classAndMethodContainer) { return (ReaderDecorator) this.convertComponentClass2ModelInstance(clazz, classAndMethodContainer, Type.Reader); } + /** + * Converts the given {@link AbstractFilterPlugin} instance into a model instance using the given parameters. + * + * @param clazz + * The class to convert. + * @param classAndMethodContainer + * The container which will be used during the reflection calls. + * + * @return A model instance representing the given class as a meta model component. + */ public FilterDecorator convertFilterClass2ModelInstance(final Class<AbstractFilterPlugin> clazz, final ClassAndMethodContainer classAndMethodContainer) { return (FilterDecorator) this.convertComponentClass2ModelInstance(clazz, classAndMethodContainer, Type.Filter); } + /** + * Converts the given {@link AbstractRepository} instance into a model instance using the given parameters. + * + * @param clazz + * The class to convert. + * @param classAndMethodContainer + * The container which will be used during the reflection calls. + * + * @return A model instance representing the given class as a meta model component. + */ public RepositoryDecorator convertRepositoryClass2ModelInstance(final Class<AbstractRepository> clazz, final ClassAndMethodContainer classAndMethodContainer) { return (RepositoryDecorator) this.convertComponentClass2ModelInstance(clazz, classAndMethodContainer, Type.Repository); } @@ -114,7 +144,7 @@ public class Class2ModelInstanceConverter { ((MIFilter) plugin).getInputPorts().addAll(inputPorts); } } - } catch (final Throwable ex) { // NOCS (Throwable) + } catch (final Throwable ex) { // NOCS NOPMD (Throwable) Class2ModelInstanceConverter.LOG.info("A component with the classname '" + clazz.getCanonicalName() + "' could not be initialized.", ex); plugin.getProperties().clear(); @@ -131,22 +161,26 @@ public class Class2ModelInstanceConverter { plugin.setClassname(clazz.getName()); plugin.setName(clazz.getSimpleName()); + // Decide what to return + AbstractAnalysisComponentDecorator<? extends MIAnalysisComponent> result; switch (type) { - case Filter: { - return new FilterDecorator((MIFilter) plugin, Collections.unmodifiableMap(propertyDescriptions), description, dependency, fullyInitialized, + case Filter: + result = new FilterDecorator((MIFilter) plugin, Collections.unmodifiableMap(propertyDescriptions), description, dependency, fullyInitialized, Collections.unmodifiableMap(displayDescriptions)); - } - case Reader: { - return new ReaderDecorator((MIReader) plugin, Collections.unmodifiableMap(propertyDescriptions), description, dependency, fullyInitialized, + break; + case Reader: + result = new ReaderDecorator((MIReader) plugin, Collections.unmodifiableMap(propertyDescriptions), description, dependency, fullyInitialized, Collections.unmodifiableMap(displayDescriptions)); - } - case Repository: { - return new RepositoryDecorator((MIRepository) plugin, Collections.unmodifiableMap(propertyDescriptions), description, dependency, fullyInitialized); - - } + break; + case Repository: + result = new RepositoryDecorator((MIRepository) plugin, Collections.unmodifiableMap(propertyDescriptions), description, dependency, fullyInitialized); + break; default: - return null; + result = null; + break; } + + return result; } private void fillInputPorts(final Class<AbstractFilterPlugin> clazz, final ClassAndMethodContainer classAndMethodContainer, @@ -196,7 +230,6 @@ public class Class2ModelInstanceConverter { return this.getAnnotatedMethods(clazz, classAndMethodContainer.getDisplayAnnotationClass()); } - @SuppressWarnings("unchecked") private void fillOutputPorts(final Class<? extends AbstractPlugin> clazz, final ClassAndMethodContainer classAndMethodContainer, final Collection<MIOutputPort> outputPorts, final MIPlugin parent) { final Annotation annotation = this.getSuitableAnnotation(clazz, classAndMethodContainer); @@ -209,7 +242,6 @@ public class Class2ModelInstanceConverter { } } - @SuppressWarnings("unchecked") private void fillProperties(final Class<? extends AbstractAnalysisComponent> clazz, final ClassAndMethodContainer classAndMethodContainer, final Collection<MIProperty> properties, final Map<String, String> propertyDescriptions) { final Annotation annotation = this.getSuitableAnnotation(clazz, classAndMethodContainer); @@ -258,7 +290,7 @@ public class Class2ModelInstanceConverter { } /** - * Tells whether the given class is "programmaticOnly". If there is no annotation which could tell the state of the flag, true will be returned. + * Tells whether the given class is "programmaticOnly". * * @param clazz * The class of the plugin or repository. diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java index a7f24e34ae0b6d516134551c2fe43394938642bb..f2084d59baf70b9adcbcc7b0260922f9d18d76da 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java @@ -23,8 +23,8 @@ import java.util.Collection; /** * A class loader which extends the {@link URLClassLoader} with a close-method using a hack. This will probably only work for a Sun VM. The class itself will - * partially <b>not</b> be checked by Findbugs (there is an exception-rule in the configuration-file) as I <b>know</b> that the code is dangerous. It is a hack after - * all. + * partially <b>not</b> be checked by Findbugs (there is an exception-rule in the configuration-file) as we <b>know</b> that the code is dangerous. It is a hack + * after all. * * @author Nils Christian Ehmke */ @@ -36,22 +36,17 @@ public class CloseableURLClassLoader extends URLClassLoader implements Closeable * Creates a new instance of this class using the given parameters. * * @param urls - * The URLs to be used by the classloader. + * The URLs to be used by the class loader. * @param parent - * The parent of this classloader. + * The parent of this class loader. */ public CloseableURLClassLoader(final URL[] urls, final ClassLoader parent) { super(urls, parent); } - /* - * (non-Javadoc) - * - * @see java.io.Closeable#close() - */ @Override public synchronized void close() throws IOException { - // Make sure that the classloader can only be closed once. + // Make sure that the class loader can only be closed once. if (!this.closed) { this.closed = true; diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/PluginFinder.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/PluginFinder.java index 8421655c4ea19a69135b0674e5962c44d802cb80..99e37ee60fc351246ad04f8ab7068e8cbe540aec 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/PluginFinder.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/PluginFinder.java @@ -16,12 +16,19 @@ package kieker.webgui.persistence.impl.util; import java.io.IOException; +import java.lang.reflect.Modifier; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; +import javax.annotation.Nullable; + +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; + import kieker.analysis.plugin.filter.AbstractFilterPlugin; import kieker.analysis.plugin.reader.AbstractReaderPlugin; import kieker.analysis.repository.AbstractRepository; @@ -45,97 +52,84 @@ public class PluginFinder { } /** - * This method delivers all classes which are available in the given jar and are compatible with <code>AbstractRepository</code>.. + * This method delivers all classes which are available in the given jar and are compatible with <code>AbstractRepository</code>. None of them is abstract. * * @param url - * The url for the jar. + * The URL for the jar. * @param classLoader - * The classloader which should be used to load the classes. + * The class loader which should be used to load the classes. * @param classAndMethodContainer * The container for the necessary reflection methods. + * * @return A list containing all available repository-classes or null, if an exception occurred. + * * @throws IOException * If something went wrong during the opening of the jar file. */ - public List<Class<AbstractRepository>> getAllRepositoriesWithinJar(final URL url, final ClassLoader classLoader, + public Collection<Class<AbstractRepository>> getAllRepositoriesWithinJar(final URL url, final ClassLoader classLoader, final ClassAndMethodContainer classAndMethodContainer) throws IOException { - // Get a list containing all available classes within the given jar - final List<Class<?>> clazzes = this.getAllClassesWithinJar(url, classLoader); - - List<Class<AbstractRepository>> result = null; - - result = new ArrayList<Class<AbstractRepository>>(); - for (final Class<?> clazz : clazzes) { - // This is the cast resulting in an unchecked cast warning. - if (clazz.isAnnotationPresent(classAndMethodContainer.getRepositoryAnnotationClass()) - && classAndMethodContainer.getAbstractRepositoryClass().isAssignableFrom(clazz)) { - result.add((Class<AbstractRepository>) clazz); - } - } - - return result; + return Collections2.transform(Collections2.filter(Collections2.filter(this.getAllClassesWithinJar(url, classLoader), + new IsRepositoryPredicate(classAndMethodContainer)), new IsNotAbstractPredicate()), new SimpleCastFunction<Class<?>, Class<AbstractRepository>>()); } /** * This method delivers all classes which are available in the given jar and have the Plugin-Annotation from the Kieker framework (And are correctly compatible - * with <code>AbstractPlugin</code>). + * with <code>AbstractReaderPlugin</code>). None of them is abstract. * * @param url - * The url for the jar. + * The URL for the jar. * @param classLoader - * The classloader which should be used to load the classes. + * The class loader which should be used to load the classes. * @param classAndMethodContainer * The container for the necessary reflection methods. + * * @return A list containing all available plugin-classes or null, if an exception occurred. + * * @throws IOException * If something went wrong during the opening of the jar file. */ - public List<Class<AbstractReaderPlugin>> getAllReadersWithinJar(final URL url, final ClassLoader classLoader, + public Collection<Class<AbstractReaderPlugin>> getAllReadersWithinJar(final URL url, final ClassLoader classLoader, final ClassAndMethodContainer classAndMethodContainer) throws IOException { - final List<Class<?>> clazzes = this.getAllClassesWithinJar(url, classLoader); - List<Class<AbstractReaderPlugin>> result = null; - - result = new ArrayList<Class<AbstractReaderPlugin>>(); - for (final Class<?> clazz : clazzes) { - // This is the cast resulting in an unchecked cast warning. - if (clazz.isAnnotationPresent(classAndMethodContainer.getPluginAnnotationClass()) - && classAndMethodContainer.getAbstractReaderPluginClass().isAssignableFrom(clazz)) { - result.add((Class<AbstractReaderPlugin>) clazz); - } - } - - return result; + return Collections2.transform(Collections2.filter(Collections2.filter(this.getAllClassesWithinJar(url, classLoader), + new IsReaderPredicate(classAndMethodContainer)), new IsNotAbstractPredicate()), new SimpleCastFunction<Class<?>, Class<AbstractReaderPlugin>>()); } - public List<Class<AbstractFilterPlugin>> getAllFiltersWithinJar(final URL url, final ClassLoader classLoader, + /** + * This method delivers all classes which are available in the given jar and have the Plugin-Annotation from the Kieker framework (And are correctly compatible + * with <code>AbstractFilterPlugin</code>). None of them is abstract. + * + * @param url + * The URL for the jar. + * @param classLoader + * The class loader which should be used to load the classes. + * @param classAndMethodContainer + * The container for the necessary reflection methods. + * + * @return A list containing all available plugin-classes or null, if an exception occurred. + * + * @throws IOException + * If something went wrong during the opening of the jar file. + */ + public Collection<Class<AbstractFilterPlugin>> getAllFiltersWithinJar(final URL url, final ClassLoader classLoader, final ClassAndMethodContainer classAndMethodContainer) throws IOException { - final List<Class<?>> clazzes = this.getAllClassesWithinJar(url, classLoader); - List<Class<AbstractFilterPlugin>> result = null; - - result = new ArrayList<Class<AbstractFilterPlugin>>(); - for (final Class<?> clazz : clazzes) { - // This is the cast resulting in an unchecked cast warning. - if (clazz.isAnnotationPresent(classAndMethodContainer.getPluginAnnotationClass()) - && classAndMethodContainer.getAbstractFilterPluginClass().isAssignableFrom(clazz)) { - result.add((Class<AbstractFilterPlugin>) clazz); - } - } - - return result; + return Collections2.transform(Collections2.filter(Collections2.filter(this.getAllClassesWithinJar(url, classLoader), + new IsFilterPredicate(classAndMethodContainer)), new IsNotAbstractPredicate()), new SimpleCastFunction<Class<?>, Class<AbstractFilterPlugin>>()); } /** * This method delivers all classes which are available in the given jar. * * @param url - * The url for the jar. + * The URL for the jar. * @param classLoader - * The classloader which should be used to load the classes. + * The class loader which should be used to load the classes. + * * @return A list containing all available classes or null, if an exception occurred. + * * @throws IOException * If something went wrong during the opening of the jar file. */ - private List<Class<?>> getAllClassesWithinJar(final URL url, final ClassLoader classLoader) throws IOException { + private Collection<Class<?>> getAllClassesWithinJar(final URL url, final ClassLoader classLoader) throws IOException { JarInputStream stream = null; try { final List<Class<?>> result = new ArrayList<Class<?>>(); @@ -171,4 +165,85 @@ public class PluginFinder { } } + /** + * A predicate which can be used to check whether a class is a repository or not. + * + * @author Nils Christian Ehmke + */ + private static class IsRepositoryPredicate implements Predicate<Class<?>> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public IsRepositoryPredicate(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + public boolean apply(@Nullable final Class<?> elem) { + return elem.isAnnotationPresent(this.classAndMethodContainer.getRepositoryAnnotationClass()) + && this.classAndMethodContainer.getAbstractRepositoryClass().isAssignableFrom(elem); + } + + } + + /** + * A predicate which can be used to check whether a class is a reader or not. + * + * @author Nils Christian Ehmke + */ + private static class IsReaderPredicate implements Predicate<Class<?>> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public IsReaderPredicate(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + public boolean apply(@Nullable final Class<?> elem) { + return elem.isAnnotationPresent(this.classAndMethodContainer.getPluginAnnotationClass()) + && this.classAndMethodContainer.getAbstractReaderPluginClass().isAssignableFrom(elem); + } + + } + + /** + * A predicate which can be used to check whether a class is a filter or not. + * + * @author Nils Christian Ehmke + */ + private static class IsFilterPredicate implements Predicate<Class<?>> { + + private final ClassAndMethodContainer classAndMethodContainer; + + public IsFilterPredicate(final ClassAndMethodContainer classAndMethodContainer) { + this.classAndMethodContainer = classAndMethodContainer; + } + + @Override + public boolean apply(@Nullable final Class<?> elem) { + return elem.isAnnotationPresent(this.classAndMethodContainer.getPluginAnnotationClass()) + && this.classAndMethodContainer.getAbstractFilterPluginClass().isAssignableFrom(elem); + } + + } + + /** + * A predicate which can be used to check whether a class is abstract or not. + * + * @author Nils Christian Ehmke + */ + private static class IsNotAbstractPredicate implements Predicate<Class<?>> { + + public IsNotAbstractPredicate() { + // No code necessary + } + + @Override + public boolean apply(@Nullable final Class<?> elem) { + return !Modifier.isAbstract(elem.getModifiers()); + } + + } + } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/SimpleCastFunction.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/SimpleCastFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..8d74af1b269457e2ec262f010e7a6f5019bde2e7 --- /dev/null +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/SimpleCastFunction.java @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright 2013 Kieker Project (http://kieker-monitoring.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***************************************************************************/ + +package kieker.webgui.persistence.impl.util; + +import javax.annotation.Nullable; + +import com.google.common.base.Function; + +/** + * A function which simply casts from the source type to the target type. + * + * @author Nils Christian Ehmke + * + * @param <S> + * The source type. + * @param <T> + * The target type. + */ +public class SimpleCastFunction<S, T> implements Function<S, T> { + + /** + * Default constructor. + */ + public SimpleCastFunction() { + // No code necessary + } + + @SuppressWarnings("unchecked") + @Override + @Nullable + public T apply(@Nullable final S elem) { + return (T) elem; + } + +} diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java index 98b54dd29428278c42f011a55a5cbdd0fabef819..ec59a5855acfaa1985fe3061d23e3ba354e41f62 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java @@ -24,8 +24,8 @@ import kieker.analysis.AnalysisController.STATE; import kieker.analysis.model.analysisMetaModel.MIProject; import kieker.webgui.common.ClassAndMethodContainer; import kieker.webgui.common.exception.AnalysisInitializationException; -import kieker.webgui.common.exception.InvalidAnalysisStateException; import kieker.webgui.common.exception.DisplayNotFoundException; +import kieker.webgui.common.exception.InvalidAnalysisStateException; import kieker.webgui.common.exception.NewerProjectException; import kieker.webgui.common.exception.ProjectAlreadyExistingException; import kieker.webgui.common.exception.ProjectNotExistingException; diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java index 4667d78ba347aa466afe9d9a8b17c0c4d7ad6305..36d71100c3c580788f0ad75de53a91861b846db8 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java @@ -26,8 +26,8 @@ import kieker.analysis.AnalysisController.STATE; import kieker.analysis.model.analysisMetaModel.MIProject; import kieker.webgui.common.ClassAndMethodContainer; import kieker.webgui.common.exception.AnalysisInitializationException; -import kieker.webgui.common.exception.InvalidAnalysisStateException; import kieker.webgui.common.exception.DisplayNotFoundException; +import kieker.webgui.common.exception.InvalidAnalysisStateException; import kieker.webgui.common.exception.NewerProjectException; import kieker.webgui.common.exception.ProjectAlreadyExistingException; import kieker.webgui.common.exception.ProjectNotExistingException; diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java index 7b5bb12a770e41b12b49af027ecc6541079edac6..afc376759a357088401959c53e1734872154d197 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java @@ -20,8 +20,8 @@ import java.util.concurrent.ConcurrentHashMap; import kieker.analysis.AnalysisController.STATE; import kieker.webgui.common.exception.AnalysisInitializationException; -import kieker.webgui.common.exception.InvalidAnalysisStateException; import kieker.webgui.common.exception.DisplayNotFoundException; +import kieker.webgui.common.exception.InvalidAnalysisStateException; import kieker.webgui.common.exception.ProjectNotExistingException; import kieker.webgui.persistence.IProjectDAO; diff --git a/Kieker.WebGUI/src/test/java/kieker/webgui/persistence/impl/util/PluginFinderTest.java b/Kieker.WebGUI/src/test/java/kieker/webgui/persistence/impl/util/PluginFinderTest.java index 958d1d3cb850ce9cacbc49dfe04d849cad98facd..b8de9c4bb2fce4dc481cd16516844e5315a4b3ee 100644 --- a/Kieker.WebGUI/src/test/java/kieker/webgui/persistence/impl/util/PluginFinderTest.java +++ b/Kieker.WebGUI/src/test/java/kieker/webgui/persistence/impl/util/PluginFinderTest.java @@ -18,7 +18,7 @@ package kieker.webgui.persistence.impl.util; import java.io.IOException; import java.net.URL; -import java.util.List; +import java.util.Collection; import org.junit.Assert; import org.junit.Test; @@ -55,9 +55,9 @@ public class PluginFinderTest { final ClassAndMethodContainer classAndMethodContainer = new ClassAndMethodContainer(classLoader); try { - final List<Class<AbstractFilterPlugin>> filters = pluginFinder.getAllFiltersWithinJar(kiekerURL, classLoader, classAndMethodContainer); - final List<Class<AbstractReaderPlugin>> readers = pluginFinder.getAllReadersWithinJar(kiekerURL, classLoader, classAndMethodContainer); - final List<Class<AbstractRepository>> repositories = pluginFinder.getAllRepositoriesWithinJar(kiekerURL, classLoader, classAndMethodContainer); + final Collection<Class<AbstractFilterPlugin>> filters = pluginFinder.getAllFiltersWithinJar(kiekerURL, classLoader, classAndMethodContainer); + final Collection<Class<AbstractReaderPlugin>> readers = pluginFinder.getAllReadersWithinJar(kiekerURL, classLoader, classAndMethodContainer); + final Collection<Class<AbstractRepository>> repositories = pluginFinder.getAllRepositoriesWithinJar(kiekerURL, classLoader, classAndMethodContainer); // There should be at least one element of both types Assert.assertFalse("No filters found.", filters.isEmpty());