This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to annotated tag japicmp-base-0.0.2 in repository https://gitbox.apache.org/repos/asf/commons-vfs.git
commit 011113427ed30cf63447258f73e284da34d9ea56 Author: siom79 <[email protected]> AuthorDate: Sat Oct 5 19:36:36 2013 +0200 added new feature package filter (new cli option) --- README.md | 5 +- .../java/japicmp/test/packageOne/PackageOne.java | 4 + .../java/japicmp/test/packageTwo/PackageTwo.java | 4 + .../java/japicmp/test/packageOne/PackageOne.java | 4 + .../java/japicmp/test/packageTwo/PackageTwo.java | 4 + japicmp-testbase/japicmp-test/pom.xml | 4 + .../src/test/java/japicmp/test/BasicTest.java | 2 +- .../test/java/japicmp/test/PackageFilterTest.java | 96 ++++++++++++++++++++++ japicmp/pom.xml | 15 ---- japicmp/src/main/java/japicmp/JApiCmp.java | 53 ++++++++---- japicmp/src/main/java/japicmp/cli/CliParser.java | 54 +++++++++--- .../java/japicmp/cmp/JarArchiveComparator.java | 22 ++++- .../japicmp/cmp/JarArchiveComparatorOptions.java | 8 +- .../src/main/java/japicmp/cmp/PackageFilter.java | 18 ++++ japicmp/src/main/java/japicmp/config/Options.java | 24 ++++-- .../java/japicmp/exception/JApiCmpException.java | 22 +++++ .../test/java/japicmp/cmp/PackageFilterTest.java | 44 ++++++++++ pom.xml | 40 +++++++-- 18 files changed, 362 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 27f33b2..445b87b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ japicmp is a tool to compare two versions of a jar archive: java -jar japicmp-0.0.1.jar -n new-version.jar -o old-version.jar -It can also be used as a library to integrate its functionality in some other kind of software: +It can also be used as a library: JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(); List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive); @@ -29,6 +29,7 @@ library to inspect the class files. This way you only have to provide the two ja * Differences can optionally be printed to an xml file. This can be transformed to an HTML file using XSLT. * Per default only public classes and class members are compared. If necessary, the access modifier of the classes and class members to be compared can be set to package, protected or private. +* Per default classes from all packages are compared. If necessary, certain packages can be excluded or only specific packages can be included. ##Usage## @@ -39,6 +40,8 @@ The tool has a set of CLI parameters that are described in the following: -n <pathToNewVersionJar> Provides the path to the new version of the jar. -x <pathToXmlOutputFile> Provides the path to the xml output file. If not given, stdout is used. -a <accessModifier> Sets the access modifier level (public, package, protected, private), which should be used. + -i <packagesToInclude> Comma separated list of package names to include, * can be used as wildcard. + -e <packagesToExclude> Comma separated list of package names to exclude, * can be used as wildcard. -m Outputs only modified classes/methods. If not given, all classes and methods are printed. ###Example### diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java new file mode 100644 index 0000000..de59dc7 --- /dev/null +++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java @@ -0,0 +1,4 @@ +package japicmp.test.packageOne; + +public class PackageOne { +} diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java new file mode 100644 index 0000000..1ac7fef --- /dev/null +++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java @@ -0,0 +1,4 @@ +package japicmp.test.packageTwo; + +public class PackageTwo { +} diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java new file mode 100644 index 0000000..de59dc7 --- /dev/null +++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java @@ -0,0 +1,4 @@ +package japicmp.test.packageOne; + +public class PackageOne { +} diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java new file mode 100644 index 0000000..1ac7fef --- /dev/null +++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java @@ -0,0 +1,4 @@ +package japicmp.test.packageTwo; + +public class PackageTwo { +} diff --git a/japicmp-testbase/japicmp-test/pom.xml b/japicmp-testbase/japicmp-test/pom.xml index 5507774..309a32f 100644 --- a/japicmp-testbase/japicmp-test/pom.xml +++ b/japicmp-testbase/japicmp-test/pom.xml @@ -64,6 +64,10 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>cobertura-maven-plugin</artifactId> + </plugin> </plugins> </build> </project> \ No newline at end of file diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java index c02ea3a..11d69a3 100644 --- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java +++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java @@ -21,7 +21,7 @@ public class BasicTest { public void test() { JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions()); List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); - assertThat(jApiClasses.size(), is(5)); + assertThat(jApiClasses.size(), is(7)); JApiClass jApiClassRemoved = getJApiClass(jApiClasses, Removed.class.getName()); JApiClass jApiClassAdded = getJApiClass(jApiClasses, Added.class.getName()); JApiClass jApiClassUnchanged = getJApiClass(jApiClasses, Unchanged.class.getName()); diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java new file mode 100644 index 0000000..7ee3c80 --- /dev/null +++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java @@ -0,0 +1,96 @@ +package japicmp.test; + +import japicmp.cmp.JarArchiveComparator; +import japicmp.cmp.JarArchiveComparatorOptions; +import japicmp.cmp.PackageFilter; +import japicmp.model.JApiClass; +import japicmp.test.packageOne.PackageOne; +import japicmp.test.packageTwo.PackageTwo; +import org.junit.Test; + +import java.util.List; + +import static japicmp.test.util.Helper.getArchive; +import static japicmp.test.util.Helper.getJApiClass; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class PackageFilterTest { + + @Test + public void onlyIncludeOnePackage() { + JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); + options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne")); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); + List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); + getJApiClass(jApiClasses, PackageOne.class.getName()); + assertThat(jApiClasses.size(), is(1)); + } + + @Test + public void onlyIncludeTwoPackages() { + JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); + options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne")); + options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageTwo")); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); + List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); + getJApiClass(jApiClasses, PackageOne.class.getName()); + getJApiClass(jApiClasses, PackageTwo.class.getName()); + assertThat(jApiClasses.size(), is(2)); + } + + @Test + public void onlyExcludeOnePackage() { + JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); + options.getPackagesExclude().add(new PackageFilter("japicmp.test.packageOne")); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); + final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); + assertThatExceptionIsThrown(new Callback() { + public void callback() { + getJApiClass(jApiClasses, PackageOne.class.getName()); + } + }); + } + + @Test + public void excludePackageJapicmpTest() { + JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); + options.getPackagesExclude().add(new PackageFilter("japicmp.test")); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); + final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); + assertThat(jApiClasses.size(), is(0)); + } + + @Test + public void includePackageJapicmpTest() { + JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); + options.getPackagesInclude().add(new PackageFilter("japicmp.test")); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); + final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); + assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue())); + } + + @Test + public void includePackageOneWithWildcard() { + JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); + options.getPackagesInclude().add(new PackageFilter("japicmp.*.packageOne")); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); + final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); + assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue())); + } + + private interface Callback { + void callback(); + } + + private void assertThatExceptionIsThrown(Callback callback) { + boolean exception = false; + try { + callback.callback(); + } catch (Exception e) { + exception = true; + } + assertThat(exception, is(true)); + } +} diff --git a/japicmp/pom.xml b/japicmp/pom.xml index e6725b0..76844b6 100644 --- a/japicmp/pom.xml +++ b/japicmp/pom.xml @@ -32,21 +32,6 @@ <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> - <version>2.5.2</version> - <configuration> - <formats> - <format>html</format> - </formats> - </configuration> - <executions> - <execution> - <phase>verify</phase> - <goals> - <goal>clean</goal> - <goal>cobertura</goal> - </goals> - </execution> - </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> diff --git a/japicmp/src/main/java/japicmp/JApiCmp.java b/japicmp/src/main/java/japicmp/JApiCmp.java index 6d55a17..14a59ec 100644 --- a/japicmp/src/main/java/japicmp/JApiCmp.java +++ b/japicmp/src/main/java/japicmp/JApiCmp.java @@ -4,6 +4,7 @@ import japicmp.cli.CliParser; import japicmp.cmp.JarArchiveComparator; import japicmp.cmp.JarArchiveComparatorOptions; import japicmp.config.Options; +import japicmp.exception.JApiCmpException; import japicmp.model.JApiClass; import japicmp.output.OutputTransformer; import japicmp.output.stdout.StdoutOutputGenerator; @@ -15,18 +16,41 @@ import java.util.List; public class JApiCmp { public static void main(String[] args) { + try { + JApiCmp app = new JApiCmp(); + app.run(args); + } catch (JApiCmpException e) { + if (e.getReason() != JApiCmpException.Reason.NormalTermination) { + System.err.println(e.getMessage()); + System.exit(-1); + } + } catch (Exception e) { + System.err.println(String.format("Execution of %s failed: %s", JApiCmp.class.getSimpleName(), e.getMessage())); + System.exit(-2); + } + } + + private void run(String[] args) { Options options = parseCliOptions(args); File oldArchive = new File(options.getOldArchive()); File newArchive = new File(options.getNewArchive()); verifyFilesExist(oldArchive, newArchive); - JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions()); + JarArchiveComparatorOptions comparatorOptions = new JarArchiveComparatorOptions(); + copyOptions(options, comparatorOptions); + JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(comparatorOptions); List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive); generateOutput(options, oldArchive, newArchive, jApiClasses); } - private static void generateOutput(Options options, File oldArchive, File newArchive, List<JApiClass> jApiClasses) { + private void copyOptions(Options options, JarArchiveComparatorOptions comparatorOptions) { + comparatorOptions.setModifierLevel(options.getAccessModifier()); + comparatorOptions.getPackagesInclude().addAll(options.getPackagesInclude()); + comparatorOptions.getPackagesExclude().addAll(options.getPackagesExclude()); + } + + private void generateOutput(Options options, File oldArchive, File newArchive, List<JApiClass> jApiClasses) { OutputTransformer.sortClassesAndMethods(jApiClasses); - if(options.getXmlOutputFile().isPresent()) { + if (options.getXmlOutputFile().isPresent()) { XmlOutputGenerator xmlGenerator = new XmlOutputGenerator(); xmlGenerator.generate(oldArchive, newArchive, jApiClasses, options); } @@ -35,28 +59,29 @@ public class JApiCmp { System.out.println(output); } - private static Options parseCliOptions(String[] args) { + private Options parseCliOptions(String[] args) { try { CliParser cliParser = new CliParser(); return cliParser.parse(args); } catch (IllegalArgumentException e) { - System.err.println(e.getMessage()); - System.exit(-1); + throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, e.getMessage()); } catch (Exception e) { - System.err.println("Failed to parse command line options: " + e.getMessage()); - System.exit(-1); + throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Failed to parse command line options: " + e.getMessage()); } - return new Options(); } - private static void verifyFilesExist(File oldArchive, File newArchive) { + private void verifyFilesExist(File oldArchive, File newArchive) { if (!oldArchive.exists()) { - System.err.println(String.format("File '%s' does not exist.", oldArchive.getAbsolutePath())); - System.exit(-1); + String msg = String.format("File '%s' does not exist.", oldArchive.getAbsolutePath()); + throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg); } if (!newArchive.exists()) { - System.err.println(String.format("File '%s' does not exist.", newArchive.getAbsolutePath())); - System.exit(-1); + String msg = String.format("File '%s' does not exist.", newArchive.getAbsolutePath()); + throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg); + } + if(oldArchive.equals(newArchive)) { + String msg = String.format("Files '%s' and '%s' are the same.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath()); + throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg); } } } diff --git a/japicmp/src/main/java/japicmp/cli/CliParser.java b/japicmp/src/main/java/japicmp/cli/CliParser.java index db1e287..83ae01e 100644 --- a/japicmp/src/main/java/japicmp/cli/CliParser.java +++ b/japicmp/src/main/java/japicmp/cli/CliParser.java @@ -2,7 +2,9 @@ package japicmp.cli; import com.google.common.base.Optional; import japicmp.cmp.AccessModifier; +import japicmp.cmp.PackageFilter; import japicmp.config.Options; +import japicmp.exception.JApiCmpException; import japicmp.util.StringArrayEnumeration; public class CliParser { @@ -27,30 +29,60 @@ public class CliParser { if ("-m".equals(arg)) { options.setOutputOnlyModifications(true); } - if ("-h".equals(arg)) { - System.out.println("Available parameters:"); - System.out.println("-h Prints this help."); - System.out.println("-o <pathToOldVersionJar> Provides the path to the old version of the jar."); - System.out.println("-n <pathToNewVersionJar> Provides the path to the new version of the jar."); - System.out.println("-x <pathToXmlOutputFile> Provides the path to the xml output file. If not given, stdout is used."); - System.out.println("-a <accessModifier> Sets the access modifier level (public, package, protected, private), which should be used."); - System.out.println("-m Outputs only modified classes/methods. If not given, all classes and methods are printed."); - System.exit(0); - } if ("-a".equals(arg)) { String accessModifierArg = getOptionWithArgument("-a", sae); try { AccessModifier accessModifier = AccessModifier.valueOf(accessModifierArg.toUpperCase()); - options.setAcessModifier(accessModifier); + options.setAccessModifier(accessModifier); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(String.format("Invalid value for option -a: %s. Possible values are: %s.", accessModifierArg, listOfAccessModifiers())); } } + if ("-i".equals(arg)) { + String packagesIncludeArg = getOptionWithArgument("-i", sae); + String[] parts = packagesIncludeArg.split(","); + for (String part : parts) { + part = part.trim(); + try { + options.getPackagesInclude().add(new PackageFilter(part)); + } catch (Exception e) { + throw new IllegalArgumentException(String.format("Wrong syntax for include option '%s': %s", part, e.getMessage())); + } + } + } + if ("-e".equals(arg)) { + String packagesExcludeArg = getOptionWithArgument("-e", sae); + String[] parts = packagesExcludeArg.split(","); + for (String part : parts) { + part = part.trim(); + try { + options.getPackagesInclude().add(new PackageFilter(part)); + } catch (Exception e) { + throw new IllegalArgumentException(String.format("Wrong syntax for exclude option '%s': %s", part, e.getMessage())); + } + } + } + if ("-h".equals(arg)) { + printHelp(); + } } checkForMandatoryOptions(options); return options; } + private void printHelp() { + System.out.println("Available parameters:"); + System.out.println("-h Prints this help."); + System.out.println("-o <pathToOldVersionJar> Provides the path to the old version of the jar."); + System.out.println("-n <pathToNewVersionJar> Provides the path to the new version of the jar."); + System.out.println("-x <pathToXmlOutputFile> Provides the path to the xml output file. If not given, stdout is used."); + System.out.println("-a <accessModifier> Sets the access modifier level (public, package, protected, private), which should be used."); + System.out.println("-i <packagesToInclude> Comma separated list of package names to include, * can be used as wildcard."); + System.out.println("-e <packagesToExclude> Comma separated list of package names to exclude, * can be used as wildcard."); + System.out.println("-m Outputs only modified classes/methods. If not given, all classes and methods are printed."); + throw new JApiCmpException(JApiCmpException.Reason.NormalTermination); + } + private void checkForMandatoryOptions(Options options) { if (options.getOldArchive() == null || options.getOldArchive().length() == 0) { throw new IllegalArgumentException("Missing option for old version: -o <pathToOldVersionJar>"); diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java index 3dbdda4..af1a0e0 100644 --- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java +++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java @@ -4,7 +4,6 @@ import japicmp.model.JApiClass; import japicmp.util.ModifierHelper; import javassist.ClassPool; import javassist.CtClass; -import javassist.Modifier; import org.apache.log4j.Logger; import java.io.File; @@ -72,7 +71,7 @@ public class JarArchiveComparator { logger.error(String.format("Failed to load file from jar '%s' as class file: %s.", name, e.getMessage())); throw e; } - if(ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel())) { + if (ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel()) && packageMatches(options, ctClass)) { classes.add(ctClass); } if (logger.isDebugEnabled()) { @@ -89,4 +88,23 @@ public class JarArchiveComparator { } return classes; } + + private boolean packageMatches(JarArchiveComparatorOptions options, CtClass ctClass) { + String packageName = ctClass.getPackageName(); + for (PackageFilter packageFilter : options.getPackagesInclude()) { + if (packageFilter.matches(packageName)) { + return true; + } + } + for (PackageFilter packageFilter : options.getPackagesExclude()) { + if (packageFilter.matches(packageName)) { + return false; + } + } + int noInclude = options.getPackagesInclude().size(); + if (noInclude > 0) { + return false; + } + return true; + } } diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java index cd2a328..d30d03e 100644 --- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java +++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java @@ -4,15 +4,15 @@ import java.util.LinkedList; import java.util.List; public class JarArchiveComparatorOptions { - private List<String> packagesInclude = new LinkedList<String>(); - private List<String> packagesExclude = new LinkedList<String>(); + private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>(); + private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>(); private AccessModifier modifierLevel = AccessModifier.PUBLIC; - public List<String> getPackagesExclude() { + public List<PackageFilter> getPackagesExclude() { return packagesExclude; } - public List<String> getPackagesInclude() { + public List<PackageFilter> getPackagesInclude() { return packagesInclude; } diff --git a/japicmp/src/main/java/japicmp/cmp/PackageFilter.java b/japicmp/src/main/java/japicmp/cmp/PackageFilter.java new file mode 100644 index 0000000..0045c22 --- /dev/null +++ b/japicmp/src/main/java/japicmp/cmp/PackageFilter.java @@ -0,0 +1,18 @@ +package japicmp.cmp; + +import java.util.regex.Pattern; + +public class PackageFilter { + private final Pattern pattern; + + public PackageFilter(String packageName) { + String regEx = packageName.replace(".", "\\."); + regEx = regEx.replace("*", ".*"); + regEx = regEx + "(\\.[^\\.]+)*"; + pattern = Pattern.compile(regEx); + } + + public boolean matches(String str) { + return pattern.matcher(str).matches(); + } +} diff --git a/japicmp/src/main/java/japicmp/config/Options.java b/japicmp/src/main/java/japicmp/config/Options.java index 6337fac..b4e46b8 100644 --- a/japicmp/src/main/java/japicmp/config/Options.java +++ b/japicmp/src/main/java/japicmp/config/Options.java @@ -2,13 +2,19 @@ package japicmp.config; import com.google.common.base.Optional; import japicmp.cmp.AccessModifier; +import japicmp.cmp.PackageFilter; + +import java.util.LinkedList; +import java.util.List; public class Options { private String oldArchive; private String newArchive; private boolean outputOnlyModifications = false; private Optional<String> xmlOutputFile = Optional.<String>absent(); - private AccessModifier acessModifier = AccessModifier.PUBLIC; + private AccessModifier accessModifier = AccessModifier.PUBLIC; + private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>(); + private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>(); public String getNewArchive() { return newArchive; @@ -42,11 +48,19 @@ public class Options { this.xmlOutputFile = xmlOutputFile; } - public void setAcessModifier(AccessModifier acessModifier) { - this.acessModifier = acessModifier; + public void setAccessModifier(AccessModifier accessModifier) { + this.accessModifier = accessModifier; + } + + public AccessModifier getAccessModifier() { + return accessModifier; + } + + public List<PackageFilter> getPackagesInclude() { + return packagesInclude; } - public AccessModifier getAcessModifier() { - return acessModifier; + public List<PackageFilter> getPackagesExclude() { + return packagesExclude; } } diff --git a/japicmp/src/main/java/japicmp/exception/JApiCmpException.java b/japicmp/src/main/java/japicmp/exception/JApiCmpException.java new file mode 100644 index 0000000..4bc8ae8 --- /dev/null +++ b/japicmp/src/main/java/japicmp/exception/JApiCmpException.java @@ -0,0 +1,22 @@ +package japicmp.exception; + +public class JApiCmpException extends RuntimeException { + private final Reason reason; + + public JApiCmpException(Reason reason) { + this.reason = reason; + } + + public enum Reason { + IllegalArgument, NormalTermination + } + + public JApiCmpException(Reason reason, String msg) { + super(msg); + this.reason = reason; + } + + public Reason getReason() { + return reason; + } +} diff --git a/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java b/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java new file mode 100644 index 0000000..8bffab9 --- /dev/null +++ b/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java @@ -0,0 +1,44 @@ +package japicmp.cmp; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class PackageFilterTest { + + @Test + public void testWithoutWildcard() { + PackageFilter pf = new PackageFilter("de.test.package"); + assertThat(pf.matches("de.test.package"), is(true)); + assertThat(pf.matches("de.test.package.packageOne"), is(true)); + assertThat(pf.matches("de.test.package."), is(false)); + assertThat(pf.matches("de.test.packag"), is(false)); + assertThat(pf.matches("de.test"), is(false)); + } + + @Test + public void testWithWildcardAfterDot() { + PackageFilter pf = new PackageFilter("de.test.package.*"); + assertThat(pf.matches("de.test.package"), is(false)); + assertThat(pf.matches("de.test.package.packageOne"), is(true)); + assertThat(pf.matches("de.test.package.packageOne.p2"), is(true)); + } + + @Test + public void testWithWildcardWithoutDot() { + PackageFilter pf = new PackageFilter("de.test.package*"); + assertThat(pf.matches("de.test.package"), is(true)); + assertThat(pf.matches("de.test.package.packageOne"), is(true)); + assertThat(pf.matches("de.test.package.packageOne.p2"), is(true)); + } + + @Test + public void testWithWildcardAndFollowingPackagename() { + PackageFilter pf = new PackageFilter("de.test.package.*.test"); + assertThat(pf.matches("de.test.package"), is(false)); + assertThat(pf.matches("de.test.package.p.test"), is(true)); + assertThat(pf.matches("de.test.package.packageOne.test"), is(true)); + assertThat(pf.matches("de.test.package.packageOne.test2"), is(false)); + } +} diff --git a/pom.xml b/pom.xml index 6b07683..27bdf0e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>japicmp</groupId> @@ -9,13 +10,13 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <github.account>siom79</github.account> + <github.account>siom79</github.account> <cloudbees.account>siom79</cloudbees.account> </properties> <modules> <module>japicmp</module> - <module>japicmp-testbase</module> + <module>japicmp-testbase</module> </modules> <dependencies> @@ -29,7 +30,7 @@ <build> <plugins> - <plugin> + <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> @@ -85,22 +86,45 @@ </executions> </plugin> </plugins> - <extensions> + <extensions> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-webdav-jackrabbit</artifactId> <version>1.0-beta-7</version> </extension> </extensions> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>cobertura-maven-plugin</artifactId> + <version>2.5.2</version> + <configuration> + <formats> + <format>html</format> + </formats> + </configuration> + <executions> + <execution> + <phase>verify</phase> + <goals> + <goal>clean</goal> + <goal>cobertura</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </pluginManagement> </build> - + <scm> <connection>scm:git:git://github.com/${github.account}/${project.groupId}.git</connection> <developerConnection>scm:git:[email protected]:${github.account}/${project.groupId}.git</developerConnection> <url>http://github.com/${github.account}/${project.groupId}/tree/master/</url> <tag>HEAD</tag> </scm> - + <distributionManagement> <repository> <id>cloudbees-public-release</id> @@ -111,7 +135,7 @@ <url>dav:https://repository-${cloudbees.account}.forge.cloudbees.com/snapshot</url> </snapshotRepository> </distributionManagement> - + <repositories> <repository> <id>cloudbees-public-snapshot</id>
