You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2009/04/28 10:25:39 UTC

svn commit: r769285 - in /felix/sandbox/clement/Project-Checker: ./ src/org/apache/felix/project/checker/

Author: clement
Date: Tue Apr 28 08:25:38 2009
New Revision: 769285

URL: http://svn.apache.org/viewvc?rev=769285&view=rev
Log:
Add Java import checker

Added:
    felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JavaImportChecker.java
Modified:
    felix/sandbox/clement/Project-Checker/README.txt
    felix/sandbox/clement/Project-Checker/project-checker.jar
    felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java
    felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Project.java
    felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/UsedLicenseChecker.java

Modified: felix/sandbox/clement/Project-Checker/README.txt
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/README.txt?rev=769285&r1=769284&r2=769285&view=diff
==============================================================================
--- felix/sandbox/clement/Project-Checker/README.txt (original)
+++ felix/sandbox/clement/Project-Checker/README.txt Tue Apr 28 08:25:38 2009
@@ -68,6 +68,20 @@
  -d ~/workspaces/felix-trunk/ipojo/arch/ 
  -n org.apache.felix.ipojo.arch 
  -v 1.3.0-SNAPSHOT
+ 
+ java \
+	 -cp bin:libs/commons-cli-1.1.jar:libs/commons-collections-3.2.1.jar:libs/commons-lang-2.4.jar:libs/dom4j-1.6.1.jar:libs/apache-rat-0.7-SNAPSHOT.jar:libs/apache-rat-core-0.7-SNAPSHOT.jar \
+	 org.apache.felix.project.checker.Project \
+	 -n org.apache.felix.main \
+	 -v 1.6.1 \
+	 -u http://people.apache.org/~pauls/1.6.1/
+	 
+  java \
+ 	-cp bin:libs/commons-cli-1.1.jar:libs/commons-collections-3.2.1.jar:libs/commons-lang-2.4.jar:libs/dom4j-1.6.1.jar:libs/apache-rat-0.7-SNAPSHOT.jar:libs/apache-rat-core-0.7-SNAPSHOT.jar \
+	 org.apache.felix.project.checker.Project \
+	 -n org.apache.felix.framework \
+	 -v 1.6.1 \
+	 -u http://people.apache.org/~pauls/1.6.1/
  	
 
 C] Release Mode
@@ -100,3 +114,4 @@
 - Changelog checker should see if all Jira issues are mentioned
 - Changelog checker should checks that the changelog contains an entry for the current version
 - Allow to write the report in a file (right know, output can be redirected)
+- Nexus support

Modified: felix/sandbox/clement/Project-Checker/project-checker.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/project-checker.jar?rev=769285&r1=769284&r2=769285&view=diff
==============================================================================
Binary files - no diff available.

Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JavaImportChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JavaImportChecker.java?rev=769285&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JavaImportChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JavaImportChecker.java Tue Apr 28 08:25:38 2009
@@ -0,0 +1,170 @@
+package org.apache.felix.project.checker;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class JavaImportChecker implements Checker {
+    
+    Project project;
+    List<String> packages;
+    
+    public static final String IMPORT_STATEMENT = "import (static )?(.*);";
+    public static final Pattern IMPORT_STATEMENT_PATTERN = Pattern.compile(IMPORT_STATEMENT); 
+
+
+    public void check() throws Exception {
+        check(packages);
+    }
+
+    public void clean() { }
+
+    public String getCheckerName() {
+        return "Java Import Checker";
+    }
+
+    public boolean prepare(Project release) throws Exception {
+        project = release;
+        
+        File root = project.getProjectRoot();
+        List<File> classes = new ArrayList<File>();
+        traverse(root, classes);
+        
+        packages = analyse(classes);
+        filter(packages);
+        
+        System.out.println(packages);
+        
+        return ! packages.isEmpty();
+        
+    }
+
+    private void filter(List<String> packages) {
+        List<String> toRemove = new ArrayList<String>();
+        
+        // Remove everything beginning by java.
+        for (String s: packages) {
+            if (s.startsWith("java.")) {
+                toRemove.add(s);
+            }
+        }
+        
+        // Remove inner classes references
+        for (String s : packages) {
+            int index = s.lastIndexOf('.');
+            int c = s.charAt(index + 1);
+            // if c is a UPPERCASE
+            if (Character.isUpperCase(c)) {
+                toRemove.add(s);
+            }
+        }
+        
+        packages.removeAll(toRemove);
+        
+        // Remove ignored packages
+        packages.removeAll(Utils.ignoredPackages(project));
+        
+    }
+
+    private List<String> analyse(List<File> classes) throws IOException {
+        List<String> packages = new ArrayList<String>();
+        Set<String> set = new HashSet<String>();
+        for (File classe : classes) {
+            BufferedReader input =  new BufferedReader(new FileReader(classe));
+
+            String line = null;
+            while (( line = input.readLine()) != null) {
+                Matcher matcher = IMPORT_STATEMENT_PATTERN.matcher(line);
+                if (matcher.matches()) {
+                    // It's an import statement.
+                    String clause = matcher.group(2);
+                    if (clause.endsWith("*")) {
+                        set.add(clause.substring(0, clause.length() - 2));
+                    } else {
+                        int index = clause.lastIndexOf('.');
+                        set.add(clause.substring(0, index));
+                    }
+                }
+            }
+        }
+        
+        packages.addAll(set);
+        return packages;
+    }
+    
+    private void check(List<String> referred) {
+        List<String> toRemove = new ArrayList<String>();
+        for (String s : referred) {
+            if (toRemove.contains(s)) {
+                continue; // Already checked.
+            }
+
+            License checker = getLicenseByPrefix(s);
+
+            if (checker != null) {
+                try {
+                    License found = getLicenseByKeyword(checker.getKeyword());
+                    checker.check(this, project, found);
+                    // Remove package.
+                    for (String x : referred) {
+                        if (x.startsWith(s)) {
+                            toRemove.add(x);
+                        }
+                    }
+                } catch (Exception e) {
+                    project.error(this, "Java Import Clause does not have an appropriate licence " + s, e.getMessage());
+                }
+            }
+            
+        }
+        referred.removeAll(toRemove);
+    }
+    
+    public License getLicenseByPrefix(String packagename) {
+        for (License checker : project.getKnownLicense()) {
+            for (int i = 0; i < checker.getPackages().length; i++) {
+                if (packagename.startsWith(checker.getPackages()[i])) {
+                    return checker;
+                }
+            }
+            
+        }
+        return null;
+    }
+    
+    public License getLicenseByKeyword(String key) {
+        Notice notice = project.getNotice();
+        License found = null;
+        List<License> lics = notice.getAll();
+        for (License lic : lics) {
+            if (lic.getText().contains(key)) {
+                if (found == null) {
+                    found = lic;
+                }
+            } 
+        }
+        return found;
+    }
+
+    private void traverse(File dir, List<File> classes) {
+        File[] files = dir.listFiles();
+        for (int i = 0;i < files.length; i++) {
+            if (files[i].isDirectory()  && ! files[i].getAbsolutePath().contains("/test/")) { // Ignore test folder
+                traverse(files[i], classes);
+            } else {
+                if (files[i].getName().endsWith(".java")) {
+                    classes.add(files[i]);
+                }
+            }
+        }
+        
+    }
+
+}

Modified: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java?rev=769285&r1=769284&r2=769285&view=diff
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java (original)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java Tue Apr 28 08:25:38 2009
@@ -33,6 +33,13 @@
     public List<License> getUsed() {
         return used;
     }
+    
+    public List<License> getAll() {
+        List<License> licences = new ArrayList<License>();
+        licences.addAll(included);
+        licences.addAll(used);
+        return licences;
+    }
 
     public List<String> getSummary() {
         return summary;

Modified: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Project.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Project.java?rev=769285&r1=769284&r2=769285&view=diff
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Project.java (original)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Project.java Tue Apr 28 08:25:38 2009
@@ -103,6 +103,8 @@
         checkers.add(new IncludedApacheLicence());
         checkers.add(new IncludedLicenseChecker());
         checkers.add(new UsedLicenseChecker());
+        checkers.add(new JavaImportChecker());
+
 
         
         // if release mode, create the temporary directory

Modified: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/UsedLicenseChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/UsedLicenseChecker.java?rev=769285&r1=769284&r2=769285&view=diff
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/UsedLicenseChecker.java (original)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/UsedLicenseChecker.java Tue Apr 28 08:25:38 2009
@@ -120,6 +120,10 @@
     
     private void processImports(String imports) {
         // Remove '\n'
+        if (imports == null) {
+            packages = new ArrayList<String>();
+            return;
+        }
         imports = imports.replaceAll("\n", "");
         // Remove spaces
         imports = imports.replaceAll(" ", "");
@@ -158,8 +162,6 @@
         // Remove ignored packages
         packages.removeAll(Utils.ignoredPackages(release));
         
-        
-        
     }
 
 }