From 39820d64e08adb79530b03a000daeaab44f5761c Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 8 Apr 2015 14:40:25 +0200 Subject: [PATCH] Removed unused implementation code from Binding MD-SAL. Change-Id: I9da77e3bb10b70dba1d97429f06cde31831d62d5 Signed-off-by: Tony Tkacik --- .../codegen/RpcIsNotRoutedException.java | 29 -- .../binding/codegen/RuntimeCodeGenerator.java | 92 ------ .../binding/codegen/RuntimeCodeHelper.java | 95 ------ .../codegen/RuntimeCodeSpecification.java | 57 ---- .../impl/AbstractRuntimeCodeGenerator.java | 192 ------------ .../impl/DefaultRuntimeCodeGenerator.java | 286 ------------------ .../sal/binding/codegen/impl/RpcMetadata.java | 95 ------ .../impl/RpcRouterCodegenInstance.java | 216 ------------- .../codegen/impl/RpcRoutingTableImpl.java | 154 ---------- .../codegen/impl/RpcServiceMetadata.java | 39 --- .../codegen/impl/RuntimeGeneratedInvoker.java | 88 ------ .../RuntimeGeneratedInvokerPrototype.java | 66 ---- .../binding/codegen/impl/SingletonHolder.java | 2 - .../sal/binding/impl/DataBrokerImpl.java | 179 ----------- .../sal/binding/impl/DataTransactionImpl.java | 40 --- .../binding/impl/RpcProviderRegistryImpl.java | 279 ----------------- .../sal/binding/impl/RpcProxyContext.java | 41 --- .../util/BindingAwareDataReaderRouter.java | 19 -- .../spi/NotificationInvokerFactory.java | 30 -- .../impl/test/RpcProviderRegistryTest.java | 107 ------- .../impl/DefaultRuntimeCodeGeneratorTest.java | 271 ----------------- .../codegen/impl/SingletonHolderTest.java | 56 ---- 22 files changed, 2433 deletions(-) delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RpcIsNotRoutedException.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeHelper.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeSpecification.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGenerator.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcMetadata.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcServiceMetadata.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvoker.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvokerPrototype.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProxyContext.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/BindingAwareDataReaderRouter.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/NotificationInvokerFactory.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGeneratorTest.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolderTest.java diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RpcIsNotRoutedException.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RpcIsNotRoutedException.java deleted file mode 100644 index 5317324ee5..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RpcIsNotRoutedException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen; - -import com.google.common.base.Preconditions; - -/** - * Exception is raised when supplied Bidning Aware - * RPCService class is not routed and was used in context - * where routed RPCs should only be used. - * - */ -public class RpcIsNotRoutedException extends IllegalStateException { - - private static final long serialVersionUID = 1L; - - public RpcIsNotRoutedException(final String message, final Throwable cause) { - super(Preconditions.checkNotNull(message), cause); - } - - public RpcIsNotRoutedException(final String message) { - super(Preconditions.checkNotNull(message)); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java deleted file mode 100644 index c7c5f10f71..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen; - -import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory; -import org.opendaylight.yangtools.yang.binding.RpcService; - -public interface RuntimeCodeGenerator { - - /** - * Returns an instance of provided RpcService type which delegates all calls - * to the delegate. - * - *

- * Returned instance: - *

- * - * @param serviceType - * - Subclass of RpcService for which direct proxy is to be - * generated. - * @return Instance of RpcService of provided serviceType which implements - * and {@link org.opendaylight.controller.sal.binding.spi.DelegateProxy} - * @throws IllegalArgumentException - * - */ - T getDirectProxyFor(Class serviceType) throws IllegalArgumentException; - - /** - * Returns an instance of provided RpcService type which routes all calls to - * other instances selected on particular input field. - * - *

- * Returned instance: - *

    - *
  • Implements: - *
      - *
    • {@link org.opendaylight.controller.sal.binding.spi.DelegateProxy} - *
    • {@link RpcRouter} - *
    - *
  • - * routes all invocations of methods, which are defined in RpcService - * subtype based on method arguments and routing information defined in the - * RpcRoutingTables for this instance - * {@link RpcRouter#getRoutingTable(Class)}. - *
      - *
    • - * Implementation uses - * {@link RpcRouter#getService(Class, org.opendaylight.yangtools.yang.binding.InstanceIdentifier)} method to - * retrieve particular instance to which call will be routed. - *
    • - * Instance of {@link org.opendaylight.yangtools.yang.binding.InstanceIdentifier} is determined by first argument of - * method and is retrieved via method which is annotated with - * {@link org.opendaylight.yangtools.yang.binding.annotations.RoutingContext}. - * Class representing Routing Context Identifier is retrieved by a - * {@link org.opendaylight.yangtools.yang.binding.annotations.RoutingContext}. - *
    • If first argument is not defined / {@link org.opendaylight.yangtools.yang.binding.annotations.RoutingContext} annotation - * is not present on any field invocation will be delegated to default - * service {@link RpcRouter#getDefaultService()}. - *
    - * - * @param serviceType - * - Subclass of RpcService for which Router is to be generated. - * @return Instance of RpcService of provided serviceType which implements - * also {@link RpcRouter} and {@link org.opendaylight.controller.sal.binding.spi.DelegateProxy} - * @throws RpcIsNotRoutedException - */ - RpcRouter getRouterFor(Class serviceType,String name) throws IllegalArgumentException, RpcIsNotRoutedException; - - NotificationInvokerFactory getInvokerFactory(); -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeHelper.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeHelper.java deleted file mode 100644 index ae90a7739e..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeHelper.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen; - -import java.lang.reflect.Field; -import java.util.Map; - -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.RpcService; - -public final class RuntimeCodeHelper { - private RuntimeCodeHelper() { - throw new UnsupportedOperationException("Utility class should never be instantiated"); - } - - private static Field getField(final Class cls, final String name) { - try { - return cls.getField(name); - } catch (NoSuchFieldException e) { - throw new IllegalArgumentException( - String.format("Class %s is missing field %s", cls, name), e); - } catch (SecurityException e) { - throw new IllegalStateException(String.format("Failed to examine class %s", cls), e); - } - } - - private static Field getDelegateField(final Class cls) { - return getField(cls, RuntimeCodeSpecification.DELEGATE_FIELD); - } - - private static Object getFieldValue(final Field field, final Object obj) { - try { - return field.get(obj); - } catch (IllegalAccessException e) { - throw new IllegalStateException(String.format("Failed to get field %s of object %s", field, obj), e); - } - } - - private static void setFieldValue(final Field field, final Object obj, final Object value) { - try { - field.set(obj, value); - } catch (IllegalAccessException e) { - throw new IllegalStateException(String.format("Failed to set field %s to %s", field, value), e); - } - } - - /** - * Helper method to return delegate from ManagedDirectedProxy with use of reflection. - * - * Note: This method uses reflection, but access to delegate field should be - * avoided and called only if necessary. - */ - @SuppressWarnings("unchecked") - public static T getDelegate(final RpcService proxy) { - return (T)getFieldValue(getDelegateField(proxy.getClass()), proxy); - } - - /** - * Helper method to set delegate to ManagedDirectedProxy with use of reflection. - * - * Note: This method uses reflection, but setting delegate field should not occur too much - * to introduce any significant performance hits. - */ - public static void setDelegate(final Object proxy, final Object delegate) { - final Field field = getDelegateField(proxy.getClass()); - - if (delegate != null) { - final Class ft = field.getType(); - if (!ft.isAssignableFrom(delegate.getClass())) { - throw new IllegalArgumentException( - String.format("Field %s type %s is not compatible with delegate type %s", - field, ft, delegate.getClass())); - } - } - - setFieldValue(field, proxy, delegate); - } - - @SuppressWarnings("unchecked") - public static Map,? extends RpcService> getRoutingTable(final RpcService target, final Class tableClass) { - final Field field = getField(target.getClass(), RuntimeCodeSpecification.getRoutingTableField(tableClass)); - return (Map,? extends RpcService>) getFieldValue(field, target); - } - - public static void setRoutingTable(final RpcService target, final Class tableClass, final Map,? extends RpcService> routingTable) { - final Field field = getField(target.getClass(), RuntimeCodeSpecification.getRoutingTableField(tableClass)); - setFieldValue(field, target, routingTable); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeSpecification.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeSpecification.java deleted file mode 100644 index 22b6f6f1c7..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeSpecification.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen; - -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.NotificationListener; -import org.opendaylight.yangtools.yang.binding.RpcService; - -public final class RuntimeCodeSpecification { - public final static String DIRECT_PROXY_SUFFIX = "DirectProxy"; - public final static String INVOKER_SUFFIX = "ListenerInvoker"; - public final static String ROUTER_SUFFIX = "Router"; - - public final static String DELEGATE_FIELD = "_delegate"; - public final static String ROUTING_TABLE_FIELD_PREFIX = "_routes_"; - - private RuntimeCodeSpecification() { - throw new UnsupportedOperationException("Utility class"); - } - - /** - * Returns a name for generated interface - */ - private static String getGeneratedName(final Class cls, final String suffix) { - return cls.getName() + "$$Broker$" + suffix; - } - - public static String getInvokerName(final Class listener) { - return getGeneratedName(listener, RuntimeCodeSpecification.INVOKER_SUFFIX); - } - - /** - * Returns a name for DirectProxy implementation - */ - public static String getDirectProxyName(final Class base) { - return getGeneratedName(base, RuntimeCodeSpecification.DIRECT_PROXY_SUFFIX); - } - - /** - * Returns a name for Router implementation - */ - public static String getRouterName(final Class base) { - return getGeneratedName(base, RuntimeCodeSpecification.ROUTER_SUFFIX); - } - - /** - * Returns a field name for specified routing context - */ - public static String getRoutingTableField(final Class routingContext) { - return "_routes_" + routingContext.getSimpleName(); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java deleted file mode 100644 index 6c02001fec..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import java.util.Map; -import java.util.WeakHashMap; -import javassist.ClassPool; -import javassist.CtClass; -import javassist.CtMethod; -import javassist.NotFoundException; -import javax.annotation.concurrent.GuardedBy; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; -import org.opendaylight.controller.sal.binding.codegen.RpcIsNotRoutedException; -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory; -import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils; -import org.opendaylight.yangtools.util.ClassLoaderUtils; -import org.opendaylight.yangtools.yang.binding.BindingMapping; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.NotificationListener; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; - -abstract class AbstractRuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator, NotificationInvokerFactory { - @GuardedBy("this") - private final Map, RuntimeGeneratedInvokerPrototype> invokerClasses = new WeakHashMap<>(); - private final CtClass brokerNotificationListener; - protected final JavassistUtils utils; - - protected AbstractRuntimeCodeGenerator(final ClassPool pool) { - utils = JavassistUtils.forClassPool(pool); - - /* - * Make sure Javassist ClassPool sees the classloader of RpcService - */ - utils.ensureClassLoader(RpcService.class); - - brokerNotificationListener = utils.asCtClass(org.opendaylight.controller.sal.binding.api.NotificationListener.class); - } - - protected final CtClass getBrokerNotificationListener() { - return brokerNotificationListener; - } - - protected abstract RuntimeGeneratedInvokerPrototype generateListenerInvoker(Class cls); - protected abstract Supplier directProxySupplier(final Class serviceType); - protected abstract Supplier routerSupplier(final Class serviceType, RpcServiceMetadata metadata); - - private RpcServiceMetadata getRpcMetadata(final CtClass iface) throws ClassNotFoundException, NotFoundException, RpcIsNotRoutedException { - final RpcServiceMetadata metadata = new RpcServiceMetadata(); - - for (CtMethod method : iface.getMethods()) { - if (isRpcMethodWithInput(iface, method)) { - final RpcMetadata routingPair = getRpcMetadata(method); - if (routingPair != null) { - metadata.addContext(routingPair.getContext()); - metadata.addRpcMethod(method.getName(), routingPair); - - /* - * Force-load the RPC class representing the "input" of this RPC. - * - * FIXME: this is pre-existing side-effect of the original code, which - * kept a reference to the loaded class, but it did not use it. - * - * There was no explanation as to why forcing this load was - * necessary. As far as I can tell now is that it forces the - * resolution of method arguments, which would (according to - * my reading of JLS) occur only when the method is invoked via - * binding-aware class action, not when coming from - * binding-independent world. Whether that makes sense or not, - * remains to be investigated. - */ - Thread.currentThread().getContextClassLoader().loadClass(routingPair.getInputType().getName()); - } else { - throw new RpcIsNotRoutedException(String.format("RPC %s from %s is not routed", method.getName(), iface.getName())); - } - } - } - - return metadata; - } - - - private boolean isRpcMethodWithInput(final CtClass iface, final CtMethod method) throws NotFoundException { - if(iface.equals(method.getDeclaringClass()) - && method.getParameterTypes().length == 1) { - final CtClass onlyArg = method.getParameterTypes()[0]; - if(onlyArg.isInterface() && onlyArg.getName().endsWith(BindingMapping.RPC_INPUT_SUFFIX)) { - return true; - } - } - return false; - } - - private RpcMetadata getRpcMetadata(final CtMethod method) throws NotFoundException { - final CtClass inputClass = method.getParameterTypes()[0]; - return rpcMethodMetadata(inputClass, inputClass, method.getName()); - } - - private RpcMetadata rpcMethodMetadata(final CtClass dataClass, final CtClass inputClass, final String rpcMethod) throws NotFoundException { - for (CtMethod method : dataClass.getMethods()) { - if (method.getName().startsWith("get") && method.getParameterTypes().length == 0) { - for (Object annotation : method.getAvailableAnnotations()) { - if (annotation instanceof RoutingContext) { - boolean encapsulated = !method.getReturnType().equals(utils.asCtClass(InstanceIdentifier.class)); - return new RpcMetadata(rpcMethod, ((RoutingContext)annotation).value(), method, encapsulated, inputClass); - } - } - } - } - - for (CtClass iface : dataClass.getInterfaces()) { - final RpcMetadata ret = rpcMethodMetadata(iface, inputClass, rpcMethod); - if(ret != null) { - return ret; - } - } - return null; - } - - private synchronized RuntimeGeneratedInvokerPrototype resolveInvokerClass(final Class cls) { - RuntimeGeneratedInvokerPrototype invoker = invokerClasses.get(cls); - if (invoker != null) { - return invoker; - } - - synchronized (utils) { - invoker = ClassLoaderUtils.withClassLoader(cls.getClassLoader(), new Supplier() { - @Override - public RuntimeGeneratedInvokerPrototype get() { - return generateListenerInvoker(cls); - } - }); - } - - invokerClasses.put(cls, invoker); - return invoker; - } - - @Override - public final NotificationInvokerFactory getInvokerFactory() { - return this; - } - - @Override - public final T getDirectProxyFor(final Class serviceType) { - synchronized (utils) { - return ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), directProxySupplier(serviceType)); - } - } - - @Override - public final RpcRouter getRouterFor(final Class serviceType, final String name) throws RpcIsNotRoutedException { - final RpcServiceMetadata metadata = ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), new Supplier() { - @Override - public RpcServiceMetadata get() { - try { - return getRpcMetadata(utils.asCtClass(serviceType)); - } catch (ClassNotFoundException | NotFoundException e) { - throw new IllegalStateException(String.format("Failed to load metadata for class %s", serviceType), e); - } - } - }); - - if (Iterables.isEmpty(metadata.getContexts())) { - throw new RpcIsNotRoutedException("Service doesn't have routing context associated."); - } - - synchronized (utils) { - final T instance = ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), routerSupplier(serviceType, metadata)); - return new RpcRouterCodegenInstance(name, serviceType, instance, metadata.getContexts()); - } - } - - @Override - public NotificationInvoker invokerFor(final NotificationListener instance) { - final Class cls = instance.getClass(); - final RuntimeGeneratedInvokerPrototype prototype = resolveInvokerClass(cls); - - try { - return RuntimeGeneratedInvoker.create(instance, prototype); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException(String.format("Failed to create invoker for %s", instance), e); - } - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGenerator.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGenerator.java deleted file mode 100644 index dfa164b485..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGenerator.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; -import java.lang.reflect.Method; -import java.util.Map; -import javassist.CannotCompileException; -import javassist.ClassPool; -import javassist.CtClass; -import javassist.CtMethod; -import javassist.NotFoundException; -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeSpecification; -import org.opendaylight.yangtools.sal.binding.generator.util.ClassGenerator; -import org.opendaylight.yangtools.sal.binding.generator.util.MethodGenerator; -import org.opendaylight.yangtools.util.ClassLoaderUtils; -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.Notification; -import org.opendaylight.yangtools.yang.binding.NotificationListener; -import org.opendaylight.yangtools.yang.binding.RpcImplementation; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; - -final class DefaultRuntimeCodeGenerator extends AbstractRuntimeCodeGenerator { - - DefaultRuntimeCodeGenerator(final ClassPool pool) { - super(pool); - } - - @Override - protected Supplier directProxySupplier(final Class serviceType) { - return new Supplier() { - @SuppressWarnings("unchecked") - @Override - public T get() { - final String proxyName = RuntimeCodeSpecification.getDirectProxyName(serviceType); - - final Class potentialClass = ClassLoaderUtils.tryToLoadClassWithTCCL(proxyName); - if (potentialClass != null) { - try { - return (T)potentialClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException("Failed to instantiate class " + potentialClass.getName(), e); - } - } - - final CtClass supertype = utils.asCtClass(serviceType); - final String directProxyName = RuntimeCodeSpecification.getDirectProxyName(serviceType); - - final CtClass createdCls; - try { - createdCls = utils.createClass(directProxyName, supertype, new ClassGenerator() { - @Override - public void process(final CtClass cls) throws CannotCompileException { - utils.field(cls, RuntimeCodeSpecification.DELEGATE_FIELD, serviceType); - utils.implementsType(cls, utils.asCtClass(RpcImplementation.class)); - utils.implementMethodsFrom(cls, supertype, new MethodGenerator() { - @Override - public void process(final CtMethod method) throws CannotCompileException { - final StringBuilder sb = new StringBuilder("\n"); - sb.append("{\n"); - sb.append(" if (").append(RuntimeCodeSpecification.DELEGATE_FIELD).append(" == null) {\n"); - sb.append(" throw new java.lang.IllegalStateException(\"No default provider is available\");\n"); - sb.append(" }\n"); - sb.append(" return ($r) ").append(RuntimeCodeSpecification.DELEGATE_FIELD).append('.').append(method.getName()).append("($$);\n"); - sb.append("}\n"); - method.setBody(sb.toString()); - } - }); - - // FIXME: copy this one... - utils.implementMethodsFrom(cls, utils.asCtClass(RpcImplementation.class), new MethodGenerator() { - @Override - public void process(final CtMethod method) throws CannotCompileException { - final StringBuilder sb = new StringBuilder("\n"); - sb.append("{\n"); - sb.append(" throw new java.lang.IllegalStateException(\"No provider is processing supplied message\");\n"); - sb.append(" return ($r) null;\n"); - sb.append("}\n"); - method.setBody(sb.toString()); - } - }); - } - }); - } catch (CannotCompileException e) { - throw new IllegalStateException("Failed to create class " + directProxyName, e); - } - - final Class c; - try { - c = createdCls.toClass(serviceType.getClassLoader(), serviceType.getProtectionDomain()); - } catch (CannotCompileException e) { - throw new IllegalStateException(String.format("Failed to create class %s", createdCls), e); - } - - try { - return (T) c.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException(String.format("Failed to instantiated class %s", c), e); - } - } - }; - } - - @Override - protected Supplier routerSupplier(final Class serviceType, final RpcServiceMetadata metadata) { - return new Supplier() { - @SuppressWarnings("unchecked") - @Override - public T get() { - final CtClass supertype = utils.asCtClass(serviceType); - final String routerName = RuntimeCodeSpecification.getRouterName(serviceType); - final Class potentialClass = ClassLoaderUtils.tryToLoadClassWithTCCL(routerName); - if (potentialClass != null) { - try { - return (T)potentialClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException("Failed to instantiate class", e); - } - } - - final CtClass targetCls; - try { - targetCls = utils.createClass(routerName, supertype, new ClassGenerator() { - @Override - public void process(final CtClass cls) throws CannotCompileException { - utils.field(cls, RuntimeCodeSpecification.DELEGATE_FIELD, serviceType); - //utils.field(cls, REMOTE_INVOKER_FIELD,iface); - utils.implementsType(cls, utils.asCtClass(RpcImplementation.class)); - - for (final Class ctx : metadata.getContexts()) { - utils.field(cls, RuntimeCodeSpecification.getRoutingTableField(ctx), Map.class); - } - - utils.implementMethodsFrom(cls, supertype, new MethodGenerator() { - @Override - public void process(final CtMethod method) throws CannotCompileException { - final int ptl; - try { - ptl = method.getParameterTypes().length; - } catch (NotFoundException e) { - throw new CannotCompileException(e); - } - final StringBuilder sb = new StringBuilder(); - - switch (ptl) { - case 0: - sb.append("return ($r) ").append(RuntimeCodeSpecification.DELEGATE_FIELD).append('.').append(method.getName()).append("($$);"); - break; - case 1: - final RpcMetadata rpcMeta = metadata.getRpcMethod(method.getName()); - final String rtGetter = rpcMeta.getInputRouteGetter().getName(); - final String stName = supertype.getName(); - - sb.append('\n'); - sb.append("{\n"); - sb.append(" if ($1 == null) {\n"); - sb.append(" throw new IllegalArgumentException(\"RPC input must not be null and must contain a value for field ").append(rtGetter).append("\");\n"); - sb.append(" }\n"); - sb.append(" if ($1.").append(rtGetter).append("() == null) {\n"); - sb.append(" throw new IllegalArgumentException(\"Field ").append(rtGetter).append(" must not be null\");\n"); - sb.append(" }\n"); - - sb.append(" final org.opendaylight.yangtools.yang.binding.InstanceIdentifier identifier = $1.").append(rtGetter).append("()"); - if (rpcMeta.isRouteEncapsulated()) { - sb.append(".getValue()"); - } - sb.append(";\n"); - - sb.append(" ").append(supertype.getName()).append(" instance = (").append(stName).append(") ").append(RuntimeCodeSpecification.getRoutingTableField(rpcMeta.getContext())).append(".get(identifier);\n"); - sb.append(" if (instance == null) {\n"); - sb.append(" instance = ").append(RuntimeCodeSpecification.DELEGATE_FIELD).append(";\n"); - sb.append(" }\n"); - - sb.append(" if (instance == null) {\n"); - sb.append(" throw new java.lang.IllegalStateException(\"No routable provider is processing routed message for \" + String.valueOf(identifier));\n"); - sb.append(" }\n"); - sb.append(" return ($r) instance.").append(method.getName()).append("($$);\n"); - sb.append('}'); - break; - default: - throw new CannotCompileException(String.format("Unsupported parameters length %s", ptl)); - } - - method.setBody(sb.toString()); - } - }); - - // FIXME: move this into a template class - utils.implementMethodsFrom(cls, utils.asCtClass(RpcImplementation.class), new MethodGenerator() { - @Override - public void process(final CtMethod method) throws CannotCompileException { - final StringBuilder sb = new StringBuilder("\n"); - sb.append("{\n"); - sb.append(" throw new java.lang.IllegalStateException(\"No provider is processing supplied message\");\n"); - sb.append(" return ($r) null;\n"); - sb.append("}\n"); - - method.setBody(sb.toString()); - } - }); - } - }); - } catch (CannotCompileException e) { - throw new IllegalStateException("Failed to create class " + routerName, e); - } - - final Class c; - try { - c = targetCls.toClass(serviceType.getClassLoader(), serviceType.getProtectionDomain()); - } catch (CannotCompileException e) { - throw new IllegalStateException(String.format("Failed to compile class %s", targetCls), e); - } - - try { - return (T)c.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException(String.format("Failed to instantiate class %s", c), e); - } - } - }; - } - - @SuppressWarnings("unchecked") - @Override - protected RuntimeGeneratedInvokerPrototype generateListenerInvoker(final Class listenerType) { - final String invokerName = RuntimeCodeSpecification.getInvokerName(listenerType); - final CtClass targetCls; - - // Builder for a set of supported types. Filled while the target class is being generated - final Builder> b = ImmutableSet.builder(); - - try { - targetCls = utils.createClass(invokerName, getBrokerNotificationListener(), new ClassGenerator() { - @Override - public void process(final CtClass cls) throws CannotCompileException { - utils.field(cls, RuntimeCodeSpecification.DELEGATE_FIELD, listenerType); - utils.implementMethodsFrom(cls, getBrokerNotificationListener(), new MethodGenerator() { - @Override - public void process(final CtMethod method) throws CannotCompileException { - final StringBuilder sb = new StringBuilder("\n"); - - sb.append("{\n"); - - for (Method m : listenerType.getMethods()) { - if (BindingReflections.isNotificationCallback(m)) { - final Class argType = m.getParameterTypes()[0]; - - // populates builder above - b.add((Class) argType); - - sb.append(" if ($1 instanceof ").append(argType.getName()).append(") {\n"); - sb.append(" ").append(RuntimeCodeSpecification.DELEGATE_FIELD).append('.').append(m.getName()).append("((").append(argType.getName()).append(") $1);\n"); - sb.append(" return null;\n"); - sb.append(" } else "); - } - } - - sb.append(" return null;\n"); - sb.append("}\n"); - method.setBody(sb.toString()); - } - }); - } - }); - } catch (CannotCompileException e) { - throw new IllegalStateException("Failed to create class " + invokerName, e); - } - - final Class finalClass; - try { - finalClass = targetCls.toClass(listenerType.getClassLoader(), listenerType.getProtectionDomain()); - } catch (CannotCompileException e) { - throw new IllegalStateException(String.format("Failed to compile class %s", targetCls), e); - } - - return new RuntimeGeneratedInvokerPrototype(b.build(), (Class>) finalClass); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcMetadata.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcMetadata.java deleted file mode 100644 index 6f9f85f58a..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcMetadata.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import javassist.CtClass; -import javassist.CtMethod; - -import org.opendaylight.yangtools.yang.binding.BaseIdentity; - -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; - -final class RpcMetadata { - private final Class context; - private final CtMethod inputRouteGetter; - private final Boolean routeEncapsulated; - private final CtClass inputType; - private final String methodName; - - public Class getContext() { - return context; - } - - public CtMethod getInputRouteGetter() { - return inputRouteGetter; - } - - public CtClass getInputType() { - return inputType; - } - - public boolean isRouteEncapsulated() { - return routeEncapsulated; - } - - public RpcMetadata(final String methodName, final Class context, final CtMethod inputRouteGetter, final boolean routeEncapsulated, final CtClass inputType) { - this.inputRouteGetter = Preconditions.checkNotNull(inputRouteGetter); - this.methodName = Preconditions.checkNotNull(methodName); - this.inputType = Preconditions.checkNotNull(inputType); - this.context = Preconditions.checkNotNull(context); - this.routeEncapsulated = routeEncapsulated; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + methodName.hashCode(); - result = prime * result + context.hashCode(); - result = prime * result + inputRouteGetter.hashCode(); - result = prime * result + routeEncapsulated.hashCode(); - result = prime * result + inputType.hashCode(); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof RpcMetadata)) { - return false; - } - final RpcMetadata other = (RpcMetadata) obj; - if (!methodName.equals(other.methodName)) { - return false; - } - if (!context.equals(other.context)) { - return false; - } - if (!inputRouteGetter.equals(other.inputRouteGetter)) { - return false; - } - if (!routeEncapsulated.equals(other.routeEncapsulated)) { - return false; - } - return inputType.equals(other.inputType); - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("context", context) - .add("inputRouteGetter", inputRouteGetter) - .add("inputType", inputType) - .add("methodName", methodName) - .add("routeEncapsulated", routeEncapsulated) - .toString(); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java deleted file mode 100644 index d69aeed352..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import static org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper.setRoutingTable; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import javax.annotation.concurrent.GuardedBy; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChange; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRoutingTable; -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.util.ListenerRegistry; -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RpcRouterCodegenInstance implements // -RpcRouter, RouteChangeListener, InstanceIdentifier> { - - private static final Logger LOG = LoggerFactory.getLogger(RpcRouterCodegenInstance.class); - - private final Class serviceType; - - private final T invocationProxy; - - private final Set> contexts; - - private final ListenerRegistry, InstanceIdentifier>> listeners; - - private final Map, RpcRoutingTableImpl> routingTables; - - @SuppressWarnings("unchecked") - public RpcRouterCodegenInstance(final String name,final Class type, final T routerImpl, final Iterable> contexts) { - this.listeners = ListenerRegistry.create(); - this.serviceType = type; - this.invocationProxy = routerImpl; - this.contexts = ImmutableSet.copyOf(contexts); - Map, RpcRoutingTableImpl> mutableRoutingTables = new HashMap<>(); - for (Class ctx : contexts) { - RpcRoutingTableImpl table = new RpcRoutingTableImpl<>(name,ctx,type); - - @SuppressWarnings("rawtypes") - Map invokerView = table.getRoutes(); - - setRoutingTable(invocationProxy, ctx, invokerView); - mutableRoutingTables.put(ctx, table); - table.registerRouteChangeListener(this); - } - this.routingTables = ImmutableMap.copyOf(mutableRoutingTables); - } - - @Override - public Class getServiceType() { - return serviceType; - } - - @Override - public T getInvocationProxy() { - return invocationProxy; - } - - @Override - @SuppressWarnings("unchecked") - public RpcRoutingTable getRoutingTable(final Class routeContext) { - return (RpcRoutingTable) routingTables.get(routeContext); - } - - @Override - public T getDefaultService() { - return RuntimeCodeHelper.getDelegate(invocationProxy); - } - - @Override - public Set> getContexts() { - return contexts; - } - - @Override - public , InstanceIdentifier>> ListenerRegistration registerRouteChangeListener( - final L listener) { - return listeners.registerWithType(listener); - } - - @Override - public void onRouteChange(final RouteChange, InstanceIdentifier> change) { - for (ListenerRegistration, InstanceIdentifier>> listener : listeners) { - try { - listener.getInstance().onRouteChange(change); - } catch (Exception e) { - LOG.error("Error occured during invoker listener {}", listener.getInstance(), e); - } - } - } - - @Override - public T getService(final Class context, final InstanceIdentifier path) { - return routingTables.get(context).getRoute(path); - } - - @Override - public RoutedRpcRegistration addRoutedRpcImplementation(final T service) { - return new RoutedRpcRegistrationImpl(service); - } - - public void removeDefaultImplementation(final T instance) { - RpcService current = RuntimeCodeHelper.getDelegate(invocationProxy); - if(instance == current) { - RuntimeCodeHelper.setDelegate(invocationProxy, null); - } - } - - @Override - public RpcRegistration registerDefaultService(final T service) { - RuntimeCodeHelper.setDelegate(invocationProxy, service); - return new DefaultRpcImplementationRegistration(service); - } - - private final class RoutedRpcRegistrationImpl extends AbstractObjectRegistration implements RoutedRpcRegistration { - /* - * FIXME: retaining this collection is not completely efficient. We really should be storing - * a reference to this registration, as a particular listener may be registered multiple - * times -- and then this goes kaboom in various aspects. - */ - @GuardedBy("this") - private final Collection> contexts = new ArrayList<>(1); - - public RoutedRpcRegistrationImpl(final T instance) { - super(instance); - } - - @Override - public Class getServiceType() { - return serviceType; - } - - @Override - public synchronized void registerPath(final Class context, final InstanceIdentifier path) { - if (isClosed()) { - LOG.debug("Closed registration of {} ignoring new path {}", getInstance(), path); - return; - } - - routingTables.get(context).updateRoute(path, getInstance()); - contexts.add(context); - } - - @Override - public synchronized void unregisterPath(final Class context, final InstanceIdentifier path) { - if (isClosed()) { - LOG.debug("Closed unregistration of {} ignoring new path {}", getInstance(), path); - return; - } - - routingTables.get(context).removeRoute(path, getInstance()); - contexts.remove(context); - } - - @Deprecated - @Override - public void registerInstance(final Class context, final InstanceIdentifier instance) { - registerPath(context, instance); - } - - @Deprecated - @Override - public void unregisterInstance(final Class context, final InstanceIdentifier instance) { - unregisterPath(context, instance); - } - - @Override - protected synchronized void removeRegistration() { - for (Class ctx : contexts) { - routingTables.get(ctx).removeAllReferences(getInstance()); - } - contexts.clear(); - } - } - - private final class DefaultRpcImplementationRegistration extends AbstractObjectRegistration implements RpcRegistration { - - - protected DefaultRpcImplementationRegistration(final T instance) { - super(instance); - } - - @Override - protected void removeRegistration() { - removeDefaultImplementation(this.getInstance()); - } - - @Override - public Class getServiceType() { - return serviceType; - } - } - - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java deleted file mode 100644 index 78fa88bb1b..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher; -import org.opendaylight.controller.md.sal.common.impl.routing.RoutingUtils; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRoutingTable; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.concepts.Mutable; -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -final class RpcRoutingTableImpl implements - Mutable, // - RpcRoutingTable, // - RouteChangePublisher, InstanceIdentifier> { - - private static final Logger LOGGER = LoggerFactory.getLogger(RpcRoutingTableImpl.class); - private final String routerName; - private final Class serviceType; - - private final Class contextType; - private final ConcurrentMap, S> routes; - private final Map, S> unmodifiableRoutes; - - private RouteChangeListener, InstanceIdentifier> listener; - private S defaultRoute; - - public RpcRoutingTableImpl(final String routerName,final Class contextType, final Class serviceType) { - super(); - this.routerName = routerName; - this.serviceType = serviceType; - this.contextType = contextType; - this.routes = new ConcurrentHashMap<>(); - this.unmodifiableRoutes = Collections.unmodifiableMap(routes); - } - - @Override - public void setDefaultRoute(final S target) { - defaultRoute = target; - } - - @Override - public S getDefaultRoute() { - return defaultRoute; - } - - @Override - public , InstanceIdentifier>> ListenerRegistration registerRouteChangeListener( - final L listener) { - return new SingletonListenerRegistration(listener); - } - - @Override - public Class getIdentifier() { - return contextType; - } - - @Override - @SuppressWarnings("unchecked") - public void updateRoute(final InstanceIdentifier path, final S service) { - S previous = this.routes.put(path, service); - - LOGGER.debug("Route {} updated to {} in routing table {}",path,service,this); - @SuppressWarnings("rawtypes") - RouteChangeListener listenerCapture = listener; - if (previous == null && listenerCapture != null) { - listenerCapture.onRouteChange(RoutingUtils.announcementChange(contextType, path)); - } - } - - - @Override - @SuppressWarnings("unchecked") - public void removeRoute(final InstanceIdentifier path) { - S previous = this.routes.remove(path); - LOGGER.debug("Route {} to {} removed in routing table {}",path,previous,this); - @SuppressWarnings("rawtypes") - RouteChangeListener listenerCapture = listener; - if (previous != null && listenerCapture != null) { - listenerCapture.onRouteChange(RoutingUtils.removalChange(contextType, path)); - } - } - - void removeRoute(final InstanceIdentifier path, final S service) { - @SuppressWarnings("rawtypes") - RouteChangeListener listenerCapture = listener; - if (routes.remove(path, service) && listenerCapture != null) { - LOGGER.debug("Route {} to {} removed in routing table {}",path,service,this); - listenerCapture.onRouteChange(RoutingUtils.removalChange(contextType, path)); - } - } - - @Override - public S getRoute(final InstanceIdentifier nodeInstance) { - S route = routes.get(nodeInstance); - if (route != null) { - return route; - } - return getDefaultRoute(); - } - - @Override - public Map, S> getRoutes() { - return unmodifiableRoutes; - } - - void removeAllReferences(final S service) { - // FIXME: replace this via properly-synchronized BiMap (or something) - final Iterator it = routes.values().iterator(); - while (it.hasNext()) { - final S s = it.next(); - if (service.equals(s)) { - it.remove(); - } - } - } - - @Override - public String toString() { - return "RpcRoutingTableImpl [router=" + routerName + ", service=" + serviceType.getSimpleName() + ", context=" - + contextType.getSimpleName() + "]"; - } - - private class SingletonListenerRegistration, InstanceIdentifier>> extends - AbstractObjectRegistration - implements ListenerRegistration { - - public SingletonListenerRegistration(final L instance) { - super(instance); - listener = instance; - } - - @Override - protected void removeRegistration() { - listener = null; - } - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcServiceMetadata.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcServiceMetadata.java deleted file mode 100644 index 430b7a7e31..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcServiceMetadata.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.opendaylight.yangtools.yang.binding.BaseIdentity; - -import com.google.common.collect.Iterables; - -final class RpcServiceMetadata { - private final Set> contexts = new HashSet<>(); - private final Map rpcMethods = new HashMap<>(); - private final Iterable> roContexts = Iterables.unmodifiableIterable(contexts); - - public Iterable> getContexts() { - return roContexts; - } - - public RpcMetadata getRpcMethod(final String name) { - return rpcMethods.get(name); - } - - public void addContext(final Class context) { - contexts.add(context); - } - - public void addRpcMethod(final String name, final RpcMetadata routingPair) { - rpcMethods.put(name, routingPair); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvoker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvoker.java deleted file mode 100644 index 9302e4925e..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvoker.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; -import java.util.Set; -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper; -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory.NotificationInvoker; -import org.opendaylight.yangtools.yang.binding.Notification; -import org.opendaylight.yangtools.yang.binding.NotificationListener; - -final class RuntimeGeneratedInvoker implements NotificationInvoker { - private final org.opendaylight.controller.sal.binding.api.NotificationListener invocationProxy; - private final RuntimeGeneratedInvokerPrototype prototype; - private final NotificationListener delegate; - - @SuppressWarnings("unchecked") - private RuntimeGeneratedInvoker(final NotificationListener delegate, final RuntimeGeneratedInvokerPrototype prototype, final org.opendaylight.controller.sal.binding.api.NotificationListener proxy) { - this.invocationProxy = (org.opendaylight.controller.sal.binding.api.NotificationListener) proxy; - this.delegate = Preconditions.checkNotNull(delegate); - this.prototype = prototype; - } - - public static RuntimeGeneratedInvoker create(final NotificationListener delegate, final RuntimeGeneratedInvokerPrototype prototype) throws InstantiationException, IllegalAccessException { - final org.opendaylight.controller.sal.binding.api.NotificationListener proxy = Preconditions.checkNotNull(prototype.getProtoClass().newInstance()); - RuntimeCodeHelper.setDelegate(proxy, delegate); - return new RuntimeGeneratedInvoker(delegate, prototype, proxy); - } - - @Override - public NotificationListener getDelegate() { - return delegate; - } - - @Override - public org.opendaylight.controller.sal.binding.api.NotificationListener getInvocationProxy() { - return invocationProxy; - } - - @Override - public Set> getSupportedNotifications() { - return prototype.getSupportedNotifications(); - } - - @Override - public void close() { - // Nothing to do - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + delegate.hashCode(); - result = prime * result + invocationProxy.hashCode(); - result = prime * result + prototype.hashCode(); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof RuntimeGeneratedInvoker)) { - return false; - } - final RuntimeGeneratedInvoker other = (RuntimeGeneratedInvoker) obj; - if (!delegate.equals(other.delegate)) { - return false; - } - if (!invocationProxy.equals(other.invocationProxy)) { - return false; - } - return prototype.equals(other.prototype); - } - - @Override - public String toString() { - return Objects.toStringHelper(this).toString(); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvokerPrototype.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvokerPrototype.java deleted file mode 100644 index 317268420f..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeGeneratedInvokerPrototype.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import java.util.Set; - -import org.opendaylight.controller.sal.binding.api.NotificationListener; -import org.opendaylight.yangtools.yang.binding.Notification; - -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; - -final class RuntimeGeneratedInvokerPrototype { - private final Set> supportedNotifications; - private final Class> protoClass; - - public RuntimeGeneratedInvokerPrototype(final Set> supportedNotifications, final Class> protoClass) { - this.supportedNotifications = Preconditions.checkNotNull(supportedNotifications); - this.protoClass = Preconditions.checkNotNull(protoClass); - } - - public Set> getSupportedNotifications() { - return supportedNotifications; - } - - public Class> getProtoClass() { - return protoClass; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + supportedNotifications.hashCode(); - result = prime * result + protoClass.hashCode(); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof RuntimeGeneratedInvokerPrototype)) { - return false; - } - final RuntimeGeneratedInvokerPrototype other = (RuntimeGeneratedInvokerPrototype) obj; - if (!protoClass.equals(other.protoClass)) { - return false; - } - return supportedNotifications.equals(other.supportedNotifications); - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("protoClass", protoClass) - .add("supportedNotifications", supportedNotifications) - .toString(); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java index f5c3959151..6bcd74d213 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java @@ -31,8 +31,6 @@ public class SingletonHolder { public static final ClassPool CLASS_POOL = ClassPool.getDefault(); public static final JavassistUtils JAVASSIST = JavassistUtils.forClassPool(CLASS_POOL); - public static final org.opendaylight.controller.sal.binding.codegen.impl.DefaultRuntimeCodeGenerator RPC_GENERATOR_IMPL = new org.opendaylight.controller.sal.binding.codegen.impl.DefaultRuntimeCodeGenerator( - CLASS_POOL); public static final int CORE_NOTIFICATION_THREADS = 4; public static final int MAX_NOTIFICATION_THREADS = 32; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java deleted file mode 100644 index 4ed0ce9b40..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.impl; - -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; - -import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; -import org.opendaylight.controller.md.sal.common.api.data.DataReader; -import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter; -import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataBroker; -import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; -import org.opendaylight.controller.sal.binding.api.data.DataProviderService; -import org.opendaylight.yangtools.concepts.Registration; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.DataObjectReadingUtil; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMap.Builder; -import com.google.common.collect.Maps; - -@Deprecated -public class DataBrokerImpl extends - AbstractDataBroker, DataObject, DataChangeListener> // - implements DataProviderService, AutoCloseable { - - private final static class ContainsWildcarded implements Predicate> { - - private final InstanceIdentifier key; - - public ContainsWildcarded(final InstanceIdentifier key) { - this.key = key; - } - - @Override - public boolean apply(final InstanceIdentifier input) { - return key.containsWildcarded(input); - } - } - - private final static class IsContainedWildcarded implements Predicate> { - - private final InstanceIdentifier key; - - public IsContainedWildcarded(final InstanceIdentifier key) { - this.key = key; - } - - @Override - public boolean apply(final InstanceIdentifier input) { - return input.containsWildcarded(key); - } - } - - private final AtomicLong nextTransaction = new AtomicLong(); - private final AtomicLong createdTransactionsCount = new AtomicLong(); - private final DelegatingDataReadRouter router = new DelegatingDataReadRouter(); - private DataCommitHandler, DataObject> rootCommitHandler; - - public DataBrokerImpl() { - setDataReadRouter(router); - } - - public void setDataReadDelegate(final DataReader, DataObject> delegate) { - router.setDelegate(delegate); - } - - public AtomicLong getCreatedTransactionsCount() { - return createdTransactionsCount; - } - - @Override - public DataTransactionImpl beginTransaction() { - String transactionId = "BA-" + nextTransaction.getAndIncrement(); - createdTransactionsCount.getAndIncrement(); - return new DataTransactionImpl(transactionId, this); - } - - @Override - public void close() { - - } - - @Override - protected Predicate> createContainsPredicate( - final InstanceIdentifier key) { - return new ContainsWildcarded(key); - } - - @Override - protected Predicate> createIsContainedPredicate( - final InstanceIdentifier key) { - return new IsContainedWildcarded(key); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - protected Map, DataObject> deepGetBySubpath( - final Map, DataObject> dataSet, - final InstanceIdentifier path) { - Builder, DataObject> builder = ImmutableMap.builder(); - Map, DataObject> potential = Maps.filterKeys(dataSet, - createIsContainedPredicate(path)); - for (Entry, DataObject> entry : potential.entrySet()) { - try { - builder.putAll(DataObjectReadingUtil.readData(entry.getValue(), (InstanceIdentifier) entry.getKey(), - path)); - } catch (Exception e) { - // FIXME : Log exception; - } - } - return builder.build(); - - } - - public class DelegatingDataReadRouter extends - AbstractDataReadRouter, DataObject> { - - private DataReader, DataObject> delegate; - - @Override - public DataObject readConfigurationData(final InstanceIdentifier path) { - return delegate.readConfigurationData(path); - } - - public void setDelegate(final DataReader, DataObject> delegate) { - this.delegate = delegate; - } - - @Override - public DataObject readOperationalData(final InstanceIdentifier path) { - return delegate.readOperationalData(path); - } - - @Override - protected DataObject merge(final InstanceIdentifier path, final Iterable data) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Registration registerConfigurationReader( - final InstanceIdentifier path, - final DataReader, DataObject> reader) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Registration registerOperationalReader( - final InstanceIdentifier path, - final DataReader, DataObject> reader) { - throw new UnsupportedOperationException("Not supported"); - } - } - - @Override - protected ImmutableList, DataObject>> affectedCommitHandlers( - final Set> paths) { - ImmutableList.Builder, DataObject>> handlersBuilder = ImmutableList.builder(); - return handlersBuilder // - .add(rootCommitHandler) // - .addAll(super.affectedCommitHandlers(paths)) // - .build(); - } - - public void setRootCommitHandler(final DataCommitHandler, DataObject> commitHandler) { - rootCommitHandler = commitHandler; - } - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java deleted file mode 100644 index 4020232bf4..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.impl; - -import org.opendaylight.controller.md.sal.common.api.TransactionStatus; -import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataTransaction; -import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.util.ListenerRegistry; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -@Deprecated -public class DataTransactionImpl extends AbstractDataTransaction, DataObject> - implements DataModificationTransaction { - private final ListenerRegistry listeners = new ListenerRegistry(); - - - - public DataTransactionImpl(Object identifier,DataBrokerImpl dataBroker) { - super(identifier,dataBroker); - } - - @Override - public ListenerRegistration registerListener(DataTransactionListener listener) { - return listeners.register(listener); - } - - @Override - protected void onStatusChange(TransactionStatus status) { - for (ListenerRegistration listenerRegistration : listeners) { - listenerRegistration.getInstance().onStatusUpdated(this, status); - } - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java deleted file mode 100644 index 0949d3d761..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.impl; - -import static com.google.common.base.Preconditions.checkState; -import com.google.common.base.Preconditions; -import com.google.common.base.Throwables; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.util.concurrent.UncheckedExecutionException; -import java.util.EventListener; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicBoolean; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChange; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher; -import org.opendaylight.controller.md.sal.common.impl.routing.RoutingUtils; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; -import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; -import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; -import org.opendaylight.controller.sal.binding.codegen.RpcIsNotRoutedException; -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator; -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper; -import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.util.ListenerRegistry; -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RpcProviderRegistryImpl implements RpcProviderRegistry, RouteChangePublisher> { - - private RuntimeCodeGenerator rpcFactory = SingletonHolder.RPC_GENERATOR_IMPL; - - // cache of proxy objects where each value in the map corresponds to a specific RpcService - private final LoadingCache, RpcService> publicProxies = CacheBuilder.newBuilder().weakKeys(). - build(new CacheLoader, RpcService>() { - @Override - public RpcService load(final Class type) { - final RpcService proxy = rpcFactory.getDirectProxyFor(type); - LOG.debug("Created {} as public proxy for {} in {}", proxy, type.getSimpleName(), this); - return proxy; - } - }); - - private final Cache, RpcRouter> rpcRouters = CacheBuilder.newBuilder().weakKeys() - .build(); - - private final ListenerRegistry>> routeChangeListeners = ListenerRegistry - .create(); - private final ListenerRegistry routerInstantiationListener = ListenerRegistry.create(); - - private final static Logger LOG = LoggerFactory.getLogger(RpcProviderRegistryImpl.class); - - private final String name; - - private final ListenerRegistry globalRpcListeners = ListenerRegistry.create(); - - public String getName() { - return name; - } - - public RpcProviderRegistryImpl(final String name) { - super(); - this.name = name; - } - - @Override - public final RoutedRpcRegistration addRoutedRpcImplementation(final Class type, - final T implementation) throws IllegalStateException { - return getRpcRouter(type).addRoutedRpcImplementation(implementation); - } - - @Override - public final RpcRegistration addRpcImplementation(final Class type, final T implementation) { - - // FIXME: This should be well documented - addRpcImplementation for - // routed RPCs - try { - // Note: If RPC is really global, expected count of registrations - // of this method is really low. - RpcRouter potentialRouter = getRpcRouter(type); - checkState(potentialRouter.getDefaultService() == null, - "Default service for routed RPC already registered."); - return potentialRouter.registerDefaultService(implementation); - } catch (RpcIsNotRoutedException e) { - // NOOP - we could safely continue, since RPC is not routed - // so we fallback to global routing. - LOG.debug("RPC is not routed. Using global registration.",e); - } - T publicProxy = getRpcService(type); - RpcService currentDelegate = RuntimeCodeHelper.getDelegate(publicProxy); - checkState(currentDelegate == null, "Rpc service is already registered"); - LOG.debug("Registering {} as global implementation of {} in {}", implementation, type.getSimpleName(), this); - RuntimeCodeHelper.setDelegate(publicProxy, implementation); - notifyGlobalRpcAdded(type); - return new RpcProxyRegistration(type, implementation, this); - } - - @SuppressWarnings("unchecked") - @Override - public final T getRpcService(final Class type) { - return (T) publicProxies.getUnchecked(type); - } - - - public RpcRouter getRpcRouter(final Class type) { - try { - final AtomicBoolean created = new AtomicBoolean(false); - @SuppressWarnings( "unchecked") - // LoadingCache is unsuitable for RpcRouter since we need to distinguish - // first creation of RPC Router, so that is why - // we are using normal cache with load API and shared AtomicBoolean - // for this call, which will be set to true if router was created. - RpcRouter router = (RpcRouter) rpcRouters.get(type,new Callable>() { - - @Override - public org.opendaylight.controller.sal.binding.api.rpc.RpcRouter call() { - RpcRouter router = rpcFactory.getRouterFor(type, name); - router.registerRouteChangeListener(new RouteChangeForwarder(type)); - LOG.debug("Registering router {} as global implementation of {} in {}", router, type.getSimpleName(), this); - RuntimeCodeHelper.setDelegate(getRpcService(type), router.getInvocationProxy()); - created.set(true); - return router; - } - }); - if(created.get()) { - notifyListenersRoutedCreated(router); - } - return router; - } catch (ExecutionException | UncheckedExecutionException e) { - // We rethrow Runtime Exceptions which were wrapped by - // Execution Exceptions - // otherwise we throw IllegalStateException with original - Throwables.propagateIfPossible(e.getCause()); - throw new IllegalStateException("Could not load RPC Router for "+type.getName(),e); - } - } - - private void notifyGlobalRpcAdded(final Class type) { - for(ListenerRegistration listener : globalRpcListeners) { - try { - listener.getInstance().onGlobalRpcRegistered(type); - } catch (Exception e) { - LOG.error("Unhandled exception during invoking listener {}", e); - } - } - - } - - private void notifyListenersRoutedCreated(final RpcRouter router) { - - for (ListenerRegistration listener : routerInstantiationListener) { - try { - listener.getInstance().onRpcRouterCreated(router); - } catch (Exception e) { - LOG.error("Unhandled exception during invoking listener {}", e); - } - } - - } - - public ListenerRegistration registerRouterInstantiationListener( - final RouterInstantiationListener listener) { - ListenerRegistration reg = routerInstantiationListener.register(listener); - try { - for (RpcRouter router : rpcRouters.asMap().values()) { - listener.onRpcRouterCreated(router); - } - } catch (Exception e) { - LOG.error("Unhandled exception during invoking listener {}", e); - } - return reg; - } - - @SuppressWarnings("unchecked") - @Override - public >> ListenerRegistration registerRouteChangeListener( - final L listener) { - return (ListenerRegistration) routeChangeListeners.register(listener); - } - - public RuntimeCodeGenerator getRpcFactory() { - return rpcFactory; - } - - public void setRpcFactory(final RuntimeCodeGenerator rpcFactory) { - this.rpcFactory = rpcFactory; - } - - public interface RouterInstantiationListener extends EventListener { - void onRpcRouterCreated(RpcRouter router); - } - - public ListenerRegistration registerGlobalRpcRegistrationListener(final GlobalRpcRegistrationListener listener) { - return globalRpcListeners.register(listener); - } - - public interface GlobalRpcRegistrationListener extends EventListener { - void onGlobalRpcRegistered(Class cls); - void onGlobalRpcUnregistered(Class cls); - - } - - private final class RouteChangeForwarder implements RouteChangeListener, InstanceIdentifier> { - private final Class type; - - RouteChangeForwarder(final Class type) { - this.type = type; - } - - @Override - public void onRouteChange(final RouteChange, InstanceIdentifier> change) { - Map>> announcements = new HashMap<>(); - for (Entry, Set>> entry : change.getAnnouncements() - .entrySet()) { - RpcContextIdentifier key = RpcContextIdentifier.contextFor(type, entry.getKey()); - announcements.put(key, entry.getValue()); - } - Map>> removals = new HashMap<>(); - for (Entry, Set>> entry : change.getRemovals() - .entrySet()) { - RpcContextIdentifier key = RpcContextIdentifier.contextFor(type, entry.getKey()); - removals.put(key, entry.getValue()); - } - RouteChange> toPublish = RoutingUtils - .> change(announcements, removals); - for (ListenerRegistration>> listener : routeChangeListeners) { - try { - listener.getInstance().onRouteChange(toPublish); - } catch (Exception e) { - LOG.error("Unhandled exception during invoking listener",listener.getInstance(),e); - } - } - } - } - - private static final class RpcProxyRegistration extends AbstractObjectRegistration implements RpcRegistration { - private final RpcProviderRegistryImpl registry; - private final Class serviceType; - - RpcProxyRegistration(final Class type, final T service, final RpcProviderRegistryImpl registry) { - super(service); - this.registry = Preconditions.checkNotNull(registry); - this.serviceType = type; - } - - @Override - public Class getServiceType() { - return serviceType; - } - - @Override - protected void removeRegistration() { - T publicProxy = registry.getRpcService(serviceType); - RpcService currentDelegate = RuntimeCodeHelper.getDelegate(publicProxy); - if (currentDelegate == getInstance()) { - RuntimeCodeHelper.setDelegate(publicProxy, null); - } - } - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProxyContext.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProxyContext.java deleted file mode 100644 index 3b6a2539de..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProxyContext.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.sal.binding.impl; - -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.osgi.framework.ServiceRegistration; - -@SuppressWarnings("all") -public class RpcProxyContext { - public RpcProxyContext(final Class proxyClass) { - this.proxyClass = proxyClass; - } - - protected final Class proxyClass; - - protected RpcService _proxy; - - public RpcService getProxy() { - return this._proxy; - } - - public void setProxy(final RpcService proxy) { - this._proxy = proxy; - } - - protected ServiceRegistration _registration; - - public ServiceRegistration getRegistration() { - return this._registration; - } - - public void setRegistration(final ServiceRegistration registration) { - this._registration = registration; - } -} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/BindingAwareDataReaderRouter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/BindingAwareDataReaderRouter.java deleted file mode 100644 index 97f74ff6f3..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/BindingAwareDataReaderRouter.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.impl.util; - -import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -public class BindingAwareDataReaderRouter extends AbstractDataReadRouter,DataObject> { - @Override - protected DataObject merge(final InstanceIdentifier path, final Iterable data) { - return data.iterator().next(); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/NotificationInvokerFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/NotificationInvokerFactory.java deleted file mode 100644 index 28e552eed7..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/NotificationInvokerFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.spi; - -import java.util.Set; - -import org.opendaylight.controller.sal.binding.api.NotificationListener; -import org.opendaylight.yangtools.yang.binding.Notification; - -public interface NotificationInvokerFactory { - - NotificationInvoker invokerFor(org.opendaylight.yangtools.yang.binding.NotificationListener instance); - - public interface NotificationInvoker { - - Set> getSupportedNotifications(); - - NotificationListener getInvocationProxy(); - - public abstract void close(); - - org.opendaylight.yangtools.yang.binding.NotificationListener getDelegate(); - - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java deleted file mode 100644 index de5f3ca46f..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.opendaylight.controller.md.sal.binding.impl.test; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_BAR_KEY; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_FOO_KEY; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.path; - -import com.google.common.base.Throwables; -import java.util.Arrays; -import javassist.ClassPool; -import org.junit.Ignore; -import org.junit.Test; -import org.mockito.Mockito; -import org.opendaylight.controller.md.sal.binding.compat.HeliumRpcProviderRegistry; -import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcProviderServiceAdapter; -import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcServiceAdapter; -import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; -import org.opendaylight.controller.md.sal.binding.test.AbstractSchemaAwareTest; -import org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; -import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; -import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; -import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; -import org.opendaylight.controller.sal.binding.codegen.RpcIsNotRoutedException; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.TopLevelList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.OpendaylightTestRoutedRpcService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.TestContext; -import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator; -import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator; -import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - - -public class RpcProviderRegistryTest extends AbstractSchemaAwareTest { - - private static InstanceIdentifier FOO_PATH = path(TOP_FOO_KEY); - private static InstanceIdentifier BAR_PATH = path(TOP_BAR_KEY); - private static RpcContextIdentifier ROUTING_CONTEXT = RpcContextIdentifier.contextFor(OpendaylightTestRoutedRpcService.class, TestContext.class); - - private RpcProviderRegistry rpcRegistry; - - - @Override - protected Iterable getModuleInfos() { - try { - return Arrays.asList( - BindingReflections.getModuleInfo(TopLevelList.class), - BindingReflections.getModuleInfo(OpendaylightTestRoutedRpcService.class), - BindingReflections.getModuleInfo(OpendaylightTestRpcServiceService.class)); - } catch (final Exception e) { - throw Throwables.propagate(e); - } - } - - @Override - protected void setupWithSchema(final SchemaContext context) { - final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault())); - final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(generator); - final GeneratedClassLoadingStrategy classLoadingStrategy = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(); - final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry); - final DOMRpcRouter domRpcRegistry = new DOMRpcRouter(); - domRpcRegistry.onGlobalContextUpdated(context); - codec.onGlobalContextUpdated(context); - final RpcConsumerRegistry consumer = new BindingDOMRpcServiceAdapter(domRpcRegistry, codec); - final BindingDOMRpcProviderServiceAdapter provider = new BindingDOMRpcProviderServiceAdapter( domRpcRegistry,codec); - rpcRegistry = new HeliumRpcProviderRegistry(consumer,provider); - } - - @Test - public void testGlobalRpcRegistrations() throws Exception { - final OpendaylightTestRpcServiceService one = Mockito.mock(OpendaylightTestRpcServiceService.class); - final OpendaylightTestRpcServiceService two = Mockito.mock(OpendaylightTestRpcServiceService.class); - - final RpcRegistration regOne = rpcRegistry.addRpcImplementation(OpendaylightTestRpcServiceService.class, one); - assertNotNull(regOne); - rpcRegistry.addRpcImplementation(OpendaylightTestRpcServiceService.class, two); - regOne.close(); - final RpcRegistration regTwo = rpcRegistry.addRpcImplementation(OpendaylightTestRpcServiceService.class, two); - assertNotNull(regTwo); - } - - - @Test - @Ignore - public void nonRoutedRegisteredAsRouted() { - final OpendaylightTestRpcServiceService one = Mockito.mock(OpendaylightTestRpcServiceService.class); - try { - final RoutedRpcRegistration reg = rpcRegistry.addRoutedRpcImplementation(OpendaylightTestRpcServiceService.class, one); - reg.registerPath(null, BAR_PATH); - fail("RpcIsNotRoutedException should be thrown"); - } catch (final RpcIsNotRoutedException e) { - assertNotNull(e.getMessage()); - } catch (final Exception e) { - fail("RpcIsNotRoutedException should be thrown"); - } - - } - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGeneratorTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGeneratorTest.java deleted file mode 100644 index 7a15619e95..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/DefaultRuntimeCodeGeneratorTest.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.codegen.impl; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import java.util.ArrayList; -import java.util.List; -import javassist.ClassPool; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; -import org.opendaylight.controller.sal.binding.api.rpc.RpcRoutingTable; -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator; -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory; -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory.NotificationInvoker; -import org.opendaylight.controller.sal.binding.test.mock.BarListener; -import org.opendaylight.controller.sal.binding.test.mock.BarUpdate; -import org.opendaylight.controller.sal.binding.test.mock.FlowDelete; -import org.opendaylight.controller.sal.binding.test.mock.FooListener; -import org.opendaylight.controller.sal.binding.test.mock.FooService; -import org.opendaylight.controller.sal.binding.test.mock.FooUpdate; -import org.opendaylight.controller.sal.binding.test.mock.ReferencableObject; -import org.opendaylight.controller.sal.binding.test.mock.ReferencableObjectKey; -import org.opendaylight.controller.sal.binding.test.mock.SimpleInput; -import org.opendaylight.yangtools.yang.binding.Augmentation; -import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.DataContainer; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -public class DefaultRuntimeCodeGeneratorTest { - - private RuntimeCodeGenerator codeGenerator; - private NotificationInvokerFactory invokerFactory; - - @Before - public void initialize() { - this.codeGenerator = new DefaultRuntimeCodeGenerator(ClassPool.getDefault()); - this.invokerFactory = codeGenerator.getInvokerFactory(); - } - - @Test - public void testGenerateDirectProxy() { - FooService product = codeGenerator.getDirectProxyFor(FooService.class); - assertNotNull(product); - } - - @Test - public void testGenerateRouter() throws Exception { - RpcRouter product = codeGenerator.getRouterFor(FooService.class,"test"); - assertNotNull(product); - assertNotNull(product.getInvocationProxy()); - - assertEquals("2 fields should be generated.", 2, product.getInvocationProxy().getClass().getFields().length); - - verifyRouting(product); - } - - @Test - public void testInvoker() throws Exception { - - FooListenerImpl fooListener = new FooListenerImpl(); - - NotificationInvoker invokerFoo = invokerFactory.invokerFor(fooListener); - - - assertSame(fooListener,invokerFoo.getDelegate()); - assertNotNull(invokerFoo.getSupportedNotifications()); - assertEquals(1, invokerFoo.getSupportedNotifications().size()); - assertNotNull(invokerFoo.getInvocationProxy()); - - FooUpdateImpl fooOne = new FooUpdateImpl(); - invokerFoo.getInvocationProxy().onNotification(fooOne); - - assertEquals(1, fooListener.receivedFoos.size()); - assertSame(fooOne, fooListener.receivedFoos.get(0)); - - CompositeListenerImpl composite = new CompositeListenerImpl(); - - NotificationInvoker invokerComposite = invokerFactory.invokerFor(composite); - - assertNotNull(invokerComposite.getSupportedNotifications()); - assertEquals(3, invokerComposite.getSupportedNotifications().size()); - assertNotNull(invokerComposite.getInvocationProxy()); - - invokerComposite.getInvocationProxy().onNotification(fooOne); - - assertEquals(1, composite.receivedFoos.size()); - assertSame(fooOne, composite.receivedFoos.get(0)); - - assertEquals(0, composite.receivedBars.size()); - - BarUpdateImpl barOne = new BarUpdateImpl(); - - invokerComposite.getInvocationProxy().onNotification(barOne); - - assertEquals(1, composite.receivedFoos.size()); - assertEquals(1, composite.receivedBars.size()); - assertSame(barOne, composite.receivedBars.get(0)); - - } - - private void verifyRouting(final RpcRouter product) { - assertNotNull("Routing table should be initialized", product.getRoutingTable(BaseIdentity.class)); - - RpcRoutingTable routingTable = product.getRoutingTable(BaseIdentity.class); - - int servicesCount = 2; - int instancesPerService = 3; - - InstanceIdentifier[][] identifiers = identifiers(servicesCount, instancesPerService); - FooService service[] = new FooService[] { mock(FooService.class, "Instance 0"), - mock(FooService.class, "Instance 1") }; - - for (int i = 0; i < service.length; i++) { - for (InstanceIdentifier instance : identifiers[i]) { - routingTable.updateRoute(instance, service[i]); - } - } - - assertEquals("All instances should be registered.", servicesCount * instancesPerService, routingTable - .getRoutes().size()); - - SimpleInput[] instance_0_input = new SimpleInputImpl[] { new SimpleInputImpl(identifiers[0][0]), - new SimpleInputImpl(identifiers[0][1]), new SimpleInputImpl(identifiers[0][2]) }; - - SimpleInput[] instance_1_input = new SimpleInputImpl[] { new SimpleInputImpl(identifiers[1][0]), - new SimpleInputImpl(identifiers[1][1]), new SimpleInputImpl(identifiers[1][2]) }; - - // We test sending mock messages - - product.getInvocationProxy().simple(instance_0_input[0]); - verify(service[0]).simple(instance_0_input[0]); - - product.getInvocationProxy().simple(instance_0_input[1]); - product.getInvocationProxy().simple(instance_0_input[2]); - - verify(service[0]).simple(instance_0_input[1]); - verify(service[0]).simple(instance_0_input[2]); - - product.getInvocationProxy().simple(instance_1_input[0]); - - // We should have call to instance 1 - verify(service[1]).simple(instance_1_input[0]); - - /* - * Generated RPC service should throw illegalArgumentException - * with message if rpc input is null. - */ - try { - product.getInvocationProxy().simple(null); - fail("Generated RPC router should throw IllegalArgumentException on null input"); - } catch (IllegalArgumentException e){ - assertNotNull(e.getMessage()); - } - - - /* - * Generated RPC service should throw illegalArgumentException - * with message if rpc route is null. - */ - try { - SimpleInput withoutValue = new SimpleInputImpl(null); - product.getInvocationProxy().simple(withoutValue); - fail("Generated RPC router should throw IllegalArgumentException on null value for route"); - } catch (IllegalArgumentException e){ - assertNotNull(e.getMessage()); - } - - } - - private InstanceIdentifier[][] identifiers(final int serviceSize, final int instancesPerService) { - InstanceIdentifier[][] ret = new InstanceIdentifier[serviceSize][]; - int service = 0; - for (int i = 0; i < serviceSize; i++) { - - InstanceIdentifier[] instanceIdentifiers = new InstanceIdentifier[instancesPerService]; - ret[i] = instanceIdentifiers; - for (int id = 0; id < instancesPerService; id++) { - instanceIdentifiers[id] = referencableIdentifier(service * instancesPerService + id); - } - service++; - } - - return ret; - } - - private InstanceIdentifier referencableIdentifier(final int i) { - return InstanceIdentifier.builder(ReferencableObject.class, new ReferencableObjectKey(i)).build(); - } - - private static class SimpleInputImpl implements SimpleInput { - private final InstanceIdentifier identifier; - - public SimpleInputImpl(final InstanceIdentifier _identifier) { - this.identifier = _identifier; - } - - @Override - public > E getAugmentation(final Class augmentationType) { - return null; - } - - @Override - public InstanceIdentifier getIdentifier() { - return this.identifier; - } - - @Override - public Class getImplementedInterface() { - return SimpleInput.class; - } - } - - private static class FooUpdateImpl implements FooUpdate { - @Override - public Class getImplementedInterface() { - return FooUpdate.class; - } - } - - private static class BarUpdateImpl implements BarUpdate { - @Override - public Class getImplementedInterface() { - return BarUpdate.class; - } - - @Override - public InstanceIdentifier getInheritedIdentifier() { - return null; - } - } - - private static class FooListenerImpl implements FooListener { - - List receivedFoos = new ArrayList<>(); - - @Override - public void onFooUpdate(final FooUpdate notification) { - receivedFoos.add(notification); - } - - } - - private static class CompositeListenerImpl extends FooListenerImpl implements BarListener { - - List receivedBars = new ArrayList<>(); - List receivedDeletes = new ArrayList<>(); - - @Override - public void onBarUpdate(final BarUpdate notification) { - receivedBars.add(notification); - } - - @Override - public void onFlowDelete(final FlowDelete notification) { - receivedDeletes.add(notification); - } - - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolderTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolderTest.java deleted file mode 100644 index 0e4c5ccb84..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolderTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.sal.binding.codegen.impl; - -import com.google.common.util.concurrent.ListeningExecutorService; -import java.lang.reflect.Field; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import org.junit.Ignore; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Ignore -public class SingletonHolderTest { - private static final Logger logger = LoggerFactory.getLogger(SingletonHolderTest.class); - - @Test - public void testNotificationExecutor() throws Exception { - ListeningExecutorService executor = SingletonHolder.getDefaultNotificationExecutor(); - ThreadPoolExecutor tpExecutor = (ThreadPoolExecutor) setAccessible(executor.getClass().getDeclaredField("delegate")).get(executor); - BlockingQueue queue = tpExecutor.getQueue(); - - for (int idx = 0; idx < 100; idx++) { - final int idx2 = idx; - logger.info("Adding {}\t{}\t{}", idx, queue.size(), tpExecutor.getActiveCount()); - executor.execute(new Runnable() { - - @Override - public void run() { - logger.info("in {}", idx2); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - logger.info("out {}", idx2); - } - }); - } - executor.shutdown(); - executor.awaitTermination(10, TimeUnit.SECONDS); - } - - private static Field setAccessible(Field field) { - field.setAccessible(true); - return field; - } -} -- 2.36.6