/*
* 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.content;
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.content.ContentSource;
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.ServerPluginService;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType;
/**
* Used as a mock service for the content source plugin container.
*/
public class TestContentServerPluginService extends ServerPluginService implements TestContentServerPluginServiceMBean {
private TestContentProviderManager contentProviderManager;
private Map<Integer, ContentProvider> providers = new HashMap<Integer, ContentProvider>();
private TestContentProvider defaultTestContentProvider;
private File tmpdir;
/**
* Creates and initializes the content server plugin container for use with the given test case.
*
* @param testContainer cannot be <code>null</code>
*/
public TestContentServerPluginService(AbstractEJB3Test testContainer) {
super();
tmpdir = testContainer.getTempDir();
testContainer.prepareCustomServerPluginService(this);
startMasterPluginContainer();
defaultTestContentProvider = new TestContentProvider();
}
/**
* Returns a subclass of {@link ContentProviderManager} that overrides the calls to retrieve a content
* provider, instead returning mock instances as configured through calls to
* {@link #associateContentProvider(ContentSource, ContentProvider)}.
*
* @return instance of {@link ContentProviderManager} with only its provider retrieval methods overwritten
*/
public TestContentProviderManager getContentProviderManager() {
return contentProviderManager;
}
/**
* Configures the providers retrieved and used by test subclass of {@link ContentProviderManager}. When that
* class needs to retrieve a {@link ContentProvider} to do some work, it will check these associations for
* the proper source -> provider mapping.
* <p/>
* If this method is never called, in other words no specific associations are made, an instance of the default
* content source ({@link TestContentProvider}) will be used by the <code>ContentProviderManager</code>
* regardless of content source requested.
*
* @param source source that will be handed to the ContentProviderManager and used to retrieve a specific
* content source
* @param provider provider to use when the given source is requested for operations
*/
public void associateContentProvider(ContentSource source, ContentProvider provider) {
providers.put(source.getId(), provider);
}
protected MasterServerPluginContainer createMasterPluginContainer() {
MasterServerPluginContainer master = new TestMasterServerPluginContainer();
MasterServerPluginContainerConfiguration config = new MasterServerPluginContainerConfiguration(tmpdir, tmpdir,
tmpdir, null);
master.initialize(config);
return master;
}
/**
* The test master plugin container.
*/
private class TestMasterServerPluginContainer extends MasterServerPluginContainer {
protected List<AbstractTypeServerPluginContainer> createPluginContainers() {
ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1);
pcs.add(new TestContentServerPluginContainer(this));
return pcs;
}
protected ClassLoader createRootServerPluginClassLoader() {
return this.getClass().getClassLoader();
}
protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
return new HashMap<URL, ServerPluginDescriptorType>();
}
}
/**
* The test content plugin container.
*/
private class TestContentServerPluginContainer extends ContentServerPluginContainer {
public TestContentServerPluginContainer(MasterServerPluginContainer master) {
super(master);
}
protected ContentProviderManager createAdapterManager() {
contentProviderManager = new TestContentProviderManager();
return contentProviderManager;
}
protected ContentServerPluginManager createPluginManager() {
TestContentProviderPluginManager pm = new TestContentProviderPluginManager(this);
return pm;
}
}
/**
* The test plugin manager.
*/
private class TestContentProviderPluginManager extends ContentServerPluginManager {
public TestContentProviderPluginManager(ContentServerPluginContainer pc) {
super(pc);
}
}
/**
* The test adapter manager.
*/
public class TestContentProviderManager extends ContentProviderManager {
public ContentProvider getIsolatedContentProvider(int contentProviderId) throws RuntimeException {
return getContentProvider(contentProviderId);
}
protected ContentProvider getIsolatedContentSourceAdapter(ContentSource contentSource) throws RuntimeException {
return getContentProvider(contentSource.getId());
}
protected ContentProvider instantiateAdapter(ContentSource contentSource) {
return getContentProvider(contentSource.getId());
}
private ContentProvider getContentProvider(int contentSourceId) {
if (providers.size() == 0) {
return defaultTestContentProvider;
} else {
return providers.get(contentSourceId);
}
}
}
}