001    /*
002     * Copyright 2005-2007 The Kuali Foundation
003     *
004     *
005     * Licensed under the Educational Community License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     * http://www.opensource.org/licenses/ecl2.php
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.kuali.rice.ksb.messaging.serviceexporters;
018    
019    import java.util.List;
020    
021    import org.apache.cxf.Bus;
022    import org.apache.cxf.binding.BindingFactoryManager;
023    import org.apache.cxf.endpoint.ServerRegistry;
024    import org.apache.cxf.interceptor.LoggingInInterceptor;
025    import org.apache.cxf.interceptor.LoggingOutInterceptor;
026    import org.apache.cxf.jaxrs.JAXRSBindingFactory;
027    import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
028    import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
029    import org.apache.log4j.Logger;
030    import org.kuali.rice.core.api.exception.RiceRuntimeException;
031    import org.kuali.rice.ksb.api.bus.ServiceDefinition;
032    import org.kuali.rice.ksb.api.bus.support.RestServiceDefinition;
033    
034    
035    /**
036     * ServiceExporter for RESTful services.  This class handles the service binding and exposure via CXF.
037     * @author Kuali Rice Team (rice.collab@kuali.org)
038     */
039    public class RESTServiceExporter extends AbstractWebServiceExporter implements ServiceExporter {
040    
041            private static final Logger LOG = Logger.getLogger(RESTServiceExporter.class);
042    
043            public RESTServiceExporter(RestServiceDefinition serviceDefinition, Bus cxfBus, ServerRegistry cxfServerRegistry) {
044                    super(serviceDefinition, cxfBus, cxfServerRegistry);
045            }
046    
047            /**
048             * This publishes the cxf service onto the cxf bus.
049             *
050             * @param serviceImpl
051             * @throws Exception
052             */
053            @Override
054            public void publishService(ServiceDefinition serviceDefinition, Object serviceImpl, String address) {
055                    RestServiceDefinition restServiceDef = (RestServiceDefinition)serviceDefinition;
056    
057                    LOG.info("Creating JAXRSService " + restServiceDef.getServiceName());
058                    JAXRSServerFactoryBean svrFactory = new JAXRSServerFactoryBean();
059            svrFactory.setBus(getCXFBus());
060    
061            List<Object> resources = restServiceDef.getResources();
062            if (resources != null && !resources.isEmpty()) {
063                    svrFactory.setServiceBeans(resources);
064            } else {
065                    try {
066                            Class<?> resourceClass = this.getClass().getClassLoader().loadClass(restServiceDef.getResourceClass());
067                            svrFactory.setResourceClasses(resourceClass);
068                            svrFactory.setResourceProvider(resourceClass, new SingletonResourceProvider(serviceImpl));
069                    } catch (ClassNotFoundException e) {
070                            throw new RiceRuntimeException("Failed to publish the service because resource class could not be loaded: " + restServiceDef.getResourceClass(), e);
071                    }
072            }
073    
074            svrFactory.setServiceName(restServiceDef.getServiceName());
075            svrFactory.setAddress(address);
076            svrFactory.setExtensionMappings(restServiceDef.getExtensionMappings());
077            svrFactory.setLanguageMappings(restServiceDef.getLanguageMappings());
078    
079            List<Object> providers = restServiceDef.getProviders();
080            if (providers != null) {
081                    svrFactory.setProviders(providers);
082            }
083    
084            BindingFactoryManager bindingFactoryManager = getCXFBus().getExtension(BindingFactoryManager.class);
085            JAXRSBindingFactory bindingFactory = new JAXRSBindingFactory();
086            bindingFactory.setBus(getCXFBus());
087            bindingFactoryManager.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, bindingFactory);
088    
089                    //Set logging interceptors
090            if (LOG.isDebugEnabled()) {
091                    svrFactory.getInInterceptors().add(new LoggingInInterceptor());
092            }
093    //        svrFactory.getInInterceptors().add(new RESTConnector.VerifyingInInterceptor());
094            if (LOG.isDebugEnabled()) {
095                    svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
096            }
097    //              svrFactory.getOutInterceptors().add(new RESTConnector.SigningOutInterceptor());
098    
099            svrFactory.setPublishedEndpointUrl(restServiceDef.getEndpointUrl().toExternalForm());
100                    svrFactory.create();
101            }
102    
103    }