001: /*
002: * BEGIN_HEADER - DO NOT EDIT
003: *
004: * The contents of this file are subject to the terms
005: * of the Common Development and Distribution License
006: * (the "License"). You may not use this file except
007: * in compliance with the License.
008: *
009: * You can obtain a copy of the license at
010: * https://open-esb.dev.java.net/public/CDDLv1.0.html.
011: * See the License for the specific language governing
012: * permissions and limitations under the License.
013: *
014: * When distributing Covered Code, include this CDDL
015: * HEADER in each file and include the License file at
016: * https://open-esb.dev.java.net/public/CDDLv1.0.html.
017: * If applicable add the following below this CDDL HEADER,
018: * with the fields enclosed by brackets "[]" replaced with
019: * your own identifying information: Portions Copyright
020: * [year] [name of copyright owner]
021: */
022:
023: /*
024: * @(#)XMLConfigElement.java
025: * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
026: *
027: * END_HEADER - DO NOT EDIT
028: */
029: package com.sun.jbi.binding.jms.config;
030:
031: import com.sun.jbi.StringTranslator;
032:
033: import com.sun.jbi.binding.jms.JMSBindingContext;
034:
035: import java.util.HashMap;
036: import java.util.Iterator;
037: import java.util.Map;
038:
039: import org.w3c.dom.Element;
040: import org.w3c.dom.NodeList;
041: import org.w3c.dom.Text;
042:
043: /**
044: * Represents a XML element node which contain one or more element nodes in it.
045: * All XML element nodes which only text node are represented as properties of
046: * the enclosing node. For e.g : The following XML fragment
047: * <pre><code>
048: * <elem>
049: * <child>
050: * Harry
051: * </child>
052: * <elem>
053: * </code></pre>
054: * would be represented by a ConfigElement named "elem" having a property
055: * "child" whose value is "Harry".
056: *
057: * @author Sun Microsystems Inc.
058: */
059: public class XMLConfigElement implements ConfigElement {
060: /**
061: * The xml Element for the Config Element.
062: */
063: private Element mElement;
064:
065: /**
066: * Internal data structure to store the name value pairs.
067: */
068: private Map mProperties;
069:
070: /**
071: * Internal handle to the element name.
072: */
073: private String mElementName;
074:
075: /**
076: * Internal handle to the string translator.
077: */
078: private StringTranslator mStringTranslator;
079:
080: /**
081: * Creates a new instance of XMLConfigElement.
082: *
083: * @param element element Node representing this element.
084: */
085: public XMLConfigElement(Element element) {
086: mProperties = new HashMap();
087: init(element);
088: mStringTranslator = JMSBindingContext.getInstance()
089: .getStringTranslator();
090: }
091:
092: /**
093: * Gets the config element associated with property name.
094: *
095: * @param propertyName element's property name.
096: *
097: * @return associated property value as a ConfigElement instance.
098: *
099: * @throws IllegalArgumentException - if the property does not exist.
100: */
101: public ConfigElement getElement(String propertyName) {
102: Object propertyValue = mProperties.get(propertyName);
103:
104: if (propertyValue == null) {
105: return null;
106: } else if (propertyValue instanceof ConfigElement) {
107: return (ConfigElement) propertyValue;
108: } else {
109: throw new IllegalArgumentException(mStringTranslator
110: .getString("JMS_PROPERTY_NOT_ELEMENT"));
111: }
112: }
113:
114: /**
115: * Returns the element for this config element.
116: *
117: * @return the Element for this config element.
118: */
119: public Element getElement() {
120: return mElement;
121: }
122:
123: /**
124: * Gets the element list associated with property name. This method is not
125: * currently supported.
126: *
127: * @param propertyName element's property name.
128: *
129: * @return associated ConfigElement instance list.
130: */
131: public ConfigElement[] getElementList(String propertyName) {
132: // Not currently supported. Will be supported later.
133: // a workaround exists
134: return null;
135: }
136:
137: /**
138: * Gets the configuration element name.
139: *
140: * @return the element name as a String.
141: */
142: public String getElementName() {
143: return mElementName;
144: }
145:
146: /**
147: * Get the iterator containing the element's property names.
148: *
149: * @return an property name interator.
150: */
151: public Iterator getKeys() {
152: return mProperties.keySet().iterator();
153: }
154:
155: /**
156: * Gets the associated property value.
157: *
158: * @param propertyName elements' property name.
159: *
160: * @return associated property value as a String.
161: *
162: * @throws IllegalArgumentException - if the property does not exist.
163: */
164: public String getProperty(String propertyName) {
165: Object propertyValue = mProperties.get(propertyName);
166:
167: if (propertyValue == null) {
168: return null;
169: } else if (propertyValue instanceof java.lang.String) {
170: return (String) propertyValue;
171: } else {
172: throw new IllegalArgumentException(mStringTranslator
173: .getString("JMS_PROPERTY_NOT_STRING"));
174: }
175: }
176:
177: /**
178: * Gets the associated property value list. This method is not currently
179: * supported.
180: *
181: * @param propertyName element's property name.
182: *
183: * @return associated property value list.
184: */
185: public String[] getPropertyList(String propertyName) {
186: // not currently supported. Will be supported later
187: // A workaround exists
188: return null;
189: }
190:
191: /**
192: * Initialize the configuration element.
193: *
194: * @param element element node which represents this configuration element.
195: */
196: private void init(Element element) {
197: mElement = element;
198: mElementName = element.getTagName();
199:
200: NodeList childNodes = element.getChildNodes();
201:
202: for (int i = 0; i < childNodes.getLength(); i++) {
203: Object nodeObj = childNodes.item(i);
204:
205: if (nodeObj instanceof Element) {
206: Element nodeElement = (Element) nodeObj;
207: processChildNode(nodeElement);
208: }
209: }
210: }
211:
212: /**
213: * processes the child node.
214: *
215: * @param childNode child node.
216: */
217: private void processChildNode(Element childNode) {
218: String childName = childNode.getTagName();
219: int size = childNode.getChildNodes().getLength();
220:
221: if (size == 1) {
222: Text textNode = (Text) childNode.getFirstChild();
223: mProperties.put(childName, textNode.getData());
224: } else {
225: mProperties.put(childName,
226: (new XMLConfigElement(childNode)));
227: }
228: }
229: }
|