/*
 * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package javax.xml.ws.wsaddressing;


import org.w3c.dom.Element;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.spi.Provider;


This class is used to build W3CEndpointReference instances. The intended use of this clsss is for an application component, for example a factory component, to create an W3CEndpointReference for a web service endpoint published by the same Java EE application. It can also be used to create W3CEndpointReferences for an Java SE based endpoint by providing the address property.

When creating a W3CEndpointReference for an endpoint that is not published by the same Java EE application, the address property MUST be specified.

When creating a W3CEndpointReference for an endpoint published by the same Java EE application, the address property MAY be null but then the serviceName and endpointName MUST specify an endpoint published by the same Java EE application.

When the wsdlDocumentLocation is specified it MUST refer to a valid WSDL document and the serviceName and endpointName (if specified) MUST match a service and port in the WSDL document.

Since:1.6, JAX-WS 2.1
/** * This class is used to build {@code W3CEndpointReference} * instances. The intended use of this clsss is for * an application component, for example a factory component, * to create an {@code W3CEndpointReference} for a * web service endpoint published by the same * Java EE application. It can also be used to create * {@code W3CEndpointReferences} for an Java SE based * endpoint by providing the {@code address} property. * <p> * When creating a {@code W3CEndpointReference} for an * endpoint that is not published by the same Java EE application, * the {@code address} property MUST be specified. * <p> * When creating a {@code W3CEndpointReference} for an endpoint * published by the same Java EE application, the {@code address} * property MAY be {@code null} but then the {@code serviceName} * and {@code endpointName} MUST specify an endpoint published by * the same Java EE application. * <p> * When the {@code wsdlDocumentLocation} is specified it MUST refer * to a valid WSDL document and the {@code serviceName} and * {@code endpointName} (if specified) MUST match a service and port * in the WSDL document. * * @since 1.6, JAX-WS 2.1 */
public final class W3CEndpointReferenceBuilder {
Creates a new W3CEndpointReferenceBuilder instance.
/** * Creates a new {@code W3CEndpointReferenceBuilder} instance. */
public W3CEndpointReferenceBuilder() { referenceParameters = new ArrayList<Element>(); metadata = new ArrayList<Element>(); attributes = new HashMap<QName, String>(); elements = new ArrayList<Element>(); }
Sets the address to the W3CEndpointReference instance's wsa:Address.

The address MUST be set to a non-null value when building a W3CEndpointReference for a web service endpoint that is not published by the same Java EE application or when running on Java SE.

Params:
  • address – The address of the endpoint to be targeted by the returned W3CEndpointReference.
Returns:A W3CEndpointReferenceBuilder instance with the address set to the wsa:Address.
/** * Sets the {@code address} to the * {@code W3CEndpointReference} instance's * {@code wsa:Address}. * <p> * The {@code address} MUST be set to a non-{@code null} * value when building a {@code W3CEndpointReference} for a * web service endpoint that is not published by the same * Java EE application or when running on Java SE. * * @param address The address of the endpoint to be targeted * by the returned {@code W3CEndpointReference}. * * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code address} set to the {@code wsa:Address}. */
public W3CEndpointReferenceBuilder address(String address) { this.address = address; return this; }
Sets the interfaceName as the wsam:InterfaceName element in the wsa:Metadata element. See 2.1 Referencing WSDL Metadata from an EPR for more details.
Params:
  • interfaceName – The port type name of the endpoint to be targeted by the returned W3CEndpointReference.
Returns:A W3CEndpointReferenceBuilder instance with the interfaceName as wsam:InterfaceName element added to the wsa:Metadata element
Since:1.7
/** * Sets the {@code interfaceName} as the * {@code wsam:InterfaceName} element in the * {@code wsa:Metadata} element. * * See <a href="http://www.w3.org/TR/2007/REC-ws-addr-metadata-20070904/#refmetadatfromepr"> * 2.1 Referencing WSDL Metadata from an EPR</a> for more details. * * @param interfaceName The port type name of the endpoint to be targeted * by the returned {@code W3CEndpointReference}. * * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code interfaceName} as {@code wsam:InterfaceName} * element added to the {@code wsa:Metadata} element * @since 1.7 */
public W3CEndpointReferenceBuilder interfaceName(QName interfaceName) { this.interfaceName = interfaceName; return this; }
Sets the serviceName as the wsam:ServiceName element in the wsa:Metadata element. See 2.1 Referencing WSDL Metadata from an EPR for more details.
Params:
  • serviceName – The service name of the endpoint to be targeted by the returned W3CEndpointReference. This property may also be used with the endpointName (portName) property to lookup the address of a web service endpoint that is published by the same Java EE application.
Returns:A W3CEndpointReferenceBuilder instance with the serviceName as wsam:ServiceName element added to the wsa:Metadata element
/** * Sets the {@code serviceName} as the * {@code wsam:ServiceName} element in the * {@code wsa:Metadata} element. * * See <a href="http://www.w3.org/TR/2007/REC-ws-addr-metadata-20070904/#refmetadatfromepr"> * 2.1 Referencing WSDL Metadata from an EPR</a> for more details. * * @param serviceName The service name of the endpoint to be targeted * by the returned {@code W3CEndpointReference}. This property * may also be used with the {@code endpointName} (portName) * property to lookup the {@code address} of a web service * endpoint that is published by the same Java EE application. * * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code serviceName} as {@code wsam:ServiceName} * element added to the {@code wsa:Metadata} element * */
public W3CEndpointReferenceBuilder serviceName(QName serviceName) { this.serviceName = serviceName; return this; }
Sets the endpointName as wsam:ServiceName/@EndpointName in the wsa:Metadata element. This method can only be called after the serviceName(QName) method has been called.

See 2.1 Referencing WSDL Metadata from an EPR for more details.

Params:
  • endpointName – The name of the endpoint to be targeted by the returned W3CEndpointReference. The endpointName (portName) property may also be used with the serviceName property to lookup the address of a web service endpoint published by the same Java EE application.
Throws:
Returns:A W3CEndpointReferenceBuilder instance with the endpointName as wsam:ServiceName/@EndpointName in the wsa:Metadata element.
/** * Sets the {@code endpointName} as * {@code wsam:ServiceName/@EndpointName} in the * {@code wsa:Metadata} element. This method can only be called * after the {@link #serviceName(QName)} method has been called. * <p> * See <a href="http://www.w3.org/TR/2007/REC-ws-addr-metadata-20070904/#refmetadatfromepr"> * 2.1 Referencing WSDL Metadata from an EPR</a> for more details. * * @param endpointName The name of the endpoint to be targeted * by the returned {@code W3CEndpointReference}. The * {@code endpointName} (portName) property may also be * used with the {@code serviceName} property to lookup * the {@code address} of a web service * endpoint published by the same Java EE application. * * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code endpointName} as * {@code wsam:ServiceName/@EndpointName} in the * {@code wsa:Metadata} element. * * @throws java.lang.IllegalStateException if the {@code serviceName} * has not been set * * @throws java.lang.IllegalArgumentException if the {@code endpointName}'s * Namespace URI doesn't match {@code serviceName}'s Namespace URI * */
public W3CEndpointReferenceBuilder endpointName(QName endpointName) { if (serviceName == null) { throw new IllegalStateException("The W3CEndpointReferenceBuilder's serviceName must be set before setting the endpointName: "+endpointName); } this.endpointName = endpointName; return this; }
Sets the wsdlDocumentLocation that will be referenced as wsa:Metadata/@wsdli:wsdlLocation. The namespace name for the wsdli:wsdlLocation's value can be taken from the WSDL itself.

See 2.1 Referencing WSDL Metadata from an EPR for more details.

Params:
  • wsdlDocumentLocation – The location of the WSDL document to be referenced in the wsa:Metadata of the W3CEndpointReference.
Returns:A W3CEndpointReferenceBuilder instance with the wsdlDocumentLocation that is to be referenced.
/** * Sets the {@code wsdlDocumentLocation} that will be referenced * as {@code wsa:Metadata/@wsdli:wsdlLocation}. The namespace name * for the wsdli:wsdlLocation's value can be taken from the WSDL itself. * * <p> * See <a href="http://www.w3.org/TR/2007/REC-ws-addr-metadata-20070904/#refmetadatfromepr"> * 2.1 Referencing WSDL Metadata from an EPR</a> for more details. * * @param wsdlDocumentLocation The location of the WSDL document to * be referenced in the {@code wsa:Metadata} of the * {@code W3CEndpointReference}. * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code wsdlDocumentLocation} that is to be referenced. */
public W3CEndpointReferenceBuilder wsdlDocumentLocation(String wsdlDocumentLocation) { this.wsdlDocumentLocation = wsdlDocumentLocation; return this; }
Adds the referenceParameter to the W3CEndpointReference instance wsa:ReferenceParameters element.
Params:
  • referenceParameter – The element to be added to the wsa:ReferenceParameters element.
Throws:
Returns:A W3CEndpointReferenceBuilder instance with the referenceParameter added to the wsa:ReferenceParameters element.
/** * Adds the {@code referenceParameter} to the * {@code W3CEndpointReference} instance * {@code wsa:ReferenceParameters} element. * * @param referenceParameter The element to be added to the * {@code wsa:ReferenceParameters} element. * * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code referenceParameter} added to the * {@code wsa:ReferenceParameters} element. * * @throws java.lang.IllegalArgumentException if {@code referenceParameter} * is {@code null}. */
public W3CEndpointReferenceBuilder referenceParameter(Element referenceParameter) { if (referenceParameter == null) throw new java.lang.IllegalArgumentException("The referenceParameter cannot be null."); referenceParameters.add(referenceParameter); return this; }
Adds the metadataElement to the W3CEndpointReference instance's wsa:Metadata element.
Params:
  • metadataElement – The element to be added to the wsa:Metadata element.
Throws:
Returns:A W3CEndpointReferenceBuilder instance with the metadataElement added to the wsa:Metadata element.
/** * Adds the {@code metadataElement} to the * {@code W3CEndpointReference} instance's * {@code wsa:Metadata} element. * * @param metadataElement The element to be added to the * {@code wsa:Metadata} element. * * @return A {@code W3CEndpointReferenceBuilder} instance with * the {@code metadataElement} added to the * {@code wsa:Metadata} element. * * @throws java.lang.IllegalArgumentException if {@code metadataElement} * is {@code null}. */
public W3CEndpointReferenceBuilder metadata(Element metadataElement) { if (metadataElement == null) throw new java.lang.IllegalArgumentException("The metadataElement cannot be null."); metadata.add(metadataElement); return this; }
Adds an extension element to the W3CEndpointReference instance's wsa:EndpointReference element.
Params:
  • element – The extension element to be added to the W3CEndpointReference
Throws:
Returns:A W3CEndpointReferenceBuilder instance with the extension element added to the W3CEndpointReference instance.
Since:1.7, JAX-WS 2.2
/** * Adds an extension element to the * {@code W3CEndpointReference} instance's * {@code wsa:EndpointReference} element. * * @param element The extension element to be added to the * {@code W3CEndpointReference} * @return A {@code W3CEndpointReferenceBuilder} instance with * the extension {@code element} added to the * {@code W3CEndpointReference} instance. * @throws java.lang.IllegalArgumentException if {@code element} * is {@code null}. * * @since 1.7, JAX-WS 2.2 */
public W3CEndpointReferenceBuilder element(Element element) { if (element == null) { throw new IllegalArgumentException("The extension element cannot be null."); } elements.add(element); return this; }
Adds an extension attribute to the W3CEndpointReference instance's wsa:EndpointReference element.
Params:
  • name – The name of the extension attribute to be added to the W3CEndpointReference
  • value – extension attribute value
Throws:
Returns:A W3CEndpointReferenceBuilder instance with the extension attribute added to the W3CEndpointReference instance.
Since:1.7, JAX-WS 2.2
/** * Adds an extension attribute to the * {@code W3CEndpointReference} instance's * {@code wsa:EndpointReference} element. * * @param name The name of the extension attribute to be added to the * {@code W3CEndpointReference} * @param value extension attribute value * @return A {@code W3CEndpointReferenceBuilder} instance with * the extension attribute added to the {@code W3CEndpointReference} * instance. * @throws java.lang.IllegalArgumentException if {@code name} * or {@code value} is {@code null}. * * @since 1.7, JAX-WS 2.2 */
public W3CEndpointReferenceBuilder attribute(QName name, String value) { if (name == null || value == null) { throw new IllegalArgumentException("The extension attribute name or value cannot be null."); } attributes.put(name, value); return this; }
Builds a W3CEndpointReference from the accumulated properties set on this W3CEndpointReferenceBuilder instance.

This method can be used to create a W3CEndpointReference for any endpoint by specifying the address property along with any other desired properties. This method can also be used to create a W3CEndpointReference for an endpoint that is published by the same Java EE application. This method can automatically determine the address of an endpoint published by the same Java EE application that is identified by the serviceName and endpointName properties. If the address is null and the serviceName and endpointName do not identify an endpoint published by the same Java EE application, a java.lang.IllegalStateException MUST be thrown.

Throws:
  • IllegalStateException
    • If the address, serviceName and endpointName are all null.
    • If the serviceName service is null and the endpointName is NOT null.
    • If the address property is null and the serviceName and endpointName do not specify a valid endpoint published by the same Java EE application.
    • If the serviceName is NOT null and is not present in the specified WSDL.
    • If the endpointName port is not null and it is not present in serviceName service in the WSDL.
    • If the wsdlDocumentLocation is NOT null and does not represent a valid WSDL.
  • WebServiceException – If an error occurs while creating the W3CEndpointReference.
Returns:W3CEndpointReference from the accumulated properties set on this W3CEndpointReferenceBuilder instance. This method never returns null.
/** * Builds a {@code W3CEndpointReference} from the accumulated * properties set on this {@code W3CEndpointReferenceBuilder} * instance. * <p> * This method can be used to create a {@code W3CEndpointReference} * for any endpoint by specifying the {@code address} property along * with any other desired properties. This method * can also be used to create a {@code W3CEndpointReference} for * an endpoint that is published by the same Java EE application. * This method can automatically determine the {@code address} of * an endpoint published by the same Java EE application that is identified by the * {@code serviceName} and * {@code endpointName} properties. If the {@code address} is * {@code null} and the {@code serviceName} and * {@code endpointName} * do not identify an endpoint published by the same Java EE application, a * {@code java.lang.IllegalStateException} MUST be thrown. * * * @return {@code W3CEndpointReference} from the accumulated * properties set on this {@code W3CEndpointReferenceBuilder} * instance. This method never returns {@code null}. * * @throws IllegalStateException * <ul> * <li>If the {@code address}, {@code serviceName} and * {@code endpointName} are all {@code null}. * <li>If the {@code serviceName} service is {@code null} and the * {@code endpointName} is NOT {@code null}. * <li>If the {@code address} property is {@code null} and * the {@code serviceName} and {@code endpointName} do not * specify a valid endpoint published by the same Java EE * application. * <li>If the {@code serviceName} is NOT {@code null} * and is not present in the specified WSDL. * <li>If the {@code endpointName} port is not {@code null} and it * is not present in {@code serviceName} service in the WSDL. * <li>If the {@code wsdlDocumentLocation} is NOT {@code null} * and does not represent a valid WSDL. * </ul> * @throws WebServiceException If an error occurs while creating the * {@code W3CEndpointReference}. * */
public W3CEndpointReference build() { if (elements.isEmpty() && attributes.isEmpty() && interfaceName == null) { // 2.1 API return Provider.provider().createW3CEndpointReference(address, serviceName, endpointName, metadata, wsdlDocumentLocation, referenceParameters); } return Provider.provider().createW3CEndpointReference(address, interfaceName, serviceName, endpointName, metadata, wsdlDocumentLocation, referenceParameters, elements, attributes); } private String address; private List<Element> referenceParameters; private List<Element> metadata; private QName interfaceName; private QName serviceName; private QName endpointName; private String wsdlDocumentLocation; private Map<QName,String> attributes; private List<Element> elements; }