001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */package org.apache.cxf.jaxws;
019:
020: import java.util.List;
021:
022: import javax.xml.ws.WebServiceException;
023: import javax.xml.ws.handler.Handler;
024: import javax.xml.ws.soap.SOAPBinding;
025:
026: import org.apache.cxf.binding.AbstractBindingFactory;
027: import org.apache.cxf.binding.soap.Soap12;
028: import org.apache.cxf.common.injection.ResourceInjector;
029: import org.apache.cxf.endpoint.Server;
030: import org.apache.cxf.frontend.ServerFactoryBean;
031: import org.apache.cxf.jaxws.binding.soap.JaxWsSoapBindingConfiguration;
032: import org.apache.cxf.jaxws.context.WebServiceContextResourceResolver;
033: import org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder;
034: import org.apache.cxf.jaxws.support.JaxWsEndpointImpl;
035: import org.apache.cxf.jaxws.support.JaxWsImplementorInfo;
036: import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean;
037: import org.apache.cxf.resource.DefaultResourceManager;
038: import org.apache.cxf.resource.ResourceManager;
039: import org.apache.cxf.resource.ResourceResolver;
040: import org.apache.cxf.service.invoker.Invoker;
041: import org.apache.cxf.service.model.BindingInfo;
042:
043: /**
044: * Bean to help easily create Server endpoints for JAX-WS. Example:
045: * <pre>
046: * JaxWsServerFactoryBean sf = JaxWsServerFactoryBean();
047: * sf.setServiceClass(MyService.class);
048: * sf.setAddress("http://acme.com/myService");
049: * sf.create();
050: * </pre>
051: * This will start a server for you and register it with the ServerManager.
052: */
053: public class JaxWsServerFactoryBean extends ServerFactoryBean {
054: protected boolean doInit;
055:
056: public JaxWsServerFactoryBean() {
057: this (new JaxWsServiceFactoryBean());
058: doInit = true;
059: }
060:
061: public JaxWsServerFactoryBean(JaxWsServiceFactoryBean serviceFactory) {
062: setServiceFactory(serviceFactory);
063:
064: JaxWsSoapBindingConfiguration defConfig = new JaxWsSoapBindingConfiguration(
065: serviceFactory);
066:
067: setBindingConfig(defConfig);
068: doInit = true;
069: }
070:
071: @Override
072: protected Invoker createInvoker() {
073: return new JAXWSMethodInvoker(getServiceBean());
074: }
075:
076: @Override
077: protected BindingInfo createBindingInfo() {
078: JaxWsServiceFactoryBean sf = (JaxWsServiceFactoryBean) getServiceFactory();
079:
080: JaxWsImplementorInfo implInfo = sf.getJaxWsImplementorInfo();
081: String jaxBid = implInfo.getBindingType();
082: String binding = getBindingId();
083: if (binding == null) {
084: binding = jaxBid;
085: setBindingId(binding);
086: }
087:
088: if (binding.equals(SOAPBinding.SOAP11HTTP_BINDING)
089: || binding.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING)
090: //|| binding.equals(SOAPBinding.SOAP12HTTP_BINDING)
091: || binding.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
092: binding = "http://schemas.xmlsoap.org/soap/";
093: setBindingId(binding);
094: if (getBindingConfig() == null) {
095: setBindingConfig(new JaxWsSoapBindingConfiguration(sf));
096: }
097: }
098:
099: if (getBindingConfig() instanceof JaxWsSoapBindingConfiguration) {
100: JaxWsSoapBindingConfiguration conf = (JaxWsSoapBindingConfiguration) getBindingConfig();
101:
102: if (jaxBid.equals(SOAPBinding.SOAP12HTTP_BINDING)) {
103: conf.setVersion(Soap12.getInstance());
104: }
105:
106: if (jaxBid.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
107: conf.setVersion(Soap12.getInstance());
108: conf.setMtomEnabled(true);
109: }
110: if (jaxBid.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING)) {
111: conf.setMtomEnabled(true);
112: }
113:
114: conf.setJaxWsServiceFactoryBean(sf);
115: }
116:
117: BindingInfo bindingInfo = super .createBindingInfo();
118:
119: if (implInfo.isWebServiceProvider()) {
120: bindingInfo.setProperty(
121: AbstractBindingFactory.DATABINDING_DISABLED,
122: Boolean.TRUE);
123: }
124:
125: return bindingInfo;
126: }
127:
128: public Server create() {
129: Server server = super .create();
130: init();
131: return server;
132: }
133:
134: private synchronized void init() {
135: if (doInit) {
136: try {
137: injectResources(getServiceBean());
138: buildHandlerChain();
139: } catch (Exception ex) {
140: if (ex instanceof WebServiceException) {
141: throw (WebServiceException) ex;
142: }
143: throw new WebServiceException(
144: "Creation of Endpoint failed", ex);
145: }
146: }
147: doInit = false;
148: }
149:
150: /**
151: * Obtain handler chain from annotations.
152: *
153: */
154: private void buildHandlerChain() {
155: AnnotationHandlerChainBuilder builder = new AnnotationHandlerChainBuilder();
156:
157: List<Handler> chain = builder.buildHandlerChainFromClass(
158: getServiceBean().getClass(), getEndpointName());
159: for (Handler h : chain) {
160: injectResources(h);
161: }
162:
163: ((JaxWsEndpointImpl) getServer().getEndpoint())
164: .getJaxwsBinding().setHandlerChain(chain);
165: }
166:
167: /**
168: * inject resources into servant. The resources are injected
169: * according to @Resource annotations. See JSR 250 for more
170: * information.
171: */
172: /**
173: * @param instance
174: */
175: protected void injectResources(Object instance) {
176: if (instance != null) {
177: ResourceManager resourceManager = getBus().getExtension(
178: ResourceManager.class);
179: List<ResourceResolver> resolvers = resourceManager
180: .getResourceResolvers();
181: resourceManager = new DefaultResourceManager(resolvers);
182: resourceManager
183: .addResourceResolver(new WebServiceContextResourceResolver());
184: ResourceInjector injector = new ResourceInjector(
185: resourceManager);
186: injector.inject(instance);
187: }
188: }
189: }
|