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.StringReader;
025: import javax.management.Attribute;
026: import javax.management.MBeanServer;
027: import javax.management.ObjectName;
028: import javax.xml.transform.Transformer;
029: import javax.xml.transform.TransformerFactory;
030: import javax.xml.transform.dom.DOMResult;
031: import javax.xml.transform.dom.DOMSource;
032: import javax.xml.transform.stream.StreamSource;
033:
034: import org.w3c.dom.Document;
035: import org.w3c.dom.Element;
036: import org.w3c.dom.NodeList;
037: import org.w3c.dom.Node;
038:
039: import org.jboss.logging.Logger;
040: import org.jboss.metadata.MetaData;
041: import org.jboss.util.StringPropertyReplacer;
042:
043: /** An implementation of the ServicesConfigDelegate that expects a delegate-config
044: element of the form:
045: <delegate-config portName="portAttrName" hostName="hostAttrName">
046: <xslt-config configName="ConfigurationElement"><![CDATA[
047: XSL document contents...
048: ]]>
049: </xslt-config>
050: <xslt-param name="p1">value1</xslt-param>
051: </delegate-config>
052: The portAttrName and hostAttrName are currently unused. Perhaps these should
053: be used as the names of the host and port parameters in the XSL script. Currently
054: the host and port bindings are passed into the XSL script as the 'host' and
055: 'port' global parameters.
056:
057: The xslt-param elements specify arbitrary XSL script parameter name/value pairs
058: that will be set on the Transformer.
059:
060: @version $Revision: 57210 $
061: @author Scott.Stark@jboss.org
062: */
063: public class XSLTConfigDelegate implements ServicesConfigDelegate {
064: private static Logger log = Logger
065: .getLogger(XSLTConfigDelegate.class);
066:
067: /** Take the given config and map it onto the service specified in the
068: config using JMX via the given server.
069: @param config, the service name and its config bindings
070: @param server, the JMX server to use to apply the config
071: */
072: public void applyConfig(ServiceConfig config, MBeanServer server)
073: throws Exception {
074: Element delegateConfig = (Element) config
075: .getServiceConfigDelegateConfig();
076: if (delegateConfig == null)
077: throw new IllegalArgumentException(
078: "ServiceConfig.ServiceConfigDelegateConfig is null");
079:
080: // Get the XSL doc
081: Element xslConfigElement = (Element) delegateConfig
082: .getElementsByTagName("xslt-config").item(0);
083: String configName = xslConfigElement.getAttribute("configName");
084: Node xslContent = xslConfigElement.getFirstChild();
085: if (configName.length() == 0)
086: throw new IllegalArgumentException(
087: "No valid configName attribute found");
088:
089: // Get the DOM config from the configName attribute
090: ObjectName serviceName = new ObjectName(config.getServiceName());
091: Element mbeanConfig = (Element) server.getAttribute(
092: serviceName, configName);
093: if (mbeanConfig == null) {
094: log.debug("No value found for config attribute: "
095: + configName);
096: return;
097: }
098:
099: // Create the XSL transformer
100: String xslText = xslContent.getNodeValue();
101: log.trace("XSL text:" + xslText);
102: StreamSource xslSource = new StreamSource(new StringReader(
103: xslText));
104: TransformerFactory factory = TransformerFactory.newInstance();
105: Transformer transformer = factory.newTransformer(xslSource);
106:
107: // Only the first binding is used as only one (host,port) pair is mapped
108: ServiceBinding[] bindings = config.getBindings();
109: if (bindings != null && bindings.length > 0) {
110: int port = bindings[0].getPort();
111: String host = bindings[0].getHostName();
112: // Set the host an port params to that binding values
113: if (host != null) {
114: transformer.setParameter("host", host);
115: log.debug("set host parameter to:" + host);
116: }
117: transformer.setParameter("port", new Integer(port));
118: log.debug("set port parameter to:" + port);
119:
120: // Check for any arbitrary attributes
121: NodeList attributes = delegateConfig
122: .getElementsByTagName("xslt-param");
123: // xslt-param are transform parameters
124: for (int a = 0; a < attributes.getLength(); a++) {
125: Element attr = (Element) attributes.item(a);
126: String name = attr.getAttribute("name");
127: if (name.length() == 0)
128: throw new IllegalArgumentException(
129: "attribute element #" + a
130: + " has no name attribute");
131: String attrExp = MetaData.getElementContent(attr);
132: String attrValue = StringPropertyReplacer
133: .replaceProperties(attrExp);
134: transformer.setParameter(name, attrValue);
135:
136: log.debug("set " + name + " parameter to:" + attrValue);
137: }
138:
139: // Transform the current config element
140: DOMSource src = new DOMSource(mbeanConfig);
141: DOMResult result = new DOMResult();
142: transformer.transform(src, result);
143: // Write the transformed config back to the mbean
144: Document newMbeanDoc = (Document) result.getNode();
145: Element newMbeanConfig = newMbeanDoc.getDocumentElement();
146: log.debug("Updating DOM attribute to: " + newMbeanConfig);
147: Attribute mbeanConfigAttr = new Attribute(configName,
148: newMbeanConfig);
149: server.setAttribute(serviceName, mbeanConfigAttr);
150: }
151: }
152:
153: }
|