blob: f638067ad1151a11fce9b684dcbf055bfa4b993b [file] [log] [blame]
/**
* 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 java.lang.reflect.Proxy;
import javax.xml.namespace.QName;
import org.apache.camel.CamelContext;
import org.apache.camel.component.cxf.spring.CxfEndpointBean;
import org.apache.camel.component.cxf.util.CxfEndpointUtils;
import org.apache.camel.spring.SpringCamelContext;
import org.apache.camel.util.ObjectHelper;
import org.apache.cxf.Bus;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
import org.apache.cxf.configuration.spring.ConfigurerImpl;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.springframework.context.ConfigurableApplicationContext;
/**
* Defines the <a href="http://camel.apache.org/cxf.html">CXF Endpoint</a>
*
* @version $Revision$
*/
public class CxfSpringEndpoint extends CxfEndpoint {
private CxfEndpointBean bean;
private String beanId;
private ConfigurerImpl configurer;
private String serviceNamespace;
private String serviceLocalName;
private String endpointLocalName;
private String endpointNamespace;
public CxfSpringEndpoint(CamelContext context, CxfEndpointBean bean) throws Exception {
super(bean.getAddress(), context);
init(bean);
}
public CxfSpringEndpoint(CxfComponent component, CxfEndpointBean bean) throws Exception {
super(bean.getAddress(), component);
init(bean);
}
private void init(CxfEndpointBean bean) throws Exception {
this.bean = bean;
// create configurer
configurer = new ConfigurerImpl(((SpringCamelContext)getCamelContext())
.getApplicationContext());
}
/**
*
* 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 = ClassLoaderUtils.loadClass(getServiceClass(), getClass());
} else {
answer = bean.getServiceClass();
}
return answer;
}
protected Bus doGetBus() {
return bean.getBus();
}
public CxfEndpointBean getBean() {
return bean;
}
// Package private methods
// -------------------------------------------------------------------------
/**
* Create a CXF Client
*/
@Override
Client createClient() throws Exception {
// get service class
Class<?> cls = getSEIClass();
ObjectHelper.notNull(cls, CxfConstants.SERVICE_CLASS);
// create client factory bean
ClientProxyFactoryBean factoryBean = createClientFactoryBean(cls);
// configure client factory bean by CXF configurer
configure(factoryBean);
// 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()));
}
return ((ClientProxy)Proxy.getInvocationHandler(factoryBean.create())).getClient();
}
/**
* Create a service factory bean
*/
@Override
ServerFactoryBean createServerFactoryBean() throws Exception {
// get service class
Class<?> cls = getSEIClass();
ObjectHelper.notNull(cls, CxfConstants.SERVICE_CLASS);
// create server factory bean
// Shouldn't use CxfEndpointUtils.getServerFactoryBean(cls) as it is for
// CxfSoapComponent
ServerFactoryBean answer = null;
if (CxfEndpointUtils.hasWebServiceAnnotation(cls)) {
answer = new JaxWsServerFactoryBean();
} else {
answer = new ServerFactoryBean();
}
// configure server factory bean by CXF configurer
configure(answer);
// 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()));
}
return answer;
}
void configure(Object beanInstance) {
// check the ApplicationContext states first , and call the refresh if necessary
if (((SpringCamelContext)getCamelContext()).getApplicationContext() instanceof ConfigurableApplicationContext) {
ConfigurableApplicationContext context = (ConfigurableApplicationContext)((SpringCamelContext)getCamelContext()).getApplicationContext();
if (!context.isActive()) {
context.refresh();
}
}
configurer.configureBean(beanId, beanInstance);
}
// 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) {
this.serviceNamespace = serviceNamespace;
}
public String getServiceNamespace() {
return serviceNamespace;
}
public void setServiceLocalName(String serviceLocalName) {
this.serviceLocalName = serviceLocalName;
}
public String getServiceLocalName() {
return serviceLocalName;
}
public String getEndpointLocalName() {
return endpointLocalName;
}
public void setEndpointLocalName(String endpointLocalName) {
this.endpointLocalName = endpointLocalName;
}
public void setEndpointNamespace(String endpointNamespace) {
this.endpointNamespace = endpointNamespace;
}
public String getEndpointNamespace() {
return endpointNamespace;
}
}