blob: fa47c5158a02e66162e332b740cba5cf3f9e854e [file] [log] [blame]
/*
* 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;
}
}