An archive type is an abstraction of the archive file format. An archive type can be implemented as a plain JAR file, as a directory layout, or a custom type. By default, GlassFish Server recognizes JAR based and directory based archive types. A new container might require a new archive type.
There are two sub-interfaces of the org.glassfish.api.deployment.archive.Archive interface, org.glassfish.api.deployment.archive.ReadableArchive and org.glassfish.api.deployment.archive.WritableArchive. Typically developers of new archive types will provide separate implementations of ReadableArchive and WritableArchive, or a single implementation that implements both ReadableArchive and WritableArchive.
Implementations of the ReadableArchive interface provide read access to an archive type. ReadableArchive defines the following methods:
Returns a java.io.InputStream for the specified entry name, or null if the entry doesn't exist.
Returns a boolean value indicating whether the specified entry name exists.
Returns the size of the specified entry as a long value.
Returns an archive for the given java.net.URI.
Returns an instance of ReadableArchive for the specified sub-archive contained within the parent archive, or null if no such archive exists.
Returns a boolean value indicating whether this archive exists.
Deletes the archive, and returns a boolean value indicating whether the archive has been successfully deleted.
Renames the archive to the specified name, and returns a boolean value indicating whether the archive has been successfully renamed.
Implementations of the WritableArchive interface provide write access to the archive type. WritableArchive defines the following methods:
Creates a new archive with the given path, specified as a java.net.URI.
Closes the specified sub-archive contained within the parent archive.
Closes the current entry.
Creates a new sub-archive in the parent archive with the specified name, and returns it as a WritableArchive instance.
Creates a new entry in the archive with the specified name, and returns it as a java.io.OutputStream.
An archive handler is responsible for handling the particular layout of an archive. Java EE defines a set of archives (WAR, JAR, and RAR, for example), and each of these archives has an ArchiveHandler instance associated with the archive type.
Each layout should have one handler associated with it. There is no extension point support at this level; the archive handler's responsibility is to give access to the classes and resources packaged in the archive, and it should not contain any container-specific code. The java.lang.ClassLoader returned by the handler is used by all the containers in which the application will be deployed.
ArchiveHandler defines the following methods:
Returns the name of the archive type as a String. Typically, this is the archive extension, such as jar or war.
Returns the default name of the specified archive as a String. Typically this default name is the name part of the URI location of the archive.
Returns a boolean value indicating whether this implementation of ArchiveHandler can work with the specified archive.
Returns a java.lang.ClassLoader capable of loading all classes from the archive passed in by the DeploymentContext instance. Typically the ClassLoader will load classes in the scratch directory area, returned by DeploymentContext.getScratchDir(), as stubs and other artifacts are generated in the scratch directory.
Prepares the ReadableArchivesource archive for loading into the container in a format the container accepts. Such preparation could be to expand a compressed archive, or possibly nothing at all if the source archive format is already in a state that the container can handle. This method returns the archive as an instance of WritableArchive.