package org.jboss.services.binding;
import java.io.File;
import java.io.FileOutputStream;
import java.io.StringReader;
import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.jboss.logging.Logger;
import org.jboss.system.server.ServerConfig;
import org.w3c.dom.Element;
public class XSLTFileDelegate implements ServicesConfigDelegate
{
private static Logger log = Logger.getLogger(XSLTFileDelegate.class);
public void applyConfig(ServiceConfig config, MBeanServer server)
throws Exception
{
Element delegateConfig =
(Element) config.getServiceConfigDelegateConfig();
if (delegateConfig == null)
{
throw new IllegalArgumentException("ServiceConfig.ServiceConfigDelegateConfig is null");
}
Element xslConfigElement =
(Element) delegateConfig.getElementsByTagName("xslt-config").item(0);
if (xslConfigElement == null)
{
throw new IllegalArgumentException("No valid xslt config found");
}
String configName = xslConfigElement.getAttribute("configName");
log.debug("configName = " + configName);
if (configName.length() == 0)
{
throw new IllegalArgumentException("No valid configName attribute found");
}
ObjectName serviceName = new ObjectName(config.getServiceName());
log.debug("serviceName = " + serviceName);
String oldValue = (String) server.getAttribute(serviceName, configName);
log.debug("oldValue = " + oldValue);
String tmpName = System.getProperty(ServerConfig.SERVER_TEMP_DIR);
File tempDirectory = new File(tmpName);
File targetFile = File.createTempFile("server", ".xml", tempDirectory);
targetFile.deleteOnExit();
log.debug("targetFile: " + targetFile.getCanonicalPath());
ServiceBinding[] bindings = config.getBindings();
if (bindings == null || bindings.length == 0)
{
throw new IllegalArgumentException("No port binding specified");
}
int port = bindings[0].getPort();
String host = bindings[0].getHostName();
try
{
String xslText = xslConfigElement.getFirstChild().getNodeValue();
log.trace("XSL text:" + xslText);
Source xslSource = new StreamSource(new StringReader(xslText));
Source xmlSource =
new StreamSource(getClass().getClassLoader().getResourceAsStream(oldValue));
Result xmlResult =
new StreamResult(new FileOutputStream(targetFile));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(xslSource);
transformer.setParameter("port", new Integer(port));
if (host != null)
{
transformer.setParameter("host", host);
}
transformer.transform(xmlSource, xmlResult);
Attribute mbeanConfigAttr =
new Attribute(configName, targetFile.getCanonicalPath());
server.setAttribute(serviceName, mbeanConfigAttr);
}
catch (Exception ex)
{
log.error("Error while transforming xml", ex);
}
}
}