You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ev...@apache.org on 2006/08/11 10:21:17 UTC

svn commit: r430718 [1/2] - in /maven/sandbox/maven-shared-jar: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/maven/ src/main/java/org/apache/maven/shared/ src/main/java/org/apache/maven/shared/j...

Author: evenisse
Date: Fri Aug 11 01:21:11 2006
New Revision: 430718

URL: http://svn.apache.org/viewvc?rev=430718&view=rev
Log:
[MNG-2489] jar internals discovery component
Submitted by: Joakim Erdfelt

Added:
    maven/sandbox/maven-shared-jar/   (with props)
    maven/sandbox/maven-shared-jar/pom.xml   (with props)
    maven/sandbox/maven-shared-jar/src/
    maven/sandbox/maven-shared-jar/src/main/
    maven/sandbox/maven-shared-jar/src/main/java/
    maven/sandbox/maven-shared-jar/src/main/java/org/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TimestampExposer.java   (with props)
    maven/sandbox/maven-shared-jar/src/test/
    maven/sandbox/maven-shared-jar/src/test/jars/
    maven/sandbox/maven-shared-jar/src/test/jars/ant.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/codec.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/evil-sealed-regex-1.0.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.1-debug.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.1.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.2-debug.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.2.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.3-debug.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.3.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.4-debug.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.4.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.5-debug.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/helloworld-1.5.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/jars/jxr.jar   (with props)
    maven/sandbox/maven-shared-jar/src/test/java/
    maven/sandbox/maven-shared-jar/src/test/java/org/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/AbstractJarTestCase.java   (with props)
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/JarTest.java   (with props)
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/classes/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/classes/ImportVisitorTest.java   (with props)
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java   (with props)
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/taxon/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzerTest.java   (with props)
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/taxon/exposers/
    maven/sandbox/maven-shared-jar/src/test/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposerTest.java   (with props)

Propchange: maven/sandbox/maven-shared-jar/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Aug 11 01:21:11 2006
@@ -0,0 +1,4 @@
+target
+*.iml
+*.ipr
+*.iws

Added: maven/sandbox/maven-shared-jar/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/pom.xml?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/pom.xml (added)
+++ maven/sandbox/maven-shared-jar/pom.xml Fri Aug 11 01:21:11 2006
@@ -0,0 +1,139 @@
+<?xml version="1.0" ?>
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.shared</groupId>
+    <artifactId>maven-shared-components</artifactId>
+    <version>2</version>
+  </parent>
+
+  <artifactId>maven-shared-jar</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <name>Maven Shared Jar Utils</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.plexus</groupId>
+        <artifactId>plexus-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>descriptor</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>cobertura-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>clean</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <artifactId>maven-project-info-reports-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <artifactId>maven-javadoc-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>changelog-maven-plugin</artifactId>
+        <!--  Changelog has been moved to org.apache.maven.plugins
+              Need to adjust this location in the future to point to
+              the finalized copy of this plugin.
+        <artifactId>maven-changelog-plugin</artifactId> 
+          -->
+      </plugin>
+      <plugin>
+        <artifactId>maven-jxr-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <configuration>
+          <linkXref>true</linkXref>
+          <rulesets>
+            <ruleset>rulesets/basic.xml</ruleset>
+            <ruleset>rulesets/codesize.xml</ruleset>
+            <ruleset>rulesets/controversial.xml</ruleset>
+            <ruleset>rulesets/coupling.xml</ruleset>
+            <ruleset>rulesets/finalizers.xml</ruleset>
+            <ruleset>rulesets/imports.xml</ruleset>
+            <ruleset>rulesets/junit.xml</ruleset>
+            <ruleset>rulesets/logging-jakarta-commons.xml</ruleset>
+            <ruleset>rulesets/naming.xml</ruleset>
+            <ruleset>rulesets/optimizations.xml</ruleset>
+            <ruleset>rulesets/strictexception.xml</ruleset>
+            <ruleset>rulesets/strings.xml</ruleset>
+            <ruleset>rulesets/sunsecure.xml</ruleset>
+            <ruleset>rulesets/unusedcode.xml</ruleset>
+          </rulesets>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>cobertura-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+      <version>2.0.2</version>
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact-manager</artifactId>
+      <version>2.0.2</version>
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.maven.repository</groupId>
+      <artifactId>maven-repository-utils</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>bcel</groupId>
+      <artifactId>bcel</artifactId>
+      <version>5.1</version>
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-collections</groupId>
+      <artifactId>commons-collections</artifactId>
+      <version>3.1</version>
+      <scope>compile</scope>
+    </dependency>
+
+  </dependencies>
+
+</project>

Propchange: maven/sandbox/maven-shared-jar/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,296 @@
+package org.apache.maven.shared.jar;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.repository.digest.Digester;
+import org.apache.maven.repository.digest.DigesterException;
+import org.apache.maven.repository.digest.StreamingDigester;
+import org.apache.maven.shared.jar.classes.JarClasses;
+import org.apache.maven.shared.jar.taxon.JarTaxon;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * A Jar Toolbox for working with Jar Files.
+ */
+public class Jar
+    extends AbstractLogEnabled
+{
+    private List entries;
+
+    private JarFile jarfile;
+
+    private File file;
+
+    private JarClasses classes;
+
+    private JarTaxon taxon;
+
+    private boolean isSealed;
+
+    /**
+     * Create a Jar Tool.
+     *
+     * @param file
+     * @throws JarException
+     */
+    public Jar( File file )
+        throws JarException
+    {
+        if ( file == null )
+        {
+            throw new JarException( "Null jar File." );
+        }
+
+        init( file );
+    }
+
+    /**
+     * @param filename
+     * @throws JarException
+     */
+    public Jar( String filename )
+        throws JarException
+    {
+        if ( StringUtils.isEmpty( filename ) )
+        {
+            throw new JarException( "Empty jar filename." );
+        }
+
+        init( new File( filename ) );
+    }
+
+    /**
+     * Compute the HashCode for this Jar File.
+     *
+     * @return the hashcode, or null if not able to be computed.
+     */
+    public String computeFileHash( Digester digester )
+    {
+        try
+        {
+            return digester.calc( new File( getFilename() ) );
+        }
+        catch ( DigesterException e )
+        {
+            getLogger().warn( "Unable to calculate the hashcode.", e );
+            return null;
+        }
+    }
+
+    /**
+     * Compute the HashCode for the Bytecode within this Jar File.
+     * <p/>
+     * Useful to see thru a recompile, recompression, or timestamp change.
+     *
+     * @return the hashcode, or null if not able to be computed.
+     */
+    public String computeBytecodeHash( StreamingDigester digester )
+    {
+        Iterator it = entries.iterator();
+        InputStream is;
+
+        try
+        {
+            digester.reset();
+            while ( it.hasNext() )
+            {
+                JarEntry entry = (JarEntry) it.next();
+
+                if ( entry.getName().endsWith( ".class" ) )
+                {
+                    is = jarfile.getInputStream( entry );
+
+                    digester.update( is );
+                }
+            }
+            return digester.calc();
+        }
+        catch ( DigesterException e )
+        {
+            getLogger().warn( "Unable to calculate the hashcode.", e );
+            return null;
+        }
+        catch ( IOException e )
+        {
+            getLogger().warn( "Unable to calculate the hashcode.", e );
+            return null;
+        }
+
+    }
+
+    public InputStream getEntryInputStream( JarEntry entry )
+    {
+        try
+        {
+            return jarfile.getInputStream( entry );
+        }
+        catch ( IOException e )
+        {
+            getLogger().error( "Unable to get input stream for entry " + entry.getName() + ": " + e.getMessage() );
+            return null;
+        }
+    }
+
+    public File getFile()
+    {
+        return file;
+    }
+
+    public String getFilename()
+    {
+        return jarfile.getName();
+    }
+
+    public Manifest getManifest()
+    {
+        try
+        {
+            return jarfile.getManifest();
+        }
+        catch ( IOException e )
+        {
+            getLogger().error( "Unable to get manifest on " + this + ": " + e.getMessage() );
+            return null;
+        }
+    }
+
+    public List getNameRegexEntryList( String regex )
+    {
+        List ret = new ArrayList();
+
+        Pattern pat = Pattern.compile( regex );
+        Matcher mat;
+
+        Iterator it = entries.iterator();
+        while ( it.hasNext() )
+        {
+            JarEntry entry = (JarEntry) it.next();
+
+            mat = pat.matcher( entry.getName() );
+            if ( mat.find() )
+            {
+                ret.add( entry );
+            }
+        }
+
+        return ret;
+    }
+
+    private void init( File jfile )
+        throws JarException
+    {
+        if ( !jfile.exists() )
+        {
+            throw new JarException( "File " + jfile.getAbsolutePath() + " does not exist." );
+        }
+
+        if ( !jfile.canRead() )
+        {
+            throw new JarException( "No read access to file " + jfile.getAbsolutePath() + "." );
+        }
+
+        try
+        {
+            this.jarfile = new JarFile( jfile );
+            this.file = jfile;
+        }
+        catch ( IOException e )
+        {
+            throw new JarException( "Unable to open artifact " + jfile.getAbsolutePath(), e );
+        }
+
+        // Obtain entries list.
+
+        entries = new ArrayList();
+        Enumeration jarentries = jarfile.entries();
+        while ( jarentries.hasMoreElements() )
+        {
+            JarEntry entry = (JarEntry) jarentries.nextElement();
+            entries.add( entry );
+        }
+
+        // Sorting of list is done to ensure a proper Bytecode Hash.
+        Collections.sort( entries, new JarEntryComparator() );
+
+        Manifest manifest = getManifest();
+        String sval = manifest.getMainAttributes().getValue( Attributes.Name.SEALED );
+        if ( StringUtils.isEmpty( sval ) )
+        {
+            isSealed = false;
+        }
+        else
+        {
+            isSealed = sval.trim().equalsIgnoreCase( "true" );
+        }
+    }
+
+    public String toString()
+    {
+        return "<Jar:" + jarfile.getName() + ">";
+    }
+
+    public boolean isSealed()
+    {
+        return isSealed;
+    }
+
+    public void setSealed( boolean isSealed )
+    {
+        this.isSealed = isSealed;
+    }
+
+    public JarClasses getClasses()
+    {
+        return classes;
+    }
+
+    public void setClasses( JarClasses classes )
+    {
+        this.classes = classes;
+    }
+
+    public JarTaxon getTaxon()
+    {
+        return taxon;
+    }
+
+    public void setTaxon( JarTaxon taxon )
+    {
+        this.taxon = taxon;
+    }
+
+    public List getEntries()
+    {
+        return entries;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/Jar.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,27 @@
+package org.apache.maven.shared.jar;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Jar Analyzer Interface.
+ */
+public interface JarAnalyzer
+{
+    static final String ROLE = JarAnalyzer.class.getName();
+
+    public void analyze( Jar jar );
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,29 @@
+/**
+ * 
+ */
+package org.apache.maven.shared.jar;
+
+import java.util.Comparator;
+import java.util.jar.JarEntry;
+
+class JarEntryComparator
+    implements Comparator
+{
+
+    public int compare( Object o1, Object o2 )
+    {
+        if ( !( o1 instanceof JarEntry ) )
+        {
+            return 0;
+        }
+        if ( !( o2 instanceof JarEntry ) )
+        {
+            return 0;
+        }
+        JarEntry j1 = (JarEntry) o1;
+        JarEntry j2 = (JarEntry) o2;
+
+        return j1.getName().compareTo( j2.getName() );
+    }
+
+}
\ No newline at end of file

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarEntryComparator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,44 @@
+package org.apache.maven.shared.jar;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Exceptions that occur during Jar utility methods.
+ */
+public class JarException
+    extends Exception
+{
+    public JarException()
+    {
+        super();
+    }
+
+    public JarException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+    public JarException( String message )
+    {
+        super( message );
+    }
+
+    public JarException( Throwable cause )
+    {
+        super( cause );
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/JarException.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,172 @@
+package org.apache.maven.shared.jar.classes;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.bcel.classfile.ConstantClass;
+import org.apache.bcel.classfile.ConstantUtf8;
+import org.apache.bcel.classfile.EmptyVisitor;
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.commons.collections.list.SetUniqueList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * ImportVisitor
+ */
+public class ImportVisitor
+    extends EmptyVisitor
+{
+    private List imports;
+
+    private JavaClass javaClass;
+
+    private Pattern qualifiedPat;
+
+    private Pattern validUtfPat;
+
+    /**
+     * Create an Import visitor.
+     *
+     * @param javaClass the javaclass to work off of.
+     */
+    public ImportVisitor( JavaClass javaClass )
+    {
+        this.javaClass = javaClass;
+        this.imports = SetUniqueList.decorate( new ArrayList() );
+        this.qualifiedPat = Pattern.compile( "L([a-zA-Z][a-zA-Z0-9\\.]+);" );
+        this.validUtfPat = Pattern.compile( "^[\\(\\)\\[A-Za-z0-9;/]+$" );
+    }
+
+    /**
+     * Get the list of discovered imports.
+     *
+     * @return Returns the imports.
+     */
+    public List getImports()
+    {
+        return imports;
+    }
+
+    /**
+     * Find any formally declared import in the Constant Pool.
+     *
+     * @see org.apache.bcel.classfile.EmptyVisitor#visitConstantClass(org.apache.bcel.classfile.ConstantClass)
+     */
+    public void visitConstantClass( ConstantClass constantClass )
+    {
+        String name = constantClass.getBytes( javaClass.getConstantPool() );
+
+        // only strings with '/' character are to be considered.
+        if ( name.indexOf( '/' ) == ( -1 ) )
+        {
+            return;
+        }
+
+        name = name.replace( '/', '.' );
+
+        if ( name.endsWith( ".class" ) )
+        {
+            name = name.substring( 0, name.length() - 6 );
+        }
+
+        Matcher mat = qualifiedPat.matcher( name );
+        if ( mat.find() )
+        {
+            this.imports.add( mat.group( 1 ) );
+        }
+        else
+        {
+            this.imports.add( name );
+        }
+    }
+
+    /**
+     * Find any package class Strings in the UTF8 String Pool.
+     *
+     * @see org.apache.bcel.classfile.EmptyVisitor#visitConstantUtf8(org.apache.bcel.classfile.ConstantUtf8)
+     */
+    public void visitConstantUtf8( ConstantUtf8 constantUtf8 )
+    {
+        String ret = constantUtf8.getBytes().trim();
+
+        // empty strings are not class names.
+        if ( ret.length() <= 0 )
+        {
+            return;
+        }
+
+        // Only valid characters please.
+        if ( !validUtfPat.matcher( ret ).matches() )
+        {
+            return;
+        }
+
+        // only strings with '/' character are to be considered.
+        if ( ret.indexOf( '/' ) == ( -1 ) )
+        {
+            return;
+        }
+
+        // Strings that start with '/' are bad too
+        // Seen when Pool has regex patterns.
+        if ( ret.charAt( 0 ) == '/' )
+        {
+            return;
+        }
+
+        // Make string more class-like.
+        ret = ret.replace( '/', '.' );
+
+        // Double ".." indicates a bad class fail-fast.
+        // Seen when ConstantUTF8 Pool has regex patterns.
+        if ( ret.indexOf( ".." ) != ( -1 ) )
+        {
+            return;
+        }
+
+        Matcher mat = qualifiedPat.matcher( ret );
+        char prefix = ret.charAt( 0 );
+
+        if ( prefix == '(' )
+        {
+            // A Method Declaration.
+
+            // Loop for each Qualified Class found.
+            while ( mat.find() )
+            {
+                this.imports.add( mat.group( 1 ) );
+            }
+        }
+        else
+        {
+            // A Variable Declaration.
+            if ( mat.find() )
+            {
+                // Add a UTF8 Qualified Class reference.
+                this.imports.add( mat.group( 1 ) );
+            }
+            else
+            {
+                // Add a simple Class reference.
+                this.imports.add( ret );
+            }
+        }
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,136 @@
+package org.apache.maven.shared.jar.classes;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.collections.list.SetUniqueList;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Facts about the classes within a Jar File.
+ */
+public class JarClasses
+{
+    private List imports;
+
+    private List packages;
+
+    private List classNames;
+
+    private boolean isDebugPresent;
+
+    private String jdkRevision;
+
+    /**
+     * Create Empty JarFacts.
+     */
+    public JarClasses()
+    {
+        super();
+        imports = SetUniqueList.decorate( new ArrayList() );
+        packages = SetUniqueList.decorate( new ArrayList() );
+        classNames = SetUniqueList.decorate( new ArrayList() );
+    }
+
+    public void addClassName( String name )
+    {
+        this.classNames.add( name );
+    }
+
+    /**
+     * Add an Import.
+     *
+     * @param iname the import name
+     */
+    public void addImport( String iname )
+    {
+        this.imports.add( iname );
+    }
+
+    /**
+     * Add a Package name.
+     *
+     * @param pname the package name
+     */
+    public void addPackage( String pname )
+    {
+        this.packages.add( pname );
+    }
+
+    public List getClassNames()
+    {
+        return classNames;
+    }
+
+    /**
+     * @return Returns the imports.
+     */
+    public List getImports()
+    {
+        return imports;
+    }
+
+    /**
+     * @return Returns the packages.
+     */
+    public List getPackages()
+    {
+        return packages;
+    }
+
+    public void setClassNames( List classes )
+    {
+        this.classNames = classes;
+    }
+
+    /**
+     * @param imports The imports to set.
+     */
+    public void setImports( List imports )
+    {
+        this.imports = imports;
+    }
+
+    /**
+     * @param packages The packages to set.
+     */
+    public void setPackages( List packages )
+    {
+        this.packages = packages;
+    }
+
+    public boolean isDebugPresent()
+    {
+        return isDebugPresent;
+    }
+
+    public void setDebugPresent( boolean hasDebugSymbols )
+    {
+        this.isDebugPresent = hasDebugSymbols;
+    }
+
+    public String getJdkRevision()
+    {
+        return jdkRevision;
+    }
+
+    public void setJdkRevision( String jdkRevision )
+    {
+        this.jdkRevision = jdkRevision;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,160 @@
+package org.apache.maven.shared.jar.classes;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.bcel.classfile.ClassParser;
+import org.apache.bcel.classfile.DescendingVisitor;
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.bcel.classfile.LineNumberTable;
+import org.apache.bcel.classfile.Method;
+import org.apache.maven.shared.jar.Jar;
+import org.apache.maven.shared.jar.JarAnalyzer;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.JarEntry;
+
+/**
+ * Jar Classes Analyzer
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.JarAnalyzer" role-hint="classes"
+ */
+public class JarClassesAnalyzer
+    extends AbstractLogEnabled
+    implements JarAnalyzer
+{
+    /**
+     * Analyze and populate the <code>jar.information.classes</code> object.
+     */
+    public void analyze( Jar jar )
+    {
+        try
+        {
+            String jarfilename = jar.getFile().getAbsolutePath();
+            JarClasses classes = new JarClasses();
+
+            List classList = jar.getNameRegexEntryList( "[A-Za-z0-9]*\\.class$" );
+
+            classes.setDebugPresent( false );
+
+            double maxVersion = 0.0;
+
+            Iterator it = classList.iterator();
+            while ( it.hasNext() )
+            {
+                JarEntry entry = (JarEntry) it.next();
+                String classname = entry.getName();
+
+                ClassParser classParser = new ClassParser( jarfilename, classname );
+                JavaClass javaClass = classParser.parse();
+
+                if ( !classes.isDebugPresent() )
+                {
+                    if ( hasDebugSymbols( javaClass ) )
+                    {
+                        classes.setDebugPresent( true );
+                    }
+                }
+
+                double classVersion = javaClass.getMajor();
+                if ( javaClass.getMinor() > 0 )
+                {
+                    classVersion = classVersion + ( 1 / (double) javaClass.getMinor() );
+                }
+
+                if ( classVersion > maxVersion )
+                {
+                    maxVersion = classVersion;
+                }
+
+                String classPackageName = javaClass.getPackageName();
+
+                classes.addClassName( javaClass.getClassName() );
+                classes.addPackage( classPackageName );
+
+                ImportVisitor importVisitor = new ImportVisitor( javaClass );
+                DescendingVisitor descVisitor = new DescendingVisitor( javaClass, importVisitor );
+                javaClass.accept( descVisitor );
+
+                addImports( classes, importVisitor.getImports() );
+            }
+
+            if ( maxVersion >= 50.0 )
+            {
+                classes.setJdkRevision( "1.6" );
+            }
+            else if ( maxVersion >= 49.0 )
+            {
+                classes.setJdkRevision( "1.5" );
+            }
+            else if ( maxVersion > 47.0 )
+            {
+                classes.setJdkRevision( "1.4" );
+            }
+            else if ( maxVersion > 46.0 )
+            {
+                classes.setJdkRevision( "1.3" );
+            }
+            else if ( maxVersion > 45.65536 )
+            {
+                classes.setJdkRevision( "1.2" );
+            }
+            else if ( maxVersion > 45.3 )
+            {
+                classes.setJdkRevision( "1.1" );
+            }
+            else
+            {
+                classes.setJdkRevision( "1.0" );
+            }
+
+            jar.setClasses( classes );
+        }
+        catch ( IOException e )
+        {
+            getLogger().warn( "Unable to process Jar File " + jar.getFile(), e );
+        }
+    }
+
+    private boolean hasDebugSymbols( JavaClass javaClass )
+    {
+        boolean ret = false;
+        Method methods[] = javaClass.getMethods();
+        for ( int i = 0; i < methods.length; i++ )
+        {
+            LineNumberTable linenumbers = methods[i].getLineNumberTable();
+            if ( ( linenumbers != null ) && ( linenumbers.getLength() > 0 ) )
+            {
+                ret = true;
+                break;
+            }
+        }
+
+        return ret;
+    }
+
+    private void addImports( JarClasses facts, List imports )
+    {
+        Iterator it = imports.iterator();
+        while ( it.hasNext() )
+        {
+            facts.addImport( (String) it.next() );
+        }
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,141 @@
+package org.apache.maven.shared.jar.taxon;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.Jar;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.console.ConsoleLogger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Abstract Jar Taxon Exposer.
+ */
+public abstract class AbstractJarTaxonExposer
+    extends AbstractLogEnabled
+    implements JarTaxonExposer
+{
+    private Jar jar;
+
+    private List groupIds = null;
+
+    private List artifactIds = null;
+
+    private List versions = null;
+
+    private List names = null;
+
+    private List vendors = null;
+
+    public Jar getJar()
+    {
+        return jar;
+    }
+
+    public void setJar( Jar jar )
+    {
+        this.jar = jar;
+    }
+
+    private List addUnique( List list, String id )
+    {
+        if ( id == null )
+        {
+            return list;
+        }
+
+        if ( list == null )
+        {
+            list = new ArrayList();
+        }
+
+        if ( !list.contains( id ) )
+        {
+            list.add( id );
+        }
+
+        return list;
+    }
+
+    protected void addGroupId( String id )
+    {
+        this.groupIds = addUnique( groupIds, id );
+    }
+
+    protected void addArtifactId( String id )
+    {
+        this.artifactIds = addUnique( artifactIds, id );
+    }
+
+    protected void addVersion( String id )
+    {
+        this.versions = addUnique( versions, id );
+    }
+
+    protected void addName( String id )
+    {
+        this.names = addUnique( names, id );
+    }
+
+    protected void addVendor( String id )
+    {
+        this.vendors = addUnique( vendors, id );
+    }
+
+    public List getGroupIds()
+    {
+        return groupIds;
+    }
+
+    public List getArtifactIds()
+    {
+        return artifactIds;
+    }
+
+    public List getVersions()
+    {
+        return versions;
+    }
+
+    public List getNames()
+    {
+        return names;
+    }
+
+    public List getVendors()
+    {
+        return vendors;
+    }
+
+    private Logger log;
+
+    protected Logger getLogger()
+    {
+        if ( log == null )
+        {
+            log = super.getLogger();
+            if ( log == null )
+            {
+                log = new ConsoleLogger( Logger.LEVEL_DEBUG, AbstractJarTaxonExposer.class.getName() );
+            }
+        }
+
+        return log;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/AbstractJarTaxonExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,47 @@
+package org.apache.maven.shared.jar.taxon;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Empty Repository Hash Search.  Always returns an empty list.
+ * Used for local only implementation of a RepositoryHashSearch.
+ * It is expected for the users of this library to provide an implementation
+ * of a RepositoryHashSearch against a real repository.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.RepositoryHashSearch"
+ */
+public class EmptyRepositoryHashSearch
+    implements RepositoryHashSearch
+{
+    public boolean isValid()
+    {
+        return false;
+    }
+
+    public List searchBytecodeHash( String hash )
+    {
+        return Collections.EMPTY_LIST;
+    }
+
+    public List searchFileHash( String hash )
+    {
+        return Collections.EMPTY_LIST;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/EmptyRepositoryHashSearch.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,191 @@
+package org.apache.maven.shared.jar.taxon;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Jar Taxon, the set of Maven dependency information both found and potential.
+ */
+public class JarTaxon
+{
+    private boolean wellKnown = false;
+
+    private String groupId;
+
+    private String artifactId;
+
+    private String version;
+
+    private String name;
+
+    private String vendor;
+
+    private List potentials;
+
+    public JarTaxon()
+    {
+        potentials = new ArrayList();
+    }
+
+    public String getArtifactId()
+    {
+        return artifactId;
+    }
+
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    }
+
+    public String getGroupId()
+    {
+        return groupId;
+    }
+
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public List getPotentials()
+    {
+        return potentials;
+    }
+
+    public void setPotentials( List potentials )
+    {
+        this.potentials = potentials;
+    }
+
+    public String getVendor()
+    {
+        return vendor;
+    }
+
+    public void setVendor( String vendor )
+    {
+        this.vendor = vendor;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    public boolean isWellKnown()
+    {
+        return wellKnown;
+    }
+
+    public void setWellKnown( boolean wellKnown )
+    {
+        this.wellKnown = wellKnown;
+    }
+
+    public List getGroupIds()
+    {
+        List ret = new ArrayList();
+        Iterator it = potentials.iterator();
+        while ( it.hasNext() )
+        {
+            AbstractJarTaxonExposer exposer = (AbstractJarTaxonExposer) it.next();
+            if ( exposer.getGroupIds() != null )
+            {
+                ret.addAll( exposer.getGroupIds() );
+            }
+        }
+        return ret;
+    }
+
+    public List getArtifactIds()
+    {
+        List ret = new ArrayList();
+        Iterator it = potentials.iterator();
+        while ( it.hasNext() )
+        {
+            AbstractJarTaxonExposer exposer = (AbstractJarTaxonExposer) it.next();
+            if ( exposer.getArtifactIds() != null )
+            {
+                ret.addAll( exposer.getArtifactIds() );
+            }
+        }
+        return ret;
+    }
+
+    public List getVersions()
+    {
+        List ret = new ArrayList();
+        Iterator it = potentials.iterator();
+        while ( it.hasNext() )
+        {
+            AbstractJarTaxonExposer exposer = (AbstractJarTaxonExposer) it.next();
+            if ( exposer.getVersions() != null )
+            {
+                ret.addAll( exposer.getVersions() );
+            }
+        }
+        return ret;
+    }
+
+    public List getNames()
+    {
+        List ret = new ArrayList();
+        Iterator it = potentials.iterator();
+        while ( it.hasNext() )
+        {
+            AbstractJarTaxonExposer exposer = (AbstractJarTaxonExposer) it.next();
+            if ( exposer.getNames() != null )
+            {
+                ret.addAll( exposer.getNames() );
+            }
+        }
+        return ret;
+    }
+
+    public List getVendors()
+    {
+        List ret = new ArrayList();
+        Iterator it = potentials.iterator();
+        while ( it.hasNext() )
+        {
+            AbstractJarTaxonExposer exposer = (AbstractJarTaxonExposer) it.next();
+            if ( exposer.getVendors() != null )
+            {
+                ret.addAll( exposer.getVendors() );
+            }
+        }
+        return ret;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxon.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,180 @@
+package org.apache.maven.shared.jar.taxon;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.Jar;
+import org.apache.maven.shared.jar.JarAnalyzer;
+import org.codehaus.plexus.util.StringUtils;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Jar Taxon Analyzer
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.JarAnalyzer" role-hint="taxon"
+ */
+public class JarTaxonAnalyzer
+    implements JarAnalyzer
+{
+    /**
+     * @plexus.requirement role="org.apache.maven.shared.jar.taxon.JarTaxonExposer"
+     */
+    private List exposers;
+
+    public void analyze( Jar jar )
+    {
+        JarTaxon taxon = new JarTaxon();
+
+        for ( Iterator i = exposers.iterator(); i.hasNext(); )
+        {
+            JarTaxonExposer exposer = (JarTaxonExposer) i.next();
+            exposer.setJar( jar );
+            addExposer( taxon, exposer );
+        }
+
+        normalize( taxon );
+
+        jar.setTaxon( taxon );
+    }
+
+    private void addExposer( JarTaxon taxon, JarTaxonExposer exposer )
+    {
+        taxon.getPotentials().add( exposer );
+        exposer.expose();
+
+        if ( exposer.isAuthoritative() )
+        {
+            if ( StringUtils.isEmpty( taxon.getGroupId() ) && isNotEmpty( exposer.getGroupIds() ) )
+            {
+                taxon.setGroupId( (String) exposer.getGroupIds().get( 0 ) );
+            }
+
+            if ( StringUtils.isEmpty( taxon.getArtifactId() ) && isNotEmpty( exposer.getArtifactIds() ) )
+            {
+                taxon.setArtifactId( (String) exposer.getArtifactIds().get( 0 ) );
+            }
+
+            if ( StringUtils.isEmpty( taxon.getVersion() ) && isNotEmpty( exposer.getVersions() ) )
+            {
+                taxon.setVersion( (String) exposer.getVersions().get( 0 ) );
+            }
+
+            if ( StringUtils.isEmpty( taxon.getName() ) && isNotEmpty( exposer.getNames() ) )
+            {
+                taxon.setName( (String) exposer.getNames().get( 0 ) );
+            }
+
+            if ( StringUtils.isEmpty( taxon.getVendor() ) && isNotEmpty( exposer.getVendors() ) )
+            {
+                taxon.setVendor( (String) exposer.getVendors().get( 0 ) );
+            }
+        }
+    }
+
+    private void normalize( JarTaxon taxon )
+    {
+        if ( StringUtils.isEmpty( taxon.getGroupId() ) )
+        {
+            taxon.setGroupId( pickSmallest( taxon.getGroupIds() ) );
+        }
+
+        if ( StringUtils.isEmpty( taxon.getArtifactId() ) )
+        {
+            taxon.setArtifactId( pickLargest( taxon.getArtifactIds() ) );
+        }
+
+        if ( StringUtils.isEmpty( taxon.getVersion() ) )
+        {
+            taxon.setVersion( pickSmallest( taxon.getVersions() ) );
+        }
+
+        if ( StringUtils.isEmpty( taxon.getName() ) )
+        {
+            taxon.setName( pickLargest( taxon.getNames() ) );
+        }
+
+        if ( StringUtils.isEmpty( taxon.getVendor() ) )
+        {
+            taxon.setVendor( pickLargest( taxon.getVendors() ) );
+        }
+    }
+
+    private String pickSmallest( List list )
+    {
+        if ( isEmpty( list ) )
+        {
+            return null;
+        }
+
+        int size = Integer.MAX_VALUE;
+        String smallest = null;
+        Iterator it = list.iterator();
+        while ( it.hasNext() )
+        {
+            String val = (String) it.next();
+
+            if ( StringUtils.isNotEmpty( val ) )
+            {
+                if ( val.length() < size )
+                {
+                    smallest = val;
+                    size = val.length();
+                }
+            }
+        }
+
+        return smallest;
+    }
+
+    private String pickLargest( List list )
+    {
+        if ( isEmpty( list ) )
+        {
+            return null;
+        }
+
+        int size = Integer.MIN_VALUE;
+        String largest = null;
+        Iterator it = list.iterator();
+        while ( it.hasNext() )
+        {
+            String val = (String) it.next();
+            if ( StringUtils.isNotEmpty( val ) )
+            {
+                if ( val.length() > size )
+                {
+                    largest = val;
+                    size = val.length();
+                }
+            }
+        }
+
+        return largest;
+    }
+
+    private boolean isEmpty( Collection coll )
+    {
+        return ( ( coll == null ) || coll.isEmpty() );
+    }
+
+    private boolean isNotEmpty( Collection coll )
+    {
+        return ( ( coll != null ) && !coll.isEmpty() );
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonAnalyzer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,48 @@
+package org.apache.maven.shared.jar.taxon;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.Jar;
+
+import java.util.List;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public interface JarTaxonExposer
+{
+    static final String ROLE = JarTaxonExposer.class.getName();
+
+    void setJar( Jar jar );
+
+    void expose();
+
+    boolean isAuthoritative();
+
+    String getExposerName();
+
+    List getGroupIds();
+
+    List getArtifactIds();
+
+    List getVersions();
+
+    List getNames();
+
+    List getVendors();
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/JarTaxonExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,33 @@
+package org.apache.maven.shared.jar.taxon;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.List;
+
+/**
+ * Interface for Repository Hash Searches.
+ */
+public interface RepositoryHashSearch
+{
+    public static final String ROLE = RepositoryHashSearch.class.getName();
+
+    public boolean isValid();
+
+    public List searchFileHash( String hash );
+
+    public List searchBytecodeHash( String hash );
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/RepositoryHashSearch.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,86 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Organization;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.jar.JarEntry;
+
+
+/**
+ * Jar Taxon Exposer for the Embedded Maven Model.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="embeddedMavenModel"
+ */
+public class EmbeddedMavenModelExposer
+    extends AbstractJarTaxonExposer
+{
+    public void expose()
+    {
+        List entries = getJar().getNameRegexEntryList( "META-INF/maven/.*/pom\\.xml$" ); //$NON-NLS-1$
+        if ( entries.isEmpty() )
+        {
+            return;
+        }
+
+        JarEntry pom = (JarEntry) entries.get( 0 );
+        MavenXpp3Reader pomreader = new MavenXpp3Reader();
+        try
+        {
+            InputStream istream = getJar().getEntryInputStream( pom );
+            InputStreamReader isreader = new InputStreamReader( istream );
+            Model model = pomreader.read( isreader );
+
+            addGroupId( model.getGroupId() );
+            addArtifactId( model.getArtifactId() );
+            addVersion( model.getVersion() );
+            addName( model.getName() );
+
+            Organization org = model.getOrganization();
+            if ( org != null )
+            {
+                addVendor( org.getName() );
+            }
+        }
+        catch ( IOException e )
+        {
+            getLogger().error( "Unable to read model " + pom.getName() + " in " + getJar().getFilename() + ".", e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            getLogger().error( "Unable to parse model " + pom.getName() + " in " + getJar().getFilename() + ".", e );
+        }
+    }
+
+    public String getExposerName()
+    {
+        return "Embedded Model";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return true;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/EmbeddedMavenModelExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,62 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * Jar Taxon Exposer based on Filename patterns.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="filename"
+ */
+public class FilenameExposer
+    extends AbstractJarTaxonExposer
+{
+    public String getExposerName()
+    {
+        return "Filename";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return false;
+    }
+
+    public void expose()
+    {
+        String fname = FileUtils.removeExtension( getJar().getFile().getName() );
+        Pattern verSplit = Pattern.compile( "-[0-9]" ); //$NON-NLS-1$
+        Matcher mat = verSplit.matcher( fname );
+        if ( mat.find() )
+        {
+            String prefix = fname.substring( 0, mat.start() );
+            addArtifactId( prefix );
+            addName( prefix );
+            addVersion( fname.substring( mat.end() - 1 ) );
+        }
+        else
+        {
+            addArtifactId( fname );
+            addName( fname );
+        }
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/FilenameExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,68 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.classes.JarClasses;
+import org.apache.maven.shared.jar.classes.JarClassesAnalyzer;
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+
+import java.util.Iterator;
+
+
+/**
+ * Jar Taxon Exposer for the information from JarClasses.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="jarClasses"
+ */
+public class JarClassesExposer
+    extends AbstractJarTaxonExposer
+{
+    public String getExposerName()
+    {
+        return "Jar Classes";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return false;
+    }
+
+    public void expose()
+    {
+        JarClasses jarclasses = getJar().getClasses();
+
+        if ( jarclasses == null )
+        {
+            JarClassesAnalyzer analyzer = new JarClassesAnalyzer();
+            analyzer.analyze( getJar() );
+            jarclasses = getJar().getClasses();
+        }
+
+        if ( jarclasses == null )
+        {
+            getLogger().error( "Unable to process null JarClasses on " + getJar().getFilename() );
+            return;
+        }
+
+        Iterator it = jarclasses.getPackages().iterator();
+        while ( it.hasNext() )
+        {
+            String packagename = (String) it.next();
+            addGroupId( packagename );
+        }
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/JarClassesExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,76 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+
+/**
+ * Jar Taxon Exposer for the Manifest.mf contents.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="manifest"
+ */
+public class ManifestExposer
+    extends AbstractJarTaxonExposer
+{
+    public String getExposerName()
+    {
+        return "Manifest.mf";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return false;
+    }
+
+    public void expose()
+    {
+        Manifest manifest = getJar().getManifest();
+        if ( manifest != null )
+        {
+            addManifestAttributeValues( manifest.getMainAttributes() );
+
+            Map entries = manifest.getEntries();
+            Iterator itentries = entries.entrySet().iterator();
+            while ( itentries.hasNext() )
+            {
+                Map.Entry entry = (Map.Entry) itentries.next();
+                Attributes attribs = (Attributes) entry.getValue();
+
+                addManifestAttributeValues( attribs );
+            }
+        }
+    }
+
+    private void addManifestAttributeValues( Attributes attribs )
+    {
+        addName( attribs.getValue( Attributes.Name.IMPLEMENTATION_TITLE ) );
+        addVersion( attribs.getValue( Attributes.Name.IMPLEMENTATION_VERSION ) );
+        addVendor( attribs.getValue( Attributes.Name.IMPLEMENTATION_VENDOR ) );
+
+        addName( attribs.getValue( Attributes.Name.SPECIFICATION_TITLE ) );
+        addVersion( attribs.getValue( Attributes.Name.SPECIFICATION_VERSION ) );
+        addVendor( attribs.getValue( Attributes.Name.SPECIFICATION_VENDOR ) );
+
+        addGroupId( attribs.getValue( Attributes.Name.EXTENSION_NAME ) );
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/ManifestExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,92 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.repository.digest.Digester;
+import org.apache.maven.repository.digest.StreamingDigester;
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+import org.apache.maven.shared.jar.taxon.RepositoryHashSearch;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Jar Taxon Exposer for the hashcode hits within a repository.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="repositorySearch"
+ */
+public class RepositorySearchExposer
+    extends AbstractJarTaxonExposer
+{
+    /**
+     * @plexus.requirement role="org.apache.maven.repository.digest.Digester" role-hint="sha1"
+     */
+    private Digester digester;
+
+    /**
+     * @plexus.requirement role-hint="sha1"
+     */
+    private StreamingDigester streamingDigester;
+
+    /**
+     * @plexus.requirement
+     */
+    private RepositoryHashSearch repositoryHashSearch;
+
+    public String getExposerName()
+    {
+        return "Repository Hashcode Hit";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return true;
+    }
+
+    public RepositoryHashSearch getRepositoryHashSearch()
+    {
+        return repositoryHashSearch;
+    }
+
+    public void setRepositoryHashSearch( RepositoryHashSearch repo )
+    {
+        this.repositoryHashSearch = repo;
+    }
+
+    public void expose()
+    {
+        String hash = getJar().computeFileHash( digester );
+        String bytecodehash = getJar().computeBytecodeHash( streamingDigester );
+        List repohits = new ArrayList();
+        repohits.addAll( repositoryHashSearch.searchFileHash( hash ) );
+        repohits.addAll( repositoryHashSearch.searchBytecodeHash( bytecodehash ) );
+        if ( !repohits.isEmpty() )
+        {
+            // Found hits in the repository.
+            Iterator it = repohits.iterator();
+            while ( it.hasNext() )
+            {
+                Artifact artifact = (Artifact) it.next();
+                addGroupId( artifact.getGroupId() );
+                addArtifactId( artifact.getArtifactId() );
+                addVersion( artifact.getVersion() );
+            }
+        }
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/RepositorySearchExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,63 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * Jar Taxon Exposer - Static Main Class Output
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="staticMainOutput"
+ */
+public class StaticMainOutputExposer
+    extends AbstractJarTaxonExposer
+{
+    public String getExposerName()
+    {
+        return "Static Main Output";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return false;
+    }
+
+    public void expose()
+    {
+        List staticMains = findStaticMainVersions();
+        if ( !staticMains.isEmpty() )
+        {
+            Iterator itvers = staticMains.iterator();
+            while ( itvers.hasNext() )
+            {
+                String ver = (String) itvers.next();
+                addVersion( ver );
+            }
+        }
+    }
+
+    private List findStaticMainVersions()
+    {
+        // TODO: Execute the static main methods of classes with 'Version' in their name.
+        return Collections.EMPTY_LIST;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/StaticMainOutputExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java?rev=430718&view=auto
==============================================================================
--- maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java (added)
+++ maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java Fri Aug 11 01:21:11 2006
@@ -0,0 +1,106 @@
+package org.apache.maven.shared.jar.taxon.exposers;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.shared.jar.taxon.AbstractJarTaxonExposer;
+import org.codehaus.plexus.util.StringUtils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.JarEntry;
+
+
+/**
+ * Jar Taxon Exposer based on Text File contents.
+ *
+ * @plexus.component role="org.apache.maven.shared.jar.taxon.JarTaxonExposer" role-hint="textFile"
+ */
+public class TextFileExposer
+    extends AbstractJarTaxonExposer
+{
+    public String getExposerName()
+    {
+        return "Text File";
+    }
+
+    public boolean isAuthoritative()
+    {
+        return false;
+    }
+
+    public void expose()
+    {
+        List textFiles = findTextFileVersions();
+        if ( !textFiles.isEmpty() )
+        {
+            Iterator ithits = textFiles.iterator();
+            while ( ithits.hasNext() )
+            {
+                String ver = (String) ithits.next();
+                addVersion( ver );
+            }
+        }
+    }
+
+    private List findTextFileVersions()
+    {
+        List textVersions = new ArrayList();
+        List hits = getJar().getNameRegexEntryList( "[Vv][Ee][Rr][Ss][Ii][Oo][Nn]" ); //$NON-NLS-1$
+
+        int hitcount = 0;
+
+        Iterator it = hits.iterator();
+        while ( it.hasNext() )
+        {
+            JarEntry entry = (JarEntry) it.next();
+
+            if ( entry.getName().endsWith( ".class" ) ) //$NON-NLS-1$
+            {
+                // skip this entry. as it's a class file.
+                continue;
+            }
+
+            getLogger().debug( "Version Hit: " + entry.getName() );
+            InputStream is = getJar().getEntryInputStream( entry );
+            BufferedReader br = new BufferedReader( new InputStreamReader( is ) );
+            try
+            {
+                String line = br.readLine();
+                // TODO: check for key=value pair.
+                // TODO: maybe even for groupId entries.
+
+                getLogger().debug( line );
+                if ( StringUtils.isNotEmpty( line ) )
+                {
+                    textVersions.add( line );
+                }
+                hitcount++;
+            }
+            catch ( IOException e )
+            {
+                getLogger().warn( "Unable to read line from " + entry.getName(), e );
+            }
+        }
+
+        return textVersions;
+    }
+}

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-shared-jar/src/main/java/org/apache/maven/shared/jar/taxon/exposers/TextFileExposer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"