/*
* JBoss, Home of Professional Open Source
* Copyright 2008, 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.
*
* 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.profileservice.management.upload;
import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import org.jboss.deployers.spi.management.deploy.DeploymentManager;
import org.jboss.deployers.spi.management.deploy.DeploymentProgress;
import org.jboss.deployers.spi.management.deploy.DeploymentTarget;
import org.jboss.deployers.spi.management.deploy.DeploymentStatus.CommandType;
import org.jboss.logging.Logger;
import org.jboss.profileservice.management.client.upload.DeploymentProgressImpl;
import org.jboss.profileservice.management.client.upload.SerializableDeploymentID;
import org.jboss.profileservice.management.client.upload.StreamingDeploymentTarget;
import org.jboss.profileservice.spi.DeploymentOption;
import org.jboss.profileservice.spi.NoSuchProfileException;
import org.jboss.profileservice.spi.ProfileKey;
import org.jboss.profileservice.spi.ProfileRepository;
import org.jboss.remoting.InvokerLocator;
/**
* The remoting base DeploymentManager implementation.
*
* @author Scott.Stark@jboss.org
* @author <a href="mailto:emuckenh@redhat.com">Emanuel Muckenhuber</a>
* @version $Revision: 91161 $
*/
public class DeploymentManagerImpl implements DeploymentManager
{
/** The logger. */
private static Logger log = Logger.getLogger(DeploymentManagerImpl.class);
/** The bundle name. */
private static final String BUNDLE_NAME = "org.jboss.profileservice.management.upload.messages"; //$NON-NLS-1$
/** The profile repository. */
private ProfileRepository profileRepository;
/** The default profile key to upload contents. */
private ProfileKey defaultKey;
/** The loaded profile key. */
private ProfileKey activeProfileKey;
/** The resource bundle. */
private ResourceBundle i18n;
/** The current locale. */
private Locale currentLocale;
/** The message formatter. */
private MessageFormat formatter = new MessageFormat("");
/** The invoker locator. */
private InvokerLocator locator;
/** The remoting subSystem. */
private String remotingSubsystem = "DeploymentManager";
public DeploymentManagerImpl()
{
currentLocale = Locale.getDefault();
formatter.setLocale(currentLocale);
i18n = ResourceBundle.getBundle(BUNDLE_NAME, currentLocale);
}
public ProfileKey getDefaultProfileKey()
{
return defaultKey;
}
public void setDefaultProfileKey(ProfileKey defaultKey)
{
this.defaultKey = defaultKey;
}
public ProfileRepository getProfileRepository()
{
return profileRepository;
}
public void setProfileRepository(ProfileRepository profileRepository)
{
this.profileRepository = profileRepository;
}
public InvokerLocator getLocator()
{
return locator;
}
public void setLocator(InvokerLocator locator)
{
this.locator = locator;
}
public String getRemotingSubsystem()
{
return remotingSubsystem;
}
public void setRemotingSubsystem(String remotingSubsystem)
{
this.remotingSubsystem = remotingSubsystem;
}
/**
* Get the available profiles with a DeploymentRepository.
*/
public Collection<ProfileKey> getProfiles()
{
return new ArrayList<ProfileKey>(this.profileRepository.getProfileKeys());
}
public DeploymentProgress distribute(String name, URL contentURL)
throws Exception
{
return distribute(name, contentURL, true);
}
public DeploymentProgress distribute(String name, URL contentURL, boolean copyContent)
{
if(name == null)
throw new IllegalArgumentException("Null name.");
if(contentURL == null)
throw new IllegalArgumentException("Null content url.");
if(getTargetProfile() == null)
{
formatter.applyPattern(i18n.getString("DeploymentManager.NoProfileLoadedException")); //$NON-NLS-1$
Object[] args = {};
String msg = formatter.format(args);
throw new IllegalStateException(msg);
}
List<DeploymentTarget> targets = getDeploymentTargets();
SerializableDeploymentID deployment = new SerializableDeploymentID(name, getTargetProfile(), contentURL.toString());
deployment.setContentURL(contentURL);
deployment.setCopyContent(copyContent);
return new DeploymentProgressImpl(targets, deployment, CommandType.DISTRIBUTE);
}
public DeploymentProgress distribute(String name, URL contentURL, DeploymentOption... options) throws Exception
{
if(name == null)
throw new IllegalArgumentException("Null name.");
if(contentURL == null)
throw new IllegalArgumentException("Null content url.");
if(options == null)
options = new DeploymentOption[0];
if(getTargetProfile() == null)
{
formatter.applyPattern(i18n.getString("DeploymentManager.NoProfileLoadedException")); //$NON-NLS-1$
Object[] args = {};
String msg = formatter.format(args);
throw new IllegalStateException(msg);
}
List<DeploymentTarget> targets = getDeploymentTargets();
SerializableDeploymentID deployment = new SerializableDeploymentID(name, getTargetProfile(), contentURL.toString());
deployment.setContentURL(contentURL);
for(DeploymentOption option : options)
deployment.addDeploymentOption(option);
return new DeploymentProgressImpl(targets, deployment, CommandType.DISTRIBUTE);
}
public String[] getRepositoryNames(String[] names) throws Exception
{
List<DeploymentTarget> targets = getDeploymentTargets();
SerializableDeploymentID deployment = new SerializableDeploymentID(names, getTargetProfile(), null);
return targets.get(0).getRepositoryNames(deployment);
}
public boolean isRedeploySupported()
{
return (getTargetProfile() != null);
}
public void loadProfile(ProfileKey key) throws NoSuchProfileException
{
// Override a DEFAULT key with the injected default
if(key.isDefaultKey() && this.defaultKey != null)
key = this.defaultKey;
// Check if we have a associated DeploymentRepository
checkProfile(key);
// Set the key
this.activeProfileKey = key;
}
public void releaseProfile()
{
this.activeProfileKey = null;
}
public DeploymentProgress redeploy(String name)
{
if(name == null)
throw new IllegalArgumentException("Null name.");
if(getTargetProfile() == null)
{
formatter.applyPattern(i18n.getString("DeploymentManager.NoProfileLoadedException")); //$NON-NLS-1$
Object[] args = {};
String msg = formatter.format(args);
throw new IllegalStateException(msg);
}
List<DeploymentTarget> targets = getDeploymentTargets();
SerializableDeploymentID deployment = new SerializableDeploymentID(name, getTargetProfile(), null);
return new DeploymentProgressImpl(targets, deployment, CommandType.REDEPLOY);
}
public DeploymentProgress prepare(String... names) throws Exception
{
return doProgress(CommandType.PREPARE, names);
}
public DeploymentProgress start(String... names)
{
if(names == null)
throw new IllegalArgumentException("Null names.");
return doProgress(CommandType.START, names);
}
public DeploymentProgress stop(String... names)
{
if(names == null)
throw new IllegalArgumentException("Null names.");
return doProgress(CommandType.STOP, names);
}
public DeploymentProgress remove(String... names)
{
if(names == null)
throw new IllegalArgumentException("Null names.");
return doProgress(CommandType.REMOVE, names);
}
protected DeploymentProgress doProgress(CommandType type, String... names)
{
if(getTargetProfile() == null)
{
formatter.applyPattern(i18n.getString("DeploymentManager.NoProfileLoadedException")); //$NON-NLS-1$
Object[] args = {};
String msg = formatter.format(args);
throw new IllegalStateException(msg);
}
if (names == null || names.length == 0)
log.warn("Null or empty names.");
List<DeploymentTarget> targets = getDeploymentTargets();
SerializableDeploymentID deployment = new SerializableDeploymentID(names, getTargetProfile(), null);
return new DeploymentProgressImpl(targets, deployment, type);
}
/**
* Check if the Profile has a associated DeploymentRepository.
* This will be needed by the DeployHandler to add the deployment content.
*
* @param key the profile key
* @throws NoSuchProfileException if the profile does not exist or is not mutable
*/
public void checkProfile(ProfileKey key) throws NoSuchProfileException
{
if(getProfiles().contains(key) == false)
{
formatter.applyPattern(i18n.getString("DeploymentManager.NoMutableProfileException")); //$NON-NLS-1$
Object[] args = { key };
String msg = formatter.format(args);
throw new NoSuchProfileException(msg);
}
}
/**
* Get the target profile to upload contents.
* If the DeploymentManager was not loaded, the
* default key is used.
*
* @return the target profile key
*/
protected ProfileKey getTargetProfile()
{
if(this.activeProfileKey == null)
return this.defaultKey;
return this.activeProfileKey;
}
/**
* TODO: should the targets include cluster info
* @param name
* @return
*/
protected List<DeploymentTarget> getDeploymentTargets()
{
String targetName = locator.getHost();
List<DeploymentTarget> targets = new ArrayList<DeploymentTarget>();
StreamingDeploymentTarget hostTarget = new StreamingDeploymentTarget(locator, targetName, remotingSubsystem);
targets.add(hostTarget);
return targets;
}
}