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/08 14:30:29 UTC
svn commit: r763213 [1/2] - in /felix/sandbox/clement/Project-Checker: ./
.settings/ libs/ licenses/ src/ src/org/ src/org/apache/
src/org/apache/felix/ src/org/apache/felix/project/
src/org/apache/felix/project/checker/
Author: clement
Date: Wed Apr 8 12:30:27 2009
New Revision: 763213
URL: http://svn.apache.org/viewvc?rev=763213&view=rev
Log:
Commit the initial version of project-checker
Added:
felix/sandbox/clement/Project-Checker/
felix/sandbox/clement/Project-Checker/.classpath
felix/sandbox/clement/Project-Checker/.project
felix/sandbox/clement/Project-Checker/.settings/
felix/sandbox/clement/Project-Checker/.settings/org.eclipse.jdt.core.prefs
felix/sandbox/clement/Project-Checker/README.txt
felix/sandbox/clement/Project-Checker/config.properties
felix/sandbox/clement/Project-Checker/jardesc.jardesc
felix/sandbox/clement/Project-Checker/libs/
felix/sandbox/clement/Project-Checker/libs/apache-rat-0.7-SNAPSHOT.jar (with props)
felix/sandbox/clement/Project-Checker/libs/apache-rat-core-0.7-SNAPSHOT.jar (with props)
felix/sandbox/clement/Project-Checker/libs/commons-cli-1.1.jar (with props)
felix/sandbox/clement/Project-Checker/libs/commons-collections-3.2.1.jar (with props)
felix/sandbox/clement/Project-Checker/libs/commons-lang-2.4.jar (with props)
felix/sandbox/clement/Project-Checker/libs/dom4j-1.6.1.jar (with props)
felix/sandbox/clement/Project-Checker/licenses/
felix/sandbox/clement/Project-Checker/licenses/LICENSE.asm
felix/sandbox/clement/Project-Checker/licenses/LICENSE.kxml2
felix/sandbox/clement/Project-Checker/licenses/apache.xml
felix/sandbox/clement/Project-Checker/licenses/asm.xml
felix/sandbox/clement/Project-Checker/licenses/kxml2.xml
felix/sandbox/clement/Project-Checker/licenses/mortbay.xml
felix/sandbox/clement/Project-Checker/licenses/osgi.xml
felix/sandbox/clement/Project-Checker/project-checker.jar (with props)
felix/sandbox/clement/Project-Checker/src/
felix/sandbox/clement/Project-Checker/src/org/
felix/sandbox/clement/Project-Checker/src/org/apache/
felix/sandbox/clement/Project-Checker/src/org/apache/felix/
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/ChangelogChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Checker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Command.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/FileChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/HeaderChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedApacheLicence.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedLicenseChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarLicenseChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarNoticeChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/License.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseParser.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseSummaryChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LinkCollector.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/MD5Checker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeCopyrightChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeNameChecker.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/ProjectLicenseChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/ProjectNoticeChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Sha1Checker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/SignatureBeautifiedChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/SignatureChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/TagChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/UsedLicenseChecker.java
felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Utils.java
Added: felix/sandbox/clement/Project-Checker/.classpath
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/.classpath?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/.classpath (added)
+++ felix/sandbox/clement/Project-Checker/.classpath Wed Apr 8 12:30:27 2009
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.5.0 (MacOS X Default)"/>
+ <classpathentry kind="lib" path="libs/apache-rat-0.7-SNAPSHOT.jar"/>
+ <classpathentry kind="lib" path="libs/apache-rat-core-0.7-SNAPSHOT.jar"/>
+ <classpathentry kind="lib" path="libs/commons-cli-1.1.jar"/>
+ <classpathentry kind="lib" path="libs/commons-collections-3.2.1.jar"/>
+ <classpathentry kind="lib" path="libs/commons-lang-2.4.jar"/>
+ <classpathentry kind="lib" path="libs/dom4j-1.6.1.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
Added: felix/sandbox/clement/Project-Checker/.project
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/.project?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/.project (added)
+++ felix/sandbox/clement/Project-Checker/.project Wed Apr 8 12:30:27 2009
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Project-Checker</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
Added: felix/sandbox/clement/Project-Checker/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/.settings/org.eclipse.jdt.core.prefs?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/.settings/org.eclipse.jdt.core.prefs (added)
+++ felix/sandbox/clement/Project-Checker/.settings/org.eclipse.jdt.core.prefs Wed Apr 8 12:30:27 2009
@@ -0,0 +1,12 @@
+#Wed Apr 01 09:53:45 CEST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
Added: felix/sandbox/clement/Project-Checker/README.txt
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/README.txt?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/README.txt (added)
+++ felix/sandbox/clement/Project-Checker/README.txt Wed Apr 8 12:30:27 2009
@@ -0,0 +1,102 @@
+Project-Checker
+===============
+
+I. What is it ?
+---------------
+
+Project-Checker is a simple tools checking releases and projects. This aims to simplify the release checking process,
+BUT does not avoid manual checking.
+Project-Checker was mainly made for Apache Felix bundles.
+
+II. Mode
+--------
+
+Project-Checker can be used in two mode:
+- the project mode allows checking a not-yet released project (build already packages). It aims to detect license and notice
+issues
+- the release mode allows checking a released project. It do the project mode checks + a couple of release checking
+
+III. Checks
+-----------
+
+The checkers applied on the project depends on the mode:
+
+A] Project Mode
+- the License file is in the project
+- the Notice file is in the project
+- the License file is in the Jar file (in META-INF)
+- the Notice file is in the Jar file (in META-INF)
+- the files contains Apache License Header (use RAT)
+- the Notice license summary is correct
+- The Notice name contains the project name
+- The Notice copyright contains a correct year
+- The Notice file says that the product contains code from the Apache Software Foundation
+- All included packages match with a declared included license specified in the notice file
+- All imported packages (only if the jar file is a bundle) match with a declared used license specified in the notice file
+
+B] Release Mode
+- all the project mode checks +
+- all the waited artifacts are created (Zip, Tag.GZ, source ...)
+- MD5 and SHA1 signatures are beautified
+- the MD5 signatures are correct
+- the SHA1 signatures are correct
+- the ASC signatures are correct
+- rhe changelog file exists
+- The release tag is correctly created
+
+IV. How to use it ?
+--------------------
+
+Using project checker depends on the mode to use
+
+A] Common part
+java -cp project-checker.jar:commons-cli-1.1.jar:commons-collections-3.2.1.jar:commons-lang-2.4.jar:dom4j-1.6.1.jar:apache-rat-0.7-SNAPSHOT.jar:apache-rat-core-0.7-SNAPSHOT.jar org.apache.felix.project.checker.Project
+
+Arguments:
+ -n or --name: Name of the artifact [mandatory]
+ -v or --version: Version of the artifact [mandatory]
+ -c or --configuration: Set the configuration file to use
+
+
+B] Project Mode arguments
+ -d or --directory: path of the project to check [mandatory in the project mode]
+
+Example:
+java
+ -cp project-checker.jar: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
+ -d ~/workspaces/felix-trunk/ipojo/arch/
+ -n org.apache.felix.ipojo.arch
+ -v 1.3.0-SNAPSHOT
+
+
+C] Release Mode
+ -u or --url: URL to download the release [mandatory in the release mode]
+ -o or --offline: to not download the artifacts (reused them)
+
+V. Configuration file
+---------------------
+
+The configuration file contains the used commands and project information. You can either edit the config.properties file or create your own.
+
+VI. Process in the release mode
+-------------------------------
+
+Release Checker is quite simple:
+1) Download (if needed) the release files
+2) Extract and parse the Notice file
+3) Launch each "checker"
+4) Generate the report
+
+A "checker" is a simple class checking one point of the release.
+
+Once downloaded, you can check manually the release by inspecting artifacts contained in the release-$RELEASE_NAME-$RELEASE_VERSION folder.
+
+VI. Todo list
+-------------
+
+- Add more known license
+- MD5 and SHA1 checks should use RegEx
+- 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)
Added: felix/sandbox/clement/Project-Checker/config.properties
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/config.properties?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/config.properties (added)
+++ felix/sandbox/clement/Project-Checker/config.properties Wed Apr 8 12:30:27 2009
@@ -0,0 +1,9 @@
+# Used commands
+SSL=openssl
+GPG=/usr/local/bin/gpg
+UNZIP=unzip
+RM=rm
+
+# Global properties
+PARENT_PROJECT_NAME=Apache Felix
+SVN_URL=http://svn.apache.org/repos/asf/felix/releases/
\ No newline at end of file
Added: felix/sandbox/clement/Project-Checker/jardesc.jardesc
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/jardesc.jardesc?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/jardesc.jardesc (added)
+++ felix/sandbox/clement/Project-Checker/jardesc.jardesc Wed Apr 8 12:30:27 2009
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="MacRoman"?>
+<jardesc>
+<jar path="Release-Checker/project-checker.jar"/>
+<options buildIfNeeded="true" compress="true" descriptionLocation="/Release-Checker/jardesc.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="true" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+<selectedProjects/>
+<manifest generateManifest="true" mainClassHandleIdentifier="=Release-Checker/src<org.apache.felix.project.checker{Project.java[Project" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+<sealing sealJar="false">
+<packagesToSeal/>
+<packagesToUnSeal/>
+</sealing>
+</manifest>
+<selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
+<file path="/Release-Checker/config.properties"/>
+<folder path="/Release-Checker/licenses"/>
+<file path="/Release-Checker/README.txt"/>
+<javaElement handleIdentifier="=Release-Checker/src"/>
+</selectedElements>
+<fatjar builder="org.eclipse.jdt.ui.plain_jar_builder" launchConfig=""/>
+</jardesc>
Added: felix/sandbox/clement/Project-Checker/libs/apache-rat-0.7-SNAPSHOT.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/libs/apache-rat-0.7-SNAPSHOT.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/libs/apache-rat-0.7-SNAPSHOT.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/libs/apache-rat-core-0.7-SNAPSHOT.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/libs/apache-rat-core-0.7-SNAPSHOT.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/libs/apache-rat-core-0.7-SNAPSHOT.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/libs/commons-cli-1.1.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/libs/commons-cli-1.1.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/libs/commons-cli-1.1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/libs/commons-collections-3.2.1.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/libs/commons-collections-3.2.1.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/libs/commons-collections-3.2.1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/libs/commons-lang-2.4.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/libs/commons-lang-2.4.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/libs/commons-lang-2.4.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/libs/dom4j-1.6.1.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/libs/dom4j-1.6.1.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/libs/dom4j-1.6.1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/licenses/LICENSE.asm
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/LICENSE.asm?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/LICENSE.asm (added)
+++ felix/sandbox/clement/Project-Checker/licenses/LICENSE.asm Wed Apr 8 12:30:27 2009
@@ -0,0 +1,29 @@
+Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
Added: felix/sandbox/clement/Project-Checker/licenses/LICENSE.kxml2
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/LICENSE.kxml2?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/LICENSE.kxml2 (added)
+++ felix/sandbox/clement/Project-Checker/licenses/LICENSE.kxml2 Wed Apr 8 12:30:27 2009
@@ -0,0 +1,20 @@
+Copyright (c) 2002-2007 Stefan Haustein, Oberhausen, Rhld., Germany
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
Added: felix/sandbox/clement/Project-Checker/licenses/apache.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/apache.xml?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/apache.xml (added)
+++ felix/sandbox/clement/Project-Checker/licenses/apache.xml Wed Apr 8 12:30:27 2009
@@ -0,0 +1,11 @@
+<license>
+<!--
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+ -->
+ <keyword>Apache Software Foundation</keyword>
+ <packages>org.apache</packages>
+ <license>Apache License 2.0</license>
+ <url>http://www.apache.org/</url>
+ <provider>The Apache Software Foundation</provider>
+</license>
\ No newline at end of file
Added: felix/sandbox/clement/Project-Checker/licenses/asm.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/asm.xml?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/asm.xml (added)
+++ felix/sandbox/clement/Project-Checker/licenses/asm.xml Wed Apr 8 12:30:27 2009
@@ -0,0 +1,12 @@
+<license>
+<!--
+ This product includes software from http://kxml.sourceforge.net.
+Copyright (c) 2002,2007, Stefan Haustein, Oberhausen, Rhld., Germany.
+Licensed under BSD License.
+ -->
+ <keyword>kxml</keyword>
+ <packages>org.xmlpull,org.kxml2</packages>
+ <license>BSD License</license>
+ <copyright>Copyright (c) 2002,2007, Stefan Haustein, Oberhausen, Rhld., Germany.</copyright>
+ <file>LICENSE.kxml2</file>
+</license>
\ No newline at end of file
Added: felix/sandbox/clement/Project-Checker/licenses/kxml2.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/kxml2.xml?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/kxml2.xml (added)
+++ felix/sandbox/clement/Project-Checker/licenses/kxml2.xml Wed Apr 8 12:30:27 2009
@@ -0,0 +1,12 @@
+<license>
+<!--
+This product includes software developed at
+Copyright (c) 2000-2005 INRIA, France Telecom
+Licensed under BSD License.
+ -->
+ <keyword>INRIA, France Telecom</keyword>
+ <packages>org.objectweb.asm</packages>
+ <license>BSD License</license>
+ <copyright>Copyright (c) 2000-2005 INRIA, France Telecom</copyright>
+ <file>LICENSE.asm</file>
+</license>
\ No newline at end of file
Added: felix/sandbox/clement/Project-Checker/licenses/mortbay.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/mortbay.xml?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/mortbay.xml (added)
+++ felix/sandbox/clement/Project-Checker/licenses/mortbay.xml Wed Apr 8 12:30:27 2009
@@ -0,0 +1,7 @@
+<license>
+ <keyword>Mortbay</keyword>
+ <packages>org.mortbay,javax.servlet</packages>
+ <license>Apache License 2.0</license>
+ <url>http://mortbay.org</url>
+ <provider>Mortbay</provider>
+</license>
\ No newline at end of file
Added: felix/sandbox/clement/Project-Checker/licenses/osgi.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/licenses/osgi.xml?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/licenses/osgi.xml (added)
+++ felix/sandbox/clement/Project-Checker/licenses/osgi.xml Wed Apr 8 12:30:27 2009
@@ -0,0 +1,16 @@
+<license>
+<!--
+ /*
+ * This product includes software developed at
+ * The OSGi Alliance (http://www.osgi.org/).
+ * Copyright (c) OSGi Alliance (2000, 2007).
+ * Licensed under the Apache License 2.0.
+ */
+ -->
+ <keyword>osgi</keyword>
+ <packages>org.osgi</packages>
+ <license>Apache License 2.0</license>
+ <url>http://www.osgi.org/</url>
+ <provider>The OSGi Alliance</provider>
+ <copyright>Copyright (c) OSGi Alliance (2000, 2007).</copyright>
+</license>
\ No newline at end of file
Added: felix/sandbox/clement/Project-Checker/project-checker.jar
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/project-checker.jar?rev=763213&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/clement/Project-Checker/project-checker.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/ChangelogChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/ChangelogChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/ChangelogChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/ChangelogChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,32 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+
+public class ChangelogChecker implements Checker {
+
+ private File project;
+
+ public void check() throws Exception {
+ File changelog = new File(project, "/doc/changelog.txt");
+
+ if (! changelog.exists()) {
+ throw new Exception("The changelog is missing");
+ }
+ //TODO Check that the changelog is up to date.
+ }
+
+ public void clean() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public String getCheckerName() {
+ return "Changelog checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ project = release.getProjectRoot();
+ return true;
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Checker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Checker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Checker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Checker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,13 @@
+package org.apache.felix.project.checker;
+
+public interface Checker {
+
+ boolean prepare(Project release) throws Exception;
+
+ String getCheckerName();
+
+ void check() throws Exception;
+
+ void clean();
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Command.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Command.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Command.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Command.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,98 @@
+package org.apache.felix.project.checker;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class Command {
+
+ private String error;
+ private String output;
+
+ private Process process;
+
+ public void executeCommand(Project release, String cmd, boolean timeout) throws IOException {
+ if (timeout) {
+ new Thread(new Killer()).start();
+ }
+ process = Runtime.getRuntime().exec(cmd, null, release.getArtifactDirectory());
+ error = inputStreamAsString(process.getErrorStream());
+ output = inputStreamAsString(process.getInputStream());
+ }
+
+ public void executeCommand(File dir, String cmd, boolean timeout) throws IOException {
+ if (timeout) {
+ new Thread(new Killer()).start();
+ }
+ process = Runtime.getRuntime().exec(cmd, null, dir);
+
+ error = inputStreamAsString(process.getErrorStream());
+ output = inputStreamAsString(process.getInputStream());
+
+ }
+
+ public String getOutput() {
+ return output;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public static String inputStreamAsString(InputStream stream)
+ throws IOException {
+ BufferedReader br = new BufferedReader(new InputStreamReader(stream));
+ StringBuilder sb = new StringBuilder();
+ String line = null;
+ try {
+ while ((line = br.readLine()) != null) {
+ sb.append(line + "\n");
+ }
+
+ br.close();
+ } catch(Exception e) {}
+ return sb.toString();
+ }
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ Command command = new Command();
+ command.executeCommand((File) null, "ls", false);
+ System.out.println("Out:");
+ System.out.println(command.getOutput());
+ System.out.println("Err:");
+ System.out.println(command.getError());
+ System.out.println("===");
+ File dir = new File("release-org.apache.felix.log-1.0.0");
+ command.executeCommand(dir, "/usr/bin/openssl md5 org.apache.felix.log-1.0.0.jar", false);
+ //command.executeCommand(dir, "echo $PATH");
+
+ System.out.println("Out:");
+ System.out.println(command.getOutput());
+ System.out.println("Err:");
+ System.out.println(command.getError());
+
+ System.out.println("Done");
+
+ }
+
+ private class Killer implements Runnable {
+
+ public void run() {
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ if (process != null) {
+ process.destroy();
+ }
+
+ }
+ }
+
+
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/FileChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/FileChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/FileChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/FileChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,78 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+import java.util.Map;
+
+public class FileChecker implements Checker {
+
+ private Project release;
+ private Map<String, File> artifacts;
+
+ public void check() throws Exception {
+ checkNotBZ2();
+ checkZip();
+ checkTarGz();
+ checkJar();
+ checkPom();
+ }
+
+ private boolean exist(String suffix) {
+ String name = release.getName() + "-" + release.getVersion();
+ return artifacts.containsKey(name + suffix);
+ }
+
+ private void checkZip() {
+ if (!exist("-bin.zip")) {
+ release.error(this, "Cannot found the -bin.zip file", null);
+ }
+ if (!exist("-project.zip")) {
+ release.error(this, "Cannot found the -project.zip file", null);
+ }
+ }
+
+ private void checkTarGz() {
+ if (!exist("-bin.tar.gz")) {
+ release.error(this, "Cannot found the -tar.gz file", null);
+ }
+ if (!exist("-project.tar.gz")) {
+ release.error(this, "Cannot found the -project.tar.gz file", null);
+ }
+ }
+
+ private void checkJar() {
+ if (!exist(".jar")) {
+ release.error(this, "Cannot found the .jar file", null);
+ }
+ if (!exist("-sources.jar")) {
+ release.error(this, "Cannot found the -sources.jar file", null);
+ }
+ }
+
+ private void checkPom() {
+ if (!exist(".pom")) {
+ release.error(this, "Cannot found the .pom file", null);
+ }
+ }
+
+ private void checkNotBZ2() {
+ if (exist("-bin.bz2")) {
+ release.warning(this, "The -bin.bz2 file is not needed");
+ }
+ if (exist("-project.bz2")) {
+ release.warning(this, "The -project.bz2 file is not needed");
+ }
+ }
+
+ public void clean() { }
+
+ public String getCheckerName() {
+ return "Artifacts Checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ artifacts = release.getArtifacts();
+ return true;
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/HeaderChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/HeaderChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/HeaderChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/HeaderChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,200 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.rat.analysis.util.HeaderMatcherMultiplexer;
+import org.apache.rat.document.impl.FileDocument;
+import org.apache.rat.document.impl.zip.ZipFileUnarchiver;
+import org.apache.rat.license.Apache20LicenseFamily;
+import org.apache.rat.license.ILicenseFamily;
+import org.apache.rat.report.IReportable;
+import org.apache.rat.report.RatReport;
+import org.apache.rat.report.RatReportFailedException;
+import org.apache.rat.report.xml.XmlReportFactory;
+import org.apache.rat.report.xml.writer.IXmlWriter;
+import org.apache.rat.report.xml.writer.impl.base.XmlWriter;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class HeaderChecker implements Checker {
+
+ Project release;
+ File file = null, xmlreport = null;
+ public static final String UNZIP_PROPERTY = "UNZIP";
+ public static final String RM_PROPERTY = "RM";
+
+
+
+ public void check() throws Exception {
+ List<String> errors = new ArrayList<String>();
+ List<String> warnings = new ArrayList<String>();
+ List<String> ignored = new ArrayList<String>();
+
+ Container walker = new Container(release.getProjectRoot());
+ HeaderMatcherMultiplexer m = new HeaderMatcherMultiplexer(org.apache.rat.Defaults.DEFAULT_MATCHERS);
+ xmlreport = new File(release.getArtifactDirectory(), "rat.xml");
+ FileWriter pw = new FileWriter(xmlreport);
+
+ IXmlWriter writer = new XmlWriter(pw);
+ RatReport report = XmlReportFactory.createStandardReport(writer,
+ m, new ILicenseFamily[] { new Apache20LicenseFamily() });
+ report.startReport();
+ walker.run(report);
+ report.endReport();
+ writer.closeDocument();
+
+ SAXReader reader = new SAXReader();
+ Document document = reader.read(xmlreport);
+ Element root = document.getRootElement();
+ // iterate through child elements of root with element name "foo"
+ for ( Iterator<Element> i = root.elementIterator( "resource" ); i.hasNext(); ) {
+ Element resource = (Element) i.next();
+ Attribute name = resource.attribute("name");
+ Element la = resource.element("license-approval");
+ if (la != null) {
+ if (la.attribute("name").getValue().equals("false")) {
+ if (name.getValue().contains("test/")) { // Test folder
+ warnings.add(name.getValue());
+ } else if (name.getValue().contains("doc/")) { // Test folder
+ ignored.add(name.getValue());
+ } else {
+ errors.add(name.getValue());
+ }
+
+ }
+ }
+ }
+
+ for (String s : ignored) {
+ // release.warning(this, "Missing license in " + s + " ignored");
+ // Nothing to do
+ }
+ for (String s : warnings) {
+ release.warning(this, "Missing licence in " + s);
+ }
+
+ for(String s : errors) {
+ release.error(this, "Missing licence in " + s, null);
+ }
+
+ if (errors.size() > 0) {
+ throw new Exception("Missing licence headers : " + errors);
+ }
+
+ }
+
+
+
+ public void clean() { }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ file = release.getProjectRoot();
+ return true;
+
+ }
+
+ private class Container implements IReportable {
+
+ File basedir;
+ private final ZipFileUnarchiver UNARCHIVER = new ZipFileUnarchiver();
+ private final FileNameComparator COMPARATOR = new FileNameComparator();
+
+ public Container(File basedir) {
+ this.basedir = basedir;
+ }
+
+ private boolean ignored(String name) {
+ return name.contains("/doc/")
+ || name.contains("LICENSE") || name.contains("LICENCE")
+ || name.contains("/target/")
+ || name.contains(".svn")
+ || name.contains(".classpath") || name.contains(".project")
+ || name.contains(".externalToolBuilders") || name.contains(".settings")
+ || name.contains("maven-eclipse.xml");
+ }
+
+ public void report(RatReport report, File file) throws RatReportFailedException {
+ if (! ignored(file.getAbsolutePath())) {
+ org.apache.rat.document.IDocument document = new FileDocument(file,
+ UNARCHIVER);
+ report.report(document);
+ }
+
+ }
+
+ public void run(RatReport report) throws RatReportFailedException {
+ process(report, basedir);
+ }
+
+ private void process(RatReport report, File file)
+ throws RatReportFailedException {
+ File files[] = file.listFiles();
+ if (files != null) {
+ Arrays.sort(files, COMPARATOR);
+ processNonDirectories(report, files);
+ processDirectories(report, files);
+ }
+ }
+
+ private void processDirectories(RatReport report, File files[])
+ throws RatReportFailedException {
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ String name = file.getName();
+ if (!ignored(name) && file.isDirectory())
+ processDirectory(report, file);
+ }
+
+ }
+
+ private void processDirectory(RatReport report, File file) throws RatReportFailedException {
+ process(report, file);
+ }
+
+ private void processNonDirectories(RatReport report, File files[])
+ throws RatReportFailedException {
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ String name = file.getName();
+ if (!ignored(name) && !file.isDirectory())
+ report(report, file);
+ }
+
+ }
+
+ }
+
+ private class FileNameComparator implements Comparator<File> {
+
+ public int compare(File first, File second) {
+ int result = 0;
+ if (first == null) {
+ if (second != null)
+ result = 1;
+ } else if (second == null) {
+ result = -1;
+ } else {
+ String firstName = first.getName();
+ String secondName = second.getName();
+ result = firstName.compareTo(secondName);
+ }
+ return result;
+ }
+ }
+
+ public String getCheckerName() {
+ return "License Header Checker";
+ }
+
+
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedApacheLicence.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedApacheLicence.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedApacheLicence.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedApacheLicence.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,53 @@
+package org.apache.felix.project.checker;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class IncludedApacheLicence implements Checker {
+
+ private Project release;
+ public static final String APACHE_LICENCE_NAME = "Apache License 2.0";
+
+ public void check() throws Exception {
+ Notice notice = release.getNotice();
+ List<License> list = notice.getIncluded();
+ boolean found = false;
+ for(License lic :list) {
+ if (lic.getLicense().equals(APACHE_LICENCE_NAME)) {
+ found = true;
+ }
+ }
+
+ if (! found) {
+ throw new Exception("The artifacts contain Apache code, but the license is not included");
+ }
+ }
+
+ public void clean() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public String getCheckerName() {
+ return "Include Apache Licence Checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ // Check that we include Apache code.
+ Iterator<String> it = release.getArtifacts().keySet().iterator();
+ ZipFile jar = null;
+ while(it.hasNext()) {
+ String f = it.next();
+ if (f.endsWith(release.getVersion() + ".jar")) { // Avoid sources.
+ jar = new ZipFile(release.getArtifacts().get(f));
+ }
+ }
+
+ ZipEntry ze = jar.getEntry("org/apache");
+ return (ze != null);
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedLicenseChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedLicenseChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedLicenseChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/IncludedLicenseChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,118 @@
+package org.apache.felix.project.checker;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+public class IncludedLicenseChecker implements Checker {
+
+ private Project release;
+ private JarFile jar;
+
+ public void check() throws Exception {
+ List<String> referred = new ArrayList<String>();
+ Enumeration entries = jar.entries();
+ while(entries.hasMoreElements()) {
+ JarEntry je = (JarEntry) entries.nextElement();
+ if (je.getName().endsWith(".class")) {
+ // Compute the package name
+ int index = je.getName().lastIndexOf('/');
+ String prefix = je.getName().substring(0, index);
+ if (! referred.contains(prefix)) {
+ referred.add(prefix);
+ }
+ }
+ }
+
+ filter(referred); // Remove apache
+ check(referred); // Check the others references against the checkers.
+
+ if (! referred.isEmpty()) {
+ // Unrecognized packages.
+ for (String r : referred) {
+ release.warning(this, "Cannot match " + r + " with a known license");
+ }
+ }
+ }
+
+ private void filter(List<String> referred) {
+ List<String> toRemove = new ArrayList<String>();
+ for (String s : referred) {
+ if (s.startsWith("org/apache/")) {
+ toRemove.add(s);
+ }
+ }
+ referred.removeAll(toRemove);
+ }
+
+ private void check(List<String> referred) {
+ List<String> toRemove = new ArrayList<String>();
+ for (String s : referred) {
+ if (toRemove.contains(s)) {
+ continue; // Already checked.
+ }
+ String name = s.replace('/', '.');
+ License checker = getLicenseByPrefix(name);
+
+ if (checker != null) {
+ try {
+ License found = getLicenseByKeyword(checker.getKeyword());
+ checker.check(this, release, found);
+ // Remove package.
+ for (String x : referred) {
+ if (x.startsWith(s)) {
+ toRemove.add(x);
+ }
+ }
+ } catch (Exception e) {
+ release.error(this, "Included code does not have an appropriate licence " + s, e.getMessage());
+ }
+ }
+
+ }
+ referred.removeAll(toRemove);
+ }
+
+ public License getLicenseByPrefix(String packagename) {
+ for (License checker : release.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 = release.getNotice();
+ License found = null;
+ List<License> lics = notice.getIncluded();
+ for (License lic : lics) {
+ if (lic.getText().contains(key)) {
+ if (found == null) {
+ found = lic;
+ } else {
+ release.warning(this, "Ambiguity found when analyzing the notice file, several licenses matche with " + key);
+ }
+ }
+ }
+ return found;
+ }
+
+ public void clean() { }
+
+ public String getCheckerName() {
+ return "Included License Checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ jar = release.getJar();
+ return true;
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarLicenseChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarLicenseChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarLicenseChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarLicenseChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,43 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class JarLicenseChecker implements Checker {
+
+ private ZipFile file;
+
+ public void check() throws Exception {
+ ZipEntry entry = file.getEntry("META-INF/LICENSE");
+ if (entry == null) {
+ entry = file.getEntry("META-INF/LICENCE");
+ }
+
+ if (entry == null) {
+ throw new Exception("Cannot find license file in " + file.getName());
+ }
+ }
+
+ public String getCheckerName() {
+ return "Jar Header Checker";
+ }
+
+ public void clean() { }
+
+ public boolean prepare(Project release) throws Exception {
+ // Get the zipped project
+ Map<String, File> maps = release.getArtifacts();
+ Iterator<String> it = maps.keySet().iterator();
+ while(it.hasNext()) {
+ String f = it.next();
+ if (f.endsWith(release.getVersion() + ".jar")) { // Avoid sources.
+ file = new ZipFile(maps.get(f));
+ }
+ }
+ return true;
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarNoticeChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarNoticeChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarNoticeChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/JarNoticeChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,41 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class JarNoticeChecker implements Checker {
+
+ private ZipFile file;
+
+ public void check() throws Exception {
+ ZipEntry entry = file.getEntry("META-INF/NOTICE");
+
+ if (entry == null) {
+ throw new Exception("Cannot find notice file in " + file.getName());
+ }
+ }
+
+ public void clean() { }
+
+ public boolean prepare(Project release) throws Exception {
+ // Get the zipped project
+ Map<String, File> maps = release.getArtifacts();
+ Iterator<String> it = maps.keySet().iterator();
+ while(it.hasNext()) {
+ String f = it.next();
+ if (f.endsWith(release.getVersion() + ".jar")) { // Avoid sources.
+ file = new ZipFile(maps.get(f));
+ }
+ }
+
+ return true;
+ }
+
+ public String getCheckerName() {
+ return "Jar Notice Checker";
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/License.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/License.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/License.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/License.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,278 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class License {
+
+ private static final String FIRST_LINE_REGEX = "This product (includes|uses) software .*";
+ private static final Pattern FIRST_LINE_PATTERN = Pattern.compile(FIRST_LINE_REGEX);
+
+ private static final String PROVIDER_REGEX = "(.*)\\((.*)\\)\\.?";
+ private static final Pattern PROVIDER_PATTERN = Pattern.compile(PROVIDER_REGEX);
+
+ private static final String LICENSE_REGEX = "Licensed under( the)? (.*).";
+ private static final Pattern LICENSE_PATTERN = Pattern.compile(LICENSE_REGEX);
+
+ private String copyright;
+
+ private String text;
+
+ private String provider;
+
+ private String url;
+
+ private String license;
+
+ boolean includes = false;
+
+ private File file;
+
+ private String[] packages;
+
+ private String keyword;
+
+ public License(String text) throws Exception {
+ this.text = text;
+ String[] table = text.split("\n");
+ switch (table.length) {
+ case 2: // First line + license line or First line + copyright
+ parseFirstLine(table[0]);
+ if (table[1].contains("Copyright")) {
+ parseCopyright(table[1]);
+ } else {
+ parseLicenseLine(table[1]);
+ }
+ break;
+ case 3: // First line + provider | copyright + license line
+ parseFirstLine(table[0]);
+ if (table[1].contains("Copyright")) {
+ // No provider, copyright:
+ parseCopyright(table[1]);
+ } else {
+ parseProvider(table[1]);
+ }
+ parseLicenseLine(table[2]);
+ break;
+ case 4: // First line + provider + copyright + license line
+ parseFirstLine(table[0]);
+ parseProvider(table[1]);
+ parseCopyright(table[2]);
+ parseLicenseLine(table[3]);
+ break;
+ default:
+ throw new Exception("Cannot parse the license " + table[0]);
+ }
+
+
+ }
+
+ public License(String keyword, String packages, String license, String copyright, String provider, String url, File file) {
+ this.keyword = keyword;
+ this.license = license;
+ if (packages.contains(",")) {
+ this.packages = packages.split(",");
+ } else {
+ this.packages = new String[] {packages};
+ }
+ this.copyright = copyright;
+ this.provider = provider;
+ this.url = url;
+ this.file = file;
+ }
+
+ public String getCopyright() {
+ return copyright;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public boolean includes() {
+ return includes;
+ }
+
+ public String getProvider() {
+ return provider;
+ }
+
+ public String getLicense() {
+ return license;
+ }
+
+
+ public String getUrl() {
+ return url;
+ }
+
+ public boolean isIncludes() {
+ return includes;
+ }
+
+ public File getFile() {
+ return file;
+ }
+
+ public String[] getPackages() {
+ return packages;
+ }
+
+ public String getKeyword() {
+ return keyword;
+ }
+
+ private void parseFirstLine(String s) throws Exception {
+ Matcher matcher = FIRST_LINE_PATTERN.matcher(s);
+ if (matcher.matches()) {
+ String verb = matcher.group(1);
+ if (verb.equals("includes")) {
+ includes = true;
+ }
+ } else {
+ throw new Exception("Malformed licence - the first line " + s + " does not match '" + FIRST_LINE_REGEX +"'");
+ }
+
+ }
+
+ private void parseProvider(String s) throws Exception {
+ Matcher matcher = PROVIDER_PATTERN.matcher(s);
+ if (matcher.matches()) {
+ provider = matcher.group(1).trim();
+ url = matcher.group(2).trim();
+ } else {
+ throw new Exception("Malformed licence - License provider line " + s + " doesn't match '" + PROVIDER_REGEX + "'");
+ }
+ }
+
+ private void parseCopyright(String s) {
+ // Optional line.
+ if (s.contains("Copyright")) {
+ copyright = s.trim();
+ }
+ }
+
+ private void parseLicenseLine(String s) throws Exception {
+ Matcher matcher = LICENSE_PATTERN.matcher(s);
+ if (matcher.matches()) {
+ license = matcher.group(2).trim();
+ } else {
+ throw new Exception("Malformed licence - Licence line " + s + " doesn't match '" + LICENSE_REGEX + "'");
+ }
+
+ }
+
+ public void check(Checker chk, Project release, License toanalyze) throws Exception {
+ if (file != null) {
+ checkJarFile(chk, release, release.getJar());
+ checkProjectFile(chk, release, release.getProjectRoot());
+ }
+
+ // Check the license content
+ if (copyright != null) {
+ if (toanalyze.getCopyright() == null || ! copyright.equals(toanalyze.getCopyright())) {
+ release.error(chk, "Bad copyright for " + getKeyword() + " license : " + copyright + " expected.", null);
+ }
+ } else {
+ if (toanalyze.getCopyright() != null) {
+ release.error(chk, "Bad copyright for " + getKeyword() + " license (no copyright expected)", null);
+ }
+ }
+
+ if (provider != null) {
+ if (toanalyze.getProvider() == null || ! provider.equals(toanalyze.getProvider())) {
+ release.error(chk, "Bad provider for " + getKeyword() + " license : " + provider + " expected, found " + toanalyze.getProvider(), null);
+ }
+ } else {
+ if (toanalyze.getProvider() != null) {
+ release.error(chk, "Bad provider for " + getKeyword() + " license (no provider expected)", null);
+ }
+ }
+
+ if (url != null) {
+ if (toanalyze.getUrl() == null || ! url.equals(toanalyze.getUrl())) {
+ release.error(chk, "Bad URL for " + getKeyword() + " license : " + url + " expected, found " + toanalyze.getUrl(), null);
+ }
+ } else {
+ if (toanalyze.getUrl() != null) {
+ release.error(chk, "Bad URL for " + getKeyword() + " license (no url expected)", null);
+ }
+ }
+
+ if (! license.equals(toanalyze.getLicense())) {
+ release.error(chk, "Bad license for " + getKeyword() + " license ( " + license + " expected)", null);
+ }
+ }
+
+ private void checkJarFile(Checker chk, Project release, JarFile jar) {
+ JarEntry je = jar.getJarEntry("META-INF/" + file.getName());
+ if (je == null) {
+ release.error(chk, "Cannot find the " + file.getName() + " in the Jar file", null);
+ }
+
+ File file = null;
+ try {
+ file = Utils.expand(release.getArtifactDirectory(), "LIC-1", je, jar);
+ boolean ok = Utils.compare(this.file, file);
+ if (! ok) {
+ release.error(chk, "Differences found in the license file", null);
+ }
+ } catch (IOException e) {
+ release.error(chk, "Cannot expand the license file from the Jar file", e.getMessage());
+ } finally {
+ if (file != null) {
+ Utils.delete(file);
+ }
+ }
+ }
+
+ private void checkProjectFile(Checker chk, Project release, File project) {
+ File lic = new File(project, file.getName());
+ if (! lic.exists()) {
+ release.error(chk, "Cannot found the " + file.getName() + " in the root of the project", null);
+ }
+ boolean ok = Utils.compare(this.file, file);
+ if (! ok) {
+ release.error(chk, "Differences found in the license file", null);
+ }
+ }
+
+
+
+// public static void main(String args[]) throws Exception {
+// String l1 = "This product uses software developed at \n"
+// + "The OSGi Alliance (http://www.osgi.org/).\n"
+// + "Copyright (c) OSGi Alliance (2000, 2007).\n"
+// + "Licensed under the Apache License 2.0.";
+//
+// String l2 = "This product includes software developed at\n"
+// + "The Apache Software Foundation (http://www.apache.org/).\n"
+// + "Licensed under the Apache License 2.0.\n";
+//
+// String l3 = "This product includes software developed by\n"
+// + "Mortbay (http://mortbay.org)\n"
+// + "Licensed under the Apache License 2.0.";
+//
+// String l4 = "This product includes software developed at\n"
+// + "Copyright (c) 2000-2005 INRIA, France Telecom\n"
+// + "Licensed under BSD License.";
+//
+// License lic1 = new License(l1);
+//
+// License lic2 = new License(l2);
+//
+// License lic3 = new License(l3);
+//
+// License lic4 = new License(l4);
+//
+// }
+
+
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseParser.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseParser.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseParser.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseParser.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,89 @@
+package org.apache.felix.project.checker;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class LicenseParser {
+
+ public static String KEYWORD = "keyword";
+ public static String PACKAGES = "packages";
+ public static String LICENSE = "license";
+ public static String COPYRIGHT = "copyright";
+ public static String PROVIDER = "provider";
+ public static String URL = "url";
+ public static String FILE = "file";
+
+ public static List<License >getKnownLicenses(File repository) {
+ List<License> licenses = new ArrayList<License>();
+ File[] files = repository.listFiles();
+ if (files == null) {
+ System.err.println("Cannot load license repository");
+ }
+ for (File file : files) {
+ try {
+ if (file.getName().endsWith(".xml")) {
+ licenses.add(parseLicence(file));
+ }
+ } catch (IOException e) {
+ System.err.println("Cannot parse the licence file " + e.getMessage());
+ } catch (DocumentException e) {
+ System.err.println("Cannot parse the licence file " + e.getMessage());
+ }
+ }
+ System.out.println("[INFO] " + licenses.size() + " known");
+ return licenses;
+ }
+
+
+ private static License parseLicence(File file) throws IOException, DocumentException {
+ SAXReader reader = new SAXReader();
+ Document document = reader.read(file);
+ Element root = document.getRootElement();
+ Element key = root.element(KEYWORD);
+ if (key == null) {
+ throw new IOException("No keyword in the license file " + file.getName());
+ }
+ Element packages = root.element(PACKAGES);
+ if (packages == null) {
+ throw new IOException("No packages in the license file " + file.getName());
+ }
+ Element license = root.element(LICENSE);
+ if (license == null) {
+ throw new IOException("No keyword in the license file " + file.getName());
+ }
+ Element copyright = root.element(COPYRIGHT);
+ Element provider = root.element(PROVIDER);
+ Element url = root.element(URL);
+ Element licfile = root.element(FILE);
+
+
+ String copy = null;
+ if (copyright != null) {
+ copy = copyright.getTextTrim();
+ }
+ String prov = null;
+ if (provider != null) {
+ prov = provider.getTextTrim();
+ }
+ String uri = null;
+ if (url != null) {
+ uri = url.getTextTrim();
+ }
+ File lic = null;
+ if (licfile != null) {
+ lic = new File(file.getParentFile(), licfile.getTextTrim());
+ }
+
+ return new License(key.getTextTrim(), packages.getTextTrim(), license.getTextTrim(), copy, prov, uri, lic);
+
+
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseSummaryChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseSummaryChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseSummaryChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LicenseSummaryChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,52 @@
+package org.apache.felix.project.checker;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class LicenseSummaryChecker implements Checker {
+
+ private Notice notice;
+ private Project release;
+
+ public void check() throws Exception {
+ Set<String> referred = new HashSet<String>();
+ for(License lic : notice.getIncluded()) {
+ referred.add(lic.getLicense());
+ }
+
+ for(License lic : notice.getUsed()) {
+ referred.add(lic.getLicense());
+ }
+
+
+ List<String> list = new ArrayList<String>(notice.getSummary());
+
+ // Check that all license are in the summary.
+ for(String l : referred) {
+ boolean found = list.remove(l);
+ if (! found) {
+ throw new Exception("A referred license '" + l + "' is not in the summary " + notice.getSummary());
+ }
+ }
+
+ if (! list.isEmpty()) {
+ release.warning(this, "Licenses contained in the summary seems not used, may be unrecognized licences : " + list);
+ }
+ }
+
+ public void clean() {
+ }
+
+ public String getCheckerName() {
+ return "License Summary Checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ notice = release.getNotice();
+ return true;
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LinkCollector.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LinkCollector.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LinkCollector.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/LinkCollector.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,49 @@
+package org.apache.felix.project.checker;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLEditorKit;
+
+public class LinkCollector extends HTMLEditorKit.ParserCallback {
+
+ private URL url;
+ private String name;
+ private Map<String, URL> list = new HashMap<String, URL>();
+
+ public LinkCollector(URL url, String name) {
+ this.url = url;
+ this.name = name;
+ }
+
+ public void add(String link) {
+ try {
+ URL url = new URL(this.url, link);
+ list.put(link, url);
+ } catch (MalformedURLException e) {
+ System.err.println("Cannot compute the url for " + link);
+ }
+ }
+
+ public Map<String, URL> getlist() {
+ return list;
+ }
+
+ public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
+ if (t.equals(HTML.Tag.A)) {
+ String str = (String) a.getAttribute(HTML.Attribute.HREF);
+ if (str.contains(name+"-") && ! str.endsWith("/")) {
+ add(str);
+ }
+ }
+
+ }
+
+
+
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/MD5Checker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/MD5Checker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/MD5Checker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/MD5Checker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,65 @@
+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.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MD5Checker implements Checker {
+
+ public static final String SSL_PROPERTY = "SSL";
+
+ private List<File> files = new ArrayList<File>();
+ private Project release;
+
+ public void check() throws Exception {
+ for (File f : files) {
+ // Remove the .asc from the file name
+ int index = f.getName().lastIndexOf('.');
+ String n = f.getName().substring(0, index);
+
+ Command cmd = new Command();
+ cmd.executeCommand(release, release.getProperty(SSL_PROPERTY) + " md5 " + n, false);
+ String out = cmd.getOutput();
+ String md5 = getMD5(f);
+ if (! out.contains(md5)) {
+ throw new Exception("Bad MD5 hash for " + n + "Expected:" + md5 + " Get:" + out);
+ }
+ }
+ }
+
+ private String getMD5(File f) throws IOException {
+ FileReader fis = new FileReader (f);
+ BufferedReader br = new BufferedReader (fis);
+ String line = br.readLine();
+ int index = line.indexOf(' ');
+ return line.substring(index).trim();
+ }
+
+ public void clean() {
+ files.clear();
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ // Get all md5 and sha1 files
+ Map<String, File> maps = release.getArtifacts();
+ Iterator<String> it = maps.keySet().iterator();
+ while(it.hasNext()) {
+ String f = it.next();
+ if (f.endsWith(".md5")) {
+ files.add(maps.get(f));
+ }
+ }
+ return true;
+ }
+
+ public String getCheckerName() {
+ return "MD5 Signature Checker";
+ }
+
+}
Added: 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=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/Notice.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,122 @@
+package org.apache.felix.project.checker;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Notice {
+
+ private String title;
+ private String copyright;
+
+ private List<License> included = new ArrayList<License>();
+ private List<License> used = new ArrayList<License>();
+
+ private List<String> summary = new ArrayList<String>();
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getCopyright() {
+ return copyright;
+ }
+
+ public List<License> getIncluded() {
+ return included;
+ }
+
+ public List<License> getUsed() {
+ return used;
+ }
+
+ public List<String> getSummary() {
+ return summary;
+ }
+
+ public Notice(File notice) throws Exception {
+ read(notice);
+ }
+
+ public void read(File file) throws Exception {
+ BufferedReader input = new BufferedReader(new FileReader(file));
+
+ String line = null;
+ int step = 0; // 0 = header, 1 = included, 2 = used, 3 = summary
+ boolean newentry = true;
+ StringBuffer current = new StringBuffer();
+ while (( line = input.readLine()) != null) {
+ if(line.length() == 0) {
+ if (current.length() > 0) {
+ try {
+ if (step == 1) {
+ included.add(new License(current.toString()));
+ } else {
+ used.add(new License(current.toString()));
+ }
+ } catch(Exception e) {
+ System.out.println("[WARNING] Unrecognized license format in the notice file :");
+ System.out.println(current);
+ }
+ }
+ current = new StringBuffer();
+ newentry = true;
+ } else if (line.contains("I. Included Software")){
+ step = 1;
+ } else if (line.contains("II. Used Software")){
+ step = 2;
+ } else if (line.contains("III. ")){ // SUMMARY
+ step = 3;
+ } else {
+ switch (step) {
+ case 0:
+ newentry = false;
+
+ if (title == null) {
+ title = line.trim();
+ } else if (copyright == null){
+ copyright = line.trim();
+ } else {
+ throw new Exception("Unexpected header line : " + line);
+ }
+ break;
+ case 1:
+ case 2:
+ if (newentry) {
+ newentry = false;
+ }
+ current.append(line +"\n");
+ break;
+ case 3:
+ // One license per line : - License name
+ parseLicense(line);
+ break;
+ }
+ }
+ }
+ }
+
+ private void parseLicense(String line) throws Exception {
+ Pattern pattern = Pattern.compile("-( )?(.*)");
+ Matcher matcher = pattern.matcher(line);
+ if (matcher.matches()) {
+ summary.add(matcher.group(2));
+ } else {
+ throw new Exception("Cannot parse the summary licence: " + line);
+ }
+ }
+
+ public static void main(String args[]) throws Exception {
+ new Notice(new File("/Users/clement/workspaces/felix-trunk/ipojo/ant/NOTICE"));
+ new Notice(new File("/Users/clement/workspaces/felix-trunk/webconsole/NOTICE"));
+ new Notice(new File("/Users/clement/workspaces/felix-trunk/http.jetty/NOTICE"));
+
+
+
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeCopyrightChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeCopyrightChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeCopyrightChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeCopyrightChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,37 @@
+package org.apache.felix.project.checker;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class NoticeCopyrightChecker implements Checker {
+
+ private Notice notice;
+ private static final String COPYRIGHT_REGEX = "Copyright (\\d{4}|\\d{4}-\\d{4}) The Apache Software Foundation";
+ private static final Pattern COPYRIGHT_PATTERN = Pattern.compile(COPYRIGHT_REGEX);
+
+
+ public void check() throws Exception {
+ String copyright = notice.getCopyright();
+ Matcher matcher = COPYRIGHT_PATTERN.matcher(copyright);
+ if (matcher.matches()) {
+ String year = matcher.group(1);
+ if (! year.contains("2009")) {
+ throw new Exception("The copyright year(s) must contains 2009");
+ }
+ } else {
+ throw new Exception("The copyright (" + copyright + ") is not conform against " + COPYRIGHT_REGEX);
+ }
+ }
+
+ public void clean() { }
+
+ public String getCheckerName() {
+ return "Notice Copyright checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ notice = release.getNotice();
+ return true;
+ }
+
+}
Added: felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeNameChecker.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeNameChecker.java?rev=763213&view=auto
==============================================================================
--- felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeNameChecker.java (added)
+++ felix/sandbox/clement/Project-Checker/src/org/apache/felix/project/checker/NoticeNameChecker.java Wed Apr 8 12:30:27 2009
@@ -0,0 +1,34 @@
+package org.apache.felix.project.checker;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class NoticeNameChecker implements Checker {
+
+ private Notice notice;
+ private Project release;;
+
+
+ public void check() throws Exception {
+ String regex = release.getProperty("PARENT_PROJECT_NAME") + " (.)+";
+ Pattern pattern = Pattern.compile(regex);
+
+ Matcher matcher = pattern.matcher(notice.getTitle());
+ if (! matcher.matches()) {
+ throw new Exception("The notice title (" + notice.getTitle() + ") is not conform against " + regex);
+ }
+ }
+
+ public void clean() { }
+
+ public String getCheckerName() {
+ return "Notice Copyright checker";
+ }
+
+ public boolean prepare(Project release) throws Exception {
+ this.release = release;
+ notice = release.getNotice();
+ return true;
+ }
+
+}