diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/DependencyMetricsTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/DependencyMetricsTest.java index ec801f807..63f37ee67 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/DependencyMetricsTest.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/DependencyMetricsTest.java @@ -83,16 +83,16 @@ public class DependencyMetricsTest final String name = "org.apache.myrmidon.launcher"; final JavaPackage javaPackage = jDepend.getPackage( name ); - final Collection afferentSet = javaPackage.getAfferents(); - final Iterator afferents = afferentSet.iterator(); + final Collection efferentSet = javaPackage.getEfferents(); + final Iterator afferents = efferentSet.iterator(); while( afferents.hasNext() ) { - final JavaPackage afferent = (JavaPackage)afferents.next(); - final String afferentName = afferent.getName(); - if( !afferentName.startsWith( name ) ) + final JavaPackage efferent = (JavaPackage)afferents.next(); + final String efferentName = efferent.getName(); + if( ! isSubPackage( name, efferentName ) ) { fail( "The launcher package " + name + " depends on external classes " + - "contained in " + afferentName + ". No classes besides " + + "contained in " + efferentName + ". No classes besides " + "those in the launcher hierarchy should be referenced" ); } } @@ -113,22 +113,35 @@ public class DependencyMetricsTest { final JavaPackage javaPackage = (JavaPackage)packages.next(); final String name = javaPackage.getName(); - final String componentPackage = "org.apache.myrmidon.component."; + final String componentPackage = "org.apache.myrmidon.components."; if( !name.startsWith( componentPackage ) ) { continue; } + + // Extract the component package final int start = componentPackage.length() + 1; final int end = name.indexOf( '.', start ); - final String component = name.substring( end ); + final String component; + if( end > -1 ) + { + component = name.substring( end ); + } + else + { + component = name; + } + // Make sure that all the afferent packages of this package (i.e. + // those that refer to this package) are sub-packages of the + // component package final Collection afferentSet = javaPackage.getAfferents(); final Iterator afferents = afferentSet.iterator(); while( afferents.hasNext() ) { final JavaPackage efferent = (JavaPackage)afferents.next(); final String efferentName = efferent.getName(); - if( !efferentName.startsWith( component ) ) + if( !isSubPackage( component, efferentName ) ) { fail( "The package " + name + " is referred to by classes " + "contained in " + efferentName + ". No classes besides " + @@ -237,7 +250,7 @@ public class DependencyMetricsTest { final JavaPackage javaPackage = (JavaPackage)packages.next(); final String name = javaPackage.getName(); - if( !name.startsWith( packageName ) ) + if( !isSubPackage( packageName, name ) ) { continue; } @@ -251,7 +264,7 @@ public class DependencyMetricsTest for( int i = 0; i < invalidEfferents.length; i++ ) { final String other = invalidEfferents[ i ]; - if( efferentName.startsWith( other ) ) + if( isSubPackage( other, efferentName ) ) { fail( "The package " + name + " has an unwanted dependency " + "on classes contained in " + efferentName ); @@ -260,4 +273,21 @@ public class DependencyMetricsTest } } } + + /** + * Determines if a package is a sub-package of another package. + * + * @return true if subpackage is either the same package as + * basePackage, or a sub-package of it. + */ + private boolean isSubPackage( final String basePackage, + final String subpackage ) + { + if( ! subpackage.startsWith( basePackage ) ) + { + return false; + } + return ( subpackage.length() == basePackage.length() + || subpackage.charAt( basePackage.length() ) == '.' ); + } } diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java index ec801f807..63f37ee67 100644 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java @@ -83,16 +83,16 @@ public class DependencyMetricsTest final String name = "org.apache.myrmidon.launcher"; final JavaPackage javaPackage = jDepend.getPackage( name ); - final Collection afferentSet = javaPackage.getAfferents(); - final Iterator afferents = afferentSet.iterator(); + final Collection efferentSet = javaPackage.getEfferents(); + final Iterator afferents = efferentSet.iterator(); while( afferents.hasNext() ) { - final JavaPackage afferent = (JavaPackage)afferents.next(); - final String afferentName = afferent.getName(); - if( !afferentName.startsWith( name ) ) + final JavaPackage efferent = (JavaPackage)afferents.next(); + final String efferentName = efferent.getName(); + if( ! isSubPackage( name, efferentName ) ) { fail( "The launcher package " + name + " depends on external classes " + - "contained in " + afferentName + ". No classes besides " + + "contained in " + efferentName + ". No classes besides " + "those in the launcher hierarchy should be referenced" ); } } @@ -113,22 +113,35 @@ public class DependencyMetricsTest { final JavaPackage javaPackage = (JavaPackage)packages.next(); final String name = javaPackage.getName(); - final String componentPackage = "org.apache.myrmidon.component."; + final String componentPackage = "org.apache.myrmidon.components."; if( !name.startsWith( componentPackage ) ) { continue; } + + // Extract the component package final int start = componentPackage.length() + 1; final int end = name.indexOf( '.', start ); - final String component = name.substring( end ); + final String component; + if( end > -1 ) + { + component = name.substring( end ); + } + else + { + component = name; + } + // Make sure that all the afferent packages of this package (i.e. + // those that refer to this package) are sub-packages of the + // component package final Collection afferentSet = javaPackage.getAfferents(); final Iterator afferents = afferentSet.iterator(); while( afferents.hasNext() ) { final JavaPackage efferent = (JavaPackage)afferents.next(); final String efferentName = efferent.getName(); - if( !efferentName.startsWith( component ) ) + if( !isSubPackage( component, efferentName ) ) { fail( "The package " + name + " is referred to by classes " + "contained in " + efferentName + ". No classes besides " + @@ -237,7 +250,7 @@ public class DependencyMetricsTest { final JavaPackage javaPackage = (JavaPackage)packages.next(); final String name = javaPackage.getName(); - if( !name.startsWith( packageName ) ) + if( !isSubPackage( packageName, name ) ) { continue; } @@ -251,7 +264,7 @@ public class DependencyMetricsTest for( int i = 0; i < invalidEfferents.length; i++ ) { final String other = invalidEfferents[ i ]; - if( efferentName.startsWith( other ) ) + if( isSubPackage( other, efferentName ) ) { fail( "The package " + name + " has an unwanted dependency " + "on classes contained in " + efferentName ); @@ -260,4 +273,21 @@ public class DependencyMetricsTest } } } + + /** + * Determines if a package is a sub-package of another package. + * + * @return true if subpackage is either the same package as + * basePackage, or a sub-package of it. + */ + private boolean isSubPackage( final String basePackage, + final String subpackage ) + { + if( ! subpackage.startsWith( basePackage ) ) + { + return false; + } + return ( subpackage.length() == basePackage.length() + || subpackage.charAt( basePackage.length() ) == '.' ); + } }