geirm       01/08/14 20:54:01

  Modified:    jjar/src/java/org/apache/commons/jjar RepositoryXML.java
  Log:
  Added support for distributed repository - this allows the repository
  to have package repository information stored at remote places.
  
  Revision  Changes    Path
  1.2       +139 -82   
jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/RepositoryXML.java
  
  Index: RepositoryXML.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/jjar/src/java/org/apache/commons/jjar/RepositoryXML.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RepositoryXML.java        2001/05/07 22:47:45     1.1
  +++ RepositoryXML.java        2001/08/15 03:54:01     1.2
  @@ -83,7 +83,7 @@
    *  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 $
  + *  @version $Id: RepositoryXML.java,v 1.2 2001/08/15 03:54:01 geirm Exp $
    */
   public class RepositoryXML extends MinML2 implements Repository
   {
  @@ -92,7 +92,7 @@
        int packageCount = 0;
   
        /** handles package dependency generation */
  -     private DependencyEngine de = new DependencyEngine();
  +     private static DependencyEngine de = new DependencyEngine();
   
        /** root of our document tree */
       private Node root = null;
  @@ -125,13 +125,18 @@
         */
       public void load( URL url )
       {
  +        load( url, packageMap );
  +    }
  +
  +    public void load( URL url, Map pkgMap )
  +    {
           try 
           {
               URLConnection conn = url.openConnection();
               InputStream is = conn.getInputStream();
   
               parse(new InputStreamReader(new BufferedInputStream( is)));
  -            process();
  +            process( pkgMap );
           }
           catch ( IOException e) 
           {
  @@ -219,9 +224,18 @@
        */
       public String getFetchTarget( String pkg, String version )
       {
  +
  +        /*
  +         *  first see if we know about this package.
  +         */
  +
           if (!isPackage( pkg ))
               return null;
   
  +        /*
  +         * next, get the package info and see if we have this version
  +         */
  +
           Map hp = (HashMap) packageMap.get( pkg );
           Iterator i =((ArrayList) hp.get( VERSION_ARRAY )).iterator();        
           
  @@ -235,7 +249,6 @@
                   if (version.equals( ver ) )
                   {
                       String out = (String) vi.get(VERSION_JAR);
  -
                       return out;
                   }
               }
  @@ -308,7 +321,7 @@
         *  internal data structures for use later.  This needs to be
         *  called right after parsing, and before use.
         */
  -    private void process()
  +    private void process( Map pkgMap )
       {
           /*
            *  need to build a package list.  Get the package groups.
  @@ -316,6 +329,9 @@
   
                List packagegroup = getDocNodeList( root, "packagegroup");
           
  +        if (packagegroup == null)
  +            System.out.println("Packagegroup == null");
  +
           //System.out.println("packagegroup has " + packagegroup.size() + 
"elements");
           
           Iterator i = packagegroup.iterator();
  @@ -336,12 +352,12 @@
   
                        while( ii.hasNext() )
                        {
  -                             processPackageNode( (Node) ii.next() );
  +                             processPackageNode( (Node) ii.next(), pkgMap );
                        }
           }
       }
        
  -     private void processPackageNode( Node pkg )
  +     private void processPackageNode( Node pkg, Map pkgMap )
        {
                HashMap pkginfo = new HashMap();
   
  @@ -352,108 +368,149 @@
                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();
  +        /*
  +         *  does this have a definition here or remote?
  +         */
   
  -        Iterator v = versionlist.iterator();
  +        Node def = getDocNode( pkg, "definition");
   
  -        while( v.hasNext() )
  +        if (def != null)
           {
  -            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() );
  +            /*
  +             * now get the information node
  +             */
   
  -            nn = getDocNode( n, "jar");
  -            vi.put( VERSION_JAR, nn.getValue() );
  +            Node info = getDocNode( def, "info/desc");
   
  -            /*  the dependencies */
  +            if( info != null)
  +                pkginfo.put( DESCRIPTION, info.getValue());
   
  -            ArrayList deplist = new ArrayList();
  +            info = getDocNode( def, "info/href");
   
  -            List deps = getDocNodeList( n, "dependencies/dep");
  - 
  -            if (deps != null)
  +            if( info != null)
  +                pkginfo.put( HREF, info.getValue());
  +            
  +            /*
  +             *  process version info
  +             */
  +            
  +            List  versionlist = getDocNodeList( def, "versionset/version");
  +            ArrayList versionArray = new ArrayList();
  +            
  +            Iterator v = versionlist.iterator();
  +            
  +            while( v.hasNext() )
               {
  -                Iterator ii = deps.iterator();
  +                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() );
                   
  -                while( ii.hasNext() )
  +                /*  the dependencies */
  +                
  +                ArrayList deplist = new ArrayList();
  +                
  +                List deps = getDocNodeList( n, "dependencies/dep");
  +                
  +                if (deps != null)
                   {
  -                    HashMap h = new HashMap();
  -                    Node ndep = (Node) ii.next();
  +                    Iterator ii = deps.iterator();
                       
  -                    h.put( DEP_PACKAGE, ndep.getAttribute("package") );
  -                    h.put( DEP_VERSION, ndep.getAttribute("version") );
  +                    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 );
  +                    }
                       
  -                    deplist.add( h );
  +                    vi.put( VERSION_DEPS, deplist );
                   }
                   
  -                vi.put( VERSION_DEPS, deplist );
  -            }
  -   
  -            versionArray.add( vi );
  +                versionArray.add( vi );
    
  -            /*
  -             *  add the package:version to the dependency engine
  -             */
  +                /*
  +                 *  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 );
  +                }
   
  -            String token = pkginfo.get( PACKAGENAME ) + ":" +  (String) vi.get( 
VERSION );
  +                try
  +                {
  +                    de.addProject( token, depar, token );
  +                }
  +                catch( Exception e )
  +                    {}
   
  -            // System.out.println("Adding " + token + " to dependency engine.");
  +            }
   
  -            ArrayList depar = new ArrayList();
  +            pkginfo.put( VERSION_ARRAY, versionArray );
   
  -            Iterator depiter = deplist.iterator();
  +            /*
  +             *  add the info to the packageMap
  +             */
  +            
  +            pkgMap.put( pkginfo.get( PACKAGENAME ), pkginfo );
               
  -            while( depiter.hasNext() )
  +            //               dumpPackageInfo( pkginfo );
  +        }
  +        else
  +        {
  +            /*
  +             * is this a remote repository? 
  +             */
  +            
  +            Node remote = getDocNode( pkg, "remotedefinition");
  +
  +            if (remote != null)
               {
  -                HashMap h = (HashMap) depiter.next();
  +                System.out.println( "Note package '" + ( (String) pkginfo.get( 
PACKAGENAME ) ) 
  +                                    + "' defining repository is remote, coming from 
" + remote.getValue() );
  +            
  +                /*
  +                 *  now recursively get the info
  +                 */
   
  -                String deptoken = (String) h.get(DEP_PACKAGE) + ":" +  (String) 
h.get(DEP_VERSION);
  -                depar.add( deptoken );
  +                try
  +                {
  +                    RepositoryXML rep = new RepositoryXML();
  +                    rep.load( new URL( remote.getValue() ), pkgMap );
  +                }
  +                catch( Exception ee )
  +                    {}
               }
  -
  -            try
  +            else
               {
  -                de.addProject( token, depar, token );
  +                System.out.println("Malformed repository : neither <definition> or 
<remotedefinition>");
               }
  -            catch( Exception e )
  -                {}
  -
  +            
  +                
           }
  -
  -        pkginfo.put( VERSION_ARRAY, versionArray );
  -
  -             /*
  -              *  add the info to the packageMap
  -              */
  -
  -             packageMap.put( pkginfo.get( PACKAGENAME ), pkginfo );
  -
  -        //           dumpPackageInfo( pkginfo );
        }
   
       /**
  
  
  

Reply via email to