alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.updater;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import java.util.zip.CRC32;

import org.w3c.dom.*;
import org.xml.sax.InputSource;

/** This class represents module updates tracking
 *
 * @author  Ales Kemr
 */
public final class UpdateTracking {
    private static final String ELEMENT_MODULES = "installed_modules"; // NOI18N
    private static final String ELEMENT_MODULE = "module"; // NOI18N
    private static final String ATTR_CODENAMEBASE = "codename"; // NOI18N
    private static final String ELEMENT_VERSION = "module_version"; // NOI18N
    private static final String ATTR_VERSION = "specification_version"; // NOI18N
    private static final String ATTR_ORIGIN = "origin"; // NOI18N
    private static final String ATTR_LAST = "last"; // NOI18N
    private static final String ATTR_INSTALL = "install_time"; // NOI18N
    private static final String ELEMENT_FILE = "file"; // NOI18N
    private static final String ATTR_FILE_NAME = "name"; // NOI18N
    private static final String ATTR_CRC = "crc"; // NOI18N
    
    private static final String NBM_ORIGIN = "nbm"; // NOI18N
    private static final String INST_ORIGIN = "installer"; // NOI18N

    /** Platform dependent file name separator */
    private static final String FILE_SEPARATOR = System.getProperty ("file.separator");
    private static final String LOCALE_DIR = FILE_SEPARATOR + "locale" + FILE_SEPARATOR; // NOI18N

    /** The name of the install_later file */
    private static final String TRACKING_FILE_NAME = "update_tracking"; // NOI18N
    private static final String XML_EXT = ".xml"; // NOI18N

    /** maps root of clusters to tracking files. (File -> UpdateTracking) */
    private static final Map trackings = new HashMap ();
    
    /** Mapping from files defining modules to appropriate modules objects.
     * (File, Module)
     */
    private LinkedHashMap installedModules = new LinkedHashMap ();

    private boolean pError = false;
    private boolean fromUser = false;
    private final File directory;
    private final File trackingFile;
    private String origin = NBM_ORIGIN;

    
    public UpdateTracking () {
        // XXX should be deleted I think
        this (null);
    }

    /** Private constructor.
     */
    private UpdateTracking( File nbPath ) {
        assert nbPath != null : "Path cannot be null";
        
        trackingFile = new File( nbPath + FILE_SEPARATOR + TRACKING_FILE_NAME);
        directory = nbPath;
        origin = INST_ORIGIN;
    }
    
    
    //
    // Various factory and utility methods
    //
    
    /** Loads update tracking for given location 
     * @param fromuser use netbeans.user or netbeans.home
     * @return the tracking
     */
    static UpdateTracking getTracking( boolean fromuser ) {        
        UpdateTracking ut = getTracking (
            System.getProperty (fromuser ? "netbeans.user" : "netbeans.home"), // NOI18N
            fromuser
        );
        return ut;
    }

    /** Loads update tracking for given location 
     * @param cluster the name of the cluster that we want to install to
     * @param createIfDoesNotExists should new tracking be created if it does not exists
     * @return the tracking
     */
    private static UpdateTracking getTracking(String cluster, boolean createIfDoesNotExists) {        
        File f = new File (cluster);
        
        UpdateTracking ut = getTracking (f, createIfDoesNotExists);
        return ut;
    }
    
    /** Finds update tracking for given cluster root. Automatically creates
     * the cluster if this is user dir.
     *
     * @path root of a cluster
     * @return the tracking for that cluster
     */    
    public static UpdateTracking getTracking (File path) {
        return getTracking (
            path,
            path.toString ().equals (System.getProperty ("netbeans.user"))
        );
    }
    
    /** Finds update tracking for given cluster root.
     * @path root of a cluster
     * @param createIfDoesNotExists should new tracking be created if it does not exists
     * @return the tracking for that cluster
     */    
    public static UpdateTracking getTracking (File path, boolean createIfDoesNotExists) {
        try {
            path = path.getCanonicalFile ();
        } catch (java.io.IOException ex) {
            IllegalStateException ill = new IllegalStateException (ex.getMessage ());
            ill.initCause (ex);
            throw ill;
        }
     
        synchronized (trackings) {
            UpdateTracking track = (UpdateTracking)trackings.get (path);
            if (track == null) {
                File utFile = new File (path, TRACKING_FILE_NAME);
                if (!createIfDoesNotExists && !utFile.isDirectory ()) {
                    // if the update_tracking directory is missing
                    // do not allow creation at all (only in userdir)
                    return null;
                }
                
                
                track = new UpdateTracking (path);
                trackings.put (path, track);
                track.read ();
                track.scanDir ();
            }
            return track;
        }
    }
    

    /** Returns the platform installatiion directory.
     * @return the File directory.
     */
    public static File getPlatformDir () {
        return new File (System.getProperty ("netbeans.home")); // NOI18N
    }
    
    /** Returns enumeration of Files that represent each possible install
     * directory.
     * @param includeUserDir whether to include also user dir
     * @return List
     */
    public static List clusters (boolean includeUserDir) {
        ArrayList files = new ArrayList ();
        
        if (includeUserDir) {
            File ud = new File (System.getProperty ("netbeans.user"));  // NOI18N
            files.add (ud);
        }
        
        
        String dirs = System.getProperty("netbeans.dirs"); // NOI18N
        if (dirs != null) {
            Enumeration en = new StringTokenizer (dirs, File.pathSeparator);
            while (en.hasMoreElements ()) {
                File f = new File ((String)en.nextElement ());
                files.add (f);
            }
        }
        
        
        File id = getPlatformDir ();
        files.add (id);
        
        return java.util.Collections.unmodifiableList (files);
    }
    
    //
    // Useful search methods
    //
    
    /** Returns true if module with given code base is installed here
     * @param codeBase name of the module
     * @return true or false
     */
    public boolean isModuleInstalled (String codeBase) {
        Iterator it = installedModules.values ().iterator ();
        while (it.hasNext ()) {
            Module m = (Module)it.next ();
            String mm = m.codenamebase;
            int indx = mm.indexOf ('/');
            if (indx >= 0) {
                mm = mm.substring (0, indx);
            }
            if (codeBase.equals (mm)) {
                return true;
            }
        }
        return false;
    }
    
    /** Compute the list of modules that should be installed into this 
     * cluster.
     * @return List of nbm files
     */
    public List getModulesToInstall () {              
        class NbmFilter implements java.io.FilenameFilter {
            public boolean accept( File dir, String name ) {
                return name.endsWith (ModuleUpdater.NBM_EXTENSION);
            }
        }
        
        File idir = new File (directory, ModuleUpdater.DOWNLOAD_DIR);
        File[] arr = idir.listFiles (new NbmFilter ());
        if (arr == null) {
            return Collections.EMPTY_LIST;
        } else {
            return Arrays.asList (arr);
        }
    }

    
    //
    // Private impls
    //
    
    
    /** Scan through org.w3c.dom.Document document. */
    private void read() {
        /** org.w3c.dom.Document document */
        org.w3c.dom.Document document;

        File file;
        InputStream is;
        try {
            file = trackingFile;
            
            if ( ! file.isFile () )
                return;
            
            is = new FileInputStream( file );

            InputSource xmlInputSource = new InputSource( is );
            document = XMLUtil.parse( xmlInputSource, false, false, new ErrorCatcher(), XMLUtil.createAUResolver() );
            if (is != null)
                is.close();
        }
        catch ( org.xml.sax.SAXException e ) {
            System.out.println("Bad update_tracking" ); // NOI18N
            e.printStackTrace ();
            return;
        }
        catch ( java.io.IOException e ) {
            System.out.println("Missing update_tracking" ); // NOI18N
            e.printStackTrace ();
            return;
        }

        org.w3c.dom.Element element = document.getDocumentElement();
        if ((element != null) && element.getTagName().equals(ELEMENT_MODULES)) {
            scanElement_installed_modules(element, fromUser);
        }            
    }    
    
    /** Scan through org.w3c.dom.Element named installed_modules. */
    void scanElement_installed_modules(org.w3c.dom.Element element, boolean fromuser) { // 
        // element.getValue();
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            if ( node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE ) {
                org.w3c.dom.Element nodeElement = (org.w3c.dom.Element)node;
                if (nodeElement.getTagName().equals(ELEMENT_MODULE)) {
                    if (true) throw new IllegalStateException ("What now!?");
                    // XXX  - should put the module into installedModules but do not know the key
                    // modules.add( scanElement_module(nodeElement, fromuser) );
                }                
            }
        }
    }
    
    /** Scan through org.w3c.dom.Element named module. */
    Module scanElement_module(org.w3c.dom.Element element, boolean fromuser) { // 
        Module module = new Module( fromuser );
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr)attrs.item(i);
            if (attr.getName().startsWith(ATTR_CODENAMEBASE)) { 
                //  or old version 
                module.setCodenamebase( attr.getValue() );
            }
        }
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            if ( node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE ) {
                org.w3c.dom.Element nodeElement = (org.w3c.dom.Element)node;
                if (nodeElement.getTagName().equals(ELEMENT_VERSION)) {
                    scanElement_module_version(nodeElement, module);
                }
            }
        }
        return module;
    }
    
    /** Scan through org.w3c.dom.Element named module_version. */
    void scanElement_module_version(org.w3c.dom.Element element, Module module) { // 
        Version version = new Version();        
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr)attrs.item(i);
            if (attr.getName().equals(ATTR_VERSION)) { // 
                version.setVersion( attr.getValue() );
            }
            if (attr.getName().equals(ATTR_ORIGIN)) { // 
                version.setOrigin( attr.getValue() );
            }
            if (attr.getName().equals(ATTR_LAST)) { // 
                version.setLast( Boolean.valueOf(attr.getValue() ).booleanValue());
            }
            if (attr.getName().equals(ATTR_INSTALL)) { // 
                long li = 0;
                try {
                    li = Long.parseLong( attr.getValue() );
                } catch ( NumberFormatException nfe ) {
                }
                version.setInstall_time( li );
            }
        }
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            if ( node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE ) {
                org.w3c.dom.Element nodeElement = (org.w3c.dom.Element)node;
                if (nodeElement.getTagName().equals(ELEMENT_FILE)) {
                    scanElement_file(nodeElement, version);
                }
            }
        }
        module.addOldVersion( version );
    }
    
    /** Scan through org.w3c.dom.Element named file. */
    void scanElement_file(org.w3c.dom.Element element, Version version) { // 
        ModuleFile file = new ModuleFile();        
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr)attrs.item(i);
            if (attr.getName().equals(ATTR_FILE_NAME)) { // 
                file.setName( attr.getValue() );
            }
            if (attr.getName().equals(ATTR_CRC)) { // 
                file.setCrc( attr.getValue() );
            }
            if (attr.getName().equals(ATTR_VERSION)) {
                file.setLocaleversion( attr.getValue() );
            }
        }
        version.addFile (file );
    }
    
    Module readModuleTracking( boolean fromuser, String codename, boolean create ) {
        new File(directory, TRACKING_FILE_NAME).mkdirs();
        File file = new File (
            new File(directory, TRACKING_FILE_NAME), 
            getTrackingName( codename ) + XML_EXT 
        );
        
        // fix for #34355
        try {
            if ( file.exists() && file.length()==0 )
                file.delete();
        } catch (Exception e) {
            // ignore
        }
        
        if ( ! file.exists() ) {
            if ( create )
                return new Module( codename, file, fromuser );
            else
                return null;
        }

        return readModuleFromFile( file, codename, fromuser, create );
    }
    
    Version createVersion(String specversion) {
        Version ver = new Version();
        ver.setVersion( specversion );
        return ver;
    }
    
    private Module readModuleFromFile( File file, String codename, boolean fromuser, boolean create ) {
        
        /** org.w3c.dom.Document document */
        org.w3c.dom.Document document;
        InputStream is;
        try {
            is = new FileInputStream( file );

            InputSource xmlInputSource = new InputSource( is );
            document = XMLUtil.parse( xmlInputSource, false, false, new ErrorCatcher(), XMLUtil.createAUResolver() );
            if (is != null)
                is.close();
        } catch ( org.xml.sax.SAXException e ) {
            System.out.println("Bad update_tracking" ); // NOI18N
            e.printStackTrace ();
            return null;
        }
        catch ( java.io.IOException e ) {
            if ( create )
                return new Module( codename, file, fromuser );
            else
                return null;
        }

        org.w3c.dom.Element element = document.getDocumentElement();
        if ((element != null) && element.getTagName().equals(ELEMENT_MODULE)) {
            
            Module m = scanElement_module(element, fromuser);
            m.setFile( file );
            installedModules.put (file, m);
            return m;
        }
        if ( create )
            return new Module( codename, file, fromuser );
        else
            return null;
    }
    
    private static String getTrackingName(String codename) {
        String trackingName = codename;
        int pos = trackingName.indexOf('/');    // NOI18N
        if ( pos > -1 )
            trackingName = trackingName.substring( 0, pos );
        return trackingName.replace( '.', '-' );       // NOI18N
    }
    
    public static void convertOldFormat(File oldfile, String path, boolean fromUserDir) {
        new File( path + FILE_SEPARATOR + TRACKING_FILE_NAME ).mkdirs();
        UpdateTracking track = getTracking( fromUserDir );
        Iterator it = track.installedModules.values ().iterator();
        while ( it.hasNext() ) {
            Module mod = (Module)it.next();
            File newfile = new File( path + FILE_SEPARATOR + TRACKING_FILE_NAME + FILE_SEPARATOR
                    + getTrackingName( mod.getCodenamebase() ) + XML_EXT );
            mod.setFile( newfile );
            mod.write();
        }
        oldfile.delete();
    }

    public String getL10NSpecificationVersion(String codenamebase, boolean fromUserDir, String jarpath) {
        Module module = readModuleTracking( fromUserDir, codenamebase, false );
        if ( module == null )
            return null;
        
        return module.getL10NSpecificationVersion( jarpath );
    }
    
    void deleteUnusedFiles() {
        List newModules = new ArrayList (installedModules.values ());
        Iterator it = newModules.iterator();
        while ( it.hasNext() ) {
            Module mod = (Module)it.next();
            mod.deleteUnusedFiles();
        }
        scanDir ();
    }
    
    public static long getFileCRC(File file) throws IOException {
        BufferedInputStream bsrc = null;
        CRC32 crc = new CRC32();
        try {
            bsrc = new BufferedInputStream( new FileInputStream( file ) );
            byte[] bytes = new byte[1024];
            int i;
            while( (i = bsrc.read()) != -1 ) {
                crc.update( (byte)i );
            }
        }
        finally {
            if ( bsrc != null )
                bsrc.close();
        }
        return crc.getValue();
    }
    
    private void scanDir () {
        File dir = new File (directory, TRACKING_FILE_NAME);
        File[] files = dir.listFiles( new FileFilter() {
                               public boolean accept( File file ) {
                                   if ( !file.isDirectory() && file.getName().toUpperCase().endsWith(".XML") ) // NOI18N
                                       return true;
                                   else
                                       return false;
                               }
                           } );
                           
        if (files == null) {
            return;
        }
                           
        for ( int i = 0; i < files.length; i++ ) {
            if (!installedModules.containsKey (files[i])) {
                readModuleFromFile( files[i], null, fromUser, true );
            }
                
        }
    }
    
    class Module extends Object {        
        
        /** Holds value of property codenamebase. */
        private String codenamebase;
        
        /** Holds value of property versions. */
        private List versions = new ArrayList();
        
        private File file = null;
        
        private boolean fromUser = true;
        
        public Module() {
        }
        
        public Module(boolean fromUser) {
            this.fromUser = fromUser;
        }
        
        public Module(String codenamebase, File file, boolean fromUser) {
            this.codenamebase = codenamebase;
            this.file = file;
            this.fromUser = fromUser;
        }
        
        private Version lastVersion = null;
        private Version newVersion = null;
        
        /** Getter for property codenamebase.
         * @return Value of property codenamebase.
         */
        String getCodenamebase() {
            return codenamebase;
        }
        
        /** Setter for property codenamebase.
         * @param codenamebase New value of property codenamebase.
         */
        void setCodenamebase(String codenamebase) {
            this.codenamebase = codenamebase;
        }
        
        /** Getter for property versions.
         * @return Value of property versions.
         */
        List getVersions() {
            return versions;
        }
        
        /** Setter for property versions.
         * @param versions New value of property versions.
         */
        void setVersions(List versions) {
            this.versions = versions;
        }
        
        boolean isFromUser() {
            return fromUser;
        }
        
        void setFromUser(boolean fromUser) {
            this.fromUser = fromUser;
        }
        
        private Version getNewOrLastVersion() {
            if ( newVersion != null )
                return newVersion;
            else
                return lastVersion;
        }
        
        boolean hasNewVersion() {
            return newVersion != null;
        }
        
        void setFile(File file) {
            this.file = file;
        }
        
        public Version addNewVersion( String spec_version ) {
            if ( lastVersion != null )
                lastVersion.setLast ( false );
            Version version = new Version();        
            newVersion = version;
            version.setVersion( spec_version );
            version.setOrigin( origin );
            version.setLast( true );
            version.setInstall_time( System.currentTimeMillis() );
            versions.add( version );
            return version;
        }
        
        void addOldVersion( Version version ) {
            if ( version.isLast() )
                lastVersion = version;
                    
            versions.add( version );
        }
        
        void addL10NVersion( Version l_version ) {
            if ( lastVersion != null )
                lastVersion.addL10NFiles( l_version.getFiles() );
            else {
                l_version.setOrigin( origin );
                l_version.setLast( true );
                l_version.setInstall_time( System.currentTimeMillis() );
                versions.add( l_version );
            }
        }
        
        void writeConfigModuleXMLIfMissing () {
            File configDir = new File (new File (directory, "config"), "Modules"); // NOI18N
            
            String name = codenamebase;
            int indx = name.indexOf ('/');
            if (indx > 0) {
                name = name.substring (0, indx);
            }
            
            String dash = name.replace ('.', '-');
            File config = new File (configDir,  dash + ".xml");
            if (config.isFile ()) {
                // already written
                return;
            }
            
            config.getParentFile ().mkdirs ();
            
            boolean isAutoload = false;
            boolean isEager = false;
            String file = null;
            
            java.util.Iterator it = newVersion.getFiles ().iterator ();
            while (it.hasNext ()) {
                ModuleFile f = (ModuleFile)it.next ();
                
                String n = f.getName ();
                if (n.endsWith (".jar") && n.indexOf ("modules") >= 0) { // NOI18N
                    file = f.getName ();
                }
                
                String parentDir = new File (f.getName ()).getParentFile ().getName ();
                if ("autoload".equals (parentDir)) { // NOI18N
                    isAutoload = true;
                }
                if ("eager".equals (parentDir)) { // NOI18N
                    isEager = true;
                }
            }
            
            boolean isEnabled = !isAutoload && !isEager;

            String spec = newVersion.getVersion ();
            OutputStream os; 
            try {
                os = new FileOutputStream(config);
                PrintWriter pw = new PrintWriter(new java.io.OutputStreamWriter(os, "UTF-8"));
                // Please make sure formatting matches what the IDE actually spits
                // out; it could matter.
                pw.println("");
                pw.println("");
                pw.println("");
                pw.println("    " + isAutoload + "");
                pw.println("    " + isEager + "");
                if (!isAutoload && !isEager) {
                    pw.println("    " + isEnabled + "");
                }
                pw.println("    " + file + "");
                pw.println("    false");
                pw.println("    " + spec + "");
                pw.println("");
                pw.flush();
                pw.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
        }
        
        void write( ) {
            Document document = XMLUtil.createDocument(ELEMENT_MODULE);
            
            Element e_module = document.getDocumentElement();
            Element e_version = null;
            Element e_file = null;
            
            e_module.setAttribute(ATTR_CODENAMEBASE, getCodenamebase());
            Iterator it2 = getVersions().iterator();
            while ( it2.hasNext() ) {
                Version ver = (Version)it2.next();
                e_version = document.createElement(ELEMENT_VERSION);
                if ( ver.getVersion() != null )
                    e_version.setAttribute(ATTR_VERSION, ver.getVersion());
                e_version.setAttribute(ATTR_ORIGIN, ver.getOrigin());
                e_version.setAttribute(ATTR_LAST, new Boolean( ver.isLast() ).toString());
                e_version.setAttribute(ATTR_INSTALL, Long.toString(ver.getInstall_time()));                
                e_module.appendChild( e_version );
                Iterator it3 = ver.getFiles().iterator();
                while ( it3.hasNext() ) {
                    ModuleFile file = (ModuleFile)it3.next();
                    e_file = document.createElement(ELEMENT_FILE);
                    e_file.setAttribute(ATTR_FILE_NAME, file.getName());
                    e_file.setAttribute(ATTR_CRC, file.getCrc());
                    if ( file.getLocaleversion() != null )
                        e_file.setAttribute(ATTR_VERSION, file.getLocaleversion());
                    e_version.appendChild( e_file );                
                }
            }
            
            document.getDocumentElement().normalize();

            try {
                OutputStream os = new FileOutputStream( file );
                XMLUtil.write(document, os);            
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }        
        }

        void deleteUnusedFiles() {
            if ( lastVersion == null || newVersion == null )
                return;
            Iterator it = lastVersion.getFiles().iterator();
            while ( it.hasNext() ) {
                ModuleFile modFile = (ModuleFile)it.next();
                if ( ! newVersion.containsFile( modFile ) && modFile.getName().indexOf( LOCALE_DIR ) == -1 )
                    safeDelete( modFile );
            }
        }
        
        private void safeDelete(ModuleFile modFile) {
            // test file existence
            File f = new File( file.getParentFile().getParent() + FILE_SEPARATOR + modFile.getName() );
            if ( f.exists() ) {
                // test crc
                try {
                    if ( ! Long.toString( getFileCRC( f ) ).equals( modFile.getCrc() ) )
                        return;
                } catch ( IOException ioe ) {
                    return;
                }

                // test if file is referenced from other module
                scanDir();
                boolean found = false;
                Iterator it = installedModules.values ().iterator();
                while ( !found && it.hasNext() ) {
                    Module mod = (Module)it.next();
                    if ( ! mod.equals( this ) ) {
                        Version v = mod.getNewOrLastVersion();
                        if ( v != null && v.containsFile( modFile ) )
                            found = true;
                    }
                }
                if ( ! found )
                    f.delete();
            }
        }
        
        String getL10NSpecificationVersion(String jarpath) {
            String localever = null;
            Collections.sort( versions );
            Iterator it = versions.iterator();
            while ( it.hasNext() ) {
                Version ver = (Version) it.next();
                localever = ver.getLocaleVersion( jarpath );
                if ( localever != null )
                    return localever;
            }
            return null;
        }
    }
    
    public class Version extends Object implements Comparable {
        
        /** Holds value of property version. */
        private String version;
        
        /** Holds value of property origin. */
        private String origin;
        
        /** Holds value of property last. */
        private boolean last;
        
        /** Holds value of property install_time. */
        private long install_time = 0;
        
        /** Holds value of property files. */
        private List files = new ArrayList();
        
        /** Getter for property version.
         * @return Value of property version.
         */
        String getVersion() {
            return version;
        }
        
        /** Setter for property version.
         * @param version New value of property version.
         */
        void setVersion(String version) {
            this.version = version;
        }
        
        /** Getter for property origin.
         * @return Value of property origin.
         */
        String getOrigin() {
            return origin;
        }
        
        /** Setter for property origin.
         * @param origin New value of property origin.
         */
        void setOrigin(String origin) {
            this.origin = origin;
        }
        
        /** Getter for property last.
         * @return Value of property last.
         */
        boolean isLast() {
            return last;
        }
        
        /** Setter for property last.
         * @param last New value of property last.
         */
        void setLast(boolean last) {
            this.last = last;
        }
        
        /** Getter for property install_time.
         * @return Value of property install_time.
         */
        long getInstall_time() {
            return install_time;
        }
        
        /** Setter for property install_time.
         * @param install_time New value of property install_time.
         */
        void setInstall_time(long install_time) {
            this.install_time = install_time;
        }
        
        /** Getter for property files.
         * @return Value of property files.
         */
        List getFiles() {
            return files;
        }
        
        /** Setter for property files.
         * @param files New value of property files.
         */
        void addL10NFiles(List l10nfiles) {
            Iterator it = l10nfiles.iterator();
            while ( it.hasNext() ) {
                ModuleFile lf = (ModuleFile) it.next();
                String lname = lf.getName();
                for ( int i = files.size() - 1; i >=0; i-- ) {
                    ModuleFile f = (ModuleFile) files.get( i );
                    if ( f.getName().equals( lname ) )
                        files.remove( i );
                }
            }
            files.addAll( l10nfiles );
        }
        
        void addFile( ModuleFile file ) {
            files.add( file );
        }
        
        public void addFileWithCrc( String filename, String crc ) {
            ModuleFile file = new ModuleFile();
            file.setName( filename );
            file.setCrc( crc );
            files.add( file );
        }
        
        public void addL10NFileWithCrc( String filename, String crc, String specver ) {
            ModuleFile file = new ModuleFile();
            file.setName( filename );
            file.setCrc( crc );
            file.setLocaleversion( specver );
            files.add( file );
        }
        
        boolean containsFile( ModuleFile file ) {
            Iterator it = files.iterator();
            while ( it.hasNext() ) {
                ModuleFile f = (ModuleFile)it.next();
                if ( f.getName().equals( file.getName() ) )
                    return true;
            }
            return false;
        }
        
        ModuleFile findFile(String filename) {
            Iterator it = files.iterator();
            while ( it.hasNext() ) {
                ModuleFile f = (ModuleFile)it.next();
                if ( f.getName().equals( filename ) )
                    return f;
            }
            return null;
        }
        
        String getLocaleVersion(String filename) {
            String locver = null;
            ModuleFile f = findFile( filename );
            if ( f != null ) {
                locver = f.getLocaleversion();
                if ( locver == null )
                    locver = version;
            }
            return locver;
        }
        
        public int compareTo(Object obj) {
            Version oth = (Version)obj;
            if ( install_time < oth.getInstall_time() )
                return 1;
            else if ( install_time > oth.getInstall_time() )
                return -1;
            else
                return 0;
        }
    }
    
    class ModuleFile extends Object {        
        
        /** Holds value of property name. */
        private String name;
        
        /** Holds value of property crc. */
        private String crc;
        
        /** Holds value of property localeversion. */
        private String localeversion = null;
        
        /** Getter for property name.
         * @return Value of property name.
         */
        String getName() {
            return name;
        }
        
        /** Setter for property name.
         * @param name New value of property name.
         */
        void setName(String name) {
            this.name = name;
        }
        
        /** Getter for property crc.
         * @return Value of property crc.
         */
        String getCrc() {
            return crc;
        }
        
        /** Setter for property crc.
         * @param crc New value of property crc.
         */
        void setCrc(String crc) {
            this.crc = crc;
        }
        
        /** Getter for property localeversion.
         * @return Value of property localeversion.
         *
         */
        public String getLocaleversion() {
            return this.localeversion;
        }
        
        /** Setter for property localeversion.
         * @param localeversion New value of property localeversion.
         *
         */
        public void setLocaleversion(String localeversion) {
            this.localeversion = localeversion;
        }
        
    }

    class ErrorCatcher implements org.xml.sax.ErrorHandler {
        private void message (String level, org.xml.sax.SAXParseException e) {
            pError = true;
        }

        public void error (org.xml.sax.SAXParseException e) {
            // normally a validity error
            pError = true;
        }

        public void warning (org.xml.sax.SAXParseException e) {
            //parseFailed = true;
        }

        public void fatalError (org.xml.sax.SAXParseException e) {
            pError = true;
        }
    }
    
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.