1 16 package org.apache.axis.deployment.wsdd; 17 18 import org.apache.axis.AxisEngine; 19 import org.apache.axis.AxisFault; 20 import org.apache.axis.ConfigurationException; 21 import org.apache.axis.Constants; 22 import org.apache.axis.EngineConfiguration; 23 import org.apache.axis.FaultableHandler; 24 import org.apache.axis.Handler; 25 import org.apache.axis.MessageContext; 26 import org.apache.axis.attachments.Attachments; 27 import org.apache.axis.attachments.AttachmentsImpl; 28 import org.apache.axis.constants.Style; 29 import org.apache.axis.constants.Use; 30 import org.apache.axis.description.JavaServiceDesc; 31 import org.apache.axis.description.ServiceDesc; 32 import org.apache.axis.encoding.DeserializerFactory; 33 import org.apache.axis.encoding.SerializationContext; 34 import org.apache.axis.encoding.SerializerFactory; 35 import org.apache.axis.encoding.TypeMapping; 36 import org.apache.axis.encoding.TypeMappingRegistry; 37 import org.apache.axis.encoding.TypeMappingRegistryImpl; 38 import org.apache.axis.encoding.ser.ArraySerializerFactory; 39 import org.apache.axis.encoding.ser.BaseDeserializerFactory; 40 import org.apache.axis.encoding.ser.BaseSerializerFactory; 41 import org.apache.axis.handlers.HandlerInfoChainFactory; 42 import org.apache.axis.handlers.soap.SOAPService; 43 import org.apache.axis.providers.java.JavaProvider; 44 import org.apache.axis.utils.Messages; 45 import org.apache.axis.utils.XMLUtils; 46 import org.w3c.dom.Element ; 47 import org.xml.sax.helpers.AttributesImpl ; 48 49 import javax.xml.namespace.QName ; 50 import java.io.IOException ; 51 import java.util.ArrayList ; 52 import java.util.List ; 53 import java.util.StringTokenizer ; 54 import java.util.Vector ; 55 56 61 public class WSDDService 62 extends WSDDTargetedChain 63 implements WSDDTypeMappingContainer 64 { 65 private TypeMappingRegistry tmr = null; 66 67 private Vector faultFlows = new Vector (); 68 private Vector typeMappings = new Vector (); 69 private Vector operations = new Vector (); 70 71 72 private Vector namespaces = new Vector (); 73 74 75 private List roles = new ArrayList (); 76 77 private String descriptionURL; 78 79 80 private Style style = Style.DEFAULT; 81 82 private Use use = Use.DEFAULT; 83 84 private transient SOAPService cachedService = null; 85 86 90 private QName providerQName; 91 92 private WSDDJAXRPCHandlerInfoChain _wsddHIchain; 94 95 JavaServiceDesc desc = new JavaServiceDesc(); 96 97 101 private boolean streaming = false; 102 103 106 private int sendType = Attachments.SEND_TYPE_NOTSET; 107 108 111 public WSDDService() 112 { 113 } 114 115 120 public WSDDService(Element e) 121 throws WSDDException 122 { 123 super(e); 124 125 desc.setName(getQName().getLocalPart()); 126 127 String styleStr = e.getAttribute(ATTR_STYLE); 128 if (styleStr != null && !styleStr.equals("")) { 129 style = Style.getStyle(styleStr, Style.DEFAULT); 130 desc.setStyle(style); 131 providerQName = style.getProvider(); 132 } 133 134 String useStr = e.getAttribute(ATTR_USE); 135 if (useStr != null && !useStr.equals("")) { 136 use = Use.getUse(useStr, Use.DEFAULT); 137 desc.setUse(use); 138 } else { 139 if (style != Style.RPC) { 140 use = Use.LITERAL; 142 desc.setUse(use); 143 } 144 } 145 146 String streamStr = e.getAttribute(ATTR_STREAMING); 147 if (streamStr != null && streamStr.equals("on")) { 148 streaming = true; 149 } 150 151 String attachmentStr = e.getAttribute(ATTR_ATTACHMENT_FORMAT); 152 if (attachmentStr != null && !attachmentStr.equals("")) { 153 sendType = AttachmentsImpl.getSendType(attachmentStr); 154 } 155 156 Element [] operationElements = getChildElements(e, ELEM_WSDD_OPERATION); 157 for (int i = 0; i < operationElements.length; i++) { 158 WSDDOperation operation = new WSDDOperation(operationElements[i], 159 desc); 160 addOperation(operation); 161 } 162 163 Element [] typeMappingElements = getChildElements(e, ELEM_WSDD_TYPEMAPPING); 164 for (int i = 0; i < typeMappingElements.length; i++) { 165 WSDDTypeMapping mapping = 166 new WSDDTypeMapping(typeMappingElements[i]); 167 typeMappings.add(mapping); 168 } 169 170 Element [] beanMappingElements = getChildElements(e, ELEM_WSDD_BEANMAPPING); 171 for (int i = 0; i < beanMappingElements.length; i++) { 172 WSDDBeanMapping mapping = 173 new WSDDBeanMapping(beanMappingElements[i]); 174 typeMappings.add(mapping); 175 } 176 177 Element [] arrayMappingElements = getChildElements(e, ELEM_WSDD_ARRAYMAPPING); 178 for (int i = 0; i < arrayMappingElements.length; i++) { 179 WSDDArrayMapping mapping = 180 new WSDDArrayMapping(arrayMappingElements[i]); 181 typeMappings.add(mapping); 182 } 183 184 Element [] namespaceElements = getChildElements(e, ELEM_WSDD_NAMESPACE); 185 for (int i = 0; i < namespaceElements.length; i++) { 186 String ns = XMLUtils.getChildCharacterData(namespaceElements[i]); 188 namespaces.add(ns); 189 } 190 if (!namespaces.isEmpty()) 191 desc.setNamespaceMappings(namespaces); 192 193 Element [] roleElements = getChildElements(e, ELEM_WSDD_ROLE); 194 for (int i = 0; i < roleElements.length; i++) { 195 String role = XMLUtils.getChildCharacterData(roleElements[i]); 196 roles.add(role); 197 } 198 199 Element wsdlElem = getChildElement(e, ELEM_WSDD_WSDLFILE); 200 if (wsdlElem != null) { 201 String fileName = XMLUtils.getChildCharacterData(wsdlElem); 202 desc.setWSDLFile(fileName.trim()); 203 } 204 205 Element docElem = getChildElement(e, ELEM_WSDD_DOC); 206 if (docElem != null) { 207 WSDDDocumentation documentation = new WSDDDocumentation(docElem); 208 desc.setDocumentation(documentation.getValue()); 209 } 210 211 Element urlElem = getChildElement(e, ELEM_WSDD_ENDPOINTURL); 212 if (urlElem != null) { 213 String endpointURL = XMLUtils.getChildCharacterData(urlElem); 214 desc.setEndpointURL(endpointURL); 215 } 216 217 String providerStr = e.getAttribute(ATTR_PROVIDER); 218 if (providerStr != null && !providerStr.equals("")) { 219 providerQName = XMLUtils.getQNameFromString(providerStr, e); 220 if (WSDDConstants.QNAME_JAVAMSG_PROVIDER.equals(providerQName)) { 221 desc.setStyle(Style.MESSAGE); 223 } 224 } 225 226 Element hcEl = getChildElement(e, ELEM_WSDD_JAXRPC_CHAIN); 228 if (hcEl != null) { 229 _wsddHIchain = new WSDDJAXRPCHandlerInfoChain(hcEl); 230 } 231 232 initTMR(); 234 235 validateDescriptors(); 237 } 238 239 246 protected void initTMR() throws WSDDException 247 { 248 if (tmr == null) { 251 createTMR(); 252 for (int i=0; i<typeMappings.size(); i++) { 253 deployTypeMapping((WSDDTypeMapping) 254 typeMappings.get(i)); 255 } 256 } 257 } 258 259 private void createTMR() { 260 tmr = new TypeMappingRegistryImpl(false); 261 String version = getParameter("typeMappingVersion"); 262 ((TypeMappingRegistryImpl)tmr).doRegisterFromVersion(version); 263 } 264 265 270 public void validateDescriptors() throws WSDDException 271 { 272 if (tmr == null) { 273 initTMR(); 274 } 275 desc.setTypeMappingRegistry(tmr); 276 desc.setTypeMapping(getTypeMapping(desc.getUse().getEncoding())); 277 278 String allowedMethods = getParameter(JavaProvider.OPTION_ALLOWEDMETHODS); 279 if (allowedMethods != null && !"*".equals(allowedMethods)) { 280 ArrayList methodList = new ArrayList (); 281 StringTokenizer tokenizer = new StringTokenizer (allowedMethods, " ,"); 282 while (tokenizer.hasMoreTokens()) { 283 methodList.add(tokenizer.nextToken()); 284 } 285 desc.setAllowedMethods(methodList); 286 } 287 } 288 289 293 public void addTypeMapping(WSDDTypeMapping mapping) { 294 typeMappings.add(mapping); 295 } 296 297 301 public void addOperation(WSDDOperation operation) { 302 operations.add(operation); 303 desc.addOperationDesc(operation.getOperationDesc()); 304 } 305 306 protected QName getElementName() 307 { 308 return QNAME_SERVICE; 309 } 310 311 317 public String getServiceDescriptionURL() 318 { 319 return descriptionURL; 320 } 321 322 327 public void setServiceDescriptionURL(String sdUrl) 328 { 329 descriptionURL = sdUrl; 330 } 331 332 public QName getProviderQName() { 333 return providerQName; 334 } 335 336 public void setProviderQName(QName providerQName) { 337 this.providerQName = providerQName; 338 } 339 340 public ServiceDesc getServiceDesc() { 341 return desc; 342 } 343 344 347 public Style getStyle() { 348 return style; 349 } 350 351 354 public void setStyle(Style style) { 355 this.style = style; 356 } 357 358 361 public Use getUse() { 362 return use; 363 } 364 365 368 public void setUse(Use use) { 369 this.use = use; 370 } 371 375 public WSDDFaultFlow[] getFaultFlows() 376 { 377 WSDDFaultFlow[] t = new WSDDFaultFlow[faultFlows.size()]; 378 faultFlows.toArray(t); 379 return t; 380 } 381 382 387 public Vector getNamespaces() 388 { 389 return namespaces; 390 } 391 392 397 public WSDDFaultFlow getFaultFlow(QName name) 398 { 399 WSDDFaultFlow[] t = getFaultFlows(); 400 401 for (int n = 0; n < t.length; n++) { 402 if (t[n].getQName().equals(name)) { 403 return t[n]; 404 } 405 } 406 407 return null; 408 } 409 410 416 public Handler makeNewInstance(EngineConfiguration registry) 417 throws ConfigurationException 418 { 419 if (cachedService != null) { 420 return cachedService; 421 } 422 423 initTMR(); 425 426 Handler reqHandler = null; 427 WSDDChain request = getRequestFlow(); 428 429 if (request != null) { 430 reqHandler = request.getInstance(registry); 431 } 432 433 Handler providerHandler = null; 434 435 if (providerQName != null) { 436 try { 437 providerHandler = WSDDProvider.getInstance(providerQName, 438 this, 439 registry); 440 } catch (Exception e) { 441 throw new ConfigurationException(e); 442 } 443 if (providerHandler == null) 444 throw new WSDDException( 445 Messages.getMessage("couldntConstructProvider00")); 446 } 447 448 Handler respHandler = null; 449 WSDDChain response = getResponseFlow(); 450 451 if (response != null) { 452 respHandler = response.getInstance(registry); 453 } 454 455 SOAPService service = new SOAPService(reqHandler, providerHandler, 456 respHandler); 457 service.setStyle(style); 458 service.setUse(use); 459 service.setServiceDescription(desc); 460 461 service.setHighFidelityRecording(!streaming); 462 service.setSendType(sendType); 463 464 if ( getQName() != null ) 465 service.setName(getQName().getLocalPart()); 466 service.setOptions(getParametersTable()); 467 468 service.setRoles(roles); 469 470 service.setEngine(((WSDDDeployment)registry).getEngine()); 471 472 if (use != Use.ENCODED) { 473 service.setOption(AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); 476 service.setOption(AxisEngine.PROP_SEND_XSI, Boolean.FALSE); 477 } 478 479 if (_wsddHIchain != null) { 481 HandlerInfoChainFactory hiChainFactory = _wsddHIchain.getHandlerChainFactory(); 482 483 service.setOption(Constants.ATTR_HANDLERINFOCHAIN, hiChainFactory); 484 } 485 486 AxisEngine.normaliseOptions(service); 487 488 WSDDFaultFlow [] faultFlows = getFaultFlows(); 489 if (faultFlows != null && faultFlows.length > 0) { 490 FaultableHandler wrapper = new FaultableHandler(service); 491 for (int i = 0; i < faultFlows.length; i++) { 492 WSDDFaultFlow flow = faultFlows[i]; 493 Handler faultHandler = flow.getInstance(registry); 494 wrapper.setOption("fault-" + flow.getQName().getLocalPart(), 495 faultHandler); 496 } 497 } 498 499 try { 500 service.getInitializedServiceDesc(MessageContext.getCurrentContext()); 501 } catch (AxisFault axisFault) { 502 throw new ConfigurationException(axisFault); 503 } 504 505 cachedService = service; 506 return service; 507 } 508 509 public void deployTypeMapping(WSDDTypeMapping mapping) 510 throws WSDDException 511 { 512 if (!typeMappings.contains(mapping)) { 513 typeMappings.add(mapping); 514 } 515 if (tmr == null) { 516 createTMR(); 517 } 518 try { 519 String encodingStyle = mapping.getEncodingStyle(); 522 if (encodingStyle == null) { 523 encodingStyle = use.getEncoding(); 524 } 525 TypeMapping tm = tmr.getOrMakeTypeMapping(encodingStyle); 526 desc.setTypeMappingRegistry(tmr); 527 desc.setTypeMapping(tm); 528 529 SerializerFactory ser = null; 530 DeserializerFactory deser = null; 531 532 if (mapping.getSerializerName() != null && 541 !mapping.getSerializerName().equals("")) { 542 ser = BaseSerializerFactory.createFactory(mapping.getSerializer(), 543 mapping.getLanguageSpecificType(), 544 mapping.getQName()); 545 } 546 if (mapping instanceof WSDDArrayMapping && ser instanceof ArraySerializerFactory) { 547 WSDDArrayMapping am = (WSDDArrayMapping) mapping; 548 ArraySerializerFactory factory = (ArraySerializerFactory) ser; 549 factory.setComponentType(am.getInnerType()); 550 } 551 552 if (mapping.getDeserializerName() != null && 553 !mapping.getDeserializerName().equals("")) { 554 deser = BaseDeserializerFactory.createFactory(mapping.getDeserializer(), 555 mapping.getLanguageSpecificType(), 556 mapping.getQName()); 557 } 558 tm.register( mapping.getLanguageSpecificType(), mapping.getQName(), ser, deser); 559 } catch (ClassNotFoundException e) { 560 log.error(Messages.getMessage("unabletoDeployTypemapping00", mapping.getQName().toString()), e); 561 throw new WSDDNonFatalException(e); 562 } catch (Exception e) { 563 throw new WSDDException(e); 564 } 565 } 566 567 570 public void writeToContext(SerializationContext context) 571 throws IOException { 572 AttributesImpl attrs = new AttributesImpl (); 573 QName name = getQName(); 574 if (name != null) { 575 attrs.addAttribute("", ATTR_NAME, ATTR_NAME, 576 "CDATA", context.qName2String(name)); 577 } 578 if (providerQName != null) { 579 attrs.addAttribute("", ATTR_PROVIDER, ATTR_PROVIDER, 580 "CDATA", context.qName2String(providerQName)); 581 } 582 if (style != Style.DEFAULT) { 583 attrs.addAttribute("", ATTR_STYLE, ATTR_STYLE, 584 "CDATA", style.getName()); 585 } 586 587 if (use != Use.DEFAULT) { 588 attrs.addAttribute("", ATTR_USE, ATTR_USE, 589 "CDATA", use.getName()); 590 } 591 592 if (streaming) { 593 attrs.addAttribute("", ATTR_STREAMING, ATTR_STREAMING, 594 "CDATA", "on"); 595 } 596 597 if (sendType != Attachments.SEND_TYPE_NOTSET) { 598 attrs.addAttribute("", ATTR_ATTACHMENT_FORMAT, 599 ATTR_ATTACHMENT_FORMAT, "CDATA", 600 AttachmentsImpl.getSendTypeString(sendType)); 601 } 602 context.startElement(WSDDConstants.QNAME_SERVICE, attrs); 603 604 if (desc.getWSDLFile() != null) { 605 context.startElement(QNAME_WSDLFILE, null); 606 context.writeSafeString(desc.getWSDLFile()); 607 context.endElement(); 608 } 609 610 if (desc.getDocumentation() != null) { 611 WSDDDocumentation documentation = new WSDDDocumentation(desc.getDocumentation()); 612 documentation.writeToContext(context); 613 } 614 615 for (int i = 0; i < operations.size(); i++) { 616 WSDDOperation operation = (WSDDOperation) operations.elementAt(i); 617 operation.writeToContext(context); 618 } 619 writeFlowsToContext(context); 620 writeParamsToContext(context); 621 622 623 for (int i=0; i < typeMappings.size(); i++) { 624 ((WSDDTypeMapping) typeMappings.elementAt(i)).writeToContext(context); 625 } 626 627 for (int i=0; i < namespaces.size(); i++ ) { 628 context.startElement(QNAME_NAMESPACE, null); 629 context.writeString((String )namespaces.get(i)); 630 context.endElement(); 631 } 632 633 String endpointURL = desc.getEndpointURL(); 634 if (endpointURL != null) { 635 context.startElement(QNAME_ENDPOINTURL, null); 636 context.writeSafeString(endpointURL); 637 context.endElement(); 638 } 639 640 if (_wsddHIchain != null) { 641 _wsddHIchain.writeToContext(context); 642 643 } 644 645 context.endElement(); 646 647 648 } 649 650 public void setCachedService(SOAPService service) 651 { 652 cachedService = service; 653 } 654 655 public Vector getTypeMappings() { 656 return typeMappings; 657 } 658 659 public void setTypeMappings(Vector typeMappings) { 660 this.typeMappings = typeMappings; 661 } 662 663 public void deployToRegistry(WSDDDeployment registry) 664 { 665 registry.addService(this); 666 667 registry.registerNamespaceForService(getQName().getLocalPart(), this); 670 671 for (int i = 0; i < namespaces.size(); i++) { 672 String namespace = (String ) namespaces.elementAt(i); 673 registry.registerNamespaceForService(namespace, this); 674 } 675 676 super.deployToRegistry(registry); 677 } 678 679 public void removeNamespaceMappings(WSDDDeployment registry) 680 { 681 for (int i = 0; i < namespaces.size(); i++) { 682 String namespace = (String ) namespaces.elementAt(i); 683 registry.removeNamespaceMapping(namespace); 684 } 685 registry.removeNamespaceMapping(getQName().getLocalPart()); 686 } 687 688 public TypeMapping getTypeMapping(String encodingStyle) { 689 if (tmr == null) { 691 return null; 692 } 693 return (TypeMapping) tmr.getOrMakeTypeMapping(encodingStyle); 694 } 695 696 697 public WSDDJAXRPCHandlerInfoChain getHandlerInfoChain() { 698 return _wsddHIchain; 699 } 700 701 public void setHandlerInfoChain(WSDDJAXRPCHandlerInfoChain hichain) { 702 _wsddHIchain = hichain; 703 } 704 } 705 | Popular Tags |