/*
* RHQ Management Platform
* Copyright (C) 2005-2009 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.enterprise.server.xmlschema;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.metadata.ConfigurationMetadataParser;
import org.rhq.core.clientapi.descriptor.configuration.ConfigurationDescriptor;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.util.stream.StreamUtil;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.HelpType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginComponentType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.alert.AlertPluginDescriptorType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.bundle.BundlePluginDescriptorType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.generic.GenericPluginDescriptorType;
/**
* Tests that we can parse server-side plugin descriptors.
*
* @author John Mazzitelli
*/
@Test
public class ServerPluginDescriptorUtilTest {
@AfterMethod(alwaysRun = true)
public void afterMethod() {
deleteAllTestPluginJars();
}
public void testPluginDescriptorControls() throws Exception {
File jar = createPluginJar("test-serverplugin-controls.jar", "test-serverplugin-controls.xml");
URL url = jar.toURI().toURL();
ServerPluginDescriptorType descriptor = ServerPluginDescriptorUtil.loadPluginDescriptorFromUrl(url);
assert descriptor != null;
assert descriptor instanceof GenericPluginDescriptorType;
assert descriptor.getApiVersion() == null;
assert descriptor.getVersion() == null;
assert descriptor.getName().equals("controls-test-name");
assert descriptor.getDisplayName() == null;
assert descriptor.getDescription() == null;
assert descriptor.getPackage() == null;
assert descriptor.isDisabledOnDiscovery() == false; // the default
assert descriptor.getHelp() == null;
ServerPluginComponentType pluginComponent = descriptor.getPluginComponent();
assert pluginComponent.getClazz().equals("controls.plugin.component");
List<ScheduledJobDefinition> scheduledJobs = ServerPluginDescriptorMetadataParser.getScheduledJobs(descriptor);
assert scheduledJobs.size() == 0;
List<ControlDefinition> controls = ServerPluginDescriptorMetadataParser.getControlDefinitions(descriptor);
assert controls != null;
assert controls.size() == 4;
Iterator<ControlDefinition> iterator = controls.iterator();
ControlDefinition def;
def = iterator.next();
assert def.getName().equals("firstControl");
assert def.getDisplayName().equals("First Control");
assert def.getDescription() == null;
assert def.getParameters() == null;
assert def.getResults() == null;
def = iterator.next();
assert def.getName().equals("secondControl");
assert def.getDisplayName().equals("2nd Control");
assert def.getDescription() == null;
assert def.getParameters() != null;
assert def.getResults() == null;
assert def.getParameters().get("argument2C") instanceof PropertyDefinitionSimple;
def = iterator.next();
assert def.getName().equals("thirdControl");
assert def.getDisplayName().equals("Third Control");
assert def.getDescription().equals("third control description");
assert def.getParameters() == null;
assert def.getResults() != null;
assert def.getResults().get("result3C") instanceof PropertyDefinitionSimple;
def = iterator.next();
assert def.getName().equals("fourthControl");
assert def.getDisplayName().equals("4th Control");
assert def.getDescription().equals("fourth control description");
assert def.getParameters() != null;
assert def.getResults() != null;
assert def.getParameters().get("argument4C") instanceof PropertyDefinitionSimple;
assert def.getResults().get("result4C") instanceof PropertyDefinitionSimple;
assert !iterator.hasNext(); // just making sure we are done
}
public void testGenericPluginDescriptorInJar() throws Exception {
File jar = createPluginJar("test-serverplugin-generic.jar", "test-serverplugin-generic.xml");
URL url = jar.toURI().toURL();
ServerPluginDescriptorType descriptor = ServerPluginDescriptorUtil.loadPluginDescriptorFromUrl(url);
assert descriptor != null;
assert descriptor instanceof GenericPluginDescriptorType;
assert descriptor.getApiVersion().equals("1.2");
assert descriptor.getVersion().equals("2.3");
assert descriptor.getName().equals("generic name");
assert descriptor.getDisplayName().equals("generic display");
assert descriptor.getDescription().equals("generic description");
assert descriptor.getPackage().equals("generic.package");
assert descriptor.isDisabledOnDiscovery() == false; // the default
HelpType help = descriptor.getHelp();
assert help != null;
List<Object> content = help.getContent();
assert content != null;
String helpStr = content.get(0).toString();
assert helpStr.equals("help text with <em>XML</em>");
ServerPluginComponentType pluginComponent = descriptor.getPluginComponent();
assert pluginComponent.getClazz().equals("generic.plugin.component");
List<ControlDefinition> controls = ServerPluginDescriptorMetadataParser.getControlDefinitions(descriptor);
assert controls != null;
assert controls.isEmpty();
List<ScheduledJobDefinition> scheduledJobs = ServerPluginDescriptorMetadataParser.getScheduledJobs(descriptor);
assert scheduledJobs.size() == 3;
ScheduledJobDefinition jobItem;
jobItem = scheduledJobs.get(0);
assert jobItem.getJobId().equals("myFirstJob");
assert jobItem.getMethodName().equals("methodNameFoo");
assert !jobItem.isEnabled();
assert !jobItem.getScheduleType().isConcurrent();
assert jobItem.getScheduleType().isClustered();
assert jobItem.getScheduleType() instanceof CronScheduleType;
assert ((CronScheduleType) jobItem.getScheduleType()).getCronExpression().equals("0 15 10 ? * MON-FRI");
assert jobItem.getCallbackData().size() == 8 : jobItem.getCallbackData();
assert jobItem.getCallbackData().getProperty("custom1").equals("true");
assert jobItem.getCallbackData().getProperty("anothercustom2").equals("12345");
assert jobItem.getCallbackData().getProperty("methodName").equals("methodNameFoo"); // just proves we get the built-in data, too
jobItem = scheduledJobs.get(1);
assert jobItem.getJobId().equals("anotherMethod");
assert jobItem.getMethodName().equals("anotherMethod");
assert jobItem.isEnabled();
assert jobItem.getScheduleType().isConcurrent();
assert !jobItem.getScheduleType().isClustered();
assert jobItem.getScheduleType() instanceof PeriodicScheduleType;
assert ((PeriodicScheduleType) jobItem.getScheduleType()).getPeriod() == 59999L;
assert jobItem.getCallbackData().size() == 4 : jobItem.getCallbackData();
jobItem = scheduledJobs.get(2);
assert jobItem.getJobId().equals("allDefaultsJob");
assert jobItem.getMethodName().equals("allDefaultsJob");
assert jobItem.isEnabled();
assert !jobItem.getScheduleType().isConcurrent();
assert jobItem.getScheduleType().isClustered() : "when not specified, the default clustered value should be true";
assert jobItem.getScheduleType() instanceof PeriodicScheduleType;
assert ((PeriodicScheduleType) jobItem.getScheduleType()).getPeriod() == 600000L;
assert jobItem.getCallbackData().size() == 0 : jobItem.getCallbackData();
ConfigurationDefinition config;
config = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(descriptor);
assert config != null;
assert config.getPropertyDefinitionSimple("prop1") != null;
return;
}
public void testAlertPluginDescriptor() throws Exception {
String testXml = "test-serverplugin-alert.xml";
ServerPluginDescriptorType data = parseTestXml(testXml);
assert data instanceof AlertPluginDescriptorType;
AlertPluginDescriptorType descriptor = (AlertPluginDescriptorType) data;
assert descriptor.getApiVersion().equals("11.22");
assert descriptor.getVersion().equals("100.999");
assert descriptor.getName().equals("alert plugin name");
assert descriptor.getDisplayName().equals("alert plugin display name");
assert descriptor.getDescription().equals("alert plugin wotgorilla?");
assert descriptor.getPackage().equals("org.alert.package.name.here");
assert descriptor.isDisabledOnDiscovery() == true;
ServerPluginComponentType pluginComponent = descriptor.getPluginComponent();
assert pluginComponent.getClazz().equals("alertPluginComponent");
assert descriptor.getScheduledJobs() == null;
assert ServerPluginDescriptorMetadataParser.getScheduledJobs(descriptor).size() == 0;
ConfigurationDescriptor configDescriptor = descriptor.getPluginConfiguration();
assert configDescriptor != null;
assert configDescriptor.getConfigurationProperty().get(0).getValue().getName().equals("alertprop1");
ConfigurationDefinition config;
config = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(descriptor);
assert config != null;
assert config.getPropertyDefinitionSimple("alertprop1") != null;
}
public void testBundlePluginDescriptor() throws Exception {
String testXml = "test-serverplugin-bundle.xml";
ServerPluginDescriptorType data = parseTestXml(testXml);
assert data instanceof BundlePluginDescriptorType;
BundlePluginDescriptorType descriptor = (BundlePluginDescriptorType) data;
// check the validity of the root element
assert descriptor.getApiVersion().equals("1.2");
assert descriptor.getVersion().equals("2.3");
assert descriptor.getName().equals("bundle name");
assert descriptor.getDisplayName().equals("bundle display");
assert descriptor.getDescription().equals("bundle description");
assert descriptor.getPackage().equals("bundle.package");
assert descriptor.getPluginComponent().getClazz().equals("bundle.plugin.component");
// check the validity of the additional bundle schema elements
assert descriptor.getBundle().getType().equals("bundle.type.name");
// check the validity of the plugin config definition
ConfigurationDescriptor pluginConfigXml = descriptor.getPluginConfiguration();
assert pluginConfigXml != null : "should have parsed the plugin config";
ConfigurationDefinition configDef = ConfigurationMetadataParser.parse("test", pluginConfigXml);
assert configDef != null : "should have parsed the plugin config properties";
PropertyDefinitionSimple propDef = configDef.getPropertyDefinitionSimple("bundleprop1");
assert propDef != null : "missing a simple property definition";
}
private ServerPluginDescriptorType parseTestXml(String testXml) throws Exception {
Unmarshaller unmarshaller = ServerPluginDescriptorUtil.getServerPluginDescriptorUnmarshaller();
URL url = this.getClass().getClassLoader().getResource(testXml);
JAXBElement<?> ele = (JAXBElement<?>) unmarshaller.unmarshal(url);
assert ele != null : "Invalid server plugin descriptor: " + testXml;
Object type = ele.getValue();
assert type instanceof ServerPluginDescriptorType : (testXml + ": invalid server plugin descriptor: " + type);
return (ServerPluginDescriptorType) type;
}
private File createPluginJar(String jarName, String descriptorXmlFilename) throws Exception {
FileOutputStream stream = null;
JarOutputStream out = null;
InputStream in = null;
try {
File pluginDir = getPluginDirectory();
pluginDir.mkdirs();
File jarFile = new File(pluginDir, jarName);
stream = new FileOutputStream(jarFile);
out = new JarOutputStream(stream);
// Add archive entry for the descriptor
JarEntry jarAdd = new JarEntry("META-INF/rhq-serverplugin.xml");
jarAdd.setTime(System.currentTimeMillis());
out.putNextEntry(jarAdd);
// Write the descriptor - note that we assume the xml file is in the test classloader
in = getClass().getClassLoader().getResourceAsStream(descriptorXmlFilename);
StreamUtil.copy(in, out, false);
return jarFile;
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
if (stream != null) {
stream.close();
}
}
}
private void deleteAllTestPluginJars() {
File[] files = getPluginDirectory().listFiles();
if (files != null) {
for (File file : files) {
if (file.getName().endsWith(".jar")) {
file.delete();
}
}
}
return;
}
private File getPluginDirectory() {
return new File(System.getProperty("java.io.tmpdir"), "xml-schemas-test");
}
}