You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jo...@apache.org on 2008/03/11 05:07:31 UTC

svn commit: r635796 [1/7] - in /maven/sandbox/trunk/archiva/archiva-jarinfo: ./ archiva-jarinfo-bundles/ archiva-jarinfo-cli/ archiva-jarinfo-cli/src/ archiva-jarinfo-cli/src/assembly/ archiva-jarinfo-cli/src/main/ archiva-jarinfo-cli/src/main/java/ ar...

Author: joakime
Date: Mon Mar 10 21:07:17 2008
New Revision: 635796

URL: http://svn.apache.org/viewvc?rev=635796&view=rev
Log:
Work in progress / Proof of Concept of standalone index / search / identification component for use by Archiva + Archiva RepoMan WebStart GUI + Maven Plugin + Q4E.


Added:
    maven/sandbox/trunk/archiva/archiva-jarinfo/   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-bundles/   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/DefaultPathParser.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/FilenameParser.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/resources/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/test/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/test/java/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/test/resources/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/pom.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/JarInfoException.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/Hasher.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/IdentificationWeights.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/JarAnalysis.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/JarEntryVisitor.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/AbstractJarEntryVisitor.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/BCELImportVisitor.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/EntryClassAnalyzer.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/EntryHasher.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/EntryManifest.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/EntrySizer.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/IdentificationEmbeddedMavenProperties.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/IdentificationFilename.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/analysis/visitors/IdentificationTimestamps.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/AssignedId.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/BytecodeDetails.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/ClassDetail.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/EntryDetail.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/Generator.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/IdValue.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/InspectedIds.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/JarDetails.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/io/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/io/JarDetailsReader.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/io/JarDetailsWriter.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/xml/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/xml/AbstractJarDetailsXml.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/xml/JarDetailsXmlDeserializer.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/model/xml/JarDetailsXmlSerializer.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/remote/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/remote/JarInfoRemote.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/scanner/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/EmptyUtils.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/EntryDetailComparator.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/Hex.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/IdValueComparator.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/NaturalLanguageComparator.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/java/org/apache/maven/archiva/jarinfo/utils/Timestamp.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/analysis/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/analysis/idweights.properties
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/model/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/model/xml/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/model/xml/jarinfo-v1_0_0.xsd   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/main/resources/org/apache/maven/archiva/jarinfo/model/xml/maven-v4.0.0.xsd   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/jars/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/jars/jxr.jar   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/jars/maven-shared-jar-1.0.jar   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/jars/mystery.jar   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/maven/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/maven/archiva/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/maven/archiva/jarinfo/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/maven/archiva/jarinfo/model/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/maven/archiva/jarinfo/model/xml/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/java/org/apache/maven/archiva/jarinfo/model/xml/JarDetailsXmlSerializerTest.java   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/resources/
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/resources/dummy-test.jardetails.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/resources/jxr.jar-details.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/resources/maven-shared.jar-details.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lib/src/test/resources/mystery.jar-details.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-lucene/   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-maven-plugin/   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/pom.xml   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/src/
    maven/sandbox/trunk/archiva/archiva-jarinfo/src/site/
    maven/sandbox/trunk/archiva/archiva-jarinfo/src/site/apt/
    maven/sandbox/trunk/archiva/archiva-jarinfo/src/site/apt/features.apt   (with props)
    maven/sandbox/trunk/archiva/archiva-jarinfo/src/site/resources/
    maven/sandbox/trunk/archiva/archiva-jarinfo/src/site/xdoc/

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Mar 10 21:07:17 2008
@@ -0,0 +1,21 @@
+target
+*~
+.*.swp
+*.log
+*.patch
+*.diff
+*.ipr
+*.iws
+*.iml
+.classpath
+.project
+.settings
+.m2eclipse
+.wtpmodules
+.xdoclet
+*.ipr
+*.iws
+*.iml
+CVS
+cobertura.ser
+jcoverage.ser

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-bundles/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Mar 10 21:07:17 2008
@@ -0,0 +1,21 @@
+target
+*~
+.*.swp
+*.log
+*.patch
+*.diff
+*.ipr
+*.iws
+*.iml
+.classpath
+.project
+.settings
+.m2eclipse
+.wtpmodules
+.xdoclet
+*.ipr
+*.iws
+*.iml
+CVS
+cobertura.ser
+jcoverage.ser

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Mar 10 21:07:17 2008
@@ -0,0 +1,21 @@
+target
+*~
+.*.swp
+*.log
+*.patch
+*.diff
+*.ipr
+*.iws
+*.iml
+.classpath
+.project
+.settings
+.m2eclipse
+.wtpmodules
+.xdoclet
+*.ipr
+*.iws
+*.iml
+CVS
+cobertura.ser
+jcoverage.ser

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml Mon Mar 10 21:07:17 2008
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?><project>
+  <parent>
+    <artifactId>archiva-jarinfo-parent</artifactId>
+    <groupId>org.apache.maven.archiva</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>archiva-jarinfo-cli</artifactId>
+  <name>Archiva Jar Info :: Cli</name>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <mainClass>org.apache.maven.archiva.jarinfo.bundler.JarInfoBundler</mainClass>
+              <addClasspath>true</addClasspath>
+              <classpathPrefix>lib</classpathPrefix>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptors>
+            <descriptor>src/assembly/bin.xml</descriptor>
+          </descriptors>
+          <finalName>archiva-jarinfo-cli-${version}</finalName>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.archiva</groupId>
+      <artifactId>archiva-jarinfo-lib</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-cli</groupId>
+      <artifactId>commons-cli</artifactId>
+      <version>1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>1.4.3</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.1</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml Mon Mar 10 21:07:17 2008
@@ -0,0 +1,31 @@
+<assembly>
+  <id>bin</id>
+  <formats>
+    <format>tar.bz2</format>
+    <!-- format>tar.gz</format>
+    <format>tar.bz2</format>
+    <format>zip</format -->
+  </formats>
+  <fileSets>
+    <fileSet>
+      <includes>
+        <include>README*</include>
+        <include>LICENSE*</include>
+        <include>NOTICE*</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>target</directory>
+      <outputDirectory>/</outputDirectory>
+      <includes>
+        <include>archiva-jarinfo-cli-*.jar</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+  <dependencySets>
+    <dependencySet>
+      <outputDirectory>lib</outputDirectory>
+      <scope>runtime</scope>
+    </dependencySet>
+  </dependencySets>
+</assembly>

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/assembly/bin.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,130 @@
+package org.apache.maven.archiva.common.utils;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * DateUtil - some (not-so) common date utility methods. 
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class DateUtil
+{
+    public static String getDuration( long duration )
+    {
+        return getDuration( new Date( 0 ), new Date( duration ) );
+    }
+    
+    public static String getDuration( long ms1, long ms2 )
+    {
+        return getDuration( new Date( ms1 ), new Date( ms2 ) );
+    }
+
+    public static String getDuration( Date d1, Date d2 )
+    {
+        Calendar cal1 = new GregorianCalendar();
+        cal1.setTime( d1 );
+
+        Calendar cal2 = new GregorianCalendar();
+        cal2.setTime( d2 );
+
+        return getDuration( cal1, cal2 );
+    }
+
+    public static String getDuration( Calendar cal1, Calendar cal2 )
+    {
+        int year1 = cal1.get( Calendar.YEAR );
+        int day1 = cal1.get( Calendar.DAY_OF_YEAR );
+        int hour1 = cal1.get( Calendar.HOUR_OF_DAY );
+        int min1 = cal1.get( Calendar.MINUTE );
+        int sec1 = cal1.get( Calendar.SECOND );
+        int ms1 = cal1.get( Calendar.MILLISECOND );
+
+        int year2 = cal2.get( Calendar.YEAR );
+        int day2 = cal2.get( Calendar.DAY_OF_YEAR );
+        int hour2 = cal2.get( Calendar.HOUR_OF_DAY );
+        int min2 = cal2.get( Calendar.MINUTE );
+        int sec2 = cal2.get( Calendar.SECOND );
+        int ms2 = cal2.get( Calendar.MILLISECOND );
+
+        int leftDays = ( day1 - day2 ) + ( year1 - year2 ) * 365;
+        int leftHours = hour2 - hour1;
+        int leftMins = min2 - min1;
+        int leftSeconds = sec2 - sec1;
+        int leftMilliSeconds = ms2 - ms1;
+
+        if ( leftMilliSeconds < 0 )
+        {
+            leftMilliSeconds += 1000;
+            --leftSeconds;
+        }
+
+        if ( leftSeconds < 0 )
+        {
+            leftSeconds += 60;
+            --leftMins;
+        }
+
+        if ( leftMins < 0 )
+        {
+            leftMins += 60;
+            --leftHours;
+        }
+        
+        if ( leftHours < 0 )
+        {
+            leftHours += 24;
+            --leftDays;
+        }
+
+        StringBuffer interval = new StringBuffer();
+
+        appendInterval( interval, leftDays, "Day" );
+        appendInterval( interval, leftHours, "Hour" );
+        appendInterval( interval, leftMins, "Minute" );
+        appendInterval( interval, leftSeconds, "Second" );
+        appendInterval( interval, leftMilliSeconds, "Millisecond" );
+
+        return interval.toString();
+    }
+
+    private static void appendInterval( StringBuffer interval, int count, String type )
+    {
+        if ( count > 0 )
+        {
+            if ( interval.length() > 0 )
+            {
+                interval.append( " " );
+            }
+
+            interval.append( count );
+            interval.append( " " ).append( type );
+            if ( count > 1 )
+            {
+                interval.append( "s" );
+            }
+        }
+    }
+
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/DateUtil.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,260 @@
+package org.apache.maven.archiva.common.utils;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * VersionComparator - compare the parts of two version strings.
+ * <p/>
+ * Technique.
+ * <p/>
+ * * Split the version strings into parts by splitting on <code>"-._"</code> first, then breaking apart words from numbers.
+ * <p/>
+ * <code>
+ * "1.0"         = "1", "0"
+ * "1.0-alpha-1" = "1", "0", "alpha", "1"
+ * "2.0-rc2"     = "2", "0", "rc", "2"
+ * "1.3-m2"      = "1", "3", "m", "3"
+ * </code>
+ * <p/>
+ * compare each part individually, and when they do not match, perform the following test.
+ * <p/>
+ * Numbers are calculated per normal comparison rules.
+ * Words that are part of the "special word list" will be treated as their index within that heirarchy.
+ * Words that cannot be identified as special, are treated using normal case-insensitive comparison rules.
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class VersionComparator
+    implements Comparator<String>
+{
+    private static Comparator<String> INSTANCE = new VersionComparator();
+
+    private List<String> specialWords;
+
+    public VersionComparator()
+    {
+        specialWords = new ArrayList<String>();
+
+        // ids that refer to LATEST
+        specialWords.add( "final" );
+        specialWords.add( "release" );
+        specialWords.add( "current" );
+        specialWords.add( "latest" );
+        specialWords.add( "g" );
+        specialWords.add( "gold" );
+        specialWords.add( "fcs" );
+
+        // ids that are for a release cycle.
+        specialWords.add( "a" );
+        specialWords.add( "alpha" );
+        specialWords.add( "b" );
+        specialWords.add( "beta" );
+        specialWords.add( "pre" );
+        specialWords.add( "rc" );
+        specialWords.add( "m" );
+        specialWords.add( "milestone" );
+
+        // ids that are for dev / debug cycles.
+        specialWords.add( "dev" );
+        specialWords.add( "test" );
+        specialWords.add( "debug" );
+        specialWords.add( "unofficial" );
+        specialWords.add( "nightly" );
+        specialWords.add( "incubating" );
+        specialWords.add( "incubator" );
+        specialWords.add( "snapshot" );
+    }
+
+    public static Comparator<String> getInstance()
+    {
+        return INSTANCE;
+    }
+
+    public int compare( String o1, String o2 )
+    {
+        if ( o1 == null && o2 == null )
+        {
+            return 0;
+        }
+
+        if ( o1 == null )
+        {
+            return 1;
+        }
+
+        if ( o2 == null )
+        {
+            return -1;
+        }
+
+        String[] parts1 = toParts( o1 );
+        String[] parts2 = toParts( o2 );
+
+        int diff;
+        int partLen = Math.max( parts1.length, parts2.length );
+        for ( int i = 0; i < partLen; i++ )
+        {
+            diff = comparePart( safePart( parts1, i ), safePart( parts2, i ) );
+            if ( diff != 0 )
+            {
+                return diff;
+            }
+        }
+
+        diff = parts2.length - parts1.length;
+
+        if ( diff != 0 )
+        {
+            return diff;
+        }
+
+        return o1.compareToIgnoreCase( o2 );
+    }
+
+    private String safePart( String[] parts, int idx )
+    {
+        if ( idx < parts.length )
+        {
+            return parts[idx];
+        }
+
+        return "0";
+    }
+
+    private int comparePart( String s1, String s2 )
+    {
+        boolean is1Num = NumberUtils.isNumber( s1 );
+        boolean is2Num = NumberUtils.isNumber( s2 );
+
+        // (Special Case) Test for numbers both first.
+        if ( is1Num && is2Num )
+        {
+            int i1 = NumberUtils.toInt( s1 );
+            int i2 = NumberUtils.toInt( s2 );
+
+            return i1 - i2;
+        }
+
+        // Test for text both next.
+        if ( !is1Num && !is2Num )
+        {
+            int idx1 = specialWords.indexOf( s1.toLowerCase() );
+            int idx2 = specialWords.indexOf( s2.toLowerCase() );
+
+            // Only operate perform index based operation, if both strings
+            // are found in the specialWords index.
+            if ( idx1 >= 0 && idx2 >= 0 )
+            {
+                return idx1 - idx2;
+            }
+        }
+
+        // Comparing text to num
+        if ( !is1Num && is2Num )
+        {
+            return -1;
+        }
+
+        // Comparing num to text
+        if ( is1Num && !is2Num )
+        {
+            return 1;
+        }
+
+        // Return comparison of strings themselves.
+        return s1.compareToIgnoreCase( s2 );
+    }
+
+    public static String[] toParts( String version )
+    {
+        if ( StringUtils.isBlank( version ) )
+        {
+            return ArrayUtils.EMPTY_STRING_ARRAY;
+        }
+
+        int modeOther = 0;
+        int modeDigit = 1;
+        int modeText = 2;
+
+        List<String> parts = new ArrayList<String>();
+        int len = version.length();
+        int i = 0;
+        int start = 0;
+        int mode = modeOther;
+
+        while ( i < len )
+        {
+            char c = version.charAt( i );
+
+            if ( Character.isDigit( c ) )
+            {
+                if ( mode != modeDigit )
+                {
+                    if ( mode != modeOther )
+                    {
+                        parts.add( version.substring( start, i ) );
+                    }
+                    mode = modeDigit;
+                    start = i;
+                }
+            }
+            else if ( Character.isLetter( c ) )
+            {
+                if ( mode != modeText )
+                {
+                    if ( mode != modeOther )
+                    {
+                        parts.add( version.substring( start, i ) );
+                    }
+                    mode = modeText;
+                    start = i;
+                }
+            }
+            else
+            {
+                // Other.
+                if ( mode != modeOther )
+                {
+                    parts.add( version.substring( start, i ) );
+                    mode = modeOther;
+                }
+            }
+
+            i++;
+        }
+
+        // Add remainder
+        if ( mode != modeOther )
+        {
+            parts.add( version.substring( start, i ) );
+        }
+
+        return parts.toArray( new String[parts.size()] );
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionComparator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,206 @@
+package org.apache.maven.archiva.common.utils;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.lang.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Version utility methods. 
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class VersionUtil
+{
+    /**
+     * These are the version patterns found in the filenames of the various artifact's versions IDs.
+     * These patterns are all tackling lowercase version IDs.
+     */
+    private static final String versionPatterns[] = new String[] {
+        "([0-9][_.0-9a-z]*)",
+        "(snapshot)",
+        "(g?[_.0-9ab]*(pre|rc|g|m)[_.0-9]*)",
+        "(dev[_.0-9]*)",
+        "(alpha[_.0-9]*)",
+        "(beta[_.0-9]*)",
+        "(rc[_.0-9]*)",
+        "(test[_.0-9]*)",
+        "(debug[_.0-9]*)",
+        "(unofficial[_.0-9]*)",
+        "(current)",
+        "(latest)",
+        "(fcs)",
+        "(release[_.0-9]*)",
+        "(nightly)",
+        "(final)",
+        "(incubating)",
+        "(incubator)",
+        "([ab][_.0-9]+)" };
+
+    private static final String VersionMegaPattern = StringUtils.join( versionPatterns, '|' );
+
+    public static final String SNAPSHOT = "SNAPSHOT";
+
+    public static final Pattern UNIQUE_SNAPSHOT_PATTERN = Pattern.compile( "^(.*)-([0-9]{8}\\.[0-9]{6})-([0-9]+)$" );
+
+    public static final Pattern TIMESTAMP_PATTERN = Pattern.compile( "^([0-9]{8})\\.([0-9]{6})$" );
+
+    public static final Pattern GENERIC_SNAPSHOT_PATTERN = Pattern.compile( "^(.*)-" + SNAPSHOT );
+    
+    /**
+     * <p>
+     * Tests if the unknown string contains elements that identify it as a version string (or not).
+     * </p>
+     * 
+     * <p>
+     * The algorithm tests each part of the string that is delimited by a '-' (dash) character.
+     * If 75% or more of the sections are identified as 'version' strings, the result is
+     * determined to be of a high probability to be version identifier string.
+     * </p>
+     * 
+     * @param unknown the unknown string to test.
+     * @return true if the unknown string is likely a version string.
+     */
+    public static boolean isVersion( String unknown )
+    {
+        String versionParts[] = StringUtils.split( unknown, '-' );
+
+        Pattern pat = Pattern.compile( VersionMegaPattern, Pattern.CASE_INSENSITIVE );
+        Matcher mat;
+
+        int countValidParts = 0;
+
+        for ( int i = 0; i < versionParts.length; i++ )
+        {
+            String part = versionParts[i];
+            mat = pat.matcher( part );
+
+            if ( mat.matches() )
+            {
+                countValidParts++;
+            }
+        }
+
+        /* Calculate version probability as true if 3/4's of the input string has pieces of
+         * of known version identifier strings.
+         */
+        int threshold = (int) Math.floor( Math.max( (double) 1.0, (double) ( versionParts.length * 0.75 ) ) );
+
+        return ( countValidParts >= threshold );
+    }
+
+    /**
+     * <p>
+     * Tests if the identifier is a known simple version keyword.
+     * </p>
+     * 
+     * <p>
+     * This method is different from {@link #isVersion(String)} in that it tests the whole input string in
+     * one go as a simple identifier. (eg "alpha", "1.0", "beta", "debug", "latest", "rc#", etc...)
+     * </p>
+     * 
+     * @param identifier the identifier to test.
+     * @return true if the unknown string is likely a version string.
+     */
+    public static boolean isSimpleVersionKeyword( String identifier )
+    {
+        Pattern pat = Pattern.compile( VersionMegaPattern, Pattern.CASE_INSENSITIVE );
+        Matcher mat = pat.matcher( identifier );
+
+        return mat.matches();
+    }
+
+    public static boolean isSnapshot( String version )
+    {
+        Matcher m = UNIQUE_SNAPSHOT_PATTERN.matcher( version );
+        if ( m.matches() )
+        {
+            return true;
+        }
+        else
+        {
+            return version.endsWith( SNAPSHOT );
+        }
+    }
+
+    public static String getBaseVersion( String version )
+    {
+        Matcher m = UNIQUE_SNAPSHOT_PATTERN.matcher( version );
+        if ( m.matches() )
+        {
+            return m.group( 1 ) + "-" + SNAPSHOT;
+        }
+        else
+        {
+            return version;
+        }
+    }
+    
+    /**
+     * <p>
+     * Get the release version of the snapshot version.
+     * </p>
+     * 
+     * <p>
+     * If snapshot version is 1.0-SNAPSHOT, then release version would be 1.0
+     * And if snapshot version is 1.0-20070113.163208-1.jar, then release version would still be 1.0
+     * </p>
+     * 
+     * @param snapshotVersion
+     * @return
+     */
+    public static String getReleaseVersion( String snapshotVersion )
+    {
+        Matcher m = UNIQUE_SNAPSHOT_PATTERN.matcher( snapshotVersion );
+        
+        if( isGenericSnapshot( snapshotVersion ) )
+        {
+            m = GENERIC_SNAPSHOT_PATTERN.matcher( snapshotVersion );
+        }
+                
+        if ( m.matches() )
+        {   
+            return m.group( 1 );
+        }
+        else
+        {        
+            return snapshotVersion;
+        }
+    }
+
+    public static boolean isUniqueSnapshot( String version )
+    {             
+        Matcher m = UNIQUE_SNAPSHOT_PATTERN.matcher( version );
+        if( m.matches() )
+        {
+            return true;
+        }
+
+        return false;
+    }
+
+    public static boolean isGenericSnapshot( String version )
+    {
+        return version.endsWith( SNAPSHOT );    
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/common/utils/VersionUtil.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,263 @@
+package org.apache.maven.archiva.jarinfo.bundler;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+import org.apache.commons.io.DirectoryWalker;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.maven.archiva.common.utils.DateUtil;
+import org.apache.maven.archiva.jarinfo.JarInfoException;
+import org.apache.maven.archiva.jarinfo.analysis.JarAnalysis;
+import org.apache.maven.archiva.jarinfo.model.JarDetails;
+import org.apache.maven.archiva.jarinfo.model.io.JarDetailsWriter;
+import org.apache.maven.archiva.repository.content.ArtifactException;
+import org.apache.maven.archiva.repository.content.ArtifactRef;
+import org.apache.maven.archiva.repository.content.DefaultPathParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Jar Info Bundler.
+ * 
+ * Scan a repository root, creating a JarInfo bundle for the most recent
+ * timestamp'd jarinfo file.
+ */
+public class JarInfoBundler
+    extends DirectoryWalker
+{
+    private static final Logger LOG = LoggerFactory.getLogger( JarInfoBundler.class );
+
+    private File repoDir;
+
+    private String repoUrl;
+
+    private String repoId;
+
+    private File outputDir;
+
+    private File bundleJar;
+
+    private JarOutputStream jarOut;
+
+    private String timestamp;
+
+    private JarAnalysis jarAnalysis;
+
+    private long startTime;
+
+    private int analysisCount;
+
+    public JarInfoBundler()
+    {
+        super();
+    }
+
+    public JarInfoBundler( FileFilter filter, int depthLimit )
+    {
+        super( filter, depthLimit );
+    }
+
+    public JarInfoBundler( IOFileFilter directoryFilter, IOFileFilter fileFilter, int depthLimit )
+    {
+        super( directoryFilter, fileFilter, depthLimit );
+    }
+
+    public File getRepoDir()
+    {
+        return repoDir;
+    }
+
+    public void setRepoDir( File repoDir )
+    {
+        this.repoDir = repoDir;
+    }
+
+    public String getRepoUrl()
+    {
+        return repoUrl;
+    }
+
+    public void setRepoUrl( String repoUrl )
+    {
+        this.repoUrl = repoUrl;
+    }
+
+    public String getRepoId()
+    {
+        return repoId;
+    }
+
+    public void setRepoId( String repoId )
+    {
+        this.repoId = repoId;
+    }
+
+    public File getOutputDir()
+    {
+        return outputDir;
+    }
+
+    public void setOutputDir( File outputDir )
+    {
+        this.outputDir = outputDir;
+    }
+
+    public String getTimestamp()
+    {
+        return timestamp;
+    }
+
+    public void setTimestamp( String timestamp )
+    {
+        this.timestamp = timestamp;
+    }
+
+    public void begin()
+        throws JarInfoBundlerException, IOException
+    {
+        if ( !outputDir.exists() )
+        {
+            outputDir.mkdirs();
+        }
+        bundleJar = new File( outputDir, "jarinfo-bundle.jar" );
+        jarOut = new JarOutputStream( new FileOutputStream( bundleJar ) );
+
+        boolean performInspection = false;
+        jarAnalysis = new JarAnalysis( performInspection );
+        jarAnalysis.addDefaultVisitors();
+
+        walk( this.repoDir, Collections.emptyList() );
+
+        // TODO: Gather Statistics.
+    }
+
+    @Override
+    protected void handleStart( File startDirectory, Collection results )
+        throws IOException
+    {
+        LOG.info( "Starting Directory Walking for " + startDirectory.getAbsolutePath() );
+        startTime = System.currentTimeMillis();
+        analysisCount = 0;
+    }
+
+    @Override
+    protected void handleEnd( Collection results )
+        throws IOException
+    {
+        long endTime = System.currentTimeMillis();
+        LOG.info( "Reached end of Directory Walk: Analyzed " + analysisCount + " jars in "
+            + DateUtil.getDuration( startTime, endTime ) );
+
+        IOUtils.closeQuietly( jarOut );
+    }
+
+    @Override
+    protected void handleCancelled( File startDirectory, Collection results, CancelException cancel )
+        throws IOException
+    {
+        LOG.info( "Walk Cancelled: " + cancel.getMessage() );
+        IOUtils.closeQuietly( jarOut );
+    }
+
+    @Override
+    protected void handleFile( File file, int depth, Collection results )
+        throws IOException
+    {
+        LOG.info( "Handle File " + file.getAbsolutePath() + ", depth:" + depth );
+
+        try
+        {
+            ArtifactRef ref = toArtifactRef( file );
+            LOG.info( "Artifact: " + ref );
+            File outputFile = new File( file.getAbsolutePath() + "info" );
+
+            if ( !needsUpdating( outputFile ) )
+            {
+                LOG.info( "Skipping (up-to-date): " + outputFile.getName() );
+                return;
+            }
+            
+            analysisCount++;
+
+            long start = System.nanoTime();
+            LOG.info( "Analyzing: " + file.getName() + " ... " );
+            JarDetails details = jarAnalysis.analyze( file );
+            if ( !details.getAssignedId().valid() )
+            {
+                // Inspected Ids have no value now.
+                details.getInspectedIds().clearAll();
+                // Set Assigned Ids.
+                details.getAssignedId().setGroupId( ref.getGroupId() );
+                details.getAssignedId().setArtifactId( ref.getArtifactId() );
+                details.getAssignedId().setVersion( ref.getVersion() );
+            }
+            long mid = System.nanoTime();
+            double seconds = ( ( (double) ( mid - start ) / 100000 ) / 1000 );
+            LOG.info( "Scan of " + file.getName() + " completed in " + seconds + " second(s)" );
+
+            ( new JarDetailsWriter() ).write( details, outputFile );
+            addToBundle( outputFile );
+        }
+        catch ( ArtifactException e )
+        {
+            LOG.warn( "Invalid Artifact [" + file.getAbsolutePath() + "]: " + e.getMessage() );
+        }
+        catch ( IOException e )
+        {
+            LOG.warn( "Unable to analyze jar file [" + file.getAbsolutePath() + "]: " + e.getMessage(), e );
+        }
+        catch ( JarInfoException e )
+        {
+            LOG.warn( "Unable to write jarinfo for file [" + file.getAbsolutePath() + "]: " + e.getMessage(), e );
+        }
+    }
+
+    private void addToBundle( File file )
+        throws IOException
+    {
+        FileInputStream stream = null;
+        try
+        {
+            jarOut.putNextEntry( new JarEntry( pathRelativeToRoot( file ) ) );
+            stream = new FileInputStream( file );
+            IOUtils.copy( stream, jarOut );
+        }
+        finally
+        {
+            jarOut.closeEntry();
+            IOUtils.closeQuietly( stream );
+        }
+    }
+
+    private String pathRelativeToRoot( File file )
+    {
+        String path = file.getAbsolutePath();
+        String root = repoDir.getAbsolutePath();
+
+        if ( path.startsWith( root ) )
+        {
+            path = path.substring( root.length() );
+        }
+
+        return path;
+    }
+
+    private ArtifactRef toArtifactRef( File file )
+        throws ArtifactException
+    {
+        return DefaultPathParser.toArtifactRef( pathRelativeToRoot( file ) );
+    }
+
+    private boolean needsUpdating( File outputFile )
+    {
+        return true;
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundler.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,142 @@
+package org.apache.maven.archiva.jarinfo.bundler;
+
+import java.io.File;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.MissingOptionException;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.io.filefilter.FileFilterUtils;
+import org.apache.commons.io.filefilter.HiddenFileFilter;
+import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.commons.io.filefilter.NameFileFilter;
+import org.apache.commons.io.filefilter.SuffixFileFilter;
+
+/**
+ * JarInfoBundler command line client.
+ */
+public class JarInfoBundlerCli
+{
+    private static final String OPT_JARINFO_OUTPUT_DIR = "o";
+
+    private static final String OPT_REPO_DIR = "d";
+
+    private static final String OPT_REPO_URL = "u";
+
+    private static final String OPT_REPO_ID = "i";
+
+    private static final String OPT_TIMESTAMP = "t";
+
+    public static void main( String args[] )
+    {
+        ( new JarInfoBundlerCli() ).execute( args );
+    }
+
+    private Options options;
+
+    private Options getOptions()
+    {
+        if ( options != null )
+        {
+            return options;
+        }
+
+        Option outputDir = new Option( OPT_JARINFO_OUTPUT_DIR, "outputDir", true, "Jarinfo Output Directory." );
+        outputDir.setArgName( "dir" );
+        outputDir.setRequired( true );
+
+        Option repoDir = new Option( OPT_REPO_DIR, "repoDir", true, "Repository Root Directory." );
+        repoDir.setArgName( "dir" );
+        repoDir.setRequired( true );
+
+        Option repoUrl = new Option( OPT_REPO_URL, "repoUrl", true, "URL to Repository." );
+        repoUrl.setArgName( "url" );
+        repoUrl.setRequired( true );
+
+        Option repoId = new Option( OPT_REPO_ID, "repoId", true, "ID to Repository." );
+        repoId.setArgName( "id" );
+        repoId.setRequired( true );
+
+        Option timestamp = new Option( OPT_TIMESTAMP, "timestamp", true,
+                                       "Timestamp for repo-${id}-jarinfo-${timestamp}.jar files." );
+        timestamp.setArgName( "timestamp" );
+        timestamp.setRequired( false );
+
+        options = new Options();
+        options.addOption( outputDir );
+        options.addOption( repoId );
+        options.addOption( repoUrl );
+        options.addOption( repoDir );
+        options.addOption( timestamp );
+
+        return options;
+    }
+
+    private void showHelp( Options options )
+    {
+        HelpFormatter help = new HelpFormatter();
+        help.printHelp( "JarInfoBundler [options] -o <dir> -i <id> -u <url> -d <dir>", options );
+    }
+
+    private void execute( String[] args )
+    {
+        CommandLineParser parser = new GnuParser();
+        try
+        {
+            CommandLine cmdline = parser.parse( getOptions(), args );
+
+            /* Ignore Hidden Directories */
+            IOFileFilter ignoreHiddenFilter = FileFilterUtils.andFileFilter( FileFilterUtils.directoryFileFilter(),
+                                                                             HiddenFileFilter.VISIBLE );
+
+            /* Ignore SCM dirs */
+            IOFileFilter ignoreSCM = FileFilterUtils.notFileFilter( new NameFileFilter( new String[] {
+                ".svn",
+                "CVS",
+                "SCCS",
+                ".arch-ids",
+                ".bzr" } ) );
+
+            IOFileFilter directoryFilter = FileFilterUtils.andFileFilter( ignoreHiddenFilter, ignoreSCM );
+
+            /* Only interested in files ending in JAR */
+            IOFileFilter jarFilter = FileFilterUtils.suffixFileFilter( ".jar" );
+            IOFileFilter notJavadocOrSourceFilter = FileFilterUtils.notFileFilter( new SuffixFileFilter( new String[] {
+                "-sources.jar",
+                "-javadoc.jar" } ) );
+            IOFileFilter jarBinaryFilter = FileFilterUtils.andFileFilter( jarFilter, notJavadocOrSourceFilter );
+
+            JarInfoBundler bundler = new JarInfoBundler( directoryFilter, jarBinaryFilter, -1 );
+
+            // TODO: log output dir?
+            bundler.setOutputDir( new File( cmdline.getOptionValue( OPT_JARINFO_OUTPUT_DIR ) ) );
+            bundler.setRepoDir( new File( cmdline.getOptionValue( OPT_REPO_DIR ) ) );
+            bundler.setRepoId( cmdline.getOptionValue( OPT_REPO_ID ) );
+            bundler.setRepoUrl( cmdline.getOptionValue( OPT_REPO_URL ) );
+            if ( cmdline.hasOption( OPT_TIMESTAMP ) )
+            {
+                bundler.setTimestamp( cmdline.getOptionValue( OPT_TIMESTAMP ) );
+            }
+
+            bundler.begin();
+        }
+        catch ( MissingOptionException e )
+        {
+            System.err.println( "ERROR: " + e.getMessage() );
+            showHelp( options );
+        }
+        catch ( ParseException e )
+        {
+            showHelp( options );
+            e.printStackTrace( System.err );
+        }
+        catch ( Throwable t )
+        {
+            t.printStackTrace( System.err );
+        }
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerCli.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,16 @@
+package org.apache.maven.archiva.jarinfo.bundler;
+
+public class JarInfoBundlerException
+    extends Exception
+{
+
+    public JarInfoBundlerException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+    public JarInfoBundlerException( String message )
+    {
+        super( message );
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/bundler/JarInfoBundlerException.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,143 @@
+package org.apache.maven.archiva.jarinfo.scanner;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Launcher
+{
+    private boolean debug;
+
+    private String mainClassName;
+
+    /**
+     * Main Launcher.
+     */
+    public Launcher( String mainClass )
+    {
+        super();
+        this.debug = false;
+        this.mainClassName = mainClass;
+    }
+
+    /**
+     * Launcher the code and start mergere-discovery.
+     * 
+     * @param args the command line arguments.
+     */
+    public void bootstrap( String[] args )
+    {
+        List<String> argList = new ArrayList<String>();
+        List<String> libList = new ArrayList<String>();
+
+        /* Add args to argList */
+        try
+        {
+            for ( int i = 0; i < args.length; i++ )
+            {
+                if ( "--lib-debug".equals( args[i] ) )
+                {
+                    this.debug = true;
+                    LibLocator.debug = true;
+                }
+                else if ( "--lib".equals( args[i] ) )
+                {
+                    i++;
+                    libList.add( args[i] );
+                }
+                else
+                {
+                    argList.add( args[i] );
+                }
+            }
+        }
+        catch ( ArrayIndexOutOfBoundsException e )
+        {
+            System.err.println( "Unable to load lib." );
+            System.exit( 2 );
+        }
+
+        /* Create locator */
+        LibLocator locator = new LibLocator();
+
+        /* Add command line libs */
+        for ( String lib : libList )
+        {
+            locator.addLib( lib );
+        }
+
+        /* Load class */
+        try
+        {
+            URLClassLoader loader = new URLClassLoader( locator.getUrls() );
+            Thread.currentThread().setContextClassLoader( loader );
+
+            debug( "Attempting to load " + this.mainClassName );
+            Class<?> mainClass = loader.loadClass( this.mainClassName );
+
+            debug( "Attempting to create a new instance of " + mainClass );
+            Object objmain = mainClass.newInstance();
+
+            debug( "Attempting to find main method of " + mainClass );
+            Class<?> argClass = Array.newInstance( String.class, 0 ).getClass();
+            Method mainMethod = mainClass.getMethod( "main", new Class[] { argClass } );
+
+            debug( "Attempting to execute main method of " + mainClass );
+            String arguments[] = argList.toArray( new String[0] );
+            mainMethod.invoke( objmain, new Object[] { arguments } );
+
+        }
+        catch ( ClassNotFoundException e )
+        {
+            error( "failed to load " + mainClassName + ".", e );
+        }
+        catch ( InstantiationException e )
+        {
+            error( "failed to instantiate " + mainClassName + ".", e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            error( "failed to access " + mainClassName + ".", e );
+        }
+        catch ( SecurityException e )
+        {
+            error( "denied access to load " + mainClassName + ".", e );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            error( "passed invalid arguments to " + mainClassName + "#main(String[]).", e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            error( "unable find method " + mainClassName + "#main(String[]).", e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            if ( e.getCause() == null )
+            {
+                error( "unable execute " + mainClassName + "#main(String[]).", e );
+            }
+            else
+            {
+                error( "Unable to run app.", e.getCause() );
+            }
+        }
+    }
+
+    private void error( String msg, Throwable toss )
+    {
+        System.err.println( "[ERROR] " + Launcher.class.getName() + "\n[ERROR]   " + msg );
+        toss.printStackTrace( System.err );
+    }
+
+    private void debug( String msg )
+    {
+        if ( debug )
+        {
+            System.out.println( "[DEBUG] " + msg );
+        }
+    }
+}
\ No newline at end of file

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/Launcher.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,337 @@
+package org.apache.maven.archiva.jarinfo.scanner;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.CharacterIterator;
+import java.text.StringCharacterIterator;
+import java.util.ArrayList;
+import java.util.List;
+
+public class LibLocator
+{
+    private static final String APP_HOME_PROPERTY = "app.home";
+
+    /** Debug Flag. */
+    public static boolean debug = false;
+
+    private List<URL> classpathUrls;
+
+    private File appHomeDir;
+
+    /**
+     * Create <code>LibLocator</code>
+     */
+    public LibLocator()
+    {
+        this.classpathUrls = new ArrayList<URL>();
+        initAppHome();
+        addLib( "lib" ); // default lib entry.
+    }
+
+    /**
+     * Constructs a file path from a <code>file:</code> URI.
+     *
+     * <p>Will be an absolute path if the given URI is absolute.</p>
+     *
+     * <p>Swallows '%' that are not followed by two characters,
+     * doesn't deal with non-ASCII characters.</p>
+     *
+     * @param uri the URI designating a file in the local filesystem.
+     * @return the local file system path for the file.
+     * @since Ant 1.6
+     */
+    public String fromURI( String uri )
+    {
+        URL url = null;
+        try
+        {
+            url = new URL( uri );
+        }
+        catch ( MalformedURLException ignore )
+        {
+            /* ignore */
+        }
+        if ( url == null || !( "file".equals( url.getProtocol() ) ) )
+        {
+            throw new IllegalArgumentException( "Can only handle valid file: URIs" );
+        }
+        StringBuffer buf = new StringBuffer( url.getHost() );
+        if ( buf.length() > 0 )
+        {
+            buf.insert( 0, File.separatorChar ).insert( 0, File.separatorChar );
+        }
+
+        String file = url.getFile();
+        int queryPos = file.indexOf( '?' );
+        buf.append( ( queryPos < 0 ) ? file : file.substring( 0, queryPos ) );
+
+        String tmpUri = buf.toString().replace( '/', File.separatorChar );
+
+        if ( File.pathSeparatorChar == ';' && uri.startsWith( "\\" ) && uri.length() > 2
+            && Character.isLetter( uri.charAt( 1 ) ) && uri.lastIndexOf( ':' ) > -1 )
+        {
+            tmpUri = uri.substring( 1 );
+        }
+
+        String path = decodeUri( tmpUri );
+        return path;
+    }
+
+    /**
+     * Decodes an Uri with % characters.
+     * @param uri String with the uri possibly containing % characters.
+     * @return The decoded Uri
+     */
+    private String decodeUri( String uri )
+    {
+        if ( uri.indexOf( '%' ) == -1 )
+        {
+            return uri;
+        }
+        StringBuffer sb = new StringBuffer();
+        CharacterIterator iter = new StringCharacterIterator( uri );
+        for ( char c = iter.first(); c != CharacterIterator.DONE; c = iter.next() )
+        {
+            if ( c == '%' )
+            {
+                char c1 = iter.next();
+                if ( c1 != CharacterIterator.DONE )
+                {
+                    int i1 = Character.digit( c1, 16 );
+                    char c2 = iter.next();
+                    if ( c2 != CharacterIterator.DONE )
+                    {
+                        int i2 = Character.digit( c2, 16 );
+                        sb.append( (char) ( ( i1 << 4 ) + i2 ) );
+                    }
+                }
+            }
+            else
+            {
+                sb.append( c );
+            }
+        }
+        String path = sb.toString();
+        return path;
+    }
+
+    /**
+     * Get the URLs being tracked.
+     * 
+     * @return the URL array.
+     */
+    public URL[] getUrls()
+    {
+        // now update the class.path property
+        StringBuffer baseClassPath = new StringBuffer( System.getProperty( "java.class.path" ) );
+        if ( baseClassPath.charAt( baseClassPath.length() - 1 ) == File.pathSeparatorChar )
+        {
+            baseClassPath.setLength( baseClassPath.length() - 1 );
+        }
+
+        URL[] jars = this.classpathUrls.toArray( new URL[0] );
+
+        for ( int i = 0; i < jars.length; ++i )
+        {
+            baseClassPath.append( File.pathSeparatorChar );
+            baseClassPath.append( fromURI( jars[i].toString() ) );
+        }
+
+        System.setProperty( "java.class.path", baseClassPath.toString() );
+
+        return jars;
+    }
+
+    /**
+     * Initialize the app.home system property.
+     */
+    private void initAppHome()
+    {
+        /* Try System Property */
+        String sysPropHome = System.getProperty( APP_HOME_PROPERTY );
+        if ( ( sysPropHome != null ) && ( sysPropHome.trim().length() > 0 ) )
+        {
+            debug( "Found System Property." );
+            this.appHomeDir = new File( sysPropHome.trim() );
+            return;
+        }
+
+        /* Attempt to figgure out the classpath entry that this object was loaded from. */
+        String selfclass = "/" + this.getClass().getName();
+        selfclass = selfclass.replace( '.', '/' ) + ".class";
+        URL classURL = this.getClass().getResource( selfclass );
+        if ( classURL != null )
+        {
+            debug( "Found Class URL: " + classURL.toExternalForm() );
+            String protocol = classURL.getProtocol();
+
+            if ( "jar".equals( protocol ) )
+            {
+                debug( "Found in jar source: " + classURL.toExternalForm() );
+                String rawurl = classURL.toExternalForm();
+                if ( !rawurl.startsWith( "jar:file:/" ) )
+                {
+                    throw new IllegalStateException( "Unknown jar file syntax: " + rawurl );
+                }
+
+                rawurl = rawurl.substring( "jar:file:".length() );
+                while ( rawurl.startsWith( "//" ) )
+                {
+                    rawurl = rawurl.substring( 1 );
+                }
+
+                int idx = rawurl.indexOf( ".jar!/" );
+                if ( idx > 0 )
+                {
+                    rawurl = rawurl.substring( 0, idx );
+                    debug( "Raw url stripped of class: " + rawurl );
+                }
+
+                idx = rawurl.lastIndexOf( "/", idx );
+                if ( idx > 0 )
+                {
+                    rawurl = rawurl.substring( 0, idx );
+                    debug( "Raw url path stripped: " + rawurl );
+                }
+
+                debug( "Found in a jar file: " + rawurl );
+                this.appHomeDir = new File( rawurl );
+            }
+            else if ( "file".equals( protocol ) )
+            {
+                debug( "Found as file source: " + classURL.toExternalForm() );
+                String rawurl = classURL.toExternalForm().substring( 6 );
+                debug( "rawurl: " + rawurl );
+                debug( "Found in a classpath directory." );
+                this.appHomeDir = new File( rawurl.substring( 0, rawurl.length() - selfclass.length() ) );
+            }
+            else
+            {
+                throw new IllegalStateException( "Only jar and file sources ares supported by Launcher: "
+                    + classURL.toExternalForm() );
+            }
+        }
+
+        if ( this.appHomeDir == null )
+        {
+            throw new IllegalStateException( "Unable to find app classes." );
+        }
+
+        System.setProperty( APP_HOME_PROPERTY, this.appHomeDir.getAbsolutePath() );
+    }
+
+    /**
+     * Add a file to the underlying classpath urls.
+     * 
+     * @param file the file to add.
+     */
+    public void addFile( File file )
+    {
+        debug( ".addFile(" + file.getAbsolutePath() + ")" );
+        try
+        {
+            addURL( file.toURL() );
+        }
+        catch ( MalformedURLException e )
+        {
+            System.err.println( "Unable to add URL to classloader for file " + file.getAbsolutePath() );
+        }
+    }
+
+    /**
+     * Add a lib directory.
+     * 
+     * @param lib the lib directory.
+     */
+    public void addLib( String lib )
+    {
+        debug( ".addLib((String)" + lib + ")" );
+        File libFile = new File( lib );
+        if ( libFile.isAbsolute() )
+        {
+            addLib( libFile );
+        }
+        else
+        {
+            addLib( new File( this.appHomeDir, lib ) );
+        }
+    }
+
+    /**
+     * Add all of the jar files in a lib.
+     * 
+     * @param lib the lib to add.
+     */
+    public void addLib( File lib )
+    {
+        debug( ".addLib((File)" + lib.getAbsolutePath() + ")" );
+        if ( lib.isFile() )
+        {
+            addFile( lib );
+        }
+        else
+        {
+            addFiles( lib );
+        }
+    }
+
+    /**
+     * Add a URL to the list tracked by the ClassLoader.
+     * 
+     * @param url the url to add.
+     */
+    public void addURL( URL url )
+    {
+        if ( !this.classpathUrls.contains( url ) )
+        {
+            // Add to parent URL Set if not added.
+            debug( "Added URL: " + url.toExternalForm() );
+            this.classpathUrls.add( url );
+        }
+    }
+
+    private void debug( String msg )
+    {
+        if ( debug )
+        {
+            System.out.println( "[DEBUG|LibLocator] " + msg );
+        }
+    }
+
+    private void addFiles( File dir )
+    {
+        File files[] = dir.listFiles();
+
+        if ( files == null )
+        {
+            debug( "No files in " + dir.getAbsolutePath() );
+            return;
+        }
+
+        for ( int i = 0; i < files.length; i++ )
+        {
+            if ( files[i].getName().startsWith( "." ) || files[i].isHidden() )
+            {
+                continue; // skip hidden files/dirs
+            }
+
+            if ( files[i].isDirectory() )
+            {
+                addFiles( files[i] ); // dive into dir.
+            }
+            else
+            {
+                int idx = files[i].getName().lastIndexOf( "." );
+                if ( idx > 0 )
+                {
+                    String ext = files[i].getName().substring( idx );
+                    if ( ".jar".equalsIgnoreCase( ext ) )
+                    {
+                        addFile( files[i] );
+                    }
+                }
+            }
+        }
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/jarinfo/scanner/LibLocator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,13 @@
+package org.apache.maven.archiva.repository.content;
+
+import java.io.IOException;
+
+public class ArtifactException extends IOException {
+	public ArtifactException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public ArtifactException(String message) {
+		super(message);
+	}
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactException.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,129 @@
+package org.apache.maven.archiva.repository.content;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.lang.StringUtils;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * ArtifactExtensionMapping
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ArtifactExtensionMapping
+{
+    public static final String MAVEN_ARCHETYPE = "maven-archetype";
+
+    public static final String MAVEN_PLUGIN = "maven-plugin";
+    
+    private static final Map<String, String> typeToExtensionMap;
+
+    private static final Pattern mavenPluginPattern = Pattern.compile( "^(maven-.*-plugin)|(.*-maven-plugin)$" );
+
+    static
+    {
+        typeToExtensionMap = new HashMap<String, String>();
+        typeToExtensionMap.put( "ejb-client", "jar" );
+        typeToExtensionMap.put( "ejb", "jar" );
+        typeToExtensionMap.put( "distribution-tgz", "tar.gz" );
+        typeToExtensionMap.put( "distribution-zip", "zip" );
+        typeToExtensionMap.put( "java-source", "jar" );
+        typeToExtensionMap.put( "javadoc.jar", "jar" );
+        typeToExtensionMap.put( "javadoc", "jar" );
+        typeToExtensionMap.put( "aspect", "jar" );
+        typeToExtensionMap.put( "uberjar", "jar" );
+        typeToExtensionMap.put( MAVEN_PLUGIN, "jar" );
+        typeToExtensionMap.put( MAVEN_ARCHETYPE, "jar" );
+    }
+
+    public static String getExtension( String type )
+    {
+        // Try specialized types first.
+        if ( typeToExtensionMap.containsKey( type ) )
+        {
+            return (String) typeToExtensionMap.get( type );
+        }
+
+        // Return type
+        return type.replace( '-', '.' );
+    }
+
+    public static String guessTypeFromFilename( File file )
+    {
+        return guessTypeFromFilename( file.getName() );
+    }
+
+    public static String guessTypeFromFilename( String filename )
+    {
+        if ( StringUtils.isBlank( filename ) )
+        {
+            return null;
+        }
+
+        String normalizedName = filename.toLowerCase().trim();
+        int idx = normalizedName.lastIndexOf( '.' );
+
+        if ( idx == ( -1 ) )
+        {
+            return null;
+        }
+
+        if ( normalizedName.endsWith( ".tar.gz" ) )
+        {
+            return "distribution-tgz";
+        }
+        if ( normalizedName.endsWith( ".tar.bz2" ) )
+        {
+            return "distribution-bzip";
+        }
+        else if ( normalizedName.endsWith( ".zip" ) )
+        {
+            return "distribution-zip";
+        }
+        else if ( normalizedName.endsWith( "-sources.jar" ) )
+        {
+            return "java-source";
+        }
+        else if ( normalizedName.endsWith( "-javadoc.jar" ) )
+        {
+            return "javadoc";
+        }
+        else
+        {
+            return normalizedName.substring( idx + 1 );
+        }
+    }
+    
+    /**
+     * Determine if a given artifact Id conforms to the naming scheme for a maven plugin.
+     * 
+     * @param artifactId the artifactId to test.
+     * @return true if this artifactId conforms to the naming scheme for a maven plugin.
+     */
+    public static boolean isMavenPlugin( String artifactId )
+    {
+        return mavenPluginPattern.matcher( artifactId ).matches();
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactExtensionMapping.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java?rev=635796&view=auto
==============================================================================
--- maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java (added)
+++ maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java Mon Mar 10 21:07:17 2008
@@ -0,0 +1,78 @@
+package org.apache.maven.archiva.repository.content;
+
+import org.apache.commons.lang.StringUtils;
+
+public class ArtifactRef
+{
+    private String groupId;
+
+    private String artifactId;
+
+    private String version;
+
+    private String classifier;
+
+    private String type;
+
+    public String toString()
+    {
+        StringBuilder buf = new StringBuilder();
+        buf.append( StringUtils.defaultString( groupId ) ).append( ':' );
+        buf.append( StringUtils.defaultString( artifactId ) ).append( ':' );
+        buf.append( StringUtils.defaultString( version ) ).append( ':' );
+        buf.append( StringUtils.defaultString( classifier ) ).append( ':' );
+        buf.append( StringUtils.defaultString( type ) );
+
+        return buf.toString();
+    }
+
+    public String getGroupId()
+    {
+        return groupId;
+    }
+
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    }
+
+    public String getArtifactId()
+    {
+        return artifactId;
+    }
+
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    public String getClassifier()
+    {
+        return classifier;
+    }
+
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    }
+
+    public String getType()
+    {
+        return type;
+    }
+
+    public void setType( String type )
+    {
+        this.type = type;
+    }
+}

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/archiva/archiva-jarinfo/archiva-jarinfo-cli/src/main/java/org/apache/maven/archiva/repository/content/ArtifactRef.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"