/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.cxf; import javax.xml.namespace.QName; import javax.xml.ws.Provider; import org.apache.camel.component.cxf.common.message.CxfConstants; import org.apache.camel.util.ObjectHelper; import org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientFactoryBean; import org.apache.cxf.frontend.ServerFactoryBean; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * Defines the <a href="http://camel.apache.org/cxf.html">CXF Endpoint</a> * * @version */ public class CxfSpringEndpoint extends CxfEndpoint implements ApplicationContextAware { private String beanId; private ApplicationContext applicationContext; public CxfSpringEndpoint(CxfComponent component, String address) throws Exception { super(address, component); } public CxfSpringEndpoint() { } /** * * A help to get the service class. The serviceClass classname in URI * query takes precedence over the serviceClass in CxfEndpointBean. */ private Class<?> getSEIClass() throws ClassNotFoundException { // get service class Class<?> answer = null; if (getServiceClass() != null) { // classname is specified in URI which overrides the bean properties answer = getServiceClass(); } return answer; } // Package private methods // ------------------------------------------------------------------------- /** * Create a CXF Client */ @Override Client createClient() throws Exception { // get service class Class<?> cls = getSEIClass(); if (getDataFormat().equals(DataFormat.POJO)) { ObjectHelper.notNull(cls, CxfConstants.SERVICE_CLASS); } if (getWsdlURL() == null && cls == null) { // no WSDL and serviceClass specified, set our default serviceClass setServiceClass(org.apache.camel.component.cxf.DefaultSEI.class.getName()); setDefaultOperationNamespace(CxfConstants.DISPATCH_NAMESPACE); setDefaultOperationName(CxfConstants.DISPATCH_DEFAULT_OPERATION_NAMESPACE); if (getDataFormat().equals(DataFormat.PAYLOAD)) { setSkipPayloadMessagePartCheck(true); } cls = getSEIClass(); } if (cls != null) { // create client factory bean ClientFactoryBean factoryBean = createClientFactoryBean(cls); // setup client factory bean setupClientFactoryBean(factoryBean, cls); // fill in values that have not been filled. QName serviceQName = null; try { serviceQName = factoryBean.getServiceName(); } catch (IllegalStateException e) { // It throws IllegalStateException if serviceName has not been set. } if (serviceQName == null && getServiceLocalName() != null) { factoryBean.setServiceName(new QName(getServiceNamespace(), getServiceLocalName())); } if (factoryBean.getEndpointName() == null && getEndpointLocalName() != null) { factoryBean.setEndpointName(new QName(getEndpointNamespace(), getEndpointLocalName())); } Client client = factoryBean.create(); // setup the handlers setupHandlers(factoryBean, client); return client; } else { ClientFactoryBean factoryBean = createClientFactoryBean(); // setup client factory bean setupClientFactoryBean(factoryBean, null); // fill in values that have not been filled. QName serviceQName = null; try { serviceQName = factoryBean.getServiceName(); } catch (IllegalStateException e) { // It throws IllegalStateException if serviceName has not been set. } if (serviceQName == null && getServiceLocalName() != null) { factoryBean.setServiceName(new QName(getServiceNamespace(), getServiceLocalName())); } if (factoryBean.getEndpointName() == null && getEndpointLocalName() != null) { factoryBean.setEndpointName(new QName(getEndpointNamespace(), getEndpointLocalName())); } checkName(factoryBean.getEndpointName(), "endpoint/port name"); checkName(factoryBean.getServiceName(), "service name"); return factoryBean.create(); } } /** * Create a service factory bean */ @Override ServerFactoryBean createServerFactoryBean() throws Exception { // get service class Class<?> cls = getSEIClass(); if (getWsdlURL() == null && cls == null) { // no WSDL and serviceClass specified, set our default serviceClass if (getDataFormat().equals(DataFormat.PAYLOAD)) { setServiceClass(org.apache.camel.component.cxf.DefaultPayloadProviderSEI.class.getName()); } cls = getServiceClass(); } // create server factory bean // Shouldn't use CxfEndpointUtils.getServerFactoryBean(cls) as it is for // CxfSoapComponent ServerFactoryBean answer = null; if (cls == null) { if (!getDataFormat().equals(DataFormat.POJO)) { answer = new JaxWsServerFactoryBean(new WSDLServiceFactoryBean()) { { doInit = false; } }; cls = Provider.class; } else { ObjectHelper.notNull(cls, CxfConstants.SERVICE_CLASS); } } else if (CxfEndpointUtils.hasWebServiceAnnotation(cls)) { answer = new JaxWsServerFactoryBean(); } else { answer = new ServerFactoryBean(); } // setup server factory bean setupServerFactoryBean(answer, cls); // fill in values that have not been filled. if (answer.getServiceName() == null && getServiceLocalName() != null) { answer.setServiceName(new QName(getServiceNamespace(), getServiceLocalName())); } if (answer.getEndpointName() == null && getEndpointLocalName() != null) { answer.setEndpointName(new QName(getEndpointNamespace(), getEndpointLocalName())); } if (cls == null) { checkName(answer.getEndpointName(), "endpoint/port name"); checkName(answer.getServiceName(), "service name"); } return answer; } // Properties // ------------------------------------------------------------------------- public String getBeanId() { return beanId; } // this property will be set by spring public void setBeanId(String id) { this.beanId = id; } public void setServiceNamespace(String serviceNamespace) { QName qn = getServiceName(); if (qn == null) { setServiceName(new QName(serviceNamespace, "local")); } else { setServiceName(new QName(serviceNamespace, qn.getLocalPart())); } } public String getServiceNamespace() { QName qn = getServiceName(); if (qn == null) { return null; } return qn.getNamespaceURI(); } public void setServiceLocalName(String serviceLocalName) { QName qn = getServiceName(); if (qn == null) { setServiceName(new QName("", serviceLocalName)); } else { setServiceName(new QName(qn.getNamespaceURI(), serviceLocalName)); } } public String getServiceLocalName() { QName qn = getServiceName(); if (qn == null) { return null; } return qn.getLocalPart(); } public String getEndpointLocalName() { QName qn = getPortName(); if (qn == null) { return null; } return qn.getLocalPart(); } public void setEndpointLocalName(String endpointLocalName) { QName qn = getPortName(); if (qn == null) { setPortName(new QName("", endpointLocalName)); } else { setPortName(new QName(qn.getNamespaceURI(), endpointLocalName)); } } public void setEndpointNamespace(String endpointNamespace) { QName qn = getPortName(); if (qn == null) { setPortName(new QName(endpointNamespace, "local")); } else { setPortName(new QName(endpointNamespace, qn.getLocalPart())); } } public String getEndpointNamespace() { QName qn = getPortName(); if (qn == null) { return null; } return qn.getNamespaceURI(); } public void setApplicationContext(ApplicationContext ctx) throws BeansException { applicationContext = ctx; if (bus == null) { bus = BusWiringBeanFactoryPostProcessor.addDefaultBus(ctx); } } public ApplicationContext getApplicationContext() { return applicationContext; } }