/* * Copyright 2014 JBoss Inc * * 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.overlord.dtgov.services.deploy; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; import org.apache.commons.io.FileUtils; import org.overlord.commons.services.ServiceRegistryUtil; import org.overlord.dtgov.common.DTGovConstants; import org.overlord.dtgov.common.Target; /** * Factory used to create an {@link Deployer} for a particular type of artifact. * * @author David Virgil Naranjo */ public class DeployerFactory { private static Map<String, Deployer<? extends Target>> deployers = new HashMap<String, Deployer<? extends Target>>(); static { loadDeployers(); } /** * Loads any dtgov deployers. These can be contributed via the standard Java * service loading mechanism. */ private static void loadDeployers() { // First load via the standard ServiceRegistry mechanism. Set<DeployerProvider> providers = ServiceRegistryUtil.getServices(DeployerProvider.class); for (DeployerProvider provider : providers) { Map<String, Deployer<? extends Target>> deployers_provider = provider.createDeployers(); if (deployers_provider != null && !deployers_provider.isEmpty()) { deployers.putAll(deployers_provider); } } // Allow users to provide a directory path where we will check for JARs // that // contain Deployer implementations. Collection<ClassLoader> loaders = new LinkedList<ClassLoader>(); String customDeployerDirPath = System.getProperty(DTGovConstants.DTGOV_CUSTOM_DEPLOYERS_DIR); if (customDeployerDirPath != null && customDeployerDirPath.trim().length() > 0) { File directory = new File(customDeployerDirPath); if (directory.isDirectory()) { List<URL> jarURLs = new ArrayList<URL>(); Collection<File> jarFiles = FileUtils.listFiles(directory, new String[] { "jar" }, false); //$NON-NLS-1$ for (File jarFile : jarFiles) { try { URL jarUrl = jarFile.toURI().toURL(); jarURLs.add(jarUrl); } catch (MalformedURLException e) { } } URL[] urls = jarURLs.toArray(new URL[jarURLs.size()]); ClassLoader jarCL = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); loaders.add(jarCL); } } // Now load all of these contributed DeployerProvider implementations for (ClassLoader loader : loaders) { for (DeployerProvider provider : ServiceLoader.load(DeployerProvider.class, loader)) { Map<String, Deployer<? extends Target>> deployers_provider = provider.createDeployers(); if (deployers_provider != null && !deployers_provider.isEmpty()) { deployers.putAll(deployers_provider); } } } } /** * Creates a new Deployer object. * * @param deployerType * the deployer type * @return the deployer */ public final static Deployer<? extends Target> createDeployer(String deployerType) { Deployer<? extends Target> deployer = deployers.get(deployerType); return deployer; } /** * Gets the custom deployer names. * * @return the custom deployer names */ public static List<org.overlord.dtgov.common.model.Deployer> getCustomDeployerNames() { List<org.overlord.dtgov.common.model.Deployer> customDeployers = new ArrayList<org.overlord.dtgov.common.model.Deployer>(); Target.TYPE[] targetTypes = Target.TYPE.values(); for (String deployer : deployers.keySet()) { boolean found = false; for (int i = 0; i < targetTypes.length; i++) { Target.TYPE type = targetTypes[i]; if (type.name().equals(deployer)) { found = true; break; } } if (!found) { customDeployers.add(new org.overlord.dtgov.common.model.Deployer(deployer)); } } return customDeployers; } }