001 /** 002 * Copyright 2005-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.ksb.messaging.serviceexporters; 017 018 import org.apache.cxf.Bus; 019 import org.apache.cxf.aegis.databinding.AegisDatabinding; 020 import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor; 021 import org.apache.cxf.frontend.ServerFactoryBean; 022 import org.apache.cxf.interceptor.LoggingInInterceptor; 023 import org.apache.cxf.interceptor.LoggingOutInterceptor; 024 import org.apache.cxf.jaxws.JaxWsServerFactoryBean; 025 import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; 026 import org.apache.log4j.Logger; 027 import org.apache.ws.security.WSConstants; 028 import org.apache.ws.security.handler.WSHandlerConstants; 029 import org.kuali.rice.core.api.exception.RiceRuntimeException; 030 import org.kuali.rice.ksb.api.bus.ServiceDefinition; 031 import org.kuali.rice.ksb.api.bus.support.SoapServiceDefinition; 032 import org.kuali.rice.ksb.impl.cxf.interceptors.ImmutableCollectionsInInterceptor; 033 import org.kuali.rice.ksb.messaging.servicehandlers.BasicAuthenticationHandler; 034 import org.kuali.rice.ksb.security.soap.CXFWSS4JInInterceptor; 035 import org.kuali.rice.ksb.security.soap.CXFWSS4JOutInterceptor; 036 037 import java.util.HashMap; 038 import java.util.Map; 039 040 /** 041 * 042 * @author Kuali Rice Team (rice.collab@kuali.org) 043 */ 044 public class SOAPServiceExporter extends AbstractWebServiceExporter implements ServiceExporter { 045 046 static final Logger LOG = Logger.getLogger(SOAPServiceExporter.class); 047 048 public SOAPServiceExporter(SoapServiceDefinition serviceDefinition, Bus cxfBus) { 049 super(serviceDefinition, cxfBus); 050 } 051 052 /** 053 * This publishes the cxf service onto the cxf bus. 054 * 055 * @param serviceImpl 056 * @throws Exception 057 */ 058 @Override 059 public void publishService(ServiceDefinition serviceDefinition, Object serviceImpl, String address) { 060 ServerFactoryBean svrFactory; 061 062 SoapServiceDefinition soapServiceDefinition = (SoapServiceDefinition)serviceDefinition; 063 064 //Use the correct bean factory depending on pojo service or jaxws service 065 if (soapServiceDefinition.isJaxWsService()){ 066 LOG.info("Creating JaxWsService " + soapServiceDefinition.getServiceName()); 067 svrFactory = new JaxWsServerFactoryBean(); 068 } else { 069 svrFactory = new ServerFactoryBean(); 070 071 //JAXB Binding not supported for pojo service (CXF-897) 072 svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding()); 073 } 074 075 svrFactory.setBus(getCXFBus()); 076 svrFactory.setServiceName(soapServiceDefinition.getServiceName()); 077 svrFactory.setAddress(address); 078 svrFactory.setPublishedEndpointUrl(soapServiceDefinition.getEndpointUrl().toExternalForm()); 079 svrFactory.setServiceBean(serviceImpl); 080 081 try { 082 svrFactory.setServiceClass(Class.forName(soapServiceDefinition.getServiceInterface())); 083 } catch (ClassNotFoundException e) { 084 throw new RiceRuntimeException("Failed to publish service " + soapServiceDefinition.getServiceName() + " because service interface could not be loaded: " + soapServiceDefinition.getServiceInterface(), e); 085 } 086 087 //Set logging and security interceptors 088 if (soapServiceDefinition.isBasicAuthentication()) { 089 Map<String, Object> properties = new HashMap<String, Object>(); 090 properties.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 091 properties.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); 092 BasicAuthenticationHandler authenticationHandler = new BasicAuthenticationHandler( 093 soapServiceDefinition.getServiceNameSpaceURI(), serviceDefinition.getServiceName()); 094 properties.put(WSHandlerConstants.PW_CALLBACK_REF, authenticationHandler); 095 svrFactory.getInInterceptors().add(new WSS4JInInterceptor(properties)); 096 svrFactory.getInInterceptors().add(new SAAJInInterceptor()); 097 } else { 098 svrFactory.getInInterceptors().add(new CXFWSS4JInInterceptor(soapServiceDefinition.getBusSecurity())); 099 svrFactory.getOutInterceptors().add(new CXFWSS4JOutInterceptor(soapServiceDefinition.getBusSecurity())); 100 svrFactory.getInFaultInterceptors().add(new CXFWSS4JInInterceptor(soapServiceDefinition.getBusSecurity())); 101 svrFactory.getOutFaultInterceptors().add(new CXFWSS4JOutInterceptor(soapServiceDefinition.getBusSecurity())); 102 } 103 104 svrFactory.getInInterceptors().add(new LoggingInInterceptor()); 105 svrFactory.getInInterceptors().add(new ImmutableCollectionsInInterceptor()); 106 107 svrFactory.getOutInterceptors().add(new LoggingOutInterceptor()); 108 109 svrFactory.create(); 110 } 111 112 }