|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectcom.sun.enterprise.deploy.shared.AbstractReadableArchive
com.sun.enterprise.deploy.shared.FileArchive
@Service(name="file") @Scoped(value=org.jvnet.hk2.component.PerLookup.class) public class FileArchive
This implementation of the Archive interface maps to a directory/file structure.
If the directory underlying the FileArchive is created by GlassFish then FileArchive filters its contents so only those files more recent than the creation of the archive itself are visible to consumers.
The main motivation is to hide unwanted "left-over" files from previous deployments that might linger, especially on Windows, after the previous app had been undeployed. (Deployment uses a FileArchive to extract the user's JAR-based archive into the applications directory.) Historically such left-over files arise after GlassFish expands an archive into its exploded form but then some code opens but does not close a file in that exploded directory tree.
An open left-over file can be overwritten-in-place on Windows, and
this happens when a caller invokes putNextEntry(java.lang.String)
to create a new entry (file) inside the archive. But a
left-over file that is not in the new app but is
still open by GlassFish cannot be deleted or renamed on Windows and so it will
remain in the expansion directory. Such left-over files, if not filtered out,
can confuse GlassFish and the application. By "stamping" the archive
creation date we can filter out such old, left-over files.
To support this feature, when FileArchive creates a directory it stores a marker file there, the contents of which records the creation date/time of the archive. We cannot just use the lastModified value for the top-level directory. Users might legitimately use "touch .reload" in the applications/appName directory to trigger a dynamic reload of the app. If .reload does not already exist then touch creates it, and this would update the lastModified of the directory file.
| Nested Class Summary | |
|---|---|
static interface |
FileArchive.StaleFileManager
API which FileArchive methods should use for dealing with the StaleFileManager implementation. |
| Field Summary |
|---|
| Fields inherited from class com.sun.enterprise.deploy.shared.AbstractReadableArchive |
|---|
extraData, parentArchive |
| Constructor Summary | |
|---|---|
FileArchive()
|
|
| Method Summary | |
|---|---|
void |
close()
close the abstract archive |
void |
closeEntry()
Closes the current entry |
void |
closeEntry(WritableArchive subArchive)
Close a previously returned sub archive |
void |
create(URI uri)
creates a new abstract archive with the given path |
WritableArchive |
createSubArchive(String name)
create or obtain an embedded archive within this abstraction. |
boolean |
delete()
delete the archive |
boolean |
deleteEntry(String name)
delete an entry in the archive |
Enumeration |
entries()
|
Enumeration |
entries(Enumeration embeddedArchives)
|
Enumeration<String> |
entries(String prefix)
Returns an enumeration of the module file entries with the specified prefix. |
boolean |
exists()
|
boolean |
exists(String name)
Returns the existence of the given entry name The file name must be relative to the root of the module. |
long |
getArchiveSize()
Get the size of the archive |
Collection<String> |
getDirectories()
Returns the enumeration of first level directories in this archive |
InputStream |
getEntry(String name)
|
long |
getEntrySize(String name)
Returns the entry size for a given entry name or 0 if not known |
Manifest |
getManifest()
|
String |
getName()
Returns the name portion of the archive's URI. |
ReadableArchive |
getSubArchive(String name)
create or obtain an embedded archive within this abstraction. |
URI |
getURI()
Returns the URI used to create or open the underlyong archive |
boolean |
isDirectory(String name)
|
void |
open(String uri)
|
void |
open(URI uri)
Open an abstract archive |
OutputStream |
putNextEntry(String name)
|
boolean |
renameTo(String name)
rename the archive |
boolean |
supportsElementsOverwriting()
|
| Methods inherited from class com.sun.enterprise.deploy.shared.AbstractReadableArchive |
|---|
getExtraData, getParentArchive, removeExtraData, setExtraData, setParentArchive |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public FileArchive()
| Method Detail |
|---|
public void open(URI uri)
throws IOException
open in interface ReadableArchiveuri - path to the archive
IOException
public void open(String uri)
throws IOException
uri - a string representing URI
IOExceptionopen(URI)
public long getArchiveSize()
throws NullPointerException,
SecurityException
getArchiveSize in interface ArchiveNullPointerException
SecurityException
public void create(URI uri)
throws IOException
create in interface WritableArchiveuri - path to create the archive
IOException
public void closeEntry(WritableArchive subArchive)
throws IOException
closeEntry in interface WritableArchivesubArchive - output stream to close
IOException
public void close()
throws IOException
close in interface ArchiveIOExceptionpublic boolean delete()
delete in interface ReadableArchivepublic boolean isDirectory(String name)
isDirectory in interface Archivepublic Enumeration entries()
entries in interface Archive
public Collection<String> getDirectories()
throws IOException
getDirectories in interface ArchiveIOExceptionpublic Enumeration entries(Enumeration embeddedArchives)
public Enumeration<String> entries(String prefix)
entries in interface Archiveprefix - the prefix of entries to be included
public boolean exists()
exists in interface ReadableArchive
public ReadableArchive getSubArchive(String name)
throws IOException
getSubArchive in interface ReadableArchivename - name of the embedded archive.
IOException
public WritableArchive createSubArchive(String name)
throws IOException
createSubArchive in interface WritableArchivename - name of the embedded archive.
IOException
public boolean exists(String name)
throws IOException
exists in interface ReadableArchivename - the file name relative to the root of the module.
IOException
public InputStream getEntry(String name)
throws IOException
getEntry in interface ReadableArchivename - the entry name
IOExceptionpublic long getEntrySize(String name)
getEntrySize in interface ReadableArchivename - the entry name
public Manifest getManifest()
throws IOException
getManifest in interface ArchiveIOExceptionpublic URI getURI()
getURI in interface Archivepublic boolean renameTo(String name)
renameTo in interface ReadableArchivename - the archive namepublic boolean supportsElementsOverwriting()
public boolean deleteEntry(String name)
name - the entry name
public void closeEntry()
throws IOException
closeEntry in interface WritableArchiveIOException
public OutputStream putNextEntry(String name)
throws IOException
putNextEntry in interface WritableArchivename - the entry name
IOExceptionpublic String getName()
For FileArhive the name is all of the path that follows the last slash (ignoring a slash at the end of the path).
Here are some example archive names for the specified FileArchive paths:
getName in interface Archive
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||