/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.system.server.profileservice.repository; import java.io.File; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.jboss.profileservice.spi.ProfileKey; import org.jboss.profileservice.spi.metadata.ProfileMetaData; import org.jboss.profileservice.spi.metadata.ProfileSourceMetaData; import org.jboss.profileservice.spi.metadata.SubProfileMetaData; import org.jboss.system.server.profile.repository.metadata.AbstractProfileSourceMetaData; import org.jboss.system.server.profile.repository.metadata.BasicProfileMetaData; import org.jboss.system.server.profile.repository.metadata.BasicSubProfileMetaData; import org.jboss.system.server.profile.repository.metadata.EmptyProfileMetaData; import org.jboss.system.server.profile.repository.metadata.FilteredProfileMetaData; import org.jboss.system.server.profile.repository.metadata.HotDeploymentProfileSourceMetaData; import org.jboss.system.server.profile.repository.metadata.ImmutableProfileSourceMetaData; /** * A profile factory based on a static configuration. * This creates the legacy configuration: bootstrap, deployers, applications * and the root profile. * * @author <a href="mailto:emuckenh@redhat.com">Emanuel Muckenhuber</a> * @version $Revision: 105720 $ */ public class StaticProfileFactory extends AbstractBootstrapProfileFactory { /** The bindings profile name. */ private String bindingsName = "bindings"; /** The bootstrap profile name. */ private String bootstrapName = "bootstrap"; /** The deployers profile name. */ private String deployersName = "deployers"; /** The applications profile name. */ private String applicationsName = "applications"; /** The bindings uri. */ private URI bindingsURI; /** The bootstrap uri. */ private URI bootstrapURI; /** The deployers uri. */ private URI deployersURI; /** The attachment store uri. */ private File attachmentStoreRoot; /** The application uris. */ private List<URI> applicationURIs; /** Ignore non existing application URIs. */ private boolean ignoreNonExistingApplicationURIs = false; public String getBootstrapName() { return bootstrapName; } public void setBootstrapName(String bootstrapName) { this.bootstrapName = bootstrapName; } public String getDeployersName() { return deployersName; } public void setDeployersName(String deployersName) { this.deployersName = deployersName; } public String getApplicationsName() { return applicationsName; } public void setApplicationsName(String applicationsName) { this.applicationsName = applicationsName; } public URI getBindingsURI() { return bindingsURI; } public void setBindingsURI(URI bindingsURI) { this.bindingsURI = bindingsURI; } public URI getBootstrapURI() { return bootstrapURI; } public void setBootstrapURI(URI bootstrapURI) { this.bootstrapURI = bootstrapURI; } public URI getDeployersURI() { return deployersURI; } public void setDeployersURI(URI deployersURI) { this.deployersURI = deployersURI; } public File getAttachmentStoreRoot() { return attachmentStoreRoot; } public void setAttachmentStoreRoot(File attachmentStoreRoot) { this.attachmentStoreRoot = attachmentStoreRoot; } public List<URI> getApplicationURIs() { if(applicationURIs == null) return Collections.emptyList(); return applicationURIs; } public void setApplicationURIs(List<URI> applicationURIs) { this.applicationURIs = applicationURIs; } public boolean isIgnoreNonExistingApplicationURIs() { return ignoreNonExistingApplicationURIs; } public void setIgnoreNonExistingApplicationURIs(boolean ignoreNonExistingApplicationURIs) { this.ignoreNonExistingApplicationURIs = ignoreNonExistingApplicationURIs; } public void create() throws Exception { // Sanity checks if(this.bootstrapURI == null) throw new IllegalStateException("Null bootstrap uri."); if(this.deployersURI == null) throw new IllegalStateException("Null deployers uri."); if(this.applicationURIs == null) throw new IllegalStateException("Null application uris."); if(isIgnoreNonExistingApplicationURIs()) { // Sanitize application URIss List<URI> applicationUris = new ArrayList<URI>(); for(URI uri : getApplicationURIs()) { File file = new File(uri); if(file.exists()) { applicationUris.add(file.toURI()); } } this.applicationURIs = applicationUris; } } public void start() { if(applicationURIs == null || applicationURIs.isEmpty()) { throw new IllegalStateException("null or empty application URIs"); } } /** * Create the legacy profiles, based on the injected uris. * * @param rootKey the key for the root profile. * @throws Exception */ @Override protected void createProfileMetaData(ProfileKey rootKey, URL url) throws Exception { if(rootKey == null) throw new IllegalArgumentException("Null root profile key."); String[] subprofileNames = new String[0]; if (bindingsURI != null) { // Create bindings profile meta data ProfileKey bindingsKey = new ProfileKey(bindingsName); BasicProfileMetaData bindings = new FilteredProfileMetaData( null, null, bindingsName); bindings.setSource(createSource(new URI[]{ bindingsURI }, false)); addProfile(bindingsKey, bindings); subprofileNames = new String[] { bindingsName }; } // Create bootstrap profile meta data ProfileKey bootstrapKey = new ProfileKey(bootstrapName); ProfileMetaData bootstrap = createProfileMetaData(bootstrapName, false, new URI[] { bootstrapURI }, subprofileNames ); addProfile(bootstrapKey, bootstrap); subprofileNames = createSubprofileNames(subprofileNames, bootstrapName); // Create deployers profile meta data ProfileKey deployersKey = new ProfileKey(deployersName); ProfileMetaData deployers = createProfileMetaData( deployersName, false, new URI[] { deployersURI }, subprofileNames); addProfile(deployersKey, deployers); subprofileNames = createSubprofileNames(subprofileNames, deployersName); // Create applications profile meta data String[] rootSubProfiles = createApplicationProfiles(subprofileNames); // Create empty root profile; ProfileMetaData root = new EmptyProfileMetaData( null, null, rootKey.getName(), createSubProfileMetaData(rootSubProfiles)); // Add to profile map addProfile(rootKey, root); } /** * Create the application sub profiles. * * @param applicationsSubProfiles * @return the dependencies for the root profile */ protected String[] createApplicationProfiles(String[] applicationsSubProfiles) { return new String[] { createApplicationProfile(applicationsSubProfiles) }; } /** * Create the applications sub profile. * * @param applicationsSubProfiles the dependencies for the application profile * @return the application profile name */ protected String createApplicationProfile(String[] applicationsSubProfiles) { ProfileKey applicationsKey = new ProfileKey(applicationsName); URI[] applicationURIs = getApplicationURIs().toArray(new URI[getApplicationURIs().size()]); ProfileMetaData applications = createProfileMetaData( applicationsName, true, applicationURIs, applicationsSubProfiles); // Add to profile map addProfile(applicationsKey, applications); return applicationsName; } /** * Create a basic profile meta data. This profile will have it's own * DeploymentRepository and therefore exposed in the DeploymentManager * for deploy actions. * * @param name the profile name. * @param isHotDeployment if hotDeployment is enabled. * @param uris the repository uris. * @param subProfiles a list of profile dependencies. * * @return the profile meta data. */ protected ProfileMetaData createProfileMetaData(String name, boolean isHotDeployment, URI[] uris, String[] subProfiles) { // Create profile BasicProfileMetaData metaData = new BasicProfileMetaData(null, null, name); // Create profile sources metaData.setSource(createSource(uris, isHotDeployment)); // Set subProfiles metaData.setSubprofiles(createSubProfileMetaData(subProfiles)); return metaData; } protected List<SubProfileMetaData> createSubProfileMetaData(String[] subProfiles) { List<SubProfileMetaData> subProfileList = new ArrayList<SubProfileMetaData>(); if(subProfiles != null && subProfiles.length > 0) { for(String profileName : subProfiles) { subProfileList.add(new BasicSubProfileMetaData(null, null, profileName)); } } return subProfileList; } /** * Create a profile repository source meta data. * * @param uris the uris for the repository * @param isHotDeployment to create a hotDeployment profile * * @return the profile source meta data. */ protected ProfileSourceMetaData createSource(URI[] uris, boolean isHotDeployment) { AbstractProfileSourceMetaData source = null; if(isHotDeployment) { source = new HotDeploymentProfileSourceMetaData(); } else { source = new ImmutableProfileSourceMetaData(); } List<String> sources = new ArrayList<String>(); for(URI uri : uris) sources.add(uri.toString()); source.setSources(sources); return source; } /** Simple "copy array and add one more element" utility */ private static String[] createSubprofileNames(String[] existing, String toAdd) { String[] subprofileNames = new String[existing.length + 1]; System.arraycopy(existing, 0, subprofileNames, 0, existing.length); subprofileNames[subprofileNames.length - 1] = toAdd; return subprofileNames; } }