FileDocCategorySizeDatePackage
InputJarArchive.javaAPI DocGlassfish v2 API12867Fri May 04 22:31:36 BST 2007com.sun.enterprise.deployment.deploy.shared

InputJarArchive

public class InputJarArchive extends AbstractArchive
This implementation of the AbstractArchive deal with reading jar files either from a JarFile or from a JarInputStream
author
Jerome Dochez

(Omit source code)

Fields Summary
protected JarFile
jarFile
protected JarInputStream
jarIS
private String
archiveUri
private InputJarArchive
parentArchive
private com.sun.enterprise.util.i18n.StringManager
localStrings
Constructors Summary
Methods Summary
public java.io.OutputStreamaddEntry(java.lang.String name)

returns
an @see java.io.OutputStream for a new entry in this current abstract archive.
param
the entry name

        throw new UnsupportedOperationException("Cannot write to an JAR archive open for reading");        
    
public voidclose()
close the abstract archive

        if (jarFile!=null) {
            jarFile.close();
            jarFile=null;
        }
        if (jarIS!=null) {
            jarIS.close();
            jarIS=null;
        }
    
public voidcloseEntry(AbstractArchive os)
close a previously returned @see java.io.OutputStream returned by an addEntry call

param
the output stream to close

        throw new UnsupportedOperationException("Cannot write to an JAR archive open for reading");        
    
public voidcloseEntry()

        throw new UnsupportedOperationException("Cannot write to an JAR archive open for reading");                
    
public voidcreate(java.lang.String path)
creates a new abstract archive with the given path

param
the path to create the archive

        throw new UnsupportedOperationException("Cannot write to an JAR archive open for reading");        
    
public booleandelete()
deletes the underlying jar file

        if (jarFile==null) {
            return false;
        }
        try {
            jarFile.close();
            jarFile = null;
        } catch (IOException ioe) {
            return false;
        }
        return FileUtils.deleteFile(new File(archiveUri));
    
public java.util.Enumerationentries()

return
an @see java.util.Enumeration of entries in this abstract archive

        Vector entries = new Vector();
 
        if (parentArchive!=null) {
            try {
                // reopen the embedded archive and position the input stream
                // at the beginning of the desired element
                jarIS = new JarInputStream(parentArchive.jarFile.getInputStream(parentArchive.jarFile.getJarEntry(archiveUri)));
                JarEntry ze;
                do {
                    ze = jarIS.getNextJarEntry();
                    if (ze!=null && !ze.isDirectory()) {
                        entries.add(ze.getName());
                    }                
                } while (ze!=null);
                jarIS.close();
                jarIS = null;
            } catch(IOException ioe) {
                return null;
            }
        } else {
            try {
                if (jarFile==null) {
                    getJarFile(archiveUri);
                }
            } catch(IOException ioe) {
                return entries.elements();
            }
            if (jarFile==null) {
                return entries.elements();
            }
            for (Enumeration e = jarFile.entries();e.hasMoreElements();) {
                ZipEntry ze = (ZipEntry) e.nextElement();
                if (!ze.isDirectory() && !ze.getName().equals(JarFile.MANIFEST_NAME)) {
                    entries.add(ze.getName());
                }
            }
        }
        return entries.elements();        
    
public java.util.Enumerationentries(java.util.Enumeration embeddedArchives)

return
an @see java.util.Enumeration of entries in this abstract archive, providing the list of embedded archive to not count their entries as part of this archive

	// jar file are not recursive    
  	return entries();
    
public booleanexists()

return
true if this abstract archive maps to an existing jar file

        return jarFile!=null;
    
public longgetArchiveSize()
Get the size of the archive

return
tje the size of this archive or -1 on error

        if(getArchiveUri() == null) {
            return -1;
        }
        File tmpFile = new File(getArchiveUri());
        return(tmpFile.length());
    
public java.lang.StringgetArchiveUri()

return
the archive uri



               
       
        return archiveUri;
    
public AbstractArchivegetEmbeddedArchive(java.lang.String name)

return
an AbstractArchive for an embedded archive indentified with the name parameter

        if (jarFile!=null) {
            // for now, I only support one level down embedded archives
            InputJarArchive ija = new InputJarArchive();
            JarEntry je = jarFile.getJarEntry(name);
            if (je!=null) {
                JarInputStream jis = new JarInputStream(new BufferedInputStream(jarFile.getInputStream(je)));
                ija.archiveUri = name;
                ija.jarIS = jis;
                ija.parentArchive = this;
                return ija;
            }
        }
        return null;
    
public java.io.InputStreamgetEntry(java.lang.String entryName)

return
a @see java.io.InputStream for an existing entry in the current abstract archive
param
the entry name

        if (jarFile!=null) {
            ZipEntry ze = jarFile.getEntry(entryName);
            if (ze!=null) {
                return new BufferedInputStream(jarFile.getInputStream(ze));
            } else {
                return null;
            }            
        } else
	if ((parentArchive != null) && (parentArchive.jarFile != null)) {
            JarEntry je;
            // close the current input stream
            if (jarIS!=null) {
                jarIS.close();
            }
            
            // reopen the embedded archive and position the input stream
            // at the beginning of the desired element
	    JarEntry archiveJarEntry = (archiveUri != null)? parentArchive.jarFile.getJarEntry(archiveUri) : null;
	    if (archiveJarEntry == null) {
		return null;
	    }
            jarIS = new JarInputStream(parentArchive.jarFile.getInputStream(archiveJarEntry));
            do {
                je = jarIS.getNextJarEntry();
            } while (je!=null && !je.getName().equals(entryName));
            if (je!=null) {
                return new BufferedInputStream(jarIS);
            } else {
                return null;
            }
        } else {
	    return null;
	}
    
protected java.util.jar.JarFilegetJarFile(java.lang.String path)

return
a JarFile instance for a file path

        jarFile = null;
        try {
            File file = new File(path);
            if (file.exists()) {
                jarFile = new JarFile(file);
            }
        } catch(IOException e) {
            DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.fileOpenFailure", 
                    new Object[]{path});
            // add the additional information about the path
            // since the IOException from jdk doesn't include that info
            String additionalInfo = localStrings.getString(
                "enterprise.deployment.invalid_zip_file", path); 
            IOException ioe = new IOException(e.getLocalizedMessage() + " --  " + additionalInfo);
            ioe.initCause(e);
            throw ioe;
        }
        return jarFile;
    
public java.util.jar.ManifestgetManifest()

return
the manifest information for this abstract archive

        if (jarFile!=null) {
            return jarFile.getManifest();
        } 
        if (parentArchive!=null) {    
            // close the current input stream
            if (jarIS!=null) {
                jarIS.close();
            }
            // reopen the embedded archive and position the input stream
            // at the beginning of the desired element
            if (jarIS==null) {
                jarIS = new JarInputStream(parentArchive.jarFile.getInputStream(parentArchive.jarFile.getJarEntry(archiveUri)));
            }
            Manifest m = jarIS.getManifest();
            if (m==null) {
               java.io.InputStream is = getEntry(java.util.jar.JarFile.MANIFEST_NAME);
               if (is!=null) {
                    m = new Manifest();
                    m.read(is);
                    is.close();
               }
            }
            return m;
        }                        
        return null;
    
public java.net.URIgetURI()

        try {
            return ArchiveFactory.prepareArchiveURI(getArchiveUri());
        } catch(java.net.URISyntaxException e) {
            return  null;
        } catch (UnsupportedEncodingException uee) {
            return null;
        } catch (IOException ioe) {
            return null;
        }
    
public voidopen(java.lang.String path)
Open an abstract archive

param
the path to the archive

        archiveUri = path;
        jarFile = getJarFile(path);
    
public java.io.OutputStreamputNextEntry(java.lang.String name)

        throw new UnsupportedOperationException("Cannot write to an JAR archive open for reading");        
    
public booleanrenameTo(java.lang.String name)
rename the underlying jar file

        if (jarFile==null) {
            return false;
        }
        try {
            jarFile.close();
            jarFile = null;
        } catch (IOException ioe) {
            return false;
        }        
        return FileUtils.renameFile(new File(archiveUri), new File(name));