org.jboss.shrinkwrap.api.ShrinkWrap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of shrinkwrap-api Show documentation
Show all versions of shrinkwrap-api Show documentation
Client View of the ShrinkWrap Project
/*
* JBoss, Home of Professional Open Source
* Copyright 2010, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.shrinkwrap.api;
import java.io.File;
import org.jboss.shrinkwrap.api.importer.ArchiveImportException;
import org.jboss.shrinkwrap.api.spec.WebArchive;
/**
* Main entry point into the ShrinkWrap system. Each {@link Archive} has an associated {@link Configuration} provided at
* construction by the {@link Domain} under which the archive was created. {@link ShrinkWrap} provides static access to
* the default {@link Domain} (and by extension the default {@link Configuration}), as well as a shortcut mechanism to
* create {@link Archive}s under these defaults by way of {@link ShrinkWrap#create(Class, String)}. Additionally, this
* class is the hook to create new {@link Domain}s via {@link ShrinkWrap#createDomain()},
* {@link ShrinkWrap#createDomain(ConfigurationBuilder)} or {@link ShrinkWrap#createDomain(Configuration)}.
*
* @author ALR
* @author Ken Gullaksen
* @version $Revision: $
*/
public final class ShrinkWrap {
// -------------------------------------------------------------------------------------||
// Constructor ------------------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
/**
* Internal constructor; not to be called as this class provides static utilities only
*/
private ShrinkWrap() {
throw new UnsupportedOperationException("No instances permitted");
}
// -------------------------------------------------------------------------------------||
// Functional Methods ----------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
/**
* Creates a new {@link Domain} containing a default {@link Configuration}. {@link ArchiveFactory}s created from
* this domain will have isolated configuration from archive factories created from other domains. Likewise, all
* {@link ArchiveFactory}s and {@link Archive}s created from the returned domain will share the same configuration.
*
* @return A new {@link Domain} with default configuration
*/
public static Domain createDomain() {
return createDomain(new ConfigurationBuilder());
}
/**
* Creates a new {@link Domain} containing configuration properties from the supplied {@link ConfigurationBuilder}.
* {@link ArchiveFactory}s created from this domain will have isolated configuration from archive factories created
* from other domains. Likewise, all {@link ArchiveFactory}s and {@link Archive}s created from the returned domain
* will share the same configuration.
*
* @param builder
* Builder with which we should create a {@link Configuration} for this {@link Domain}
* @return A new {@link Domain} with default configuration
* @throws IllegalArgumentException
* If the builder is not supplied
*/
public static Domain createDomain(final ConfigurationBuilder builder) throws IllegalArgumentException {
if (builder == null) {
throw new IllegalArgumentException("builder must be supplied");
}
return createDomain(builder.build());
}
/**
* Creates a new {@link Domain} containing configuration properties from the supplied {@link Configuration}.
* {@link ArchiveFactory}s created from this domain will have isolated configuration from archive factories created
* from other domains. Likewise, all {@link ArchiveFactory}s and {@link Archive}s created from the returned domain
* will share the same configuration.
*
* @param configuration
* {@link Configuration} for this {@link Domain}
* @return A new {@link Domain} with default configuration
* @throws IllegalArgumentException
* If the configuration is not supplied
*/
public static Domain createDomain(final Configuration configuration) throws IllegalArgumentException {
if (configuration == null) {
throw new IllegalArgumentException("configuration must be supplied");
}
return new Domain(configuration);
}
/**
* Returns a single domain with default configuration for use in applications with no explicit configuration or
* isolation requirements.
*
* @return default {@link Domain}
*/
public static Domain getDefaultDomain() {
return DefaultDomainWrapper.SINGLETON.getDefaultDomain();
}
/**
* Creates a new archive of the specified type. The archive will be be backed by the default {@link Configuration}.
* specific to this {@link ArchiveFactory}. Generates a random name for the archive and adds proper extension based
* on the service descriptor properties file if extension property is present (e.g.
* shrinkwrap/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.JavaArchive)
*
* Invoking this method is functionally equivalent to calling {@link ArchiveFactory#create(Class)} upon
* {@link Domain#getArchiveFactory()} upon the domain returned by {@link ShrinkWrap#getDefaultDomain()}.
*
* @param type
* The type of the archive e.g. {@link WebArchive}
* @return An {@link Assignable} archive base
* @throws IllegalArgumentException
* if type is not specified
* @throws UnknownExtensionTypeException
* If no extension mapping is found for the specified type
*/
public static T create(final Class type) throws IllegalArgumentException,
UnknownExtensionTypeException {
// Precondition checks
if (type == null) {
throw new IllegalArgumentException("Type must be specified");
}
// Delegate to the default domain's archive factory for creation
return ShrinkWrap.getDefaultDomain().getArchiveFactory().create(type);
}
/**
* Creates a new archive of the specified type. The archive will be be backed by the default {@link Configuration}.
* Invoking this method is functionally equivalent to calling {@link ArchiveFactory#create(Class, String)} upon
* {@link Domain#getArchiveFactory()} upon the domain returned by {@link ShrinkWrap#getDefaultDomain()}.
*
* @param type
* The type of the archive e.g. {@link WebArchive}
* @param archiveName
* The name of the archive
* @return An {@link Assignable} archive base
* @throws IllegalArgumentException
* either argument is not specified
*/
public static T create(final Class type, final String archiveName)
throws IllegalArgumentException {
// Precondition checks
if (type == null) {
throw new IllegalArgumentException("Type must be specified");
}
if (archiveName == null || archiveName.length() == 0) {
throw new IllegalArgumentException("ArchiveName must be specified");
}
// Delegate to the default domain's archive factory for creation
return ShrinkWrap.getDefaultDomain().getArchiveFactory().create(type, archiveName);
}
/**
* Creates a new archive of the specified type as imported from the specified {@link File}. The file is expected to
* be encoded as ZIP (ie. JAR/WAR/EAR). The name of the archive will be set to {@link File#getName()}. The archive
* will be be backed by the {@link Configuration} within the {@link ShrinkWrap#getDefaultDomain()}
*
* @param type
* The type of the archive e.g. {@link org.jboss.shrinkwrap.api.spec.WebArchive}
* @param archiveFile
* the archiveName to use
* @return An {@link Assignable} view
* @throws IllegalArgumentException
* If either argument is not supplied, if the specified {@link File} does not exist, or is not a valid
* ZIP file
* @throws org.jboss.shrinkwrap.api.importer.ArchiveImportException
* If an error occurred during the import process
*/
public static T createFromZipFile(final Class type, final File archiveFile)
throws IllegalArgumentException, ArchiveImportException {
// Delegate
return getDefaultDomain().getArchiveFactory().createFromZipFile(type, archiveFile);
}
// -------------------------------------------------------------------------------------||
// Internal Helper Members ------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
/**
* Singleton wrapper to encapsulate a default domain
*
* @author ALR
* @version $Revision: $
*/
private enum DefaultDomainWrapper {
SINGLETON;
/**
* The wrapped default domain
*/
private transient Domain domain = ShrinkWrap.createDomain();
/**
* Obtains the default domain for the system
*
* @return the default domain for the system
*/
private Domain getDefaultDomain() {
return domain;
}
}
}