/*
* RHQ Management Platform
* Copyright (C) 2005-2012 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;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.plugin.PluginKey;
import org.rhq.core.domain.plugin.PluginStatusType;
import org.rhq.core.domain.plugin.ServerPlugin;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration;
import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
import org.rhq.enterprise.server.plugin.pc.ServerPluginService;
import org.rhq.enterprise.server.plugin.pc.ServerPluginType;
import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser;
import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorUtil;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType;
/**
*
*
* @author Lukas Krejci
*/
public abstract class TestServerPluginService extends ServerPluginService implements TestServerPluginServiceMBean {
public TestMasterServerPluginContainer master;
public MasterServerPluginContainerConfiguration masterConfig;
protected TestServerPluginService(File tmpdir) {
this.masterConfig = new MasterServerPluginContainerConfiguration(tmpdir, tmpdir, tmpdir, null);
}
@Override
public MasterServerPluginContainer createMasterPluginContainer() {
this.master = new TestMasterServerPluginContainer();
this.master.initialize(this.masterConfig);
return this.master;
}
protected abstract List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master);
public static ServerPlugin getPlugin(ServerPluginEnvironment env) {
return getPlugin(env.getPluginUrl(), env.getPluginDescriptor());
}
public static ServerPlugin getPlugin(URL pluginUrl, ServerPluginDescriptorType pluginDescriptor) {
try {
Configuration pluginConfig = null;
Configuration scheduledJobsConfig = null;
ConfigurationDefinition configDef;
configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor);
if (configDef != null) {
pluginConfig = configDef.getDefaultTemplate().createConfiguration();
}
configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor);
if (configDef != null) {
scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration();
}
File pluginFile = new File(pluginUrl.toURI());
PluginKey pluginKey = PluginKey.createServerPluginKey(new ServerPluginType(pluginDescriptor).stringify(), pluginDescriptor.getName());
ServerPlugin plugin =
new ServerPlugin(0, pluginKey.getPluginName(), pluginFile.getName(),
pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED,
pluginDescriptor.getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile),
pluginDescriptor.getVersion(), pluginDescriptor.getVersion(), pluginConfig,
scheduledJobsConfig, new ServerPluginType(pluginDescriptor).stringify(),
System.currentTimeMillis(), System.currentTimeMillis());
return plugin;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static ServerPlugin getPlugin(URL pluginUrl) throws Exception {
ServerPluginDescriptorType type = ServerPluginDescriptorUtil.loadPluginDescriptorFromUrl(pluginUrl);
return getPlugin(pluginUrl, type);
}
protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
return null;
}
private class TestMasterServerPluginContainer extends MasterServerPluginContainer {
@Override
protected ClassLoader createRootServerPluginClassLoader() {
return getClass().getClassLoader();
}
@Override
protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
Map<URL, ? extends ServerPluginDescriptorType> plugins = TestServerPluginService.this.preloadAllPlugins();
if (plugins != null) {
return plugins;
}
// if our test never setup any plugins, ignore it and just return an empty map
File pluginDir = getConfiguration().getPluginDirectory();
if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) {
return new HashMap<URL, ServerPluginDescriptorType>();
} else {
return super.preloadAllPlugins();
}
}
@Override
protected List<PluginKey> getDisabledPluginKeys() {
// in the real world, the db is checked for enable flag, here we say all plugins are enabled
return new ArrayList<PluginKey>();
}
@Override
protected List<AbstractTypeServerPluginContainer> createPluginContainers() {
return TestServerPluginService.this.createPluginContainers(this);
}
}
}