1 22 package org.jboss.system.metadata; 23 24 import java.util.ArrayList ; 25 import java.util.List ; 26 27 import javax.management.ObjectName ; 28 29 import org.jboss.dependency.spi.ControllerMode; 30 import org.jboss.dependency.spi.ControllerState; 31 import org.jboss.deployment.DeploymentException; 32 import org.jboss.logging.Logger; 33 import org.jboss.util.StringPropertyReplacer; 34 import org.w3c.dom.Attr ; 35 import org.w3c.dom.Element ; 36 import org.w3c.dom.Node ; 37 import org.w3c.dom.NodeList ; 38 import org.w3c.dom.Text ; 39 40 53 public class ServiceMetaDataParser 54 { 55 56 private static final Logger log = Logger.getLogger(ServiceMetaDataParser.class); 57 58 59 private Element config; 60 61 62 private ControllerMode serverMode; 63 64 69 public ServiceMetaDataParser(Element config) 70 { 71 if (config == null) 72 throw new IllegalArgumentException ("Null config"); 73 74 this.config = config; 75 } 76 77 83 public List <ServiceMetaData> parse() throws DeploymentException 84 { 85 List <ServiceMetaData> services = new ArrayList <ServiceMetaData>(); 86 87 try 88 { 89 String tagName = config.getTagName(); 90 if ("mbean".equals(tagName)) 91 internalParse(services, config, true); 92 else 93 { 94 if ("server".equals(tagName)) 95 parseServer(config); 96 97 NodeList nl = config.getChildNodes(); 98 99 for (int i = 0; i < nl.getLength(); ++i) 100 { 101 if (nl.item(i).getNodeType() == Node.ELEMENT_NODE) 102 { 103 Element element = (Element ) nl.item(i); 104 if ("mbean".equals(element.getTagName())) 105 { 106 Element mbean = (Element ) nl.item(i); 107 internalParse(services, mbean, true); 108 } 109 } 110 } 111 } 112 } 113 catch (Throwable t) 114 { 115 DeploymentException.rethrowAsDeploymentException("Unable to parse service configuration", t); 116 } 117 118 return services; 119 } 120 121 127 private void parseServer(Element serverElement) throws Exception 128 { 129 String modeString = serverElement.getAttribute("mode"); 130 if (modeString != null) 131 { 132 modeString = modeString.trim(); 133 if (modeString.length() != 0) 134 serverMode = new ControllerMode(modeString); 135 } 136 } 137 138 147 private ObjectName internalParse(List <ServiceMetaData> services, Element mbeanElement, boolean replace) throws Exception 148 { 149 ServiceMetaData service = new ServiceMetaData(); 150 151 ObjectName mbeanName = parseObjectName(mbeanElement, replace); 152 service.setObjectName(mbeanName); 153 154 String code = parseCode(mbeanName, mbeanElement); 155 service.setCode(code); 156 157 ControllerMode mode = parseMode(mbeanName, mbeanElement); 158 if (mode == null) 159 mode = serverMode; 160 service.setMode(mode); 161 162 ServiceConstructorMetaData constructor = parseConstructor(mbeanName, mbeanElement, replace); 163 service.setConstructor(constructor); 164 165 String interfaceName = parseInterface(mbeanName, mbeanElement); 166 service.setInterfaceName(interfaceName); 167 168 String xmbeandd = parseXMBeanDD(mbeanName, mbeanElement); 169 service.setXMBeanDD(xmbeandd); 170 171 String xmbeanCode = parseXMBeanCode(mbeanName, mbeanElement); 172 service.setXMBeanCode(xmbeanCode); 173 174 if (xmbeandd != null && xmbeandd.length() == 0) 175 { 176 Element xmbeanDescriptor = parseXMBeanDescriptor(mbeanName, mbeanElement); 177 service.setXMBeanDescriptor(xmbeanDescriptor); 178 } 179 180 List <ServiceAttributeMetaData> attributes = new ArrayList <ServiceAttributeMetaData>(); 181 List <ServiceDependencyMetaData> dependencies = new ArrayList <ServiceDependencyMetaData>(); 182 183 NodeList attrs = mbeanElement.getChildNodes(); 184 for (int j = 0; j < attrs.getLength(); j++) 185 { 186 if (attrs.item(j).getNodeType() != Node.ELEMENT_NODE) 188 continue; 189 190 Element element = (Element ) attrs.item(j); 191 192 boolean replaceAttribute = true; 193 194 if (element.getTagName().equals("attribute")) 196 { 197 String attributeName = element.getAttribute("name"); 198 if (attributeName == null) 199 throw new DeploymentException("No attribute name for " + mbeanName); 200 boolean trim = true; 201 String replaceAttr = element.getAttribute("replace"); 202 if (replaceAttr.length() > 0) 203 replaceAttribute = Boolean.valueOf(replaceAttr).booleanValue(); 204 String trimAttr = element.getAttribute("trim"); 205 if (trimAttr.length() > 0) 206 trim = Boolean.valueOf(trimAttr).booleanValue(); 207 String serialDataType = element.getAttribute("serialDataType"); 208 209 if (element.hasChildNodes()) 210 { 211 ServiceValueMetaData value = null; 213 if (serialDataType.equals("javaBean")) 214 { 215 value = new ServiceJavaBeanValueMetaData(element); 216 } 217 else if (serialDataType.equals("jbxb")) 218 { 219 value = new ServiceJBXBValueMetaData(element); 220 } 221 else 222 { 223 NodeList nl = element.getChildNodes(); 224 for (int i = 0; i < nl.getLength(); i++) 225 { 226 Node n = nl.item(i); 227 if (n.getNodeType() == Node.ELEMENT_NODE) 228 { 229 Element el = (Element ) n; 230 String tagName = el.getTagName(); 231 if ("inject".equals(tagName)) 232 { 233 String dependency = el.getAttribute("bean"); 234 String property = null; 235 Attr attr = el.getAttributeNode("property"); 236 if (attr != null) 237 property = attr.getValue(); 238 ControllerState requiredState = ControllerState.INSTALLED; 239 attr = el.getAttributeNode("state"); 240 if (attr != null) 241 requiredState = new ControllerState(attr.getValue()); 242 value = new ServiceInjectionValueMetaData(dependency, property, requiredState); 243 } 244 else 245 { 246 value = new ServiceElementValueMetaData((Element ) n); 247 } 248 break; 249 } 250 } 251 if (value == null) 252 value = new ServiceTextValueMetaData(getElementTextContent(element, trim, replaceAttribute)); 253 } 254 255 ServiceAttributeMetaData attribute = new ServiceAttributeMetaData(); 256 attribute.setName(attributeName); 257 attribute.setReplace(replaceAttribute); 258 attribute.setTrim(trim); 259 attribute.setValue(value); 260 attributes.add(attribute); 261 } 262 } 263 else if (element.getTagName().equals("depends")) 264 { 265 String mbeanRefName = element.getAttribute("optional-attribute-name"); 266 if ("".equals(mbeanRefName)) 267 mbeanRefName = null; 268 else 269 mbeanRefName = StringPropertyReplacer.replaceProperties(mbeanRefName); 270 271 String proxyType = element.getAttribute("proxy-type"); 272 if ("".equals(proxyType)) 273 proxyType = null; 274 else 275 proxyType = StringPropertyReplacer.replaceProperties(proxyType); 276 277 String dependsObjectName = processDependency(mbeanName, mbeanRefName, element, services, replace); 279 280 if (mbeanRefName != null) 281 { 282 ServiceValueMetaData value = new ServiceDependencyValueMetaData(dependsObjectName, proxyType); 283 ServiceAttributeMetaData attribute = new ServiceAttributeMetaData(); 284 attribute.setName(mbeanRefName); 285 attribute.setValue(value); 286 attributes.add(attribute); 287 } 288 else 289 { 290 ServiceDependencyMetaData dependency = new ServiceDependencyMetaData(); 291 dependency.setIDependOn(dependsObjectName); 292 dependencies.add(dependency); 293 } 294 } 295 else if (element.getTagName().equals("depends-list")) 296 { 297 String dependsListName = element.getAttribute("optional-attribute-name"); 298 if ("".equals(dependsListName)) 299 dependsListName = null; 300 301 NodeList dependsList = element.getChildNodes(); 302 ArrayList <String > dependsListNames = new ArrayList <String >(); 303 for (int l = 0; l < dependsList.getLength(); ++l) 304 { 305 if (dependsList.item(l).getNodeType() != Node.ELEMENT_NODE) 306 continue; 307 308 Element dependsElement = (Element ) dependsList.item(l); 309 if (dependsElement.getTagName().equals("depends-list-element")) 310 { 311 String dependsObjectName = processDependency(mbeanName, dependsListName, dependsElement, services, replace); 313 if (dependsListNames.contains(dependsObjectName) == false) 314 dependsListNames.add(dependsObjectName); 315 316 if (dependsListName == null) 317 { 318 ServiceDependencyMetaData dependency = new ServiceDependencyMetaData(); 319 dependency.setIDependOn(dependsObjectName); 320 dependencies.add(dependency); 321 } 322 } 323 } 324 if (dependsListName != null) 325 { 326 ServiceValueMetaData value = new ServiceDependencyListValueMetaData(dependsListNames); 327 ServiceAttributeMetaData attribute = new ServiceAttributeMetaData(); 328 attribute.setName(dependsListName); 329 attribute.setValue(value); 330 attributes.add(attribute); 331 } 332 } 333 } 334 335 service.setAttributes(attributes); 336 service.setDependencies(dependencies); 337 338 services.add(service); 339 340 return mbeanName; 341 } 342 343 350 private ObjectName parseObjectName(final Element mbeanElement, boolean replace) throws Exception 351 { 352 String name = mbeanElement.getAttribute("name"); 353 354 if (name == null || name.trim().length() == 0) 355 throw new DeploymentException("Missing or empty 'name' attribute for mbean."); 356 357 if (replace) 358 name = StringPropertyReplacer.replaceProperties(name); 359 360 return new ObjectName (name); 361 } 362 363 371 private String parseCode(final ObjectName name, final Element mbeanElement) throws Exception 372 { 373 return mbeanElement.getAttribute("code"); 374 } 375 376 384 private ControllerMode parseMode(final ObjectName name, final Element mbeanElement) throws Exception 385 { 386 String modeString = mbeanElement.getAttribute("mode"); 387 if (modeString == null) 388 return null; 389 modeString = modeString.trim(); 390 if (modeString.length() == 0) 391 return null; 392 return new ControllerMode(modeString); 393 } 394 395 404 private ServiceConstructorMetaData parseConstructor(final ObjectName name, final Element mbeanElement, boolean replace) throws Exception 405 { 406 ServiceConstructorMetaData result = new ServiceConstructorMetaData(); 407 408 NodeList list = mbeanElement.getElementsByTagName("constructor"); 409 if (list.getLength() > 1 && list.item(0).getParentNode() == mbeanElement) 410 throw new DeploymentException("only one <constructor> element may be defined for " + name); 411 412 if (list.getLength() == 1) 413 { 414 Element element = (Element ) list.item(0); 415 416 list = element.getElementsByTagName("arg"); 418 int length = list.getLength(); 419 String [] params = new String [length]; 420 String [] signature = new String [length]; 421 422 for (int j=0; j<length; ++j) 424 { 425 Element arg = (Element )list.item(j); 426 String typeName = null; 427 Attr attr = arg.getAttributeNode("type"); 428 if (attr != null) 429 typeName = attr.getValue(); 430 String value = null; 431 attr = arg.getAttributeNode("value"); 432 if (attr != null) 433 value = attr.getValue(); 434 signature[j] = typeName; 435 params[j] = value; 436 } 437 438 result.setParams(params); 439 result.setSignature(signature); 440 } 441 442 return result; 443 } 444 445 453 private String parseInterface(final ObjectName name, final Element mbeanElement) throws Exception 454 { 455 Attr attr = mbeanElement.getAttributeNode("interface"); 456 if (attr != null) 457 return attr.getValue(); 458 else 459 return null; 460 } 461 462 470 private String parseXMBeanDD(final ObjectName name, final Element mbeanElement) throws Exception 471 { 472 Attr attr = mbeanElement.getAttributeNode("xmbean-dd"); 473 if (attr != null) 474 return attr.getValue(); 475 else 476 return null; 477 } 478 479 487 private String parseXMBeanCode(final ObjectName name, final Element mbeanElement) throws Exception 488 { 489 Attr attr = mbeanElement.getAttributeNode("xmbean-code"); 490 if (attr != null) 491 return attr.getValue(); 492 else 493 return ServiceMetaData.XMBEAN_CODE; 494 } 495 496 504 private Element parseXMBeanDescriptor(final ObjectName name, final Element mbeanElement) throws Exception 505 { 506 NodeList mbeans = mbeanElement.getElementsByTagName("xmbean"); 507 if (mbeans.getLength() == 0) 508 throw new DeploymentException("No nested mbean element given for xmbean for " + name); 509 return (Element ) mbeans.item(0); 510 } 511 512 523 private String processDependency(ObjectName mbeanName, String attributeName, Element element, List <ServiceMetaData> services, boolean replace) throws Exception 524 { 525 String dependsObjectName = null; 526 527 NodeList nl = element.getChildNodes(); 528 for (int i = 0; i < nl.getLength(); i++) 529 { 530 Node childNode = nl.item(i); 531 if (childNode.getNodeType() == Node.ELEMENT_NODE) 532 { 533 Element child = (Element ) childNode; 534 String tagName = child.getTagName(); 535 if ("mbean".equals(tagName)) 536 { 537 dependsObjectName = internalParse(services, child, replace).getCanonicalName(); 538 break; 539 } 540 else 541 { 542 if (attributeName != null) 543 log.warn("Non mbean child <" + tagName + "/> in depends tag for " + mbeanName + " attribute: " + attributeName); 544 else 545 log.warn("Non mbean child <" + tagName + "/> in depends tag for " + mbeanName); 546 } 547 } 548 } 549 550 if (dependsObjectName == null) 551 dependsObjectName = getElementTextContent(element, true, replace); 552 553 return dependsObjectName; 554 } 555 556 565 public static String getElementTextContent(Element element, boolean trim, boolean replace) throws Exception 566 { 567 NodeList nl = element.getChildNodes(); 568 String attributeText = ""; 569 for (int i = 0; i < nl.getLength(); i++) 570 { 571 Node n = nl.item(i); 572 if (n instanceof Text ) 573 { 574 attributeText += ((Text ) n).getData(); 575 } 576 } 577 if (trim) 578 attributeText = attributeText.trim(); 579 if (replace) 580 attributeText = StringPropertyReplacer.replaceProperties(attributeText); 581 return attributeText; 582 } 583 } 584 | Popular Tags |