001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common Development
008: * and Distribution License("CDDL") (collectively, the "License"). You
009: * may not use this file except in compliance with the License. You can obtain
010: * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
011: * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
012: * language governing permissions and limitations under the License.
013: *
014: * When distributing the software, include this License Header Notice in each
015: * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
016: * Sun designates this particular file as subject to the "Classpath" exception
017: * as provided by Sun in the GPL Version 2 section of the License file that
018: * accompanied this code. If applicable, add the following below the License
019: * Header, with the fields enclosed by brackets [] replaced by your own
020: * identifying information: "Portions Copyrighted [year]
021: * [name of copyright owner]"
022: *
023: * Contributor(s):
024: *
025: * If you wish your version of this file to be governed by only the CDDL or
026: * only the GPL Version 2, indicate your decision by adding "[Contributor]
027: * elects to include this software in this distribution under the [CDDL or GPL
028: * Version 2] license." If you don't indicate a single choice of license, a
029: * recipient has the option to distribute your version of this file under
030: * either the CDDL, the GPL Version 2 or to extend the choice of license to
031: * its licensees as provided above. However, if you add GPL Version 2 code
032: * and therefore, elected the GPL Version 2 license, then the option applies
033: * only if the new code is made subject to such option by the copyright
034: * holder.
035: */
036:
037: package com.sun.xml.ws.binding;
038:
039: import com.sun.istack.NotNull;
040: import com.sun.istack.Nullable;
041: import com.sun.xml.ws.api.BindingID;
042: import com.sun.xml.ws.api.SOAPVersion;
043: import com.sun.xml.ws.api.WSBinding;
044: import com.sun.xml.ws.api.addressing.AddressingVersion;
045: import com.sun.xml.ws.api.pipe.Codec;
046: import com.sun.xml.ws.client.HandlerConfiguration;
047: import com.sun.xml.ws.developer.MemberSubmissionAddressingFeature;
048:
049: import javax.xml.ws.WebServiceFeature;
050: import javax.xml.ws.soap.AddressingFeature;
051: import javax.xml.ws.handler.Handler;
052: import java.util.Collections;
053: import java.util.List;
054:
055: /**
056: * Instances are created by the service, which then
057: * sets the handler chain on the binding impl.
058: *
059: * <p>
060: * This class is made abstract as we don't see a situation when
061: * a BindingImpl has much meaning without binding id.
062: * IOW, for a specific binding there will be a class
063: * extending BindingImpl, for example SOAPBindingImpl.
064: *
065: * <p>
066: * The spi Binding interface extends Binding.
067: *
068: * @author WS Development Team
069: */
070: public abstract class BindingImpl implements WSBinding {
071: private HandlerConfiguration handlerConfig;
072: private final BindingID bindingId;
073: // Features that are set(enabled/disabled) on the binding
074: protected final WebServiceFeatureList features = new WebServiceFeatureList();
075:
076: protected BindingImpl(BindingID bindingId) {
077: this .bindingId = bindingId;
078: setHandlerConfig(createHandlerConfig(Collections
079: .<Handler> emptyList()));
080: }
081:
082: public @NotNull
083: List<Handler> getHandlerChain() {
084: return handlerConfig.getHandlerChain();
085: }
086:
087: public HandlerConfiguration getHandlerConfig() {
088: return handlerConfig;
089: }
090:
091: /**
092: * Sets the handlers on the binding and then
093: * sorts the handlers in to logical and protocol handlers.
094: * Creates a new HandlerConfiguration object and sets it on the BindingImpl.
095: */
096: public void setHandlerChain(List<Handler> chain) {
097: setHandlerConfig(createHandlerConfig(chain));
098: }
099:
100: /**
101: * This is called when ever Binding.setHandlerChain() or SOAPBinding.setRoles()
102: * is called.
103: * This sorts out the Handlers into Logical and SOAP Handlers and
104: * sets the HandlerConfiguration.
105: */
106: protected void setHandlerConfig(HandlerConfiguration handlerConfig) {
107: this .handlerConfig = handlerConfig;
108: }
109:
110: protected abstract HandlerConfiguration createHandlerConfig(
111: List<Handler> handlerChain);
112:
113: public @NotNull
114: BindingID getBindingId() {
115: return bindingId;
116: }
117:
118: public final SOAPVersion getSOAPVersion() {
119: return bindingId.getSOAPVersion();
120: }
121:
122: public AddressingVersion getAddressingVersion() {
123: AddressingVersion addressingVersion;
124: if (features.isEnabled(AddressingFeature.class))
125: addressingVersion = AddressingVersion.W3C;
126: else if (features
127: .isEnabled(MemberSubmissionAddressingFeature.class))
128: addressingVersion = AddressingVersion.MEMBER;
129: else
130: addressingVersion = null;
131: return addressingVersion;
132: }
133:
134: public final @NotNull
135: Codec createCodec() {
136: return bindingId.createEncoder(this );
137: }
138:
139: public static BindingImpl create(@NotNull
140: BindingID bindingId) {
141: if (bindingId.equals(BindingID.XML_HTTP))
142: return new HTTPBindingImpl();
143: else
144: return new SOAPBindingImpl(bindingId);
145: }
146:
147: public static BindingImpl create(@NotNull
148: BindingID bindingId, WebServiceFeature[] features) {
149: if (bindingId.equals(BindingID.XML_HTTP))
150: return new HTTPBindingImpl();
151: else
152: return new SOAPBindingImpl(bindingId, features);
153: }
154:
155: public static WSBinding getDefaultBinding() {
156: return new SOAPBindingImpl(BindingID.SOAP11_HTTP);
157: }
158:
159: public String getBindingID() {
160: return bindingId.toString();
161: }
162:
163: public @Nullable
164: <F extends WebServiceFeature> F getFeature(@NotNull
165: Class<F> featureType) {
166: return features.get(featureType);
167: }
168:
169: public boolean isFeatureEnabled(@NotNull
170: Class<? extends WebServiceFeature> feature) {
171: return features.isEnabled(feature);
172: }
173:
174: @NotNull
175: public WebServiceFeatureList getFeatures() {
176: return features;
177: }
178:
179: public void setFeatures(WebServiceFeature... newFeatures) {
180: if (newFeatures != null) {
181: for (WebServiceFeature f : newFeatures) {
182: features.add(f);
183: }
184: }
185: }
186:
187: public void addFeature(@NotNull
188: WebServiceFeature newFeature) {
189: features.add(newFeature);
190: }
191: }
|