geirm 01/05/07 15:47:45
Added: jjar/src/java/org/apache/commons/jjar ClasspathUtil.java
DependencyEngine.java JJAR.java JJARPackage.java
JJARTask.java Repository.java RepositoryProps.java
RepositoryXML.java Transport.java Version.java
Log:
initial src checkin
Revision Changes Path
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/ClasspathUtil.java
Index: ClasspathUtil.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.lang.Package;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collection;
import java.util.Map;
import java.util.List;
import java.util.StringTokenizer;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.jar.Attributes;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.JarEntry;
import java.io.File;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.net.JarURLConnection;
import java.net.URLConnection;
import java.net.URL;
/**
* classpath support for JJAR. This is currently a jumble - will
* clean up.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: ClasspathUtil.java,v 1.1 2001/05/07 22:47:44 geirm Exp $
*/
public class ClasspathUtil
{
/**
* current default repository
*/
public static String getDefaultRepository()
{
return "http://207.138.188.222/jjar/";
}
/**
* lists the jars currently in the classpath
*/
public static void listJars( String path )
{
List jars = getJarList( path );
Iterator i = jars.iterator();
while( i.hasNext() )
{
String jar = (String) i.next();
System.out.println(" inspecting : " + jar );
}
return;
}
/**
* checks to see if the classpath <code>path</code> contains
* the package / version
*/
public static boolean containsVersionedJar( String path, String pkg, String
version)
{
List jars = getJarList( path );
/*
* now, with this set of jars, see if we can find those that match
* the package name
*/
Iterator i = jars.iterator();
while( i.hasNext() )
{
String jar = (String) i.next();
try
{
URL url = new URL("jar:file:" + jar + "!/");
JarURLConnection conn = (JarURLConnection) url.openConnection();
if (packageMatch( conn, pkg, version ) )
{
// System.out.println( jar + " : pkg = " + pkg + " ver = " +
version );
return true;
}
}
catch( Exception e )
{
//System.out.println("Exception (continuing) : " + e );
}
}
return false;
}
/**
* returns a JJARPackage( info ) for a given jar
*/
public static JJARPackage getPackage( String jarname )
throws Exception
{
URL url = new URL("jar:file:" + jarname + "!/");
JarURLConnection conn = (JarURLConnection) url.openConnection();
return getPackage( conn );
}
public static JJARPackage getPackage( JarURLConnection jarConn )
throws Exception
{
if (jarConn == null)
return null;
Manifest mfst = jarConn.getManifest();
if (mfst == null)
{
return null;
}
/*
* get the attributes we care about
*/
Attributes att = mfst.getMainAttributes();
String jarpkg = att.getValue( Attributes.Name.IMPLEMENTATION_TITLE );
String jarver = att.getValue( Attributes.Name.IMPLEMENTATION_VERSION );
if (jarpkg == null || jarver == null)
{
/*
* unusable
*/
return null;
}
return new JJARPackage( jarpkg, jarver );
}
/**
* determines if two packages are equal
*/
public static boolean packageMatch( JarURLConnection jarConn, String pkg, String
version )
throws Exception
{
JJARPackage jjarp = getPackage( jarConn );
if ( jjarp == null)
return false;
/*
* compare
*/
return jjarp.equals( pkg, version );
}
/**
* returns a list of jars in the specified claspath.
* will check the system classpath by default
*/
public static List getJarList( String path )
{
if (path == null)
{
path = "java.class.path";
}
String classpath = System.getProperty( path );
String pathSep = System.getProperty("path.separator");
/*
* take the classpath, and look for jars
*/
StringTokenizer st = new StringTokenizer( classpath, pathSep );
ArrayList jars = new ArrayList();
while( st.hasMoreTokens() )
{
String foo = st.nextToken();
if ( foo.indexOf("jar") != -1 )
jars.add(foo);
}
return jars;
}
public static void main( String args[] )
{
/*
* see if the default classpath has the jar we need
*/
if ( ClasspathUtil.containsVersionedJar( null, "commons-beanutils", "0.1") )
System.out.println("Found commons-beanutils v0.1");
else
{
/*
* didn't find it...
*/
try
{
/*
* so go to the repository
*/
URL url = new
URL("jar:file:/home/gmj/jakarta/jakarta-commons/beanutils/dist/commons-beanutils.jar!/");
JarURLConnection conn = (JarURLConnection) url.openConnection();
/*
* ensure that it's right
*/
if (!packageMatch( conn, "commons-beanutils", "0.1" ))
{
System.out.println("repository doesn't have it");
return;
}
System.out.println("jar in repository correct. Fetching");
String jar = "commons-beanutils-0.1.jar";
url = new
URL("file:/home/gmj/jakarta/jakarta-commons/beanutils/dist/commons-beanutils.jar");
URLConnection uconn = (URLConnection) url.openConnection();
Transport.fetchJar( uconn, jar );
/*
* add to classpath and verify
*/
String classpath = System.getProperty( "java.class.path" );
String pathSep = System.getProperty("path.separator");
classpath = classpath + pathSep + jar;
System.setProperty("java.class.path", classpath);
if ( ClasspathUtil.containsVersionedJar( null, "commons-beanutils",
"0.1") )
System.out.println("Found commons-beanutils v0.1");
}
catch( Exception e )
{
System.out.println("exception " + e );
}
}
}
/**
* doesn't work. don't use
*/
public static boolean markJar( String jarname, String packagename, String
version )
throws Exception
{
JarFile jf = new JarFile( jarname );
Manifest mfst = jf.getManifest();
if (mfst == null)
{
return false;
}
/*
* set the attributes we care about
*/
Attributes att = mfst.getMainAttributes();
Object a = att.put( Attributes.Name.IMPLEMENTATION_TITLE, packagename );
Object b = att.put( Attributes.Name.IMPLEMENTATION_VERSION, version );
System.out.println(" Object a " + a );
System.out.println(" Object b " + b );
JarOutputStream jos = new JarOutputStream( new FileOutputStream( new File(
jarname + "-jjar")));
byte[] buffer = new byte[1024];
int bytesRead;
for( Enumeration e = jf.entries(); e.hasMoreElements(); )
{
JarEntry entry = (JarEntry) e.nextElement();
if( entry.getName().equals("META-INF/MANIFEST.MF"))
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
mfst.write( baos );
JarEntry ee = new JarEntry( entry );
ee.setSize(baos.size() );
jos.putNextEntry(ee );
mfst.write( jos );
continue;
}
System.out.println(" Name : " + entry.getName() );
InputStream entryStream = jf.getInputStream( entry);
jos.putNextEntry(entry );
while ((bytesRead = entryStream.read(buffer)) != -1)
{
jos.write(buffer, 0, bytesRead);
}
}
jos.close();
jf.close();
return true;
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/DependencyEngine.java
Index: DependencyEngine.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.util.HashMap;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
/**
* <p>
* Simple class to figure out ordered dependency lists. Basic
* idea is that you load it with datum consisting of a set
* consisting of a package name and list of packages that
* it's dependent upon.
* </p>
*
* <p>
* Then, you should be able to ask for the dependencies for any
* package placed in there.
* </p>
*
* <p> will detect loops at 'runtime', not loadtime. Just punts
* when that happens
* </p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: DependencyEngine.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class DependencyEngine
{
private HashMap projects = new HashMap();
private ArrayList buildList = null;
/**
* CTOR
*/
public DependencyEngine()
{
}
/**
* returns a list of dependencies for a given package
*/
public List getDependencies( String pkg )
{
buildList = new ArrayList();
try
{
doIt( pkg );
}
catch( Exception e )
{
System.out.println("DE.getDependencies() : " + pkg + " : " + e);
}
if( buildList.size() > 0)
buildList.remove( buildList.size() - 1 );
return buildList;
}
/**
* from previous use - generates a dependency list
* spanning the entire tree. Returns a list
* of names.
*/
public List generateNamelist()
throws Exception
{
/*
* get the project list
*/
buildList = new ArrayList();
Iterator i = projects.keySet().iterator();
while(i.hasNext())
{
String s = (String) i.next();
/*
* make them by name
*/
doIt( s );
}
return buildList;
}
/**
* from previous use - generates a dependency list
* spanning the entire tree. Returns a list
* of cookies.
*/
public List generateCookielist()
throws Exception
{
/*
* get the project list
*/
List list = generateNamelist();
ArrayList cookies = new ArrayList();
Iterator i = list.iterator();
while(i.hasNext())
{
String s = (String) i.next();
Node n = (Node) projects.get( s );
cookies.add( n.getCookie() );
}
return cookies;
}
/**
* The recursive worker...
*/
void doIt( String current )
throws Exception
{
Node project = (Node) projects.get(current);
if (project == null)
{
/*
* we may have a dependency that isn't a project.
* so what... (This shouldn't happen)
*/
buildList.add( current );
return;
}
/*
* check status of this one
*/
int status = project.getStatus();
if ( status == Node.WORKING )
{
throw new Exception("Detected loop while trying to build " + current);
}
else if ( status == Node.ZILCH )
{
/*
* not working - so mark as working and start on the dependencies
*/
project.setStatus( Node.WORKING );
/*
* do we have any dependencies?
*/
Iterator deps = project.getDeps();
/*
* if so, work on each
*/
while( deps.hasNext() )
{
String dep = (String) deps.next();
Node depnode = (Node) projects.get( dep );
if (depnode == null)
{
/*
* we don't have this as a project, so
* let the client try to build it...
*/
// System.out.println("Adding non-project dep build list : " +
current );
buildList.add( dep );
continue;
}
/*
* now, look at the status of this dependency
*/
int depstatus = depnode.getStatus();
if ( depstatus == Node.WORKING )
{
/*
* gaak. loop!
*/
throw new Exception("LOOP : checking dep " + dep + " for current
= " + current );
}
else if ( depstatus == Node.ZILCH )
{
// System.out.println(" trying to build " +
current + " : need to build dep " + dep );
/*
* recurse
*/
doIt( dep );
}
else if( depstatus == Node.DONE )
{
// can skip
}
}
/*
* if all clear, can build and mark as done. We don't care
* if the client couldn't do it for now. That may change.
* the client can tell
*/
//System.out.println("Adding to build list : " + current );
buildList.add( current );
project.setStatus( Node.DONE );
return;
}
/*
* node is done
*/
return;
}
/**
* Adds a project and it's associated dependencies. The dependencies
* currently do not have to be projects themselves.
*
* @param project Name of project to add
* @param dependencies java.util.List of project dependencies
* @throws Exception in the even that it already has the project in the list
*/
public void addProject( String project, List dependencies, Object cookie )
throws Exception
{
/*
* first, see if we have it
*/
Node n = (Node) projects.get( project );
if (n != null)
{
System.out.println(" addProject() : rejecting duplicate : " + project );
throw new Exception("already have it...");
}
// System.out.println(" addProject() : adding project : " + project );
/*
* make a new one and add the dependencies
*/
n = new Node( project, cookie );
Iterator i = dependencies.iterator();
while( i.hasNext() )
{
String dep = (String) i.next();
if ( dep.equals( project ) )
{
// System.out.println(" addProject() : rejecting self- dependency :
" + project );
}
else
{
// System.out.println(" addProject() : adding dependency : " + dep
+ " for project : " + project );
n.addDep( dep );
}
}
/*
* add to the pile
*/
projects.put( project, n );
return;
}
/**
* little demonstration test
*/
public static void main(String arg[] )
{
/*
* tests the engine with
* A B C
* ^ ^ ^\
* \/ \/ |
* D <-E |
* ^ /
* \ /
* F <-
*/
try
{
DependencyEngine d = new DependencyEngine();
ArrayList deps = null;
/*
* A : no dependencies
*/
deps = new ArrayList();
d.addProject( "A", deps, "A" );
/*
* B : no dependencies
*/
deps = new ArrayList();
d.addProject("B", deps, "B" );
/*
* C -> F
*/
deps = new ArrayList();
deps.add("F");
d.addProject("C", deps, "C");
/*
* D -> A, B
*/
deps = new ArrayList();
deps.add("A");
deps.add("B");
d.addProject("D", deps, "D");
/*
* E -> B, C, D
*/
deps = new ArrayList();
deps.add("B");
deps.add("C");
deps.add("D");
d.addProject("E", deps, "E" );
/*
* F -> D
*/
deps = new ArrayList();
deps.add("D");
d.addProject("F", deps, "F" );
/*
* generate the list
*/
List l = d.generateCookielist();
/*
* show us
*/
Iterator i = l.iterator();
while(i.hasNext())
{
String s = (String) i.next();
//System.out.println("Building : " + s );
}
}
catch( Exception e )
{
System.out.println("main : " + e );
}
}
}
class Node
{
public static int ZILCH = 0;
public static int WORKING = 1;
public static int DONE = 2;
private int status = ZILCH;
private ArrayList deps = new ArrayList();
private String name = "";
private Object cookie = null;
public Node( String name, Object cookie)
{
this.name = name;
this.cookie = cookie;
}
public Object getCookie()
{
return cookie;
}
public void addDep( String dep )
{
deps.add( dep );
}
public Iterator getDeps()
{
return deps.iterator();
}
public void setStatus( int i )
{
status = i;
}
public int getStatus()
{
return status;
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/JJAR.java
Index: JJAR.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Iterator;
import java.net.URLConnection;
import java.net.URL;
/**
* JJAR command line program
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: JJAR.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class JJAR
{
public static String title = "JJAR : Jakarta Jar Archive Respository v0.1";
public static String defaultRepository = ClasspathUtil.getDefaultRepository();
public static void main( String args[])
{
/*
* first thing is the verb
*/
if (args.length < 1 )
{
System.out.println(title);
return;
}
String verb = args[0];
Class [] ca = {args.getClass() };
Object [] arg = { args };
try
{
Method m = Class.forName("org.apache.commons.jjar.JJAR").getMethod(verb,
ca );
m.invoke( null, arg );
}
catch( NoSuchMethodException nsme )
{
System.out.println("JJAR : invalid action " + verb );
JJAR.help( args );
}
catch( Exception e )
{
System.out.println("JJAR : exception : " + e );
}
}
public static void help( String args[] )
{
header();
System.out.println("list : list the JJAR packages in the repository");
System.out.println("fetch : fetch a JJAR package from the repository");
System.out.println("See the README.txt for more info.");
}
public static void fetch( String args[] )
{
boolean classpath = false;
String jarname = null;
String packagename = null;
String version = null;
boolean verifyignore = false;
boolean getdeps = true;
String dir = ".";
if ( args.length < 3 )
{
System.out.println("Usage : fetch [-v] -j jarname -p package -v version
");
return;
}
for( int i = 1; i < args.length; i++)
{
String arg = args[i];
if (arg.startsWith("-"))
{
if (arg.equals("-j"))
{
jarname = args[i+1];
i++;
}
else if (arg.equals("-p"))
{
packagename = args[i+1];
i++;
}
else if (arg.equals("-v"))
{
version = args[i+1];
i++;
}
else if (arg.equals("-c"))
{
classpath = true;
}
else if (arg.equals("-vi"))
{
verifyignore = true;
}
else if( arg.equals("-d"))
{
dir = args[i+1];
i++;
}
else if( arg.equals("-nd"))
{
getdeps = false;
}
}
}
if ( packagename == null)
{
System.out.println("Usage : fetch -j jarname -p package -v version ");
return;
}
/*
* now go get
*/
try
{
/*
* get the repository info
*/
Repository rep = new RepositoryXML();
rep.load( new URL( defaultRepository + "repository.xml") );
/*
* get the fetch target
*/
if( version == null)
version = rep.getPackageDefaultVersion( packagename );
System.out.println("Fetching " + packagename + " v" + version + " into
file " + (jarname == null? "<default name>" : jarname ) );
String fetchTarget = rep.getFetchTarget( packagename, version );
if (fetchTarget == null)
{
System.out.println("JJAR.fetch : target not found for " +
packagename + " v" + version );
return;
}
/*
* are there any dependencies for this fetch target?
*/
String deptarget = "";
if (getdeps)
{
List deplist = rep.getDependencyList( packagename, version );
Iterator ii = deplist.iterator();
while(ii.hasNext())
{
/*
* for now, use the fetchtarget names
*/
String depnameuni = (String) ii.next();
JJARPackage jjarp = new JJARPackage( depnameuni );
String depname = jjarp.getName();
String depver = jjarp.getVersionString();
deptarget = rep.getFetchTarget( depname, depver );
if( deptarget == null)
{
System.out.println(" Repository error : returned null for
dependency " + depname + " v" + depver
+ " Skipping.");
continue;
}
/*
* check to see if exists if verifyignore
*/
if (verifyignore )
{
JJARPackage jpak = null;
try
{
jpak = ClasspathUtil.getPackage( dir + "/" + deptarget );
}
catch(Exception e)
{
// ignore
}
if (jpak != null)
{
if( jpak.equals( depname, depver ))
{
System.out.println(" Dependency '" + depname + "'
exists. Skipping.");
continue;
}
}
}
/*
* now get it
*/
URL url = new URL( defaultRepository + deptarget );
URLConnection uconn = (URLConnection) url.openConnection();
System.out.println(" Fetching dependency : " + deptarget + " to
" + dir + "/" + deptarget );
Transport.fetchJar( uconn, dir + "/" + deptarget );
}
}
/*
* if verifyignore then check the jar to see if it satisfies the request
*/
if (jarname == null)
jarname = fetchTarget;
if( verifyignore)
{
try
{
JJARPackage packageinfo = ClasspathUtil.getPackage( dir + "/" +
jarname );
if( packageinfo.equals( packagename, version ))
{
System.out.println("Target exists. skipping fetch");
return;
}
}
catch(Exception e)
{
// ignore and continue
}
}
URL url = new URL( defaultRepository + fetchTarget );
URLConnection uconn = (URLConnection) url.openConnection();
String destjar = dir + "/" + jarname;
System.out.println(" Fetching target : " + fetchTarget + " to " +
destjar );
Transport.fetchJar( uconn, destjar);
}
catch( Exception e )
{
System.out.println("JJAR.fetch : exception " + e );
e.printStackTrace();
}
}
public static void verify( String args[] )
{
header();
/*
* do we do it to classpath, or was a jar specified
*/
String flag = null;
String jarname = null;
if (args.length > 1 )
{
flag = args[1];
if (flag.equals("-j"))
{
if (args.length >= 3)
{
jarname = args[2];
try
{
JJARPackage jjarp = ClasspathUtil.getPackage( jarname );
if (jjarp != null)
System.out.println(" " + jjarp.getName() + " v" +
jjarp.getVersionString() );
else
System.out.println(" " + jarname + "not a jjar
compatable jar");
}
catch( Exception e )
{
}
}
}
else
{
/*
* do the classpath
*/
List jars = ClasspathUtil.getJarList( null );
Iterator i = jars.iterator();
while( i.hasNext() )
{
String jar = (String) i.next();
try
{
JJARPackage jjarp = ClasspathUtil.getPackage( jar );
if (jjarp != null)
System.out.println(" " + jjarp.getName() + " v" +
jjarp.getVersionString() );
else
System.out.println(" " + jar + "not a jjar compatable
jar");
}
catch( Exception e )
{
}
}
}
}
else
{
System.out.println(" usage : verify -c | -j jarname");
}
return;
}
public static void list( String args[] )
{
header();
try
{
URL url = new URL(defaultRepository + "repository.xml");
Repository rep = new RepositoryXML();
rep.load(url);
if (args.length >= 3 )
{
String flag = args[1];
if (flag.equals("-p"))
{
String pkg = args[2];
dumpInfo( rep, pkg );
}
}
else
{
System.out.println("Repository contains " + rep.getPackageCount() +
" packages : " );
Iterator i = rep.getPackageListIter();
while( i.hasNext() )
{
String p = (String) i.next();
dumpInfo( rep, p );
System.out.println("");
}
}
}
catch( Exception e )
{
System.out.println("JJAR.list : exception " + e );
e.printStackTrace();
}
}
private static void dumpInfo(Repository rep, String p )
{
System.out.println(" " + p );
System.out.println(" desc : " + rep.getPackageDescription( p ) );
System.out.println(" default : " + rep.getPackageDefaultVersion( p ));
System.out.println(" versions : ");
List l = rep.getPackageVersionList( p );
Iterator ii = l.iterator();
while( ii.hasNext() )
{
String version = (String) ii.next() ;
System.out.print( " " + version + " deps : " );
List depl = rep.getDependencyList( p, version );
Iterator iii = depl.iterator();
while( iii.hasNext() )
{
System.out.print( iii.next() + ", " );
}
System.out.println("");
}
System.out.println("--");
}
public static void mark( String args[] )
{
// mark -j jarname -p package -v version
String packagename = null;
String jarname = null;
String version = null;
if ( args.length < 7 )
{
System.out.println("Usage : mark -j jarname -p package -v version ");
return;
}
for( int i = 1; i < args.length; i++)
{
String arg = args[i];
if (arg.startsWith("-"))
{
if (arg.equals("-j"))
{
jarname = args[i+1];
i++;
}
else if (arg.equals("-p"))
{
packagename = args[i+1];
i++;
}
else if (arg.equals("-v"))
{
version = args[i+1];
i++;
}
}
}
if ( packagename == null || jarname == null || version == null)
{
System.out.println("Usage : mark -j jarname -p package -v version ");
return;
}
try
{
if (ClasspathUtil.markJar( jarname, packagename, version ))
System.out.println("successful");
}
catch( Exception e)
{
System.out.println("Exception e : " + e );
}
}
private static void header()
{
System.out.println(title);
System.out.println("===================================");
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/JJARPackage.java
Index: JJARPackage.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.util.HashMap;
/**
* little class to handle the
* package/version duple.
*
* the intent was to extend to carry more
* information, but the repository seems to
* be doing ok for that.
*
* It might be nice to continue here though
* and make the repository surface area smaller
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: JJARPackage.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class JJARPackage
{
private String name;
private Version version;
private HashMap properties;
private static String DESC = "desc";
private static String JAR = "jar";
private static String HREF = "href";
/**
* usual CTOR
*/
public JJARPackage( String name, String version )
{
this.name = name;
this.version = new Version(version);
}
/**
* ctor for <package>:<version> unispec
*/
public JJARPackage( String onepiece )
{
int i = onepiece.indexOf(":");
if (i != -1 )
{
this.name = onepiece.substring(0, i );
this.version = new Version( onepiece.substring( i + 1 ) );
}
}
public String getName()
{
return name;
}
public Version getVersion()
{
return version;
}
public String getVersionString()
{
return version.toString();
}
public boolean equals( JJARPackage jpack )
{
return equals( jpack.getName(), jpack.getVersionString() );
}
public boolean equals( String pkg, String ver )
{
if ( pkg != null && this.name.equals( pkg ) )
{
// do something better here ?
if ( ver != null && version.equals( ver ) )
{
return true;
}
}
return false;
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/JJARTask.java
Index: JJARTask.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Iterator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
/**
* An ant task for doing JJAR stuff
*
* @version $Id: JJARTask.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class JJARTask extends Task
{
private static String defaultRepository = ClasspathUtil.getDefaultRepository();
private String pkg = null;
private String ver = null;
private String localrep = ".";
private boolean verifyignore = true;
private String classpath = null;
/**
* [REQUIRED] sets the package and version. ver can be
* null to get the default
*/
public void setPackage( String pkg)
{
this.pkg = pkg;
}
public void setVersion( String version )
{
this.ver = version;
}
public void setLocalrepository( String localrep )
{
this.localrep = localrep;
}
public void setVerifyignore( boolean b )
{
this.verifyignore = b;
}
public void setRepository( String rep )
{
this.defaultRepository = rep;
}
public void setClasspath( String classpath )
{
this.classpath = classpath;
}
/**
* Execute the input script with Velocity
*
* @throws BuildException
* BuildExceptions are thrown when required attributes are missing.
* Exceptions thrown by Velocity are rethrown as BuildExceptions.
*/
public void execute ()
throws BuildException
{
/*
* make sure that we at least have a package name
*/
if( pkg == null)
throw new BuildException("Need to specify a package to fetch");
/*
* get the repository
*/
Repository repository = null;
try
{
repository = new RepositoryXML();
repository.load( new URL( defaultRepository + "repository.xml") );
}
catch( Exception e )
{
throw new BuildException("Problem getting repository info", e );
}
log("Fetching package '" + pkg + "' from repository '" + defaultRepository
+ "' into local repository '" + localrep + "'");
try
{
/*
* do it : first, see if there is a dependency list
*/
if( ver == null)
ver = repository.getPackageDefaultVersion( pkg );
List deplist = repository.getDependencyList( pkg, ver );
Iterator ii = deplist.iterator();
while(ii.hasNext())
{
/*
* for now, use the fetchtarget names
*/
String depnameuni = (String) ii.next();
JJARPackage jjarp = new JJARPackage( depnameuni );
String depname = jjarp.getName();
String depver = jjarp.getVersionString();
String deptarget = repository.getFetchTarget( depname, depver );
/*
* see if the dependent package is already in the classpath
*/
if ( verifyignore && ClasspathUtil.containsVersionedJar( classpath,
depname, depver))
{
log(" Dependency '" + depname + "' already in classpath -
skipping");
continue;
}
/*
* now get it
*/
URL url = new URL( defaultRepository + deptarget );
URLConnection uconn = (URLConnection) url.openConnection();
log(" Fetching dependency : " + deptarget );
Transport.fetchJar( uconn, localrep + "/" + deptarget );
}
/*
* now get the actual package
*/
/*
* if we don't have a version, we need to get it from the repository
*/
if (ver == null)
{
ver = repository.getPackageDefaultVersion( pkg );
}
if( verifyignore && ClasspathUtil.containsVersionedJar( classpath, pkg,
ver))
{
log(" Skipping fetch of '" + pkg + "' - already exists in
classpath");
// ignore and continue
}
else
{
String fetchTarget = repository.getFetchTarget( pkg, ver );
URL url = new URL( defaultRepository + fetchTarget );
URLConnection uconn = (URLConnection) url.openConnection();
log(" Fetching package : " + pkg );
Transport.fetchJar( uconn, localrep + "/" + fetchTarget );
}
}
catch( Exception e )
{
throw new BuildException("Exception : ",e);
}
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/Repository.java
Index: Repository.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* first cut at a repository interface
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: Repository.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public interface Repository
{
public void load( URL url );
public List getDependencyList( String pkg, String version );
public Iterator getPackageListIter();
public int getPackageCount();
public String getPackageDefaultVersion( String pkg );
public String getPackageDescription( String pkg );
public String getFetchTarget( String pkg, String version );
public boolean isPackage( String pkg );
public List getPackageVersionList( String pkg );
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/RepositoryProps.java
Index: RepositoryProps.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class RepositoryProps extends Properties implements Repository
{
private List packageList = null;
private DependencyEngine de = new DependencyEngine();
public void load( URL url )
{
try
{
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
load(is);
is.close();
}
catch(Exception e )
{
}
/*
* get the list of packages
*/
String packages = getProperty("packages");
packages.trim();
packageList = makeList( packages );
/*
* setup the dependency engine
*/
Iterator i = packageList.iterator();
while( i.hasNext() )
{
/*
* for each package
*/
String p = (String) i.next();
// System.out.println(" processing " + p );
/*
* get the dependency list
*/
String depstr = getProperty( p + ".dependencies");
depstr.trim();
List dep = makeList( depstr );
/*
* now, remove an <none> marks
*/
Iterator ii = dep.iterator();
List deplist = new ArrayList();
while( ii.hasNext() )
{
String sdep = (String) ii.next();
if ( !sdep.equals("<none>"))
deplist.add( sdep );
}
try
{
de.addProject( p, deplist, p );
}
catch( Exception e )
{
System.out.println("Repository.Repository() : " + p + " : " + e
);
}
}
}
public List getDependencyList( String pkg, String version )
{
if( isPackage( pkg ))
return de.getDependencies( pkg );
return new ArrayList();
}
public Iterator getPackageListIter()
{
return packageList.iterator();
}
public int getPackageCount()
{
return packageList.size();
}
public String getPackageDefaultVersion( String pkg )
{
if (isPackage( pkg ) )
{
return getProperty( pkg + ".default" );
}
return null;
}
public String getPackageDescription( String pkg )
{
if (isPackage( pkg ) )
{
return getProperty( pkg + ".desc" );
}
return null;
}
public String getFetchTarget( String pkg, String version )
{
if (!isPackage( pkg ))
return null;
String ft = getProperty( pkg + "." + version + ".jar");
return ft;
}
public boolean isPackage( String pkg )
{
Iterator i = packageList.iterator();
while( i.hasNext() )
{
String p = (String) i.next();
if (p.equals( pkg ) )
return true;
}
return false;
}
public List getPackageVersionList( String pkg )
{
if(!isPackage( pkg ))
return null;
return makeList( getProperty( pkg + ".version" ) );
}
private List makeList( String thing )
{
StringTokenizer st = new StringTokenizer( thing, ", ");
List list = new ArrayList();
while(st.hasMoreTokens() )
{
list.add( st.nextToken().trim() );
}
return list;
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/RepositoryXML.java
Index: RepositoryXML.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
import java.util.Map;
import java.util.HashMap;
import java.io.StringWriter;
import java.io.Writer;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import org.xml.sax.*;
import uk.co.wilson.xml.MinML2;
/**
* Repository implementation that supports XML repository
* definitions. Uses a great small little lightweight SAX
* parser - but it's not clear what it doesn't support, so
* be careful
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: RepositoryXML.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class RepositoryXML extends MinML2 implements Repository
{
/** list of packages */
private HashMap packageMap = new HashMap();
int packageCount = 0;
/** handles package dependency generation */
private DependencyEngine de = new DependencyEngine();
/** root of our document tree */
private Node root = null;
/** stack used for SAX parsing */
private Stack stack = new Stack();
/** user for SAX parsing to avoid character events */
private StringWriter saxWriter = null;
/** string constants for use in data structure */
private static String PACKAGENAME = "packagename";
private static String DEFAULTVERSION = "defaultversion";
private static String NODE = "node";
private static String DESCRIPTION = "description";
private static String HREF = "href";
private static String VERSION = "version";
private static String VERSION_INFO = "version_info";
private static String VERSION_JAR = "version_jar";
private static String DEP_PACKAGE = "dep_package";
private static String DEP_VERSION = "dep_version";
private static String VERSION_DEPS = "version_deps";
private static String VERSION_ARRAY = "version_array";
/**
* loads the object with the XML data from the
* passed in URL. Invokes the SAX parser.
*
* @param url location of the repository.xml
*/
public void load( URL url )
{
try
{
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
parse(new InputStreamReader(new BufferedInputStream( is)));
process();
}
catch ( IOException e)
{
System.out.println("IOException: " + e);
e.printStackTrace();
}
catch ( SAXException e)
{
System.out.println("SAXException: " + e);
e.printStackTrace();
}
catch ( Throwable e)
{
System.out.println("Other Exception: " + e);
e.printStackTrace();
}
}
/**
* returns a list of dependencies for
* a given package. The list contains
* Maps, with 'package' and 'version'
* as the keys for the necessary info.
*
* @param pkg package to get dep list for
* @return List of Maps
*/
public List getDependencyList( String pkg, String version )
{
if( isPackage( pkg ))
return de.getDependencies( pkg + ":" + version );
return new ArrayList();
}
/**
* returns an iterator over the
* list of package names
*/
public Iterator getPackageListIter()
{
return packageMap.keySet().iterator();
}
/**
* returns the number of packages known to
* the repository
*/
public int getPackageCount()
{
return packageMap.size();
}
/**
* returns the default version of the package to the caller
*/
public String getPackageDefaultVersion( String pkg )
{
if (isPackage( pkg ) )
{
HashMap hpack = (HashMap) packageMap.get( pkg );
return (String) hpack.get( DEFAULTVERSION);
}
return null;
}
/**
* returns the info/desc string to the caller
*/
public String getPackageDescription( String pkg )
{
if (isPackage( pkg ) )
{
HashMap hpack = (HashMap) packageMap.get( pkg );
return (String) hpack.get( DESCRIPTION);
}
return "";
}
/**
* returns the 'fetch' target (jarname) for the
* given package : version
*/
public String getFetchTarget( String pkg, String version )
{
if (!isPackage( pkg ))
return null;
Map hp = (HashMap) packageMap.get( pkg );
Iterator i =((ArrayList) hp.get( VERSION_ARRAY )).iterator();
while( i.hasNext() )
{
HashMap vi = (HashMap) i.next();
String ver = (String) vi.get( VERSION );
if (ver != null)
{
if (version.equals( ver ) )
{
String out = (String) vi.get(VERSION_JAR);
return out;
}
}
}
return null;
}
/**
* determines if something is a known package
*/
public boolean isPackage( String pkg )
{
Object o = packageMap.get( pkg );
if( o != null)
return true;
return false;
}
/**
* returns a given property
* not implemented
*/
public String getProp( String s )
{
return s;
}
/**
* returns a list of the know versions available
* for this package
*/
public List getPackageVersionList( String pkg )
{
if(!isPackage( pkg ))
return null;
Map hp = (HashMap) packageMap.get( pkg );
ArrayList verlist = new ArrayList();
Iterator i =((ArrayList) hp.get( VERSION_ARRAY )).iterator();
while( i.hasNext() )
{
verlist.add( ( (HashMap)i.next() ).get( VERSION ) );
}
return verlist;
}
private List makeList( String thing )
{
StringTokenizer st = new StringTokenizer( thing, ", ");
List list = new ArrayList();
while(st.hasMoreTokens() )
{
list.add( st.nextToken().trim() );
}
return list;
}
/**
* takes the intermediary form of input data, and loads the
* internal data structures for use later. This needs to be
* called right after parsing, and before use.
*/
private void process()
{
/*
* need to build a package list. Get the package groups.
*/
List packagegroup = getDocNodeList( root, "packagegroup");
//System.out.println("packagegroup has " + packagegroup.size() + "elements");
Iterator i = packagegroup.iterator();
while( i.hasNext() )
{
Node pkggrp = (Node) i.next();
//System.out.println("Processing packagegroup : " +
pkggrp.getAttribute("name") );
List packages = getDocNodeList( pkggrp, "package");
/*
* for each package...
*/
Iterator ii = packages.iterator();
while( ii.hasNext() )
{
processPackageNode( (Node) ii.next() );
}
}
}
private void processPackageNode( Node pkg )
{
HashMap pkginfo = new HashMap();
/*
* start with the basics
*/
pkginfo.put( PACKAGENAME, pkg.getAttribute("name") );
pkginfo.put( DEFAULTVERSION, pkg.getAttribute("default"));
pkginfo.put( NODE, pkg );
/*
* now get the information node
*/
Node info = getDocNode( pkg, "info/desc");
if( info != null)
pkginfo.put( DESCRIPTION, info.getValue());
info = getDocNode( pkg, "info/href");
if( info != null)
pkginfo.put( HREF, info.getValue());
/*
* process version info
*/
List versionlist = getDocNodeList( pkg, "versionset/version");
ArrayList versionArray = new ArrayList();
Iterator v = versionlist.iterator();
while( v.hasNext() )
{
Node n = (Node) v.next();
HashMap vi = new HashMap();
vi.put( VERSION, n.getAttribute("version") );
Node nn = getDocNode( n, "note");
vi.put( VERSION_INFO, nn.getValue() );
nn = getDocNode( n, "jar");
vi.put( VERSION_JAR, nn.getValue() );
/* the dependencies */
ArrayList deplist = new ArrayList();
List deps = getDocNodeList( n, "dependencies/dep");
if (deps != null)
{
Iterator ii = deps.iterator();
while( ii.hasNext() )
{
HashMap h = new HashMap();
Node ndep = (Node) ii.next();
h.put( DEP_PACKAGE, ndep.getAttribute("package") );
h.put( DEP_VERSION, ndep.getAttribute("version") );
deplist.add( h );
}
vi.put( VERSION_DEPS, deplist );
}
versionArray.add( vi );
/*
* add the package:version to the dependency engine
*/
String token = pkginfo.get( PACKAGENAME ) + ":" + (String) vi.get(
VERSION );
// System.out.println("Adding " + token + " to dependency engine.");
ArrayList depar = new ArrayList();
Iterator depiter = deplist.iterator();
while( depiter.hasNext() )
{
HashMap h = (HashMap) depiter.next();
String deptoken = (String) h.get(DEP_PACKAGE) + ":" + (String)
h.get(DEP_VERSION);
depar.add( deptoken );
}
try
{
de.addProject( token, depar, token );
}
catch( Exception e )
{}
}
pkginfo.put( VERSION_ARRAY, versionArray );
/*
* add the info to the packageMap
*/
packageMap.put( pkginfo.get( PACKAGENAME ), pkginfo );
// dumpPackageInfo( pkginfo );
}
/**
* simple dumper for debugging
*/
private void dumpPackageInfo( Map h )
{
System.out.println("Package : " + h.get( PACKAGENAME ) );
System.out.println(" default version : " + h.get(DEFAULTVERSION ));
System.out.println(" description : " + h.get(DESCRIPTION ));
System.out.println(" href : " + h.get(HREF ));
System.out.println(" version info -> " );
ArrayList vl = (ArrayList) h.get( VERSION_ARRAY );
Iterator i = vl.iterator();
while( i.hasNext() )
{
HashMap vi = (HashMap) i.next();
System.out.println(" ver : " + vi.get( VERSION ) );
System.out.println(" info : " + vi.get( VERSION_INFO ) );
System.out.println(" jar : " + vi.get( VERSION_JAR ) );
}
}
/**
* Returns a given node from the document tree.
* if a multivalued node, will return the first
*
* @param root node to start seaching on
* @param path node path, a la "foo/bar/woogie"
* @return node or null
*/
private Node getDocNode( Node root, String path )
{
List ar = getDocNodeList(root, path );
if (ar == null || ar.size() == 0)
return null;
return (Node) ar.get(0);
}
/**
* returns the node list for a given path relative to the
* passed in node
*
* @param root node to start from
* @param path note path
* @return List of nodes that match
*/
private List getDocNodeList( Node root, String path)
{
StringTokenizer st = new StringTokenizer( path, "/");
Node n = root;
ArrayList ar = null;
while( st.hasMoreTokens() )
{
String token = st.nextToken();
ar = n.getChildren(token);
if (ar == null || ar.size() == 0)
return null;
n = (Node) ar.get(0);
}
return ar;
}
/**
* start element event handler for SAX.
*/
public Writer startElement( String namespaceURI, String localName, String qName,
Attributes atts, Writer writer)
throws SAXException
{
/*
* get the top element on the list
*/
Node parent = null;
Node element = new Node( qName );
if( root == null)
{
root = element;
}
else
{
/*
* get parent node
*/
try
{
parent = (Node) stack.peek();
}
catch(Exception e)
{}
}
/*
* everything is a list
*/
if (parent != null)
{
parent.addChildNode( element);
}
/*
* now add our attributes
*/
for (int i = 0; i < atts.getLength(); i++)
{
element.setAttribute( atts.getQName(i), atts.getValue(i) );
}
/*
* now put this element on the stack for later
*/
stack.push(element);
saxWriter = new StringWriter();
return saxWriter;
}
/**
* end element event handler for SAX parsing
*/
public void endElement( String namespaceURI, String localName, String qName)
throws SAXException
{
try
{
Node element = (Node) stack.pop();
String s = saxWriter.toString();
if ( s.length() > 0)
element.setValue( s );
}
catch( Exception e )
{
System.out.println("endElement : " + e );
}
}
public void fatalError (SAXParseException e)
throws SAXException
{
System.out.println("RepositoryXML.fatalError(): " + e);
throw e;
}
/**
* used for debugging
*/
public static void main ( String[] args)
{
RepositoryXML rep = new RepositoryXML();
try
{
rep.load( new URL("file://" + args[0] ));
}
catch( Exception e )
{ System.out.println(e );}
List al = rep.getDependencyList( "ant", "1.3");
Iterator i = al.iterator();
System.out.println("dep for ant 1.3 ");
while( i.hasNext() )
{
System.out.println(" " + (String) i.next() );
}
}
/**
* meethod for debugging parsing
*/
private static void show( String indent, Map map )
{
System.out.println("");
Iterator i = map.keySet().iterator();
while(i.hasNext() )
{
String s = (String) i.next();
Object o = map.get( s );
System.out.print( indent + "<" + s + ">");
if ( o instanceof Map )
{
show( indent + " ", (Map) o);
}
else if ( o instanceof List )
{
Iterator j = ((List) o).iterator();
while( j.hasNext() )
{
Object oo = j.next();
if (oo instanceof Map)
show( indent + " ", (Map) oo);
else
System.out.println("woo!" + oo.getClass());
}
}
else
{
System.out.println( map.get( s ));
}
}
}
/**
* small class to hold our node information for
* XML processing
*/
class Node
{
String name = null;
String value = "";
HashMap attributes = new HashMap();
HashMap children = new HashMap();
Node( String name )
{
this.name = name;
}
void setValue( String val )
{
value = val;
}
String getValue()
{
return value;
}
void setAttribute( String key, String val )
{
attributes.put( key, val );
}
String getAttribute( String key )
{
return (String) attributes.get( key );
}
void addChildNode( Node node )
{
ArrayList ar = (ArrayList) children.get( node.name );
if (ar == null)
ar = new ArrayList();
ar.add( node );
children.put( node.name, ar );
}
ArrayList getChildren( String name )
{
return (ArrayList) children.get( name );
}
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/Transport.java
Index: Transport.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
import java.lang.Package;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collection;
import java.util.Map;
import java.util.List;
import java.util.StringTokenizer;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.jar.Attributes;
import java.util.jar.JarInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.JarURLConnection;
import java.net.URLConnection;
import java.net.URL;
/**
* bit moving support for JJAR
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: Transport.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class Transport
{
public static boolean fetchJar( URLConnection source, String dest )
{
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
bis = new BufferedInputStream( source.getInputStream());
bos = new BufferedOutputStream( new FileOutputStream( dest ) );
return fetch( bis, bos );
}
catch( Exception e )
{
System.out.println("Transport.fetchJar() : " + e );
}
finally
{
try{
if (bos != null)
bos.close();
}catch(Exception e){}
}
return false;
}
private static boolean fetch( InputStream is, OutputStream os )
throws Exception
{
byte[] buf = new byte[ 1024];
int count = 0;
do
{
os.write( buf, 0, count);
count = is.read(buf, 0, buf.length);
} while (count != -1);
return true;
}
}
1.1
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/Version.java
Index: Version.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jjar;
/**
* simple class to handle JJAR version information
*
* should be of format
* <major>.<minor>-<modifier>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
* @version $Id: Version.java,v 1.1 2001/05/07 22:47:45 geirm Exp $
*/
public class Version
{
private static String VER_SEP = ".";
private static String MOD_SEP = "-";
private boolean proper = false;
private String version;
private int major = -1;
private int minor = -1;
private String modifier = "";
public Version( String version )
{
this.version = version;
parse();
}
public boolean isProper()
{
return proper;
}
public String toString()
{
return version;
}
public int getMajor()
{
return this.major;
}
public int getMinor()
{
return this.minor;
}
public String getModifier()
{
return this.modifier;
}
public boolean equals( String version )
{
Version v = new Version( version );
return equals( v );
}
public boolean equals( Version v )
{
return (v.getMajor() == major && v.getMinor() == minor &&
v.getModifier().equals( modifier));
}
private void parse()
{
/*
* first, look for the separators
*/
int wherever = version.indexOf( VER_SEP );
int wheremod = version.indexOf( MOD_SEP );
/*
* we must have the VER_SEP or it's not
* properly formatted
*/
if (wherever != -1 )
{
/*
* major : get the 'left' of VER_SEP
*/
String maj = version.substring( 0,wherever);
try
{
major = Integer.parseInt( maj );
proper = true;
}
catch( Exception e )
{}
/*
* minor :
*/
String min = version.substring( wherever + 1,
(wheremod == -1 ? version.length() : wheremod ) );
try
{
minor = Integer.parseInt( min );
proper = true;
}
catch( Exception e )
{}
}
if ( wheremod != -1 )
{
/*
* now the modifier
*/
modifier = version.substring( wheremod + 1 );
}
}
public static void main( String args[])
{
Version jv = new Version( "1.1");
System.out.println( jv.getMajor() + " : " + jv.getMinor() + " : " +
jv.getModifier());
jv = new Version( "2.1-rc1");
System.out.println( jv.getMajor() + " : " + jv.getMinor() + " : " +
jv.getModifier());
}
}