1 23 24 package com.sun.enterprise.deployment.node; 25 26 import java.util.Map ; 27 import java.util.Iterator ; 28 import org.w3c.dom.Node ; 29 import org.w3c.dom.Element ; 30 import org.xml.sax.Attributes ; 31 import com.sun.enterprise.deployment.Descriptor; 32 import com.sun.enterprise.deployment.ExtensionElementDescriptor; 33 import com.sun.enterprise.deployment.DynamicAttributesDescriptor; 34 import com.sun.enterprise.deployment.xml.TagNames; 35 36 42 public class ExtensionElementNode extends DeploymentDescriptorNode { 43 44 ExtensionElementDescriptor descriptor; 45 46 47 public ExtensionElementNode() { 48 descriptor = new ExtensionElementDescriptor(); 49 } 50 51 57 protected Map getDispatchTable() { 58 return null; 59 } 60 61 68 protected void addNodeDescriptor(DeploymentDescriptorNode node) { 69 ExtensionElementDescriptor dad = (ExtensionElementDescriptor) node.getDescriptor(); 71 Iterator itr = dad.getElementNames(); 72 if (itr.hasNext()) itr.next(); 74 75 if (itr.hasNext() && !dad.hasAttributes()) { 76 descriptor.addElement(node.getXMLRootTag().getCompleteName(), dad); 77 } else { 78 descriptor.addElement(node.getXMLRootTag().getCompleteName(), dad.getElement(node.getXMLRootTag().getCompleteName())); 79 } 80 } 81 82 85 public Object getDescriptor() { 86 return descriptor; 87 } 88 89 93 public boolean handlesElement(XMLElement element) { 94 return false; 96 } 97 98 101 public XMLNode getHandlerFor(XMLElement element) { 102 ExtensionElementNode subNode = new ExtensionElementNode(); 103 subNode.setParentNode(this); 104 subNode.setXMLRootTag(new XMLElement(element.getCompleteName())); 105 return subNode; 106 } 107 108 111 public void startElement(XMLElement element, Attributes attributes) { 112 if (attributes.getLength()>0) { 113 for (int i=0;i<attributes.getLength();i++) { 114 if (attributes.getLocalName(i).equals("type")) { 115 descriptor.getAttributes().addExtraAttribute("xsi:type", attributes.getValue(i)); 117 } else { 118 descriptor.getAttributes().addExtraAttribute(attributes.getQName(i), attributes.getValue(i)); 119 } 120 } 121 } 122 } 123 124 130 public void setElementValue(XMLElement element, String value) { 131 descriptor.addElement(element.getCompleteName(), value); 132 } 133 134 140 public boolean endElement(XMLElement element) { 141 boolean allDone = element.getCompleteName().equals(getXMLRootTag().getCompleteName()) || element.getQName().equals(TagNames.EXTENSION_ELEMENT); 142 if (allDone) { 143 postParsing(); 144 ((DeploymentDescriptorNode) getParentNode()).addNodeDescriptor(this); 145 } 146 return allDone; 147 } 148 149 155 protected void writeDescriptor(Node parentNode, String tagName, ExtensionElementDescriptor descriptor) { 156 Element node = appendChildNS(parentNode, tagName, descriptor); 157 if (descriptor.hasAttributes()) { 158 Map attributes = descriptor.getAttributes().getExtraAttributes(); 159 for (Iterator itr = attributes.keySet().iterator();itr.hasNext();) { 160 String key = (String ) itr.next(); 161 String value = (String ) attributes.get(key); 162 String namespace = ""; 163 if (key.indexOf(':')!=-1) { 164 String prefix = key.substring(0, key.indexOf(':')); 165 namespace = getNamespaceFor(descriptor, parentNode, prefix); 166 } 167 node.setAttributeNS(namespace, key, value); 168 } 169 } 170 addNamespaceDeclaration(node, descriptor); 171 for (Iterator itr = descriptor.getElementNames();itr.hasNext();) { 172 String elementName = (String ) itr.next(); 173 Object value = descriptor.getElement(elementName); 174 if (value instanceof ExtensionElementDescriptor) { 175 writeDescriptor(node, elementName, (ExtensionElementDescriptor) value); 176 } else 177 if (value instanceof String ) { 178 appendTextChildNS(node, elementName, (String ) value, descriptor); 179 } 180 } 181 } 182 183 191 public Element appendChildNS(Node parent, String elementName, Descriptor descriptor) { 192 if (elementName.indexOf(':')!=-1) { 193 String prefix = elementName.substring(0, elementName.indexOf(':')); 194 elementName = elementName.substring(elementName.indexOf(':')+1); 195 196 String namespace = getNamespaceFor(descriptor, parent, prefix); 197 198 Element child = getOwnerDocument(parent).createElementNS(namespace, elementName); 199 child.setPrefix(prefix); 200 parent.appendChild(child); 201 return child; 202 } 203 return super.appendChild(parent, elementName); 204 } 205 206 210 private String getNamespaceFor(Descriptor descriptor, Node parent, String prefix) { 211 212 Map prefixMapping = descriptor.getPrefixMapping(); 213 String namespace = null; 214 if (prefixMapping!=null) { 215 namespace = (String ) prefixMapping.get(prefix); 216 } 217 if (namespace==null) { 218 Element currentNode = (Element ) parent; 219 namespace=""; 220 while (currentNode!=null && namespace.length()==0) { 221 namespace = currentNode.getAttributeNS("http://www.w3.org/2000/xmlns/", prefix); 222 if (namespace.length()==0) 223 currentNode = (Element ) currentNode.getParentNode(); 224 } 225 } 226 return namespace; 227 } 228 229 230 239 public Node appendTextChildNS(Node parent, String elementName, String text, Descriptor descriptor) { 240 241 if (text == null || text.length()==0) 242 return null; 243 244 Node child = appendChildNS(parent, elementName, descriptor); 245 child.appendChild(getOwnerDocument(child).createTextNode(text)); 246 return child; 247 } 248 249 } 250 | Popular Tags |