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>

Reply via email to