/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.generic;
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.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
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.generated.serverplugin.ServerPluginDescriptorType;
/**
* Used as a mock service for the generic server plugin container.
*/
public class TestGenericServerPluginService extends ServerPluginService implements TestGenericServerPluginServiceMBean {
public enum State {
INITIALIZED, STARTED, STOPPED, UNINITIALIZED
}
// public so tests can directly set these
public TestMasterServerPluginContainer master;
public TestGenericServerPluginContainer genericPC;
public MasterServerPluginContainerConfiguration masterConfig;
public TestGenericServerPluginService(File tmpdir) {
// build the config at constructor time so tests have it even before the PC is initialized
this.masterConfig = new MasterServerPluginContainerConfiguration(tmpdir, tmpdir, tmpdir, null);
}
@Override
public MasterServerPluginContainer createMasterPluginContainer() {
this.master = new TestMasterServerPluginContainer();
this.master.initialize(this.masterConfig);
return this.master;
}
@Override
public File getServerPluginsDirectory() {
return masterConfig.getPluginDirectory();
}
/**
* The test master PC
*/
class TestMasterServerPluginContainer extends MasterServerPluginContainer {
@Override
protected List<AbstractTypeServerPluginContainer> createPluginContainers() {
ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1);
genericPC = new TestGenericServerPluginContainer(this);
pcs.add(genericPC);
return pcs;
}
@Override
protected ClassLoader createRootServerPluginClassLoader() {
return this.getClass().getClassLoader();
}
@Override
protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
// 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>();
}
}
/**
* The test generic PC.
*/
class TestGenericServerPluginContainer extends GenericServerPluginContainer {
public State state = State.UNINITIALIZED;
public TestGenericServerPluginContainer(MasterServerPluginContainer master) {
super(master);
}
@Override
protected ServerPluginManager createPluginManager() {
TestGenericPluginManager pm = new TestGenericPluginManager(this);
return pm;
}
@Override
public synchronized void initialize() throws Exception {
if (state == State.UNINITIALIZED) {
state = State.INITIALIZED;
} else {
System.out.println("!!! PC LIFECYCLE WAS BAD - THIS IS A BUG !!!");
throw new IllegalStateException("not uninitialized: " + state);
}
super.initialize();
}
@Override
public synchronized void start() {
if (state == State.INITIALIZED) {
state = State.STARTED;
} else {
System.out.println("!!! PC LIFECYCLE WAS BAD - THIS IS A BUG !!!");
throw new IllegalStateException("not initialized: " + state);
}
super.start();
}
@Override
public synchronized void stop() {
if (state == State.STARTED) {
state = State.STOPPED;
} else {
System.out.println("!!! PC LIFECYCLE WAS BAD - THIS IS A BUG !!!");
throw new IllegalStateException("not started: " + state);
}
super.stop();
}
@Override
public synchronized void shutdown() {
if (state == State.STOPPED) {
state = State.UNINITIALIZED;
} else {
System.out.println("!!! PC LIFECYCLE WAS BAD - THIS IS A BUG !!!");
throw new IllegalStateException("not stopped: " + state);
}
super.shutdown();
}
}
/**
* The test plugin manager.
*/
class TestGenericPluginManager extends ServerPluginManager {
public final Map<String, ServerPluginComponent> components;
public TestGenericPluginManager(TestGenericServerPluginContainer pc) {
super(pc);
components = new HashMap<String, ServerPluginComponent>();
}
@Override
protected ServerPlugin getPlugin(ServerPluginEnvironment env) {
try {
Configuration pluginConfig = null;
Configuration scheduledJobsConfig = null;
ConfigurationDefinition configDef;
ServerPluginDescriptorType pluginDescriptor = env.getPluginDescriptor();
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(env.getPluginUrl().toURI());
ServerPlugin plugin = new ServerPlugin(0, env.getPluginKey().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);
}
}
@Override
protected ServerPluginComponent createServerPluginComponent(ServerPluginEnvironment environment)
throws Exception {
ServerPluginComponent component = super.createServerPluginComponent(environment);
components.put(environment.getPluginKey().getPluginName(), component);
return component;
}
}
}