/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.plugin.pc.content;
import java.util.HashMap;
import java.util.Map;
import org.rhq.core.clientapi.agent.metadata.ConfigurationMetadataParser;
import org.rhq.core.clientapi.agent.metadata.InvalidPluginDescriptorException;
import org.rhq.core.domain.content.PackageType;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.packagetype.PackageTypeDefinitionType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.packagetype.PackageTypePluginDescriptorType;
/**
*
*
* @author Lukas Krejci
*/
public class PackageTypePluginManager extends ServerPluginManager {
private Map<PackageType, ServerPluginEnvironment> pluginsByPackageTypeId;
public PackageTypePluginManager(AbstractTypeServerPluginContainer pc) {
super(pc);
pluginsByPackageTypeId = new HashMap<PackageType, ServerPluginEnvironment>();
}
@Override
protected void loadPlugin(ServerPluginEnvironment env, boolean enabled) throws Exception {
super.loadPlugin(env, enabled);
PackageTypePluginDescriptorType descriptor = (PackageTypePluginDescriptorType) env.getPluginDescriptor();
try {
//check the behavior class exists
String behaviorClassName = descriptor.getBehaviorClass();
Class<?> behaviorClass = loadPluginClass(env, behaviorClassName, false);
if (!AbstractPackageTypeBehavior.class.isAssignableFrom(behaviorClass)) {
throw new Exception("The behavior class '" + behaviorClassName + "' of the plugin '"
+ env.getPluginKey().getPluginName() + "' does not inherit from AbstractPackageTypeBehavior class.");
}
//check that all the package types defined by this plugin exist
for (PackageTypeDefinitionType def : descriptor.getPackageType()) {
PackageType pt = ensurePackageTypeExists(def);
pluginsByPackageTypeId.put(pt, env);
}
} catch (Exception e) {
// do not deploy this plugin - its stinky
try {
unloadPlugin(env.getPluginKey().getPluginName());
} catch (Exception ignore) {
}
throw e;
}
}
private PackageType ensurePackageTypeExists(PackageTypeDefinitionType def) throws InvalidPluginDescriptorException {
SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
ContentManagerLocal cm = LookupUtil.getContentManager();
PackageType packageType = cm.findPackageType(subjectManager.getOverlord(), null, def.getName());
if (packageType == null) {
//TODO support tying the package type to the resource types?
packageType = new PackageType(def.getName(), null);
packageType.setDescription(def.getDescription());
packageType.setDisplayName(def.getDisplayName());
packageType.setSupportsArchitecture(def.isSupportsArchitecture());
packageType.setCreationData(false);
packageType.setDeploymentConfigurationDefinition(ConfigurationMetadataParser.parse(def.getName(),
def.getConfiguration()));
packageType.setDiscoveryInterval(-1);
packageType.setPackageExtraPropertiesDefinition(null);
packageType = cm.persistServersidePackageType(packageType);
}
return packageType;
}
public AbstractPackageTypeBehavior<? extends ServerPluginComponent> getBehavior(int packageTypeId) throws Exception {
return getBehavior(findByPackageTypeId(packageTypeId));
}
public AbstractPackageTypeBehavior<? extends ServerPluginComponent> getBehavior(String packageTypeName)
throws Exception {
return getBehavior(findByPackageTypeName(packageTypeName));
}
private AbstractPackageTypeBehavior<? extends ServerPluginComponent> getBehavior(ServerPluginEnvironment env)
throws Exception {
if (env == null) {
return null;
}
PackageTypePluginDescriptorType descriptor = (PackageTypePluginDescriptorType) env.getPluginDescriptor();
String behaviorClassName = descriptor.getBehaviorClass();
@SuppressWarnings("unchecked")
AbstractPackageTypeBehavior<ServerPluginComponent> ret = (AbstractPackageTypeBehavior<ServerPluginComponent>) instantiatePluginClass(
env, behaviorClassName);
ret.pluginComponent = getServerPluginComponent(env.getPluginKey().getPluginName());
return ret;
}
private ServerPluginEnvironment findByPackageTypeId(int id) {
for (Map.Entry<PackageType, ServerPluginEnvironment> entry : pluginsByPackageTypeId.entrySet()) {
if (entry.getKey().getId() == id) {
return entry.getValue();
}
}
return null;
}
private ServerPluginEnvironment findByPackageTypeName(String name) {
for (Map.Entry<PackageType, ServerPluginEnvironment> entry : pluginsByPackageTypeId.entrySet()) {
if (entry.getKey().getName().equals(name)) {
return entry.getValue();
}
}
return null;
}
}