From: Tony Tkacik Date: Mon, 30 Sep 2013 13:33:31 +0000 (+0200) Subject: Updated SAL Binding APIs X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~690 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=526185d061ed50c75890b31a376e9495144b660a Updated SAL Binding APIs Data Services - Added DataModification contract which is used to track reads and writes regarding configuration change. - Updated Transaction APIs to use nwe DataModification object - Deprecated old APIs for Data Modification which supported only one unsubmitted transaction per consumer / provider Rpc Services - Added Registration for Routed Rpcs - Added Registration for Mounted Rpcs Util classes - Updated implementation of AbstractBindingAwareConsumer - Updated implementation of AbstractBindingAwareProvider Change-Id: I0adb98ae6faf6d214484e4b276d6c3df930ca4e9 Signed-off-by: Tony Tkacik --- diff --git a/opendaylight/md-sal/model/model-flow-service/pom.xml b/opendaylight/md-sal/model/model-flow-service/pom.xml index 583a7ac010..6b8df6a4c8 100644 --- a/opendaylight/md-sal/model/model-flow-service/pom.xml +++ b/opendaylight/md-sal/model/model-flow-service/pom.xml @@ -29,7 +29,7 @@ org.opendaylight.yangtools.model opendaylight-l2-types - 2013.08.27-SNAPSHOT + 2013.08.27.0 bundle diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareConsumer.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareConsumer.java index a176664ff9..ffb39d5e92 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareConsumer.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareConsumer.java @@ -16,7 +16,9 @@ public abstract class AbstractBindingAwareConsumer implements BindingAwareConsum } @Deprecated - abstract protected void startImpl(BundleContext context); + protected void startImpl(BundleContext context) { + + } @Override public final void stop(BundleContext context) throws Exception { diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareProvider.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareProvider.java index 20a7c0d779..994d3f40a8 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareProvider.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBindingAwareProvider.java @@ -1,5 +1,9 @@ package org.opendaylight.controller.sal.binding.api; +import java.util.Collection; + +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; +import org.opendaylight.yangtools.yang.binding.RpcService; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; @@ -10,16 +14,53 @@ public abstract class AbstractBindingAwareProvider implements BindingAwareProvid public final void start(BundleContext context) throws Exception { ServiceReference brokerRef = context.getServiceReference(BindingAwareBroker.class); BindingAwareBroker broker = context.getService(brokerRef); - broker.registerProvider(this, context); + + ProviderContext ctx = broker.registerProvider(this, context); + registerRpcImplementations(ctx); + registerFunctionality(ctx); + startImpl(context); } - @Deprecated - abstract protected void startImpl(BundleContext context); + private void registerFunctionality(ProviderContext ctx) { + Collection functionality = this.getFunctionality(); + if(functionality == null || functionality.isEmpty()) { + return; + } + for (ProviderFunctionality providerFunctionality : functionality) { + ctx.registerFunctionality(providerFunctionality); + } + + } + + private void registerRpcImplementations(ProviderContext ctx) { + Collection rpcs = this.getImplementations(); + if(rpcs == null || rpcs.isEmpty()) { + return; + } + for (RpcService rpcService : rpcs) { + //ctx.addRpcImplementation(type, implementation); + } + + } + + protected void startImpl(BundleContext context) { + // NOOP + } @Override public final void stop(BundleContext context) throws Exception { } + + @Override + public Collection getFunctionality() { + return null; + } + + @Override + public Collection getImplementations() { + return null; + } } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareBroker.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareBroker.java index 87008cd14b..14db6e5a32 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareBroker.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareBroker.java @@ -7,8 +7,11 @@ */ package org.opendaylight.controller.sal.binding.api; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality; import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; +import org.opendaylight.yangtools.yang.binding.BaseIdentity; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; import org.osgi.framework.BundleContext; @@ -161,14 +164,52 @@ public interface BindingAwareBroker { * */ public interface ProviderContext extends ConsumerContext { + /** + * Registers an global RpcService implementation. + * + * @param type + * @param implementation + * @return + */ + RpcRegistration addRpcImplementation(Class type, T implementation) + throws IllegalStateException; - RpcServiceRegistration addRpcImplementation(Class type, T implementation); + RpcRegistration addMountRpcImplementation(Class type, + InstanceIdentifier mount, T implementation) throws IllegalStateException; + + RoutedRpcRegistration addRoutedRpcImplementation(Class type, T implementation) + throws IllegalStateException; + + void registerFunctionality(ProviderFunctionality functionality); + void unregisterFunctionality(ProviderFunctionality functionality); } - public interface RpcServiceRegistration { + public interface RpcRegistration { + /** + * + * @return instance for which registration does exists. + */ T getService(); + /** + * Unregister an RpcService from broker. + * + */ void unregister(); } + + public interface RoutedRpcRegistration extends RpcRegistration { + + /** + * Register particular instance identifier to be processed by this + * RpcService + * + * @param context + * @param instance + */ + void registerInstance(Class context, InstanceIdentifier instance); + + void unregisterInstance(Class context, InstanceIdentifier instance); + } } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationProviderService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationProviderService.java index 86c9eebecd..7052ab0c45 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationProviderService.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationProviderService.java @@ -7,9 +7,13 @@ */ package org.opendaylight.controller.sal.binding.api; +import java.util.concurrent.ExecutorService; + import org.opendaylight.yangtools.yang.binding.Notification; public interface NotificationProviderService extends NotificationService { void notify(Notification notification); + + void notify(Notification notification, ExecutorService service); } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java index 3723c70e8c..38bf7a196c 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java @@ -12,6 +12,7 @@ import org.opendaylight.yangtools.yang.binding.Notification; public interface NotificationService extends BindingAwareService { void addNotificationListener(Class notificationType, NotificationListener listener); - + void addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener); + void removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener); void removeNotificationListener(Class notificationType, NotificationListener listener); } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataBrokerService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataBrokerService.java index dd055aa382..cd04d356a2 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataBrokerService.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataBrokerService.java @@ -11,7 +11,9 @@ import java.util.concurrent.Future; import org.opendaylight.controller.sal.binding.api.BindingAwareService; import org.opendaylight.controller.sal.common.DataStoreIdentifier; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.DataRoot; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; /** @@ -56,6 +58,7 @@ public interface DataBrokerService extends BindingAwareService { * Data tree filter similar to the NETCONF filter * @return */ + @Deprecated T getData(DataStoreIdentifier store, T filter); /** @@ -68,6 +71,7 @@ public interface DataBrokerService extends BindingAwareService { * Identifier of the store, from which will be data retrieved * @return */ + @Deprecated T getCandidateData(DataStoreIdentifier store, Class rootType); /** @@ -90,6 +94,7 @@ public interface DataBrokerService extends BindingAwareService { * A filter data root * @return */ + @Deprecated T getCandidateData(DataStoreIdentifier store, T filter); /** @@ -104,6 +109,7 @@ public interface DataBrokerService extends BindingAwareService { * @return Result object containing the modified data tree if the operation * was successful, otherwise list of the encountered errors. */ + @Deprecated RpcResult editCandidateData(DataStoreIdentifier store, DataRoot changeSet); /** @@ -130,5 +136,17 @@ public interface DataBrokerService extends BindingAwareService { * @return Result of the commit, containing success information or list of * encountered errors, if commit was not successful. */ + @Deprecated Future> commit(DataStoreIdentifier store); + + + DataObject getData(InstanceIdentifier data); + DataObject getConfigurationData(InstanceIdentifier data); + + /** + * Creates a data modification transaction. + * + * @return new blank data modification transaction. + */ + DataModification beginTransaction(); } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataCommitHandler.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataCommitHandler.java index ea5a16e27b..b12dce6ea2 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataCommitHandler.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataCommitHandler.java @@ -77,107 +77,6 @@ import org.opendaylight.yangtools.yang.common.RpcResult; *
  • For each CommitTransaction from Commit Request phase *
      *
    1. Broker - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * * broker invokes a {@link CommitTransaction#finish()} *
    2. The provider rollbacks a commit and returns an {@link RpcResult} of * rollback.
    @@ -234,6 +133,13 @@ public interface DataCommitHandler extends ProviderFunctionality { */ DataStoreIdentifier getDataStore(); + /** + * Returns a modification transaction which is the source of this + * commit transaction. + * + */ + DataModification getModification(); + /** * Returns the handler associated with this transaction. * diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataModification.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataModification.java new file mode 100644 index 0000000000..4506caf94b --- /dev/null +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataModification.java @@ -0,0 +1,77 @@ +package org.opendaylight.controller.sal.binding.api.data; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Future; + +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.Identifiable; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; + +public interface DataModification { + + /** + * Returns transaction identifier + * + * @return Transaction identifier + */ + Object getIdentifier(); + + TransactionStatus getStatus(); + + /** + * Reads data from overal data storage which includes + * runtime and configuration data. + * + * @param path + * @return + */ + DataObject read(InstanceIdentifier path); + + /** + * Reads data from configuration data storage. + * + * @param path Instance identifier which + * @return + */ + DataObject readConfiguration(InstanceIdentifier path); + + void putRuntimeData(InstanceIdentifier path,DataObject data); + void putConfigurationData(InstanceIdentifier path,DataObject data); + void removeRuntimeData(InstanceIdentifier path); + void removeConfigurationData(InstanceIdentifier path); + + + Map getRuntimeDataUpdates(); + Map getConfigurationDataUpdates(); + Set getRemovals(); + Set getConfigurationRemovals(); + + /** + * Commits transaction to be stored in global data repository. + * + * + * @return Future object which returns RpcResult with TransactionStatus + * when transaction is processed by store. + */ + Future> commit(); + + void registerListener(DataTransactionListener listener); + void unregisterListener(DataTransactionListener listener); + + public enum TransactionStatus { + + UNSUBMITTED, + COMMITING, + COMMITED, + FAILED, + CANCELED + } + + public interface DataTransactionListener { + + void onStatusUpdated(DataModification transaction,TransactionStatus status); + + } +} diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataProviderService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataProviderService.java index 857b07b5c7..801a1c0d61 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataProviderService.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataProviderService.java @@ -7,7 +7,12 @@ */ package org.opendaylight.controller.sal.binding.api.data; +import java.util.Map; +import java.util.Set; + import org.opendaylight.controller.sal.common.DataStoreIdentifier; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public interface DataProviderService extends DataBrokerService { @@ -61,5 +66,4 @@ public interface DataProviderService extends DataBrokerService { * @param refresher */ void removeRefresher(DataStoreIdentifier store, DataRefresher refresher); - } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/RuntimeDataProvider.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/RuntimeDataProvider.java index 4b01aed6ee..68a2b29342 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/RuntimeDataProvider.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/RuntimeDataProvider.java @@ -2,11 +2,13 @@ package org.opendaylight.controller.sal.binding.api.data; import java.util.Set; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality; import org.opendaylight.controller.sal.common.DataStoreIdentifier; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.DataRoot; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -public interface RuntimeDataProvider { +public interface RuntimeDataProvider extends ProviderFunctionality { Set getSupportedStores(); @@ -48,4 +50,7 @@ public interface RuntimeDataProvider { * @return */ T getData(DataStoreIdentifier store, T filter); + + + T getData(Class dataType, InstanceIdentifier identifier); } 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 new file mode 100644 index 0000000000..9f7e05cbbf --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java @@ -0,0 +1,81 @@ +package org.opendaylight.controller.sal.binding.codegen; + +import org.opendaylight.controller.sal.binding.spi.DelegateProxy; +import org.opendaylight.controller.sal.binding.spi.RpcRouter; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.RpcService; +import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; + +public interface RuntimeCodeGenerator { + + /** + * Returns an instance of provided RpcService type which delegates all calls + * to the delegate. + * + *

    + * Returned instance: + *

      + *
    • implements provided subclass of RpcService type and + * {@link DelegateProxy} interface. + *
    • + *

      + * delegates all invocations of methods, which are defined in RpcService + * subtype to delegate which is defined by + * {@link DelegateProxy#setDelegate(Object)}. + *

      + * If delegate is not defined (getDelegate() == null) + * implementation throws {@link IllegalStateException} + *

    • {@link DelegateProxy#getDelegate()} - returns the delegate to which + * all calls are delegated. + *
    • {@link DelegateProxy#setDelegate(Object)} - sets the delegate for + * particular 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 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 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, InstanceIdentifier)} method to + * retrieve particular instance to which call will be routed. + *
      • + * Instance of {@link InstanceIdentifier} is determined by first argument of + * method and is retrieved via method which is annotated with + * {@link RoutingContext}. Class representing Routing Context Identifier is + * retrieved by {@link RoutingContext}. + *
      • If first argument is not defined / {@link 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 DelegateProxy} + */ + T getRouterFor(Class serviceType) throws IllegalArgumentException; +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/BrokerImplClassLoader.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/BrokerImplClassLoader.xtend new file mode 100644 index 0000000000..522102bdf1 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/BrokerImplClassLoader.xtend @@ -0,0 +1,22 @@ +package org.opendaylight.controller.sal.binding.codegen.impl + +import java.lang.ClassLoader + +class BrokerImplClassLoader extends ClassLoader { + + val ClassLoader spiClassLoader + + public new(ClassLoader model, ClassLoader spi) { + super(model) + spiClassLoader = spi; + } + + override public loadClass(String name) throws ClassNotFoundException { + try { + return super.loadClass(name); + } catch (ClassNotFoundException e) { + return spiClassLoader.loadClass(name); + } + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend index 298a74ece5..8a3d2c0ecc 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend @@ -28,16 +28,19 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderCo import org.slf4j.LoggerFactory import org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration class BindingAwareBrokerImpl implements BindingAwareBroker { private static val log = LoggerFactory.getLogger(BindingAwareBrokerImpl) - + private val clsPool = ClassPool.getDefault() private var RuntimeCodeGenerator generator; private Map, RpcProxyContext> managedProxies = new HashMap(); private var NotificationBrokerImpl notifyBroker private var ServiceRegistration notifyBrokerRegistration - + @Property var BundleContext brokerBundleContext @@ -92,9 +95,9 @@ class BindingAwareBrokerImpl implements BindingAwareBroker { * If proxy class does not exist for supplied service class it will be generated automatically. */ def getManagedDirectProxy(Class service) { - + var RpcProxyContext existing = null - if ((existing = managedProxies.get(service)) != null) { + if((existing = managedProxies.get(service)) != null) { return existing.proxy } val proxyClass = generator.generateDirectProxy(service) @@ -107,6 +110,7 @@ class BindingAwareBrokerImpl implements BindingAwareBroker { managedProxies.put(service, rpcProxyCtx) return rpcProxyCtx.proxy } + /** * Registers RPC Implementation * @@ -121,4 +125,15 @@ class BindingAwareBrokerImpl implements BindingAwareBroker { proxy.delegate = service; return new RpcServiceRegistrationImpl(type, service, osgiReg); } + + def RpcRegistration registerMountedRpcImplementation(Class tyoe, T service, InstanceIdentifier identifier, + OsgiProviderContext context, Hashtable properties) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } + + def RoutedRpcRegistration registerRoutedRpcImplementation(Class type, T service, OsgiProviderContext context, + Hashtable properties) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend index 22db73526e..8b0400f512 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend @@ -49,4 +49,17 @@ class NotificationBrokerImpl implements NotificationProviderService { def notifyAll(Collection> listeners, Notification notification) { listeners.forEach[(it as NotificationListener).onNotification(notification)] } + + override addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + + } + + override removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } + + override notify(Notification notification, ExecutorService service) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationServiceImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationServiceImpl.xtend deleted file mode 100644 index fb35ee3779..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationServiceImpl.xtend +++ /dev/null @@ -1,33 +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.controller.sal.binding.api.NotificationService -import org.opendaylight.controller.sal.binding.api.NotificationListener -import org.opendaylight.yangtools.yang.binding.Notification -import com.google.common.collect.Multimap -import com.google.common.collect.HashMultimap - -class NotificationServiceImpl implements NotificationService { - val Multimap, NotificationListener> listeners; - - new() { - listeners = HashMultimap.create() - } - - override addNotificationListener(Class notificationType, - NotificationListener listener) { - listeners.put(notificationType, listener) - } - - override removeNotificationListener(Class notificationType, - NotificationListener listener) { - listeners.remove(notificationType, listener) - } - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend index c769ca1ee3..494118b694 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend @@ -12,24 +12,26 @@ import java.util.Hashtable; import java.util.Map; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcServiceRegistration; import org.opendaylight.yangtools.yang.binding.RpcService; import org.osgi.framework.BundleContext; import static org.opendaylight.controller.sal.binding.impl.osgi.Constants.*; import static extension org.opendaylight.controller.sal.binding.impl.osgi.PropertiesUtils.*; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality class OsgiProviderContext extends OsgiConsumerContext implements ProviderContext { @Property - val Map, RpcServiceRegistrationImpl> registeredServices + val Map, RpcRegistration> registeredServices new(BundleContext ctx, BindingAwareBrokerImpl broker) { super(ctx, broker); _registeredServices = new HashMap(); } - override def RpcServiceRegistration addRpcImplementation(Class type, T implementation) { + override addRpcImplementation(Class type, T implementation) { // TODO Auto-generated method stub val properties = new Hashtable(); @@ -40,4 +42,32 @@ class OsgiProviderContext extends OsgiConsumerContext implements ProviderContext registeredServices.put(type, salReg) return salReg; } + + override addMountRpcImplementation(Class type, InstanceIdentifier mount, T implementation) throws IllegalStateException { + + val properties = new Hashtable(); + properties.salServiceType = SAL_SERVICE_TYPE_PROVIDER + + // Fill requirements + val salReg = broker.registerMountedRpcImplementation(type, implementation, mount, this, properties) + registeredServices.put(type, salReg) + return salReg; + } + + override addRoutedRpcImplementation(Class type, T implementation) throws IllegalStateException { + val properties = new Hashtable(); + properties.salServiceType = SAL_SERVICE_TYPE_PROVIDER + + // Fill requirements + val salReg = broker.registerRoutedRpcImplementation(type, implementation, this, properties) + registeredServices.put(type, salReg) + return salReg; + } + + override registerFunctionality(ProviderFunctionality functionality) { + + } + + override unregisterFunctionality(ProviderFunctionality functionality) { + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcServiceRegistrationImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcServiceRegistrationImpl.xtend index afb27b47c6..5b31b5f50d 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcServiceRegistrationImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcServiceRegistrationImpl.xtend @@ -7,11 +7,11 @@ */ package org.opendaylight.controller.sal.binding.impl -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcServiceRegistration import org.osgi.framework.ServiceRegistration import org.opendaylight.yangtools.yang.binding.RpcService +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration -class RpcServiceRegistrationImpl implements RpcServiceRegistration { +class RpcServiceRegistrationImpl implements RpcRegistration { val ServiceRegistration osgiRegistration; private val T service; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/_DataBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/_DataBrokerImpl.xtend index b278df56f8..794e028ab2 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/_DataBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/_DataBrokerImpl.xtend @@ -17,6 +17,7 @@ import org.opendaylight.controller.sal.binding.api.data.DataValidator import org.opendaylight.yangtools.yang.common.RpcResult import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider import java.util.Map +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier class _DataBrokerImpl implements DataProviderService { @@ -74,5 +75,17 @@ class _DataBrokerImpl implements DataProviderService { def DataProviderContext resolveProvider(DataStoreIdentifier store, Class root) { } + + override beginTransaction() { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } + + override getConfigurationData(InstanceIdentifier data) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } + + override getData(InstanceIdentifier data) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/DelegateProxy.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/DelegateProxy.java new file mode 100644 index 0000000000..085228c966 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/DelegateProxy.java @@ -0,0 +1,7 @@ +package org.opendaylight.controller.sal.binding.spi; + +public interface DelegateProxy { + + void setDelegate(T delegate); + T getDelegate(); +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRouter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRouter.java new file mode 100644 index 0000000000..360f039366 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRouter.java @@ -0,0 +1,62 @@ +package org.opendaylight.controller.sal.binding.spi; + +import org.opendaylight.yangtools.yang.binding.BaseIdentity; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.RpcService; + +/** + * RpcRouter is responsible for selecting RpcService based on provided routing + * context identifier {@link RpcRoutingTable#getContextIdentifier()} and path in + * overal data tree (@link {@link InstanceIdentifier}. + * + * + * @author Tony Tkacik + * + * @param + * Type of RpcService for which router provides routing information + * and route selection. + */ +public interface RpcRouter { + + /** + * Returns a type of RpcService which is served by this instance of router. + * + * @return type of RpcService which is served by this instance of router. + */ + Class getRpcServiceType(); + + /** + * Returns a routing table for particular route context + * + * @param routeContext + * @return Routing Table for particular route context. + */ + RpcRoutingTable getRoutingTable(Class routeContext); + + /** + * Returns an instance of RpcService which is responsible for processing + * particular path. + * + * @param context + * Rpc Routing Context + * @param path + * Instance Identifier which is used as a selector of instance. + * @return instance of RpcService which is responsible for processing + * particular path. + */ + T getService(Class context, InstanceIdentifier path); + + /** + * Returns a default fallback instance of RpcService which is responsible + * for handling all unknown imports. + * + * @return default instance responsible for processing RPCs. + */ + T getDefaultService(); + + /** + * + */ + void setDefaultService(); + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingTable.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingTable.java new file mode 100644 index 0000000000..f2d38256c9 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingTable.java @@ -0,0 +1,38 @@ +package org.opendaylight.controller.sal.binding.spi; + +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 interface RpcRoutingTable { + + Class getContextIdentifier(); + + /** + * Updates route for particular path to specified instance of {@link RpcService}. + * + * @param path Path for which RpcService routing is to be updated + * @param service Instance of RpcService which is responsible for processing Rpc Requests. + */ + void updateRoute(InstanceIdentifier path,S service); + + /** + * Deletes a route for particular path + * + * @param path Path for which + */ + void deleteRoute(InstanceIdentifier path); + + /** + * + */ + S getService(InstanceIdentifier nodeInstance); + + /** + * + * @return + */ + Map getRoutes(); +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/package-info.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/package-info.java new file mode 100644 index 0000000000..774571b545 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author ttkacik + * + */ +package org.opendaylight.controller.sal.binding.spi; \ No newline at end of file diff --git a/opendaylight/md-sal/sal-connector-api/pom.xml b/opendaylight/md-sal/sal-connector-api/pom.xml index 68c8756e46..3be5b82806 100644 --- a/opendaylight/md-sal/sal-connector-api/pom.xml +++ b/opendaylight/md-sal/sal-connector-api/pom.xml @@ -14,6 +14,11 @@ + + org.opendaylight.controller + sal-core-api + 1.0-SNAPSHOT + org.opendaylight.yangtools yang-data-api diff --git a/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/Connector.java b/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/Connector.java index e47d67e8cf..55f8b8ced9 100644 --- a/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/Connector.java +++ b/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/Connector.java @@ -2,8 +2,18 @@ package org.opendaylight.controller.sal.connector.api; import java.util.Set; +import org.opendaylight.controller.sal.core.api.RpcImplementation; +import org.opendaylight.controller.sal.core.api.notify.NotificationListener; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; -public interface Connector { +public interface Connector extends RpcImplementation, NotificationListener { + + + Set getConfigurationPrefixes(); + Set getRuntimePrefixes(); + + void registerListener(ConnectorListener listener); + void unregisterListener(ConnectorListener listener); } diff --git a/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/ConnectorListener.java b/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/ConnectorListener.java new file mode 100644 index 0000000000..ac9c893a0b --- /dev/null +++ b/opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/ConnectorListener.java @@ -0,0 +1,19 @@ +/* + * 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.connector.api; + +import java.util.Set; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +public interface ConnectorListener { + + void onPrefixesAnnounced(Set prefixes); + void onPrefixesWithdrawn(Set prefixes); + +}