document
style
aoqi@0: * soapBindings
aoqi@0: */
aoqi@0: private static final String DOCUMENT = "document";
aoqi@0: /**
aoqi@0: * Constant String "rpc" used to specify rpc
style
aoqi@0: * soapBindings
aoqi@0: */
aoqi@0: private static final String RPC = "rpc";
aoqi@0: /**
aoqi@0: * Constant String "literal" used to create literal
use binddings
aoqi@0: */
aoqi@0: private static final String LITERAL = "literal";
aoqi@0: /**
aoqi@0: * Constant String to flag the URL to replace at runtime for the endpoint
aoqi@0: */
aoqi@0: private static final String REPLACE_WITH_ACTUAL_URL = "REPLACE_WITH_ACTUAL_URL";
aoqi@0: private Setmethod
is wrapper style
aoqi@0: * @param method The {@link JavaMethod} to check if it is wrapper style
aoqi@0: * @return true if the method is wrapper style, otherwise, false.
aoqi@0: */
aoqi@0: protected boolean isWrapperStyle(JavaMethodImpl method) {
aoqi@0: if (method.getRequestParameters().size() > 0) {
aoqi@0: ParameterImpl param = method.getRequestParameters().iterator().next();
aoqi@0: return param.isWrapperStyle();
aoqi@0: }
aoqi@0: return false;
aoqi@0: }
aoqi@0:
aoqi@0: /**
aoqi@0: * Determines if a {@link JavaMethod} is rpc/literal
aoqi@0: * @param method The method to check
aoqi@0: * @return true if method is rpc/literal, otherwise, false
aoqi@0: */
aoqi@0: protected boolean isRpcLit(JavaMethodImpl method) {
aoqi@0: return method.getBinding().getStyle() == Style.RPC;
aoqi@0: }
aoqi@0:
aoqi@0: /**
aoqi@0: * Generates the parameterOrder for a PortType operation
aoqi@0: * @param operation The operation to generate the parameterOrder for
aoqi@0: * @param method The {@link JavaMethod} to generate the parameterOrder from
aoqi@0: */
aoqi@0: protected void generateParameterOrder(Operation operation, JavaMethodImpl method) {
aoqi@0: if (method.getMEP() == MEP.ONE_WAY)
aoqi@0: return;
aoqi@0: if (isRpcLit(method))
aoqi@0: generateRpcParameterOrder(operation, method);
aoqi@0: else
aoqi@0: generateDocumentParameterOrder(operation, method);
aoqi@0: }
aoqi@0:
aoqi@0: /**
aoqi@0: * Generates the parameterOrder for a PortType operation
aoqi@0: * @param operation the operation to generate the parameterOrder for
aoqi@0: * @param method the {@link JavaMethod} to generate the parameterOrder from
aoqi@0: */
aoqi@0: protected void generateRpcParameterOrder(Operation operation, JavaMethodImpl method) {
aoqi@0: String partName;
aoqi@0: StringBuilder paramOrder = new StringBuilder();
aoqi@0: Setbody
parameter
aoqi@0: */
aoqi@0: protected boolean isBodyParameter(ParameterImpl parameter) {
aoqi@0: ParameterBinding paramBinding = parameter.getBinding();
aoqi@0: return paramBinding.isBody();
aoqi@0: }
aoqi@0:
aoqi@0: protected boolean isHeaderParameter(ParameterImpl parameter) {
aoqi@0: ParameterBinding paramBinding = parameter.getBinding();
aoqi@0: return paramBinding.isHeader();
aoqi@0: }
aoqi@0:
aoqi@0: protected boolean isAttachmentParameter(ParameterImpl parameter) {
aoqi@0: ParameterBinding paramBinding = parameter.getBinding();
aoqi@0: return paramBinding.isAttachment();
aoqi@0: }
aoqi@0:
aoqi@0:
aoqi@0: /**
aoqi@0: * Generates the Binding section of the WSDL
aoqi@0: */
aoqi@0: protected void generateBinding() {
aoqi@0: Binding newBinding = serviceDefinitions.binding().name(model.getBoundPortTypeName().getLocalPart());
aoqi@0: extension.addBindingExtension(newBinding);
aoqi@0: newBinding.type(model.getPortTypeName());
aoqi@0: boolean first = true;
aoqi@0: for (JavaMethodImpl method : model.getJavaMethods()) {
aoqi@0: if (first) {
aoqi@0: SOAPBinding sBinding = method.getBinding();
aoqi@0: SOAPVersion soapVersion = sBinding.getSOAPVersion();
aoqi@0: if (soapVersion == SOAPVersion.SOAP_12) {
aoqi@0: com.sun.xml.internal.ws.wsdl.writer.document.soap12.SOAPBinding soapBinding = newBinding.soap12Binding();
aoqi@0: soapBinding.transport(this.binding.getBindingId().getTransport());
aoqi@0: if (sBinding.getStyle().equals(Style.DOCUMENT))
aoqi@0: soapBinding.style(DOCUMENT);
aoqi@0: else
aoqi@0: soapBinding.style(RPC);
aoqi@0: } else {
aoqi@0: com.sun.xml.internal.ws.wsdl.writer.document.soap.SOAPBinding soapBinding = newBinding.soapBinding();
aoqi@0: soapBinding.transport(this.binding.getBindingId().getTransport());
aoqi@0: if (sBinding.getStyle().equals(Style.DOCUMENT))
aoqi@0: soapBinding.style(DOCUMENT);
aoqi@0: else
aoqi@0: soapBinding.style(RPC);
aoqi@0: }
aoqi@0: first = false;
aoqi@0: }
aoqi@0: if (this.binding.getBindingId().getSOAPVersion() == SOAPVersion.SOAP_12)
aoqi@0: generateSOAP12BindingOperation(method, newBinding);
aoqi@0: else
aoqi@0: generateBindingOperation(method, newBinding);
aoqi@0: }
aoqi@0: }
aoqi@0:
aoqi@0: protected void generateBindingOperation(JavaMethodImpl method, Binding binding) {
aoqi@0: BindingOperationType operation = binding.operation().name(method.getOperationName());
aoqi@0: extension.addBindingOperationExtension(operation, method);
aoqi@0: String targetNamespace = model.getTargetNamespace();
aoqi@0: QName requestMessage = new QName(targetNamespace, method.getOperationName());
aoqi@0: Listaoqi@0: * For example, {@code relative("http://www.sun.com/abc/def","http://www.sun.com/pqr/stu") => "../abc/def"} aoqi@0: * aoqi@0: *
aoqi@0: * This method only works on hierarchical URI's, not opaque URI's (refer to the aoqi@0: * java.net.URI aoqi@0: * javadoc for complete definitions of these terms. aoqi@0: * aoqi@0: *
aoqi@0: * This method will not normalize the relative URI.
aoqi@0: * @param uri the URI to relativize
aoqi@0: *
aoqi@0: *
aoqi@0: * @param baseUri the base URI to use for the relativization
aoqi@0: * @return the relative URI or the original URI if a relative one could not be computed
aoqi@0: */
aoqi@0: protected static String relativize(String uri, String baseUri) {
aoqi@0: try {
aoqi@0: assert uri != null;
aoqi@0:
aoqi@0: if (baseUri == null) return uri;
aoqi@0:
aoqi@0: URI theUri = new URI(escapeURI(uri));
aoqi@0: URI theBaseUri = new URI(escapeURI(baseUri));
aoqi@0:
aoqi@0: if (theUri.isOpaque() || theBaseUri.isOpaque())
aoqi@0: return uri;
aoqi@0:
aoqi@0: if (!equalsIgnoreCase(theUri.getScheme(), theBaseUri.getScheme()) ||
aoqi@0: !equal(theUri.getAuthority(), theBaseUri.getAuthority()))
aoqi@0: return uri;
aoqi@0:
aoqi@0: String uriPath = theUri.getPath();
aoqi@0: String basePath = theBaseUri.getPath();
aoqi@0:
aoqi@0: // normalize base path
aoqi@0: if (!basePath.endsWith("/")) {
aoqi@0: basePath = normalizeUriPath(basePath);
aoqi@0: }
aoqi@0:
aoqi@0: if (uriPath.equals(basePath))
aoqi@0: return ".";
aoqi@0:
aoqi@0: String relPath = calculateRelativePath(uriPath, basePath);
aoqi@0:
aoqi@0: if (relPath == null)
aoqi@0: return uri; // recursion found no commonality in the two uris at all
aoqi@0: StringBuilder relUri = new StringBuilder();
aoqi@0: relUri.append(relPath);
aoqi@0: if (theUri.getQuery() != null)
aoqi@0: relUri.append('?').append(theUri.getQuery());
aoqi@0: if (theUri.getFragment() != null)
aoqi@0: relUri.append('#').append(theUri.getFragment());
aoqi@0:
aoqi@0: return relUri.toString();
aoqi@0: } catch (URISyntaxException e) {
aoqi@0: throw new InternalError("Error escaping one of these uris:\n\t" + uri + "\n\t" + baseUri);
aoqi@0: }
aoqi@0: }
aoqi@0:
aoqi@0: private static String calculateRelativePath(String uri, String base) {
aoqi@0: if (base == null) {
aoqi@0: return null;
aoqi@0: }
aoqi@0: if (uri.startsWith(base)) {
aoqi@0: return uri.substring(base.length());
aoqi@0: } else {
aoqi@0: return "../" + calculateRelativePath(uri, getParentUriPath(base));
aoqi@0: }
aoqi@0: }
aoqi@0:
aoqi@0:
aoqi@0: /**
aoqi@0: * Implements the SchemaOutputResolver used by JAXB to
aoqi@0: */
aoqi@0: protected class JAXWSOutputSchemaResolver extends SchemaOutputResolver {
aoqi@0: ArrayList