fix: (vNet) class load issues for OSGi bundle.

Problem.
1. Inside incubator package, class loader can't search classes defined
   in the other bundles such as onos-core

Solution
1. Added a method to return bundle context, and obtain class loader.

Change-Id: If5ee4cb1a5b9ef5ab7d7e3bbc70408ea8257baea
This commit is contained in:
Yoonseon Han 2017-03-07 14:08:01 +09:00
parent 0932ac5e56
commit b14461bf48
11 changed files with 43 additions and 57 deletions

View File

@ -29,9 +29,7 @@ import org.onosproject.incubator.net.virtual.VnetService;
*/
public abstract class AbstractVirtualListenerManager
<E extends Event, L extends EventListener<E>>
implements ListenerService<E, L>, VnetService {
private static final String NETWORK_NULL = "Network ID cannot be null";
implements ListenerService<E, L>, VnetService {
protected final NetworkId networkId;
protected final VirtualNetworkService manager;
@ -39,29 +37,34 @@ public abstract class AbstractVirtualListenerManager
protected EventDeliveryService eventDispatcher;
VirtualListenerRegistryManager listenerManager =
private VirtualListenerRegistryManager listenerManager =
VirtualListenerRegistryManager.getInstance();
private Class<? extends Event> eventClass;
public AbstractVirtualListenerManager(VirtualNetworkService manager,
NetworkId networkId) {
NetworkId networkId,
Class<? extends Event> eventClass) {
this.manager = manager;
this.networkId = networkId;
this.serviceDirectory = manager.getServiceDirectory();
this.eventClass = eventClass;
//Set default event delivery service by default
this.eventDispatcher = serviceDirectory.get(EventDeliveryService.class);
}
@Override
@SuppressWarnings("unchecked")
public void addListener(L listener) {
listenerManager.getRegistry(networkId, getEventClass())
.addListener(listener);
listenerManager.getRegistry(networkId, eventClass).addListener(listener);
}
@Override
@SuppressWarnings("unchecked")
public void removeListener(L listener) {
listenerManager.getRegistry(networkId, getEventClass())
.removeListener(listener);
listenerManager.getRegistry(networkId, eventClass).removeListener(listener);
}
/**
@ -83,23 +86,4 @@ public abstract class AbstractVirtualListenerManager
public NetworkId networkId() {
return this.networkId;
}
/**
* Returns the class type of parameter type.
* More specifically, it returns the class type of event class.
*
* @return the class type of provider service of the service
*/
public Class getEventClass() {
String className = this.getClass().getGenericSuperclass().toString();
String pramType = className.split("<")[1].split(",")[0];
try {
return Class.forName(pramType);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -72,8 +72,10 @@ public final class VirtualListenerRegistryManager
ListenerRegistry listenerRegistry =
listenerMapByNetwork.get(networkId).get(originalEvent.getClass());
listenerRegistry.process(originalEvent);
lastStart = listenerRegistry;
if (listenerRegistry != null) {
listenerRegistry.process(originalEvent);
lastStart = listenerRegistry;
}
}
@Override

View File

@ -38,6 +38,7 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
import org.onosproject.incubator.net.virtual.VirtualNetworkService;
import org.onosproject.incubator.net.virtual.VirtualPort;
import org.onosproject.net.DeviceId;
import org.osgi.framework.BundleContext;
import java.util.ArrayList;
import java.util.List;
@ -52,24 +53,22 @@ import static org.junit.Assert.*;
*/
public class AbstractVirtualListenerManagerTest {
private VirtualNetworkService manager;
TestEventDispatcher dispatcher = new TestEventDispatcher();
VirtualListenerRegistryManager listenerRegistryManager =
private TestEventDispatcher dispatcher = new TestEventDispatcher();
private VirtualListenerRegistryManager listenerRegistryManager =
VirtualListenerRegistryManager.getInstance();
PrickleManager prickleManager;
PrickleListener prickleListener;
private PrickleManager prickleManager;
private PrickleListener prickleListener;
GooManager gooManager;
GooListener gooListener;
private GooManager gooManager;
private GooListener gooListener;
BarManager barManager;
BarListener barListener;
private BarManager barManager;
private BarListener barListener;
@Before
public void setUp() {
manager = new TestVirtualNetworkManager();
VirtualNetworkService manager = new TestVirtualNetworkManager();
dispatcher.addSink(VirtualEvent.class, listenerRegistryManager);
@ -153,25 +152,25 @@ public class AbstractVirtualListenerManagerTest {
private enum Type { FOO }
private static class Thing extends AbstractEvent<Type, String> {
protected Thing(String subject) {
private Thing(String subject) {
super(Type.FOO, subject);
}
}
private static class Prickle extends Thing {
protected Prickle(String subject) {
private Prickle(String subject) {
super(subject);
}
}
private static class Goo extends Thing {
protected Goo(String subject) {
private Goo(String subject) {
super(subject);
}
}
private static class Bar extends Thing {
protected Bar(String subject) {
private Bar(String subject) {
super(subject);
}
}
@ -198,19 +197,19 @@ public class AbstractVirtualListenerManagerTest {
private class PrickleManager extends AbstractVirtualListenerManager<Prickle, PrickleListener> {
public PrickleManager(VirtualNetworkService service, NetworkId networkId) {
super(service, networkId);
super(service, networkId, Prickle.class);
}
}
private class GooManager extends AbstractVirtualListenerManager<Goo, GooListener> {
public GooManager(VirtualNetworkService service, NetworkId networkId) {
super(service, networkId);
super(service, networkId, Goo.class);
}
}
private class BarManager extends AbstractVirtualListenerManager<Bar, BarListener> {
public BarManager(VirtualNetworkService service, NetworkId networkId) {
super(service, networkId);
super(service, networkId, Bar.class);
}
}

View File

@ -61,7 +61,7 @@ public class VirtualNetworkDeviceManager
*/
public VirtualNetworkDeviceManager(VirtualNetworkService virtualNetworkManager,
NetworkId networkId) {
super(virtualNetworkManager, networkId);
super(virtualNetworkManager, networkId, DeviceEvent.class);
manager.addListener(virtualNetworkListener);
}

View File

@ -112,7 +112,7 @@ public class VirtualNetworkFlowRuleManager
*/
public VirtualNetworkFlowRuleManager(VirtualNetworkService virtualNetworkManager,
NetworkId networkId) {
super(virtualNetworkManager, networkId);
super(virtualNetworkManager, networkId, FlowRuleEvent.class);
store = serviceDirectory.get(VirtualNetworkFlowRuleStore.class);

View File

@ -67,7 +67,7 @@ public class VirtualNetworkGroupManager
private boolean purgeOnDisconnection = false;
public VirtualNetworkGroupManager(VirtualNetworkService manager, NetworkId networkId) {
super(manager, networkId);
super(manager, networkId, GroupEvent.class);
store = serviceDirectory.get(VirtualNetworkGroupStore.class);
deviceService = manager.get(networkId, DeviceService.class);

View File

@ -57,7 +57,7 @@ public class VirtualNetworkHostManager
*/
public VirtualNetworkHostManager(VirtualNetworkService virtualNetworkManager,
NetworkId networkId) {
super(virtualNetworkManager, networkId);
super(virtualNetworkManager, networkId, HostEvent.class);
}

View File

@ -75,7 +75,7 @@ public class VirtualNetworkIntentManager
public VirtualNetworkIntentManager(VirtualNetworkService virtualNetworkManager,
NetworkId networkId) {
super(virtualNetworkManager, networkId);
super(virtualNetworkManager, networkId, IntentEvent.class);
this.store = serviceDirectory.get(VirtualNetworkStore.class);
this.intentService = serviceDirectory.get(IntentService.class);

View File

@ -51,7 +51,7 @@ public class VirtualNetworkLinkManager
*/
public VirtualNetworkLinkManager(VirtualNetworkService virtualNetworkManager,
NetworkId networkId) {
super(virtualNetworkManager, networkId);
super(virtualNetworkManager, networkId, LinkEvent.class);
}
@Override

View File

@ -142,10 +142,10 @@ public class VirtualNetworkManager
@Activate
public void activate() {
store.setDelegate(delegate);
eventDispatcher.addSink(VirtualNetworkEvent.class, listenerRegistry);
eventDispatcher.addSink(VirtualEvent.class,
VirtualListenerRegistryManager.getInstance());
store.setDelegate(delegate);
intentService.addListener(intentListener);
appId = coreService.registerApplication(VIRTUAL_NETWORK_APP_ID_STRING);
log.info("Started");
@ -364,6 +364,7 @@ public class VirtualNetworkManager
private final Map<ServiceKey, VnetService> networkServices = Maps.newConcurrentMap();
@Override
@SuppressWarnings("unchecked")
public <T> T get(NetworkId networkId, Class<T> serviceClass) {
checkNotNull(networkId, NETWORK_NULL);
ServiceKey serviceKey = networkServiceKey(networkId, serviceClass);
@ -453,7 +454,7 @@ public class VirtualNetworkManager
* @param networkId network identifier
* @param serviceClass service class
*/
public ServiceKey(NetworkId networkId, Class serviceClass) {
ServiceKey(NetworkId networkId, Class serviceClass) {
checkNotNull(networkId, NETWORK_NULL);
this.networkId = networkId;

View File

@ -68,7 +68,7 @@ public class VirtualNetworkTopologyManager
*/
public VirtualNetworkTopologyManager(VirtualNetworkService virtualNetworkManager,
NetworkId networkId) {
super(virtualNetworkManager, networkId);
super(virtualNetworkManager, networkId, TopologyEvent.class);
}
@Override