001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.services.binding;
023:
024: import java.io.File;
025: import java.io.FileOutputStream;
026: import java.io.StringReader;
027:
028: import javax.management.Attribute;
029: import javax.management.MBeanServer;
030: import javax.management.ObjectName;
031: import javax.xml.transform.Result;
032: import javax.xml.transform.Source;
033: import javax.xml.transform.Transformer;
034: import javax.xml.transform.TransformerFactory;
035: import javax.xml.transform.stream.StreamResult;
036: import javax.xml.transform.stream.StreamSource;
037:
038: import org.jboss.logging.Logger;
039: import org.jboss.system.server.ServerConfig;
040: import org.jboss.metadata.MetaData;
041: import org.jboss.util.StringPropertyReplacer;
042: import org.w3c.dom.Element;
043: import org.w3c.dom.NodeList;
044:
045: /**
046: * An implementation of the ServicesConfigDelegate
047: * that transforms an xml file used by a service.
048: *
049: * It retrieves the file location from the service,
050: * tranforms the file and saves it on a temporary location,
051: * which will be then applied to the service.
052: *
053: * It excpects a delegate-config element of the following form:
054: *
055: * <delegate-config>
056: * <xslt-config configName="jmx_filename_attribute"><![CDATA[
057: * XSL document contents...
058: * ]]></xslt-config>
059: * </delegate-config>
060: *
061: * The configName attribute specifies the JMX attribute,
062: * which defines the XML file to be transformed.
063: *
064: * @author wonne.keysers@realsoftware.be
065: * @author Scott.Stark@jboss.org
066: * @version $Revision: 57210 $
067: */
068: public class XSLTFileDelegate implements ServicesConfigDelegate {
069: private static Logger log = Logger
070: .getLogger(XSLTFileDelegate.class);
071:
072: /** Transform the file specified in the given config,
073: * transform it, temporarily save the result and apply it onto the service
074: * specified in the config using JMX via the given server.
075: @param config, the service name and its config bindings
076: @param server, the JMX server to use to apply the config
077: */
078: public void applyConfig(ServiceConfig config, MBeanServer server)
079: throws Exception {
080: Element delegateConfig = (Element) config
081: .getServiceConfigDelegateConfig();
082: if (delegateConfig == null) {
083: throw new IllegalArgumentException(
084: "ServiceConfig.ServiceConfigDelegateConfig is null");
085: }
086:
087: Element xslConfigElement = (Element) delegateConfig
088: .getElementsByTagName("xslt-config").item(0);
089: if (xslConfigElement == null) {
090: throw new IllegalArgumentException(
091: "No valid xslt config found");
092: }
093:
094: String configName = xslConfigElement.getAttribute("configName");
095: log.debug("configName = " + configName);
096:
097: if (configName.length() == 0) {
098: throw new IllegalArgumentException(
099: "No valid configName attribute found");
100: }
101:
102: ObjectName serviceName = new ObjectName(config.getServiceName());
103: log.debug("serviceName = " + serviceName);
104:
105: String oldValue = (String) server.getAttribute(serviceName,
106: configName);
107: log.debug("oldValue = " + oldValue);
108:
109: String tmpName = System
110: .getProperty(ServerConfig.SERVER_TEMP_DIR);
111: File tempDirectory = new File(tmpName);
112: File targetFile = File.createTempFile("server", ".xml",
113: tempDirectory);
114: targetFile.deleteOnExit();
115: log.debug("targetFile: " + targetFile.getCanonicalPath());
116:
117: ServiceBinding[] bindings = config.getBindings();
118: if (bindings == null || bindings.length == 0) {
119: throw new IllegalArgumentException(
120: "No port binding specified");
121: }
122:
123: int port = bindings[0].getPort();
124: String host = bindings[0].getHostName();
125:
126: try {
127: String xslText = xslConfigElement.getFirstChild()
128: .getNodeValue();
129: log.trace("XSL text:" + xslText);
130: Source xslSource = new StreamSource(new StringReader(
131: xslText));
132:
133: Source xmlSource = new StreamSource(getClass()
134: .getClassLoader().getResourceAsStream(oldValue));
135:
136: Result xmlResult = new StreamResult(new FileOutputStream(
137: targetFile));
138:
139: TransformerFactory factory = TransformerFactory
140: .newInstance();
141: Transformer transformer = factory.newTransformer(xslSource);
142:
143: transformer.setParameter("port", new Integer(port));
144: log.debug("set port parameter to:" + port);
145: if (host != null) {
146: transformer.setParameter("host", host);
147: log.debug("set host parameter to:" + host);
148: }
149:
150: // Check for any arbitrary attributes
151: NodeList attributes = delegateConfig
152: .getElementsByTagName("xslt-param");
153: // xslt-param are transform parameters
154: for (int a = 0; a < attributes.getLength(); a++) {
155: Element attr = (Element) attributes.item(a);
156: String name = attr.getAttribute("name");
157: if (name.length() == 0)
158: throw new IllegalArgumentException(
159: "attribute element #" + a
160: + " has no name attribute");
161: String attrExp = MetaData.getElementContent(attr);
162: String attrValue = StringPropertyReplacer
163: .replaceProperties(attrExp);
164: transformer.setParameter(name, attrValue);
165:
166: log.debug("set " + name + " parameter to:" + attrValue);
167: }
168:
169: transformer.transform(xmlSource, xmlResult);
170:
171: Attribute mbeanConfigAttr = new Attribute(configName,
172: targetFile.getCanonicalPath());
173:
174: server.setAttribute(serviceName, mbeanConfigAttr);
175: } catch (Exception ex) {
176: log.error("Error while transforming xml", ex);
177: }
178:
179: }
180:
181: }
|