/* * Copyright 2004,2005 The Apache Software Foundation. * * Licensed 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.axis2.osgi.deployment.tracker; import org.osgi.framework.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.axis2.engine.MessageReceiver; import org.apache.axis2.description.WSDL2Constants; import org.apache.axis2.description.AxisService; import org.apache.axis2.AxisFault; import org.apache.axis2.osgi.deployment.BundleClassLoader; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver; import org.apache.axis2.rpc.receivers.RPCMessageReceiver; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; /** * WSTracker will listen to registered services and expose them as Web Services (AxisService) * if and only if the attached Directory object contains the name/value pair "org.apache.axis2.ws". * In addition to this WSTracker uses different name/value pairs to manipulate AxisService as required. */ public class WSTracker { private boolean open; private final Lock lock = new ReentrantLock(); private BundleContext context; private ServiceListener serviceListener; private static Log log = LogFactory.getLog(WSTracker.class); private List<Bundle> bundleList = new ArrayList<Bundle>(); public static String AXIS2_WS = "org.apache.axis2.osgi.ws"; private ConfigurationContext configCtx; public WSTracker(ConfigurationContext configCtx, BundleContext context) { this.context = context; this.configCtx = configCtx; this.serviceListener = new ServiceListener() { public void serviceChanged(ServiceEvent event) { int serviceType = event.getType(); try { switch (serviceType) { case ServiceEvent.REGISTERED: ServiceReference reference = event.getServiceReference(); createWS(reference.getBundle(), event.getServiceReference()); break; case ServiceEvent.UNREGISTERING: //TODO remove web service break; } } catch (AxisFault e) { String msg = "Error while creating AxisService"; log.error(msg, e); } } }; } public void open() { if (open) { return; } open = true; for (Bundle bundle : context.getBundles()) { if (bundle != context.getBundle()) { ServiceReference[] references = bundle.getRegisteredServices(); try { createWS(bundle, references); } catch (AxisFault e) { String msg = "Error while creating AxisService from bundle : " + bundle.getBundleId(); log.error(msg, e); } bundleList.add(bundle); } } context.addServiceListener(serviceListener); } /** * ServiceReferece will be used to create the web service based on Directory objects. * * @param bundle; associated bundle to obtain meta information * @param references; ServiceReferences array * @throws org.apache.axis2.AxisFault will be thrown */ private void createWS(Bundle bundle, ServiceReference[] references) throws AxisFault { if (bundle != null && references != null) { for (ServiceReference reference : references) { createWS(bundle, reference); } } } /** * TODO: This method need more modifications * * @param bundle bundle * @param reference reference * @throws AxisFault will be thrown */ private void createWS(Bundle bundle, ServiceReference reference) throws AxisFault { if (bundle != null && reference != null) { Object axis2Ws = reference.getProperty(AXIS2_WS); if (axis2Ws == null) { return; } String wsName = axis2Ws.toString(); lock.lock(); try { Object service = context.getService(reference); AxisService axisService = AxisService.createService( service.getClass().getName(), configCtx.getAxisConfiguration(), createDefaultMessageReceivers(), null, null, new BundleClassLoader(bundle, WSTracker.class.getClassLoader())); axisService.setName(wsName); configCtx.getAxisConfiguration().addService(axisService); log.info("Added new WS from ServiceReference : " + service.getClass().getName()); } finally { lock.unlock(); } } } private Map createDefaultMessageReceivers() throws AxisFault { Map<String, MessageReceiver> messageReciverMap = new HashMap<String, MessageReceiver>(); try { MessageReceiver messageReceiver = RPCInOnlyMessageReceiver.class.newInstance(); messageReciverMap.put(WSDL2Constants.MEP_URI_IN_ONLY, messageReceiver); MessageReceiver inOutmessageReceiver = RPCMessageReceiver.class.newInstance(); messageReciverMap.put(WSDL2Constants.MEP_URI_IN_OUT, inOutmessageReceiver); messageReciverMap.put(WSDL2Constants.MEP_URI_ROBUST_IN_ONLY, inOutmessageReceiver); } catch (InstantiationException e) { String msg = "Message receivers cannot be instantiated"; log.error(msg, e); throw new AxisFault(msg, e); } catch (IllegalAccessException e) { String msg = "Illegal access"; log.error(msg, e); throw new AxisFault(msg, e); } return messageReciverMap; } }