Merge "Added skeleton for yang maven plugin."
authorGiovanni Meo <gmeo@cisco.com>
Fri, 5 Apr 2013 13:19:55 +0000 (13:19 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 5 Apr 2013 13:19:55 +0000 (13:19 +0000)
25 files changed:
opendaylight/sal/yang-prototype/sal/pom.xml
opendaylight/sal/yang-prototype/sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/DataProviderService.java
opendaylight/sal/yang-prototype/sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/DataRefresher.java
opendaylight/sal/yang-prototype/sal/sal-binding-broker-impl/pom.xml
opendaylight/sal/yang-prototype/sal/sal-binding-broker-impl/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingBrokerImpl.java
opendaylight/sal/yang-prototype/sal/sal-binding-broker-impl/src/main/java/org/opendaylight/controller/sal/binding/impl/DataModule.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/sal/sal-binding-spi/src/main/java/org/opendaylight/controller/sal/binding/spi/MappingProvider.java
opendaylight/sal/yang-prototype/sal/sal-binding-spi/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcMapper.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/pom.xml
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/BrokerImpl.java
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/BrokerServiceImpl.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/ConsumerSessionImpl.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/DataBrokerModule.java [moved from opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/data/DataBrokerModule.java with 86% similarity]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/NotificationModule.java [moved from opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/notify/NotificationModule.java with 86% similarity]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/ProviderSessionImpl.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/data/package-info.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/notify/package-info.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/rpc/RpcModule.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/rpc/package-info.java [deleted file]
opendaylight/sal/yang-prototype/sal/sal-common-util/pom.xml [new file with mode: 0644]
opendaylight/sal/yang-prototype/sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Rpcs.java [moved from opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/RpcUtils.java with 60% similarity]
opendaylight/sal/yang-prototype/sal/sal-core-api/pom.xml
opendaylight/sal/yang-prototype/sal/sal-core-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataBrokerService.java
opendaylight/sal/yang-prototype/sal/sal-core-api/src/main/java/org/opendaylight/controller/sal/core/api/model/SchemaService.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/sal/sal-core-demo/src/main/java/org/opendaylight/controller/sal/demo/SALDemo.java

index 1b633b4a25ae78f1cb32710a3c9590921e987fb2..9f77613b89ff584b8304b09d822e8ed3e5cdde6e 100644 (file)
@@ -7,15 +7,15 @@
        <packaging>pom</packaging>\r
 \r
        <modules>\r
+               <module>sal-common</module>\r
+               <module>sal-common-util</module>\r
                <module>sal-core-api</module>\r
                <module>sal-data-api</module>\r
                <module>sal-binding-api</module>\r
                <module>sal-binding-spi</module>\r
                <module>sal-binding-broker-impl</module>\r
                <module>sal-schema-repository-api</module>\r
-               <module>sal-common</module>\r
                <module>sal-core-spi</module>\r
-               <module>../yang</module>\r
                <module>sal-broker-impl</module>\r
                <module>sal-core-demo</module>\r
        </modules>\r
                                <artifactId>slf4j-api</artifactId>\r
                                <version>1.7.2</version>\r
                        </dependency>\r
+                       <dependency>\r
+                               <groupId>junit</groupId>\r
+                               <artifactId>junit</artifactId>\r
+                               <version>4.10</version>\r
+                       </dependency>\r
                </dependencies>\r
        </dependencyManagement>\r
 \r
@@ -40,7 +45,6 @@
                <dependency>\r
                        <groupId>junit</groupId>\r
                        <artifactId>junit</artifactId>\r
-                       <version>4.10</version>\r
                        <scope>test</scope>\r
                        <optional>true</optional>\r
                </dependency>\r
index e4e7be5c6c196cef628d8598d498ad3928cfc3a2..8f90ddbbea8e073056f43d566e4996acf500c48a 100644 (file)
@@ -62,24 +62,6 @@ public interface DataProviderService extends DataBrokerService {
      * @param store\r
      * @param refresher\r
      */\r
-    void removeRefresher(DataStoreIdentifier store, DataRefresher refresher);\r
-\r
-    /**\r
-     * Trigger for refreshing of the data exposed by the {@link Provider}\r
-     * \r
-\r
-     * \r
-     */\r
-    public interface DataRefresher extends\r
-            BindingAwareProvider.ProviderFunctionality {\r
-\r
-        /**\r
-         * Fired when some component explicitly requested the data refresh.\r
-         * \r
-         * The provider which exposed the {@link DataRefresher} should republish\r
-         * its provided data by editing the data in all affected data stores.\r
-         */\r
-        void refreshData();\r
-    }\r
+   void removeRefresher(DataStoreIdentifier store, DataRefresher refresher);\r
 \r
 }\r
index 56b2a9f4dabdb0c675360b8e417d1d2090f1a5db..0f9997651fd677dbb4fb01536278c43252d439c3 100644 (file)
@@ -7,9 +7,20 @@
  */\r
 package org.opendaylight.controller.sal.binding.api;\r
 \r
-import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality;\r
-\r
-public interface DataRefresher extends ProviderFunctionality {\r
+/**\r
+ * Trigger for refreshing of the data exposed by the {@link Provider}\r
+ * \r
+ * \r
+ * \r
+ */\r
+public interface DataRefresher extends\r
+        BindingAwareProvider.ProviderFunctionality {\r
 \r
+    /**\r
+     * Fired when some component explicitly requested the data refresh.\r
+     * \r
+     * The provider which exposed the {@link DataRefresher} should republish its\r
+     * provided data by editing the data in all affected data stores.\r
+     */\r
     void refreshData();\r
-}\r
+}
\ No newline at end of file
index f126744652b78f8a4b87cf14a3b8adf5852c0137..2d427cb61fa5aa6993e4648d83a3c2d27bf3eb2d 100644 (file)
 \r
 \r
        <dependencies>\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>sal-common-util</artifactId>\r
+                       <version>1.0-SNAPSHOT</version>\r
+               </dependency>\r
                <dependency>\r
                        <groupId>org.opendaylight.controller</groupId>\r
                        <artifactId>sal-binding-api</artifactId>\r
index 2209f84cac7ca86b29da96487dd1b45329daca5d..32eff18d4a3644069cec3d8cfce0bbdff7fb5c36 100644 (file)
@@ -7,17 +7,36 @@
  */
 package org.opendaylight.controller.sal.binding.impl;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.controller.sal.binding.api.BindingAwareService;
+import org.opendaylight.controller.sal.binding.spi.Mapper;
+import org.opendaylight.controller.sal.binding.spi.MappingProvider;
+import org.opendaylight.controller.sal.binding.spi.RpcMapper;
+import org.opendaylight.controller.sal.binding.spi.RpcMapper.RpcProxyInvocationHandler;
 import org.opendaylight.controller.sal.binding.spi.SALBindingModule;
+import org.opendaylight.controller.sal.common.util.Rpcs;
+import org.opendaylight.controller.sal.core.api.Provider;
+import org.opendaylight.controller.sal.core.api.RpcImplementation;
+import org.opendaylight.controller.yang.binding.DataObject;
 import org.opendaylight.controller.yang.binding.RpcService;
+import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.common.RpcResult;
+import org.opendaylight.controller.yang.data.api.CompositeNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,6 +50,22 @@ public class BindingBrokerImpl implements BindingAwareBroker {
 
     private Set<SALBindingModule> modules = new HashSet<SALBindingModule>();
     private Map<Class<? extends BindingAwareService>, SALBindingModule> salServiceProviders = new HashMap<Class<? extends BindingAwareService>, SALBindingModule>();
+    private MappingProvider mapping;
+    private BIFacade biFacade = new BIFacade();
+    private org.opendaylight.controller.sal.core.api.Broker.ProviderSession biSession;
+    private ExecutorService executor;
+
+    Map<Class<? extends RpcService>, RpcService> rpcImpls = Collections
+            .synchronizedMap(new HashMap<Class<? extends RpcService>, RpcService>());
+
+    private RpcProxyInvocationHandler rpcProxyHandler = new RpcProxyInvocationHandler() {
+
+        @Override
+        public Future<RpcResult<? extends DataObject>> invokeRpc(
+                RpcService proxy, QName rpc, DataObject input) {
+            return rpcProxyInvoked(proxy, rpc, input);
+        }
+    };
 
     @Override
     public ConsumerSession registerConsumer(BindingAwareConsumer consumer) {
@@ -41,9 +76,7 @@ public class BindingBrokerImpl implements BindingAwareBroker {
         consumer.onSessionInitialized(session);
 
         sessions.add(session);
-
         return session;
-
     }
 
     @Override
@@ -116,11 +149,101 @@ public class BindingBrokerImpl implements BindingAwareBroker {
 
     }
 
+    private <T extends RpcService> T newRpcProxyForSession(Class<T> service) {
+
+        RpcMapper<T> mapper = mapping.rpcMapperForClass(service);
+        if (mapper == null) {
+            log.error("Mapper for " + service + "is unavailable.");
+            return null;
+        }
+        T proxy = mapper.getConsumerProxy(rpcProxyHandler);
+
+        return proxy;
+    }
+
+    private Future<RpcResult<? extends DataObject>> rpcProxyInvoked(
+            RpcService rpcProxy, QName rpcType, DataObject inputData) {
+        if (rpcProxy == null) {
+            throw new IllegalArgumentException("Proxy must not be null");
+        }
+        if (rpcType == null) {
+            throw new IllegalArgumentException(
+                    "rpcType (QName) should not be null");
+        }
+        Future<RpcResult<? extends DataObject>> ret = null;
+
+        // Real invocation starts here
+        RpcMapper<? extends RpcService> mapper = mapping
+                .rpcMapperForProxy(rpcProxy);
+        RpcService impl = rpcImpls.get(mapper.getServiceClass());
+
+        if (impl == null) {
+            // RPC is probably remote
+            CompositeNode inputNode = null;
+            Mapper<? extends DataObject> inputMapper = mapper.getInputMapper();
+            if (inputMapper != null) {
+                inputNode = inputMapper.domFromObject(inputData);
+            }
+            Future<RpcResult<CompositeNode>> biResult = biSession.rpc(rpcType,
+                    inputNode);
+            ret = new TranslatedFuture(biResult, mapper);
+
+        } else {
+            // RPC is local
+            Callable<RpcResult<? extends DataObject>> invocation = localRpcCallableFor(
+                    impl, mapper, rpcType, inputData);
+            ret = executor.submit(invocation);
+        }
+        return ret;
+    }
+
+    private Callable<RpcResult<? extends DataObject>> localRpcCallableFor(
+            final RpcService impl,
+            final RpcMapper<? extends RpcService> mapper, final QName rpcType,
+            final DataObject inputData) {
+
+        return new Callable<RpcResult<? extends DataObject>>() {
+
+            @Override
+            public RpcResult<? extends DataObject> call() throws Exception {
+                return mapper.invokeRpcImplementation(rpcType, impl, inputData);
+            }
+        };
+    }
+
+    // Binding Independent invocation of Binding Aware RPC
+    private RpcResult<CompositeNode> invokeLocalRpc(QName rpc,
+            CompositeNode inputNode) {
+        RpcMapper<? extends RpcService> mapper = mapping.rpcMapperForData(rpc,
+                inputNode);
+
+        DataObject inputTO = mapper.getInputMapper().objectFromDom(inputNode);
+
+        RpcService impl = rpcImpls.get(mapper.getServiceClass());
+        if (impl == null) {
+            log.warn("Implementation for rpc: " + rpc + "not available.");
+        }
+        RpcResult<? extends DataObject> result = mapper
+                .invokeRpcImplementation(rpc, impl, inputTO);
+        DataObject outputTO = result.getResult();
+
+        CompositeNode outputNode = null;
+        if (outputTO != null) {
+            outputNode = mapper.getOutputMapper().domFromObject(outputTO);
+        }
+        return Rpcs.getRpcResult(result.isSuccessful(), outputNode,
+                result.getErrors());
+    }
+
     private class ConsumerSessionImpl implements
             BindingAwareBroker.ConsumerSession {
 
         private final BindingAwareConsumer consumer;
-        private Map<Class<? extends BindingAwareService>, BindingAwareService> sessionSalServices = new HashMap<Class<? extends BindingAwareService>, BindingAwareService>();
+        private Map<Class<? extends BindingAwareService>, BindingAwareService> sessionSalServices = Collections
+                .synchronizedMap(new HashMap<Class<? extends BindingAwareService>, BindingAwareService>());
+
+        private Map<Class<? extends RpcService>, RpcService> sessionRpcProxies = Collections
+                .synchronizedMap(new HashMap<Class<? extends RpcService>, RpcService>());
 
         public ConsumerSessionImpl(BindingAwareConsumer cons) {
             this.consumer = cons;
@@ -153,9 +276,27 @@ public class BindingBrokerImpl implements BindingAwareBroker {
         }
 
         @Override
-        public <T extends RpcService> T getRpcService(Class<T> module) {
-            // TODO Implement this method
-            throw new UnsupportedOperationException("Not implemented");
+        public <T extends RpcService> T getRpcService(Class<T> service) {
+            RpcService current = sessionRpcProxies.get(service);
+            if (current != null) {
+                if (service.isInstance(current)) {
+                    @SuppressWarnings("unchecked")
+                    T ret = (T) current;
+                    return ret;
+                } else {
+                    log.error("Proxy  for rpc service " + service.getName()
+                            + " does not implement the service interface");
+                    throw new IllegalStateException("Service implementation "
+                            + current.getClass().getName()
+                            + "does not implement " + service.getName());
+                }
+            } else {
+                T ret = BindingBrokerImpl.this.newRpcProxyForSession(service);
+                if (ret != null) {
+                    sessionRpcProxies.put(service, ret);
+                }
+                return ret;
+            }
         }
 
         public BindingAwareConsumer getConsumer() {
@@ -176,12 +317,20 @@ public class BindingBrokerImpl implements BindingAwareBroker {
 
         @Override
         public void addRpcImplementation(RpcService implementation) {
+            if (implementation == null) {
+                throw new IllegalArgumentException(
+                        "Implementation should not be null");
+            }
             // TODO Implement this method
             throw new UnsupportedOperationException("Not implemented");
         }
 
         @Override
         public void removeRpcImplementation(RpcService implementation) {
+            if (implementation == null) {
+                throw new IllegalArgumentException(
+                        "Implementation should not be null");
+            }
             // TODO Implement this method
             throw new UnsupportedOperationException("Not implemented");
         }
@@ -192,4 +341,96 @@ public class BindingBrokerImpl implements BindingAwareBroker {
 
     }
 
+    private class BIFacade implements Provider,RpcImplementation {
+
+        @Override
+        public Set<QName> getSupportedRpcs() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public RpcResult<CompositeNode> invokeRpc(QName rpc, CompositeNode input) {
+            if (rpc == null) {
+                throw new IllegalArgumentException(
+                        "Rpc type should not be null");
+            }
+
+            return BindingBrokerImpl.this.invokeLocalRpc(rpc, input);
+        }
+
+        @Override
+        public void onSessionInitiated(
+                org.opendaylight.controller.sal.core.api.Broker.ProviderSession session) {
+            
+            BindingBrokerImpl.this.biSession = session;
+            for (SALBindingModule module : modules) {
+                try {
+                    module.onBISessionAvailable(biSession);
+                } catch(Exception e) {
+                    log.error("Module " +module +" throwed unexpected exception",e);
+                }
+            }
+        }
+
+        @Override
+        public Collection<ProviderFunctionality> getProviderFunctionality() {
+            return Collections.emptySet();
+        }
+
+    }
+
+    private static class TranslatedFuture implements
+            Future<RpcResult<? extends DataObject>> {
+        private final Future<RpcResult<CompositeNode>> realFuture;
+        private final RpcMapper<?> mapper;
+
+        public TranslatedFuture(Future<RpcResult<CompositeNode>> future,
+                RpcMapper<?> mapper) {
+            realFuture = future;
+            this.mapper = mapper;
+        }
+
+        @Override
+        public boolean cancel(boolean mayInterruptIfRunning) {
+            return realFuture.cancel(mayInterruptIfRunning);
+        }
+
+        @Override
+        public boolean isCancelled() {
+            return realFuture.isCancelled();
+        }
+
+        @Override
+        public boolean isDone() {
+            return realFuture.isDone();
+        }
+
+        @Override
+        public RpcResult<? extends DataObject> get()
+                throws InterruptedException, ExecutionException {
+            RpcResult<CompositeNode> val = realFuture.get();
+            return tranlate(val);
+        }
+
+        @Override
+        public RpcResult<? extends DataObject> get(long timeout, TimeUnit unit)
+                throws InterruptedException, ExecutionException,
+                TimeoutException {
+            RpcResult<CompositeNode> val = realFuture.get(timeout, unit);
+            return tranlate(val);
+        }
+
+        private RpcResult<? extends DataObject> tranlate(
+                RpcResult<CompositeNode> result) {
+            CompositeNode outputNode = result.getResult();
+            DataObject outputTO = null;
+            if (outputNode != null) {
+                Mapper<?> outputMapper = mapper.getOutputMapper();
+                outputTO = outputMapper.objectFromDom(outputNode);
+            }
+            return Rpcs.getRpcResult(result.isSuccessful(), outputTO,
+                    result.getErrors());
+        }
+
+    }
 }
diff --git a/opendaylight/sal/yang-prototype/sal/sal-binding-broker-impl/src/main/java/org/opendaylight/controller/sal/binding/impl/DataModule.java b/opendaylight/sal/yang-prototype/sal/sal-binding-broker-impl/src/main/java/org/opendaylight/controller/sal/binding/impl/DataModule.java
new file mode 100644 (file)
index 0000000..cbd6b00
--- /dev/null
@@ -0,0 +1,198 @@
+package org.opendaylight.controller.sal.binding.impl;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerSession;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality;
+import org.opendaylight.controller.sal.binding.api.BindingAwareService;
+import org.opendaylight.controller.sal.binding.api.DataBrokerService;
+import org.opendaylight.controller.sal.binding.api.DataCommitHandler;
+import org.opendaylight.controller.sal.binding.api.DataProviderService;
+import org.opendaylight.controller.sal.binding.api.DataValidator;
+import org.opendaylight.controller.sal.binding.spi.MappingProvider;
+import org.opendaylight.controller.sal.binding.spi.SALBindingModule;
+import org.opendaylight.controller.sal.common.DataStoreIdentifier;
+import org.opendaylight.controller.sal.binding.api.DataRefresher;
+import org.opendaylight.controller.yang.binding.DataRoot;
+import org.opendaylight.controller.yang.common.RpcResult;
+import org.opendaylight.controller.yang.data.api.CompositeNode;
+
+public class DataModule implements SALBindingModule {
+
+    private BindingAwareBroker broker;
+    private org.opendaylight.controller.sal.core.api.Broker.ProviderSession biSession;
+    private MappingProvider mappingProvider;
+    private final BIFacade biFacade = new BIFacade();
+    private org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService;
+
+    @Override
+    public void setBroker(BindingAwareBroker broker) {
+        this.broker = broker;
+    }
+
+    @Override
+    public void onBISessionAvailable(
+            org.opendaylight.controller.sal.core.api.Broker.ProviderSession session) {
+        this.biSession = session;
+        this.biDataService = session
+                .getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class);
+        // biDataService.addRefresher(store, refresher)
+
+    }
+
+    @Override
+    public void setMappingProvider(MappingProvider provider) {
+        this.mappingProvider = provider;
+
+    }
+
+    @Override
+    public Set<Class<? extends BindingAwareService>> getProvidedServices() {
+        Set<Class<? extends BindingAwareService>> ret = new HashSet<Class<? extends BindingAwareService>>();
+        ret.add(DataBrokerService.class);
+        ret.add(DataProviderService.class);
+        return ret;
+    }
+
+    @Override
+    public <T extends BindingAwareService> T getServiceForSession(
+            Class<T> service, ConsumerSession session) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Set<Class<? extends ProviderFunctionality>> getSupportedProviderFunctionality() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    private class DataBrokerSession implements DataBrokerService {
+
+        @Override
+        public <T extends DataRoot> T getData(DataStoreIdentifier store,
+                Class<T> rootType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T extends DataRoot> T getData(DataStoreIdentifier store,
+                T filter) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T extends DataRoot> T getCandidateData(
+                DataStoreIdentifier store, Class<T> rootType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T extends DataRoot> T getCandidateData(
+                DataStoreIdentifier store, T filter) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public RpcResult<DataRoot> editCandidateData(DataStoreIdentifier store,
+                DataRoot changeSet) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<RpcResult<Void>> commit(DataStoreIdentifier store) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+    }
+
+    private class DataProviderSession extends DataBrokerSession implements
+            DataProviderService {
+
+        @Override
+        public void addValidator(DataStoreIdentifier store,
+                DataValidator validator) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void removeValidator(DataStoreIdentifier store,
+                DataValidator validator) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void addCommitHandler(DataStoreIdentifier store,
+                DataCommitHandler provider) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void removeCommitHandler(DataStoreIdentifier store,
+                DataCommitHandler provider) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void addRefresher(DataStoreIdentifier store,
+                DataRefresher refresher) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void removeRefresher(DataStoreIdentifier store,
+                DataRefresher refresher) {
+            // TODO Auto-generated method stub
+
+        }
+
+    }
+
+    private class BIFacade
+            implements
+            org.opendaylight.controller.sal.core.api.data.DataCommitHandler,
+            org.opendaylight.controller.sal.core.api.data.DataValidator,
+            org.opendaylight.controller.sal.core.api.data.DataProviderService.DataRefresher {
+
+        @Override
+        public RpcResult<Void> validate(CompositeNode toValidate) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Set<DataStoreIdentifier> getSupportedDataStores() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public RpcResult<CommitTransaction> requestCommit(
+                DataStoreIdentifier store) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public void refreshData() {
+            // TODO Auto-generated method stub
+            
+        }
+
+    }
+
+}
index a7fbb240895ca7a5d7144c12d94fa25e98414cc8..b29eac2871c2a1534ead86f552a4acf5a3ddabf9 100644 (file)
@@ -8,12 +8,40 @@
 package org.opendaylight.controller.sal.binding.spi;
 
 import org.opendaylight.controller.yang.binding.DataObject;
+import org.opendaylight.controller.yang.binding.RpcService;
 import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.data.api.CompositeNode;
 
 public interface MappingProvider {
 
-    <T extends DataObject> Mapper<T> getMapper(Class<T> type);
-    Mapper<DataObject> getMapper(QName name);
+    <T extends DataObject> Mapper<T> mapperForClass(Class<T> type);
+    Mapper<DataObject> mapperForQName(QName name);
+    
+    /**
+     * Returns {@link RpcMapper} associated to class
+     * 
+     * @param type Class for which RpcMapper should provide mapping
+     * @return
+     */
+    <T extends RpcService> RpcMapper<T> rpcMapperForClass(Class<T> type);
+    
+    /**
+     * Returns {@link RpcMapper} associated to the {@link RpcService} proxy.
+     * 
+     * @param proxy
+     * @return
+     */
+    RpcMapper<? extends RpcService> rpcMapperForProxy(RpcService proxy);
+    
+    /**
+     * 
+     * 
+     * @param rpc
+     * @param inputNode
+     * @return
+     */
+    RpcMapper<? extends RpcService> rpcMapperForData(QName rpc,
+            CompositeNode inputNode);
 
     <T extends MappingExtension> MappingExtensionFactory<T> getExtensionFactory(Class<T> cls);
 
@@ -25,4 +53,6 @@ public interface MappingProvider {
         T forClass(Class<?> obj);
     }
 
+
+
 }
diff --git a/opendaylight/sal/yang-prototype/sal/sal-binding-spi/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcMapper.java b/opendaylight/sal/yang-prototype/sal/sal-binding-spi/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcMapper.java
new file mode 100644 (file)
index 0000000..0db1bc2
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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.spi;
+
+import java.util.Set;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.yang.binding.DataObject;
+import org.opendaylight.controller.yang.binding.RpcService;
+import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.common.RpcResult;
+
+public interface RpcMapper<T extends RpcService> {
+    
+    Set<QName> getRpcQNames();
+    
+    /**
+     * Returns a class object representing subinterface
+     * to whom, this mapper is assigned.
+     * 
+     * @return
+     */
+    Class<T> getServiceClass();
+    
+    /**
+     * Returns a Binding Mapper for Rpc Input Data
+     * @return
+     */
+    Mapper<?> getInputMapper();
+    /**
+     * Returns a Binding Mapper for Rpc Output Data
+     * 
+     * @return
+     */
+    Mapper<?> getOutputMapper();
+    
+    /**
+     * Returns a consumer proxy, which is responsible
+     * for invoking the rpc functionality of {@link BindingAwareBroker} implementation.
+     * 
+     * @return Proxy of {@link RpcService} assigned to this mapper.
+     */
+    T getConsumerProxy(RpcProxyInvocationHandler handler);
+    
+    /**
+     * Invokes the method of RpcService representing the supplied rpc.
+     * 
+     * @param rpc QName of Rpc
+     * @param impl Implementation of RpcService on which the method should be invoked
+     * @param baInput Input Data to RPC method
+     * @return Result of RPC invocation.
+     */
+    RpcResult<? extends DataObject> invokeRpcImplementation(QName rpc,
+            RpcService impl, DataObject baInput);
+    
+    public interface RpcProxyInvocationHandler {
+        
+        Future<RpcResult<? extends DataObject>> invokeRpc(RpcService proxy, QName rpc, DataObject input);
+    }
+}
index d81c6ac2ff9ad30a523c6814bf06effea2563330..c195fe4ae2c317807c2ed2d1ae77b867f55a26fe 100644 (file)
                        <artifactId>sal-core-api</artifactId>\r
                        <version>1.0-SNAPSHOT</version>\r
                </dependency>\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>sal-common-util</artifactId>\r
+                       <version>1.0-SNAPSHOT</version>\r
+               </dependency>\r
                <dependency>\r
                        <groupId>org.opendaylight.controller</groupId>\r
                        <artifactId>sal-core-spi</artifactId>\r
index 84bc0569504272704d3ea68605d42f6c13de0afe..b8a0b97eab9abb81b851eeda349ec6156709442a 100644 (file)
@@ -1,4 +1,3 @@
-
 /*\r
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
  *\r
@@ -8,46 +7,55 @@
  */\r
 package org.opendaylight.controller.sal.core.impl;\r
 \r
+import java.util.Collection;\r
+import java.util.Collections;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.Map;\r
 import java.util.Set;\r
+import java.util.concurrent.Callable;\r
+import java.util.concurrent.ExecutorService;\r
 import java.util.concurrent.Future;\r
-\r
 import org.opendaylight.controller.sal.core.api.Broker;\r
 import org.opendaylight.controller.sal.core.api.BrokerService;\r
 import org.opendaylight.controller.sal.core.api.Consumer;\r
 import org.opendaylight.controller.sal.core.api.Provider;\r
+import org.opendaylight.controller.sal.core.api.RpcImplementation;\r
 import org.opendaylight.controller.sal.core.spi.BrokerModule;\r
-import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.common.RpcResult;
-import org.opendaylight.controller.yang.data.api.CompositeNode;
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.common.RpcResult;\r
+import org.opendaylight.controller.yang.data.api.CompositeNode;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-\r
 public class BrokerImpl implements Broker {\r
     private static Logger log = LoggerFactory.getLogger(BrokerImpl.class);\r
 \r
-    private Set<ConsumerSessionImpl> sessions = new HashSet<ConsumerSessionImpl>();\r
-    private Set<ProviderSessionImpl> providerSessions = new HashSet<ProviderSessionImpl>();\r
-    // private ExecutorService executor;\r
-    private Set<BrokerModule> modules = new HashSet<BrokerModule>();\r
+    // Broker Generic Context\r
+    private Set<ConsumerSessionImpl> sessions = Collections\r
+            .synchronizedSet(new HashSet<ConsumerSessionImpl>());\r
+    private Set<ProviderSessionImpl> providerSessions = Collections\r
+            .synchronizedSet(new HashSet<ProviderSessionImpl>());\r
+    private Set<BrokerModule> modules = Collections\r
+            .synchronizedSet(new HashSet<BrokerModule>());\r
+    private Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = Collections\r
+            .synchronizedMap(new HashMap<Class<? extends BrokerService>, BrokerModule>());\r
+\r
+    // RPC Context\r
+    private Map<QName, RpcImplementation> rpcImpls = Collections\r
+            .synchronizedMap(new HashMap<QName, RpcImplementation>());\r
 \r
-    private Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = new HashMap<Class<? extends BrokerService>, BrokerModule>();\r
+    // Implementation specific\r
+    private ExecutorService executor;\r
 \r
     @Override\r
     public ConsumerSession registerConsumer(Consumer consumer) {\r
         checkPredicates(consumer);\r
         log.info("Registering consumer " + consumer);\r
-\r
         ConsumerSessionImpl session = newSessionFor(consumer);\r
         consumer.onSessionInitiated(session);\r
-\r
         sessions.add(session);\r
-\r
         return session;\r
-\r
     }\r
 \r
     @Override\r
@@ -56,11 +64,26 @@ public class BrokerImpl implements Broker {
 \r
         ProviderSessionImpl session = newSessionFor(provider);\r
         provider.onSessionInitiated(session);\r
-\r
         providerSessions.add(session);\r
         return session;\r
     }\r
 \r
+    public void addModule(BrokerModule module) {\r
+        log.info("Registering broker module " + module);\r
+        if (modules.contains(module)) {\r
+            log.error("Module already registered");\r
+            throw new IllegalArgumentException("Module already exists.");\r
+        }\r
+    \r
+        Set<Class<? extends BrokerService>> provServices = module\r
+                .getProvidedServices();\r
+        for (Class<? extends BrokerService> serviceType : provServices) {\r
+            log.info("  Registering session service implementation: "\r
+                    + serviceType.getCanonicalName());\r
+            serviceProviders.put(serviceType, module);\r
+        }\r
+    }\r
+\r
     public <T extends BrokerService> T serviceFor(Class<T> service,\r
             ConsumerSessionImpl session) {\r
         BrokerModule prov = serviceProviders.get(service);\r
@@ -71,11 +94,43 @@ public class BrokerImpl implements Broker {
         return prov.getServiceForSession(service, session);\r
     }\r
 \r
-    public Future<RpcResult<CompositeNode>> invokeRpc(QName rpc,\r
+    // RPC Functionality\r
+    \r
+    private void addRpcImplementation(QName rpcType,\r
+            RpcImplementation implementation) {\r
+        synchronized (rpcImpls) {\r
+            if (rpcImpls.get(rpcType) != null) {\r
+                throw new IllegalStateException("Implementation for rpc "\r
+                        + rpcType + " is already registered.");\r
+            }\r
+            rpcImpls.put(rpcType, implementation);\r
+        }\r
+        // TODO Add notification for availability of Rpc Implementation\r
+    }\r
+\r
+    private void removeRpcImplementation(QName rpcType,\r
+            RpcImplementation implToRemove) {\r
+        synchronized (rpcImpls) {\r
+            if (implToRemove == rpcImpls.get(rpcType)) {\r
+                rpcImpls.remove(rpcType);\r
+            }\r
+        }\r
+        // TODO Add notification for removal of Rpc Implementation\r
+    }\r
+\r
+    private Future<RpcResult<CompositeNode>> invokeRpc(QName rpc,\r
             CompositeNode input) {\r
-        // TODO Implement this method\r
-        throw new UnsupportedOperationException("Not implemented");\r
+        RpcImplementation impl = rpcImpls.get(rpc);\r
+        // if()\r
+\r
+        Callable<RpcResult<CompositeNode>> call = callableFor(impl,\r
+                rpc, input);\r
+        Future<RpcResult<CompositeNode>> result = executor.submit(call);\r
+\r
+        return result;\r
     }\r
+    \r
+    // Validation\r
 \r
     private void checkPredicates(Provider prov) {\r
         if (prov == null)\r
@@ -96,34 +151,130 @@ public class BrokerImpl implements Broker {
         }\r
     }\r
 \r
+    // Private Factory methods\r
+    \r
     private ConsumerSessionImpl newSessionFor(Consumer cons) {\r
-        return new ConsumerSessionImpl(this, cons);\r
+        return new ConsumerSessionImpl(cons);\r
     }\r
 \r
     private ProviderSessionImpl newSessionFor(Provider provider) {\r
-        return new ProviderSessionImpl(this, provider);\r
+        return new ProviderSessionImpl(provider);\r
     }\r
 \r
-    public void addModule(BrokerModule module) {\r
-        log.info("Registering broker module " + module);\r
-        if (modules.contains(module)) {\r
-            log.error("Module already registered");\r
-            throw new IllegalArgumentException("Module already exists.");\r
+    private void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {\r
+        sessions.remove(consumerSessionImpl);\r
+        providerSessions.remove(consumerSessionImpl);\r
+    }\r
+\r
+    private static Callable<RpcResult<CompositeNode>> callableFor(\r
+            final RpcImplementation implemenation, final QName rpc,\r
+            final CompositeNode input) {\r
+\r
+        return new Callable<RpcResult<CompositeNode>>() {\r
+\r
+            @Override\r
+            public RpcResult<CompositeNode> call() throws Exception {\r
+                return implemenation.invokeRpc(rpc, input);\r
+            }\r
+        };\r
+    }\r
+    \r
+    private class ConsumerSessionImpl implements ConsumerSession {\r
+\r
+        private final Consumer consumer;\r
+\r
+        private Map<Class<? extends BrokerService>, BrokerService> instantiatedServices = Collections\r
+                .synchronizedMap(new HashMap<Class<? extends BrokerService>, BrokerService>());\r
+        private boolean closed = false;\r
+\r
+        public Consumer getConsumer() {\r
+            return consumer;\r
         }\r
 \r
-        Set<Class<? extends BrokerService>> provServices = module\r
-                .getProvidedServices();\r
-        for (Class<? extends BrokerService> serviceType : provServices) {\r
-            log.info("  Registering session service implementation: "\r
-                    + serviceType.getCanonicalName());\r
-            serviceProviders.put(serviceType, module);\r
+        public ConsumerSessionImpl(Consumer consumer) {\r
+            this.consumer = consumer;\r
+        }\r
+\r
+        @Override\r
+        public Future<RpcResult<CompositeNode>> rpc(QName rpc,\r
+                CompositeNode input) {\r
+            return BrokerImpl.this.invokeRpc(rpc, input);\r
+        }\r
+\r
+        @Override\r
+        public <T extends BrokerService> T getService(Class<T> service) {\r
+            BrokerService potential = instantiatedServices.get(service);\r
+            if (potential != null) {\r
+                @SuppressWarnings("unchecked")\r
+                T ret = (T) potential;\r
+                return ret;\r
+            }\r
+            T ret = BrokerImpl.this.serviceFor(service, this);\r
+            if (ret != null) {\r
+                instantiatedServices.put(service, ret);\r
+            }\r
+            return ret;\r
+        }\r
+\r
+        @Override\r
+        public void close() {\r
+            Collection<BrokerService> toStop = instantiatedServices.values();\r
+            this.closed = true;\r
+            for (BrokerService brokerService : toStop) {\r
+                brokerService.closeSession();\r
+            }\r
+            BrokerImpl.this.consumerSessionClosed(this);\r
+        }\r
+\r
+        @Override\r
+        public boolean isClosed() {\r
+            return closed;\r
         }\r
-    }\r
 \r
-    public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {\r
-        sessions.remove(consumerSessionImpl);\r
-        providerSessions.remove(consumerSessionImpl);\r
     }\r
 \r
+    private class ProviderSessionImpl extends ConsumerSessionImpl implements\r
+            ProviderSession {\r
+\r
+        private Provider provider;\r
+        private Map<QName, RpcImplementation> sessionRpcImpls = Collections.synchronizedMap(new HashMap<QName, RpcImplementation>());\r
+\r
+        public ProviderSessionImpl(Provider provider) {\r
+            super(null);\r
+            this.provider = provider;\r
+        }\r
+\r
+        @Override\r
+        public void addRpcImplementation(QName rpcType,\r
+                RpcImplementation implementation)\r
+                throws IllegalArgumentException {\r
+            if (rpcType == null) {\r
+                throw new IllegalArgumentException("rpcType must not be null");\r
+            }\r
+            if (implementation == null) {\r
+                throw new IllegalArgumentException(\r
+                        "Implementation must not be null");\r
+            }\r
+            BrokerImpl.this.addRpcImplementation(rpcType, implementation);\r
+            sessionRpcImpls.put(rpcType, implementation);\r
+        }\r
+\r
+        @Override\r
+        public void removeRpcImplementation(QName rpcType,\r
+                RpcImplementation implToRemove) throws IllegalArgumentException {\r
+            RpcImplementation localImpl = rpcImpls.get(rpcType);\r
+            if (localImpl != implToRemove) {\r
+                throw new IllegalStateException(\r
+                        "Implementation was not registered in this session");\r
+            }\r
+\r
+            BrokerImpl.this.removeRpcImplementation(rpcType, implToRemove);\r
+            sessionRpcImpls.remove(rpcType);\r
+        }\r
+\r
+        public Provider getProvider() {\r
+            return this.provider;\r
+        }\r
+\r
+    }\r
 }\r
-
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/BrokerServiceImpl.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/BrokerServiceImpl.java
deleted file mode 100644 (file)
index 4f25443..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.controller.sal.core.impl;\r
-\r
-import org.opendaylight.controller.sal.core.api.BrokerService;\r
-\r
-abstract public class BrokerServiceImpl implements BrokerService {\r
-\r
-    ConsumerSessionImpl session;\r
-}\r
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/ConsumerSessionImpl.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/ConsumerSessionImpl.java
deleted file mode 100644 (file)
index 032dd22..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.controller.sal.core.impl;\r
-\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-import java.util.concurrent.Future;\r
-\r
-import org.opendaylight.controller.sal.core.api.BrokerService;\r
-import org.opendaylight.controller.sal.core.api.Consumer;\r
-import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;\r
-import org.opendaylight.controller.yang.common.QName;\r
-import org.opendaylight.controller.yang.common.RpcResult;\r
-import org.opendaylight.controller.yang.data.api.CompositeNode;\r
-\r
-\r
-public class ConsumerSessionImpl implements ConsumerSession {\r
-\r
-    private final BrokerImpl broker;\r
-    private final Consumer consumer;\r
-\r
-    private Map<Class<? extends BrokerService>, BrokerService> instantiatedServices = new HashMap<Class<? extends BrokerService>, BrokerService>();\r
-    private boolean closed = false;\r
-\r
-    public Consumer getConsumer() {\r
-        return consumer;\r
-    }\r
-\r
-    public ConsumerSessionImpl(BrokerImpl broker, Consumer consumer) {\r
-        this.broker = broker;\r
-        this.consumer = consumer;\r
-    }\r
-\r
-    @Override\r
-    public Future<RpcResult<CompositeNode>> rpc(QName rpc, CompositeNode input) {\r
-        return broker.invokeRpc(rpc, input);\r
-    }\r
-\r
-    @Override\r
-    public <T extends BrokerService> T getService(Class<T> service) {\r
-        BrokerService potential = instantiatedServices.get(service);\r
-        if (potential != null) {\r
-            @SuppressWarnings("unchecked")\r
-            T ret = (T) potential;\r
-            return ret;\r
-        }\r
-        T ret = this.broker.serviceFor(service, this);\r
-        if (ret != null) {\r
-            instantiatedServices.put(service, ret);\r
-        }\r
-        return ret;\r
-    }\r
-\r
-    @Override\r
-    public void close() {\r
-        Collection<BrokerService> toStop = instantiatedServices.values();\r
-        this.closed  = true;\r
-        for (BrokerService brokerService : toStop) {\r
-            brokerService.closeSession();\r
-        }\r
-        broker.consumerSessionClosed(this);\r
-    }\r
-\r
-    @Override\r
-    public boolean isClosed() {\r
-        return closed;\r
-    }\r
-\r
-}
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
  */\r
-package org.opendaylight.controller.sal.core.impl.data;\r
+package org.opendaylight.controller.sal.core.impl;\r
 \r
 import java.util.ArrayList;\r
 import java.util.Collections;\r
@@ -13,9 +13,11 @@ import java.util.HashSet;
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
+import java.util.concurrent.ExecutorService;\r
 import java.util.concurrent.Future;\r
 \r
 import org.opendaylight.controller.sal.common.DataStoreIdentifier;\r
+import org.opendaylight.controller.sal.common.util.Rpcs;\r
 import org.opendaylight.controller.sal.core.api.BrokerService;\r
 import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;\r
 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;\r
@@ -27,7 +29,6 @@ import org.opendaylight.controller.sal.core.api.data.DataProviderService;
 import org.opendaylight.controller.sal.core.api.data.DataValidator;\r
 import org.opendaylight.controller.sal.core.api.data.DataCommitHandler.CommitTransaction;\r
 import org.opendaylight.controller.sal.core.api.data.DataProviderService.DataRefresher;\r
-import org.opendaylight.controller.sal.core.impl.RpcUtils;\r
 import org.opendaylight.controller.sal.core.spi.BrokerModule;\r
 import org.opendaylight.controller.yang.common.RpcError;\r
 import org.opendaylight.controller.yang.common.RpcResult;\r
@@ -36,33 +37,40 @@ import org.opendaylight.controller.yang.data.api.CompositeNodeModification;
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
+import com.google.common.collect.ImmutableSet;\r
 \r
 public class DataBrokerModule implements BrokerModule {\r
 \r
     private static final Logger log = LoggerFactory\r
             .getLogger(DataBrokerModule.class);\r
 \r
+    private static final Set<Class<? extends ProviderFunctionality>> SUPPORTED_PROVIDER_FUNCTIONALITY = ImmutableSet\r
+            .of((Class<? extends ProviderFunctionality>) DataValidator.class,\r
+                    DataRefresher.class, DataCommitHandler.class);\r
+\r
+    private static final Set<Class<? extends BrokerService>> PROVIDED_SESSION_SERVICES = ImmutableSet\r
+            .of((Class<? extends BrokerService>) DataBrokerService.class,\r
+                    DataProviderService.class);\r
+\r
     private Map<DataStoreIdentifier, StoreContext> storeContext;\r
 \r
+    private ExecutorService executor;\r
+    \r
     private SequentialCommitHandlerCoordinator coordinator = new SequentialCommitHandlerCoordinator();\r
 \r
     @Override\r
     public Set<Class<? extends BrokerService>> getProvidedServices() {\r
-        // FIXME: Refactor\r
-        Set<Class<? extends BrokerService>> ret = new HashSet<Class<? extends BrokerService>>();\r
-        ret.add(DataBrokerService.class);\r
-        ret.add(DataProviderService.class);\r
-        return ret;\r
+        return PROVIDED_SESSION_SERVICES;\r
     }\r
 \r
     @Override\r
     public Set<Class<? extends ProviderFunctionality>> getSupportedProviderFunctionality() {\r
-        // FIXME Refactor\r
-        Set<Class<? extends ProviderFunctionality>> ret = new HashSet<Class<? extends ProviderFunctionality>>();\r
-        ret.add(DataValidator.class);\r
-        ret.add(DataCommitHandler.class);\r
-        ret.add(DataRefresher.class);\r
-        return ret;\r
+        return SUPPORTED_PROVIDER_FUNCTIONALITY;\r
+    }\r
+\r
+    @Override\r
+    public Set<Class<? extends ConsumerFunctionality>> getSupportedConsumerFunctionality() {\r
+        return Collections.emptySet();\r
     }\r
 \r
     @Override\r
@@ -85,25 +93,24 @@ public class DataBrokerModule implements BrokerModule {
     }\r
 \r
     private DataProviderService newDataProviderService(ConsumerSession session) {\r
-        // TODO Implement this method\r
-        throw new UnsupportedOperationException("Not implemented");\r
+        return new DataProviderSession();\r
     }\r
 \r
     private DataBrokerService newDataConsumerService(ConsumerSession session) {\r
-        // TODO Implement this method\r
-        throw new UnsupportedOperationException("Not implemented");\r
+        return new DataConsumerSession();\r
     }\r
 \r
-    @Override\r
-    public Set<Class<? extends ConsumerFunctionality>> getSupportedConsumerFunctionality() {\r
-        // TODO Implement this method\r
-        throw new UnsupportedOperationException("Not implemented");\r
+    private StoreContext context(DataStoreIdentifier store) {\r
+        return storeContext.get(store);\r
     }\r
 \r
     private static class StoreContext {\r
-        private Set<DataCommitHandler> commitHandlers = new HashSet<DataCommitHandler>();\r
-        private Set<DataValidator> validators = new HashSet<DataValidator>();\r
-        private Set<DataRefresher> refreshers = new HashSet<DataRefresher>();\r
+        private Set<DataCommitHandler> commitHandlers = Collections\r
+                .synchronizedSet(new HashSet<DataCommitHandler>());\r
+        private Set<DataValidator> validators = Collections\r
+                .synchronizedSet(new HashSet<DataValidator>());\r
+        private Set<DataRefresher> refreshers = Collections\r
+                .synchronizedSet(new HashSet<DataRefresher>());\r
     }\r
 \r
     private class DataConsumerSession implements DataBrokerService {\r
@@ -153,10 +160,12 @@ public class DataBrokerModule implements BrokerModule {
             throw new UnsupportedOperationException("Not implemented");\r
         }\r
 \r
-    }\r
+        @Override\r
+        public Set<DataStoreIdentifier> getDataStores() {\r
+            // TODO Auto-generated method stub\r
+            return null;\r
+        }\r
 \r
-    private StoreContext context(DataStoreIdentifier store) {\r
-        return storeContext.get(store);\r
     }\r
 \r
     private class DataProviderSession extends DataConsumerSession implements\r
@@ -265,7 +274,7 @@ public class DataBrokerModule implements BrokerModule {
             }\r
             CommitTransaction transaction = new SequentialCommitTransaction(\r
                     store, transactions);\r
-            return RpcUtils.getRpcResult(successful, transaction, errors);\r
+            return Rpcs.getRpcResult(successful, transaction, errors);\r
         }\r
 \r
         @Override\r
@@ -306,7 +315,7 @@ public class DataBrokerModule implements BrokerModule {
                     break;\r
             }\r
 \r
-            return RpcUtils.getRpcResult(successful, null, errors);\r
+            return Rpcs.getRpcResult(successful, null, errors);\r
         }\r
 \r
         @Override\r
@@ -330,7 +339,7 @@ public class DataBrokerModule implements BrokerModule {
                     break;\r
             }\r
 \r
-            return RpcUtils.getRpcResult(successful, null, errors);\r
+            return Rpcs.getRpcResult(successful, null, errors);\r
         }\r
 \r
         @Override\r
@@ -374,7 +383,7 @@ public class DataBrokerModule implements BrokerModule {
                     break;\r
             }\r
 \r
-            return RpcUtils.getRpcResult(successful, null, errors);\r
+            return Rpcs.getRpcResult(successful, null, errors);\r
         }\r
 \r
         @Override\r
@@ -408,4 +417,3 @@ public class DataBrokerModule implements BrokerModule {
         }\r
     }\r
 }\r
-
@@ -22,7 +22,6 @@ import org.opendaylight.controller.sal.core.api.Provider.ProviderFunctionality;
 import org.opendaylight.controller.sal.core.api.notify.NotificationListener;\r
 import org.opendaylight.controller.sal.core.api.notify.NotificationProviderService;\r
 import org.opendaylight.controller.sal.core.api.notify.NotificationService;\r
-import org.opendaylight.controller.sal.core.impl.BrokerServiceImpl;\r
 import org.opendaylight.controller.sal.core.spi.BrokerModule;\r
 import org.opendaylight.controller.yang.common.QName;\r
 import org.opendaylight.controller.yang.data.api.CompositeNode;\r
@@ -40,21 +39,25 @@ public class NotificationModule implements BrokerModule {
     private Multimap<QName, NotificationListener> listeners = HashMultimap\r
             .create();\r
 \r
-    private static final Set<Class<? extends BrokerService>> providedServices = ImmutableSet\r
+    private static final Set<Class<? extends BrokerService>> PROVIDED_SERVICE_TYPE = ImmutableSet\r
             .of((Class<? extends BrokerService>) NotificationService.class,\r
                     NotificationProviderService.class);\r
 \r
+    private static final Set<Class<? extends ConsumerFunctionality>> SUPPORTED_CONSUMER_FUNCTIONALITY = ImmutableSet\r
+            .of((Class<? extends ConsumerFunctionality>) NotificationListener.class,\r
+                    NotificationListener.class); // Workaround: if we use the\r
+                                                 // version of method with only\r
+                                                 // one argument, the generics\r
+                                                 // inference will not work\r
+\r
     @Override\r
     public Set<Class<? extends BrokerService>> getProvidedServices() {\r
-        return providedServices;\r
+        return PROVIDED_SERVICE_TYPE;\r
     }\r
 \r
     @Override\r
     public Set<Class<? extends ConsumerFunctionality>> getSupportedConsumerFunctionality() {\r
-        // FIXME Refactor\r
-        Set<Class<? extends ConsumerFunctionality>> ret = new HashSet<Class<? extends ConsumerFunctionality>>();\r
-        ret.add(NotificationListener.class);\r
-        return ret;\r
+        return SUPPORTED_CONSUMER_FUNCTIONALITY;\r
     }\r
 \r
     @Override\r
@@ -107,8 +110,8 @@ public class NotificationModule implements BrokerModule {
         return new NotificationProviderSessionImpl();\r
     }\r
 \r
-    private class NotificationConsumerSessionImpl extends BrokerServiceImpl\r
-            implements NotificationService {\r
+    private class NotificationConsumerSessionImpl implements\r
+            NotificationService {\r
 \r
         private Multimap<QName, NotificationListener> consumerListeners = HashMultimap\r
                 .create();\r
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/ProviderSessionImpl.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/ProviderSessionImpl.java
deleted file mode 100644 (file)
index e87b8bb..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.controller.sal.core.impl;\r
-\r
-import java.util.Set;\r
-\r
-import org.opendaylight.controller.sal.core.api.Provider;\r
-import org.opendaylight.controller.sal.core.api.RpcImplementation;\r
-import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;\r
-import org.opendaylight.controller.yang.common.QName;
-\r
-\r
-public class ProviderSessionImpl extends ConsumerSessionImpl implements\r
-        ProviderSession {\r
-\r
-    private Provider provider;\r
-\r
-    public ProviderSessionImpl(BrokerImpl broker, Provider provider) {\r
-        super(broker, null);\r
-        this.provider = provider;\r
-    }\r
-\r
-    @Override\r
-    public void addRpcImplementation(QName rpcType,\r
-            RpcImplementation implementation) throws IllegalArgumentException {\r
-        // TODO Implement this method\r
-        throw new UnsupportedOperationException("Not implemented");\r
-    }\r
-\r
-    @Override\r
-    public void removeRpcImplementation(QName rpcType,\r
-            RpcImplementation implementation) throws IllegalArgumentException {\r
-        // TODO Implement this method\r
-        throw new UnsupportedOperationException("Not implemented");\r
-    }\r
-\r
-    public Provider getProvider() {\r
-        return this.provider;\r
-    }\r
-\r
-}\r
-
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/data/package-info.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/data/package-info.java
deleted file mode 100644 (file)
index 34fa5e4..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-
-package org.opendaylight.controller.sal.core.impl.data;
\ No newline at end of file
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/notify/package-info.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/notify/package-info.java
deleted file mode 100644 (file)
index c068196..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-
-package org.opendaylight.controller.sal.core.impl.notify;
\ No newline at end of file
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/rpc/RpcModule.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/rpc/RpcModule.java
deleted file mode 100644 (file)
index 58ceb5f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.opendaylight.controller.sal.core.impl.rpc;\r
-\r
-public interface RpcModule {\r
-\r
-}\r
diff --git a/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/rpc/package-info.java b/opendaylight/sal/yang-prototype/sal/sal-broker-impl/src/main/java/org/opendaylight/controller/sal/core/impl/rpc/package-info.java
deleted file mode 100644 (file)
index 41e9bcb..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/*\r
-  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
-  *\r
-  * This program and the accompanying materials are made available under the\r
-  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
-  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
-  */\r
-package org.opendaylight.controller.sal.core.impl.rpc;
\ No newline at end of file
diff --git a/opendaylight/sal/yang-prototype/sal/sal-common-util/pom.xml b/opendaylight/sal/yang-prototype/sal/sal-common-util/pom.xml
new file mode 100644 (file)
index 0000000..b8be514
--- /dev/null
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <parent>\r
+               <groupId>org.opendaylight.controller</groupId>\r
+               <artifactId>sal</artifactId>\r
+               <version>1.0-SNAPSHOT</version>\r
+       </parent>\r
+       <artifactId>sal-common-util</artifactId>\r
+\r
+       <dependencies>\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>yang-common</artifactId>\r
+                       <version>1.0</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>sal-common</artifactId>\r
+                       <version>1.0-SNAPSHOT</version>\r
+               </dependency>\r
+       </dependencies>
+
+</project>
\ No newline at end of file
@@ -5,38 +5,17 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
  */\r
-package org.opendaylight.controller.sal.core.impl;\r
+package org.opendaylight.controller.sal.common.util;\r
 \r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.Collections;\r
-import java.util.List;\r
-import java.util.concurrent.Callable;\r
-\r
-import org.opendaylight.controller.sal.core.api.RpcImplementation;\r
-import org.opendaylight.controller.yang.common.QName;\r
 import org.opendaylight.controller.yang.common.RpcError;\r
 import org.opendaylight.controller.yang.common.RpcResult;\r
-import org.opendaylight.controller.yang.data.api.CompositeNode;\r
-\r
-\r
-public class RpcUtils {\r
-\r
-    Callable<RpcResult<CompositeNode>> callableFor(\r
-            final RpcImplementation implemenation, final QName rpc,\r
-            final CompositeNode input) {\r
-\r
-        return new Callable<RpcResult<CompositeNode>>() {\r
-\r
-            @Override\r
-            public RpcResult<CompositeNode> call() throws Exception {\r
-                return implemenation.invokeRpc(rpc, input);\r
-            }\r
-        };\r
-    }\r
 \r
+public class Rpcs {\r
     public static <T> RpcResult<T> getRpcResult(boolean successful, T result,\r
-            List<RpcError> errors) {\r
+            Collection<RpcError> errors) {\r
         RpcResult<T> ret = new RpcResultTO<T>(successful, result, errors);\r
         return ret;\r
     }\r
@@ -47,7 +26,8 @@ public class RpcUtils {
         private final T result;\r
         private final boolean successful;\r
 \r
-        public RpcResultTO(boolean successful, T result, List<RpcError> errors) {\r
+        public RpcResultTO(boolean successful, T result,\r
+                Collection<RpcError> errors) {\r
             this.successful = successful;\r
             this.result = result;\r
             this.errors = Collections.unmodifiableList(new ArrayList<RpcError>(\r
@@ -71,4 +51,3 @@ public class RpcUtils {
 \r
     }\r
 }\r
-
index abdd3ad656f831bf60893cb7e5e8ce4cf878d738..7ced1746fc5fd86c639b01541742d0d2b3636317 100644 (file)
@@ -1,27 +1,29 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-  <modelVersion>4.0.0</modelVersion>\r
-  <parent>\r
-    <groupId>org.opendaylight.controller</groupId>\r
-    <artifactId>sal</artifactId>\r
-    <version>1.0-SNAPSHOT</version>\r
-  </parent>\r
-   <artifactId>sal-core-api</artifactId>\r
-   \r
-   <dependencies>\r
-               <dependency>\r
-               <groupId>org.opendaylight.controller</groupId>\r
-               <artifactId>sal-common</artifactId>\r
-               <version>1.0-SNAPSHOT</version>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.opendaylight.controller</groupId>\r
-               <artifactId>yang-data-api</artifactId>\r
-               <version>1.0</version>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.opendaylight.controller</groupId>\r
-               <artifactId>yang-model-api</artifactId>\r
-               <version>1.0</version>\r
-       </dependency>\r
-   </dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <parent>\r
+               <groupId>org.opendaylight.controller</groupId>\r
+               <artifactId>sal</artifactId>\r
+               <version>1.0-SNAPSHOT</version>\r
+       </parent>\r
+       <artifactId>sal-core-api</artifactId>\r
+\r
+       <dependencies>\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>sal-common</artifactId>\r
+                       <version>1.0-SNAPSHOT</version>\r
+               </dependency>\r
+\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>yang-data-api</artifactId>\r
+                       <version>1.0</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>yang-model-api</artifactId>\r
+                       <version>1.0</version>\r
+               </dependency>\r
+       </dependencies>
 </project>
\ No newline at end of file
index f5f393852e8f7050dad9de610a522eae6854a675..d74a7d146ddf7dd63d502aab9d720624566105d9 100644 (file)
@@ -7,6 +7,7 @@
  */\r
 package org.opendaylight.controller.sal.core.api.data;\r
 \r
+import java.util.Set;\r
 import java.util.concurrent.Future;\r
 \r
 import org.opendaylight.controller.sal.common.DataStoreIdentifier;\r
@@ -29,6 +30,9 @@ import org.opendaylight.controller.yang.data.api.Node;
  */\r
 public interface DataBrokerService extends BrokerService {\r
 \r
+    \r
+    Set<DataStoreIdentifier> getDataStores();\r
+    \r
     /**\r
      * Returns a data from specified Data Store.\r
      * \r
diff --git a/opendaylight/sal/yang-prototype/sal/sal-core-api/src/main/java/org/opendaylight/controller/sal/core/api/model/SchemaService.java b/opendaylight/sal/yang-prototype/sal/sal-core-api/src/main/java/org/opendaylight/controller/sal/core/api/model/SchemaService.java
new file mode 100644 (file)
index 0000000..22abdc2
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.sal.core.api.model;\r
+\r
+import org.opendaylight.controller.sal.core.api.BrokerService;\r
+import org.opendaylight.controller.yang.model.api.Module;\r
+import org.opendaylight.controller.yang.model.api.SchemaContext;\r
+\r
+public interface SchemaService extends BrokerService {\r
+\r
+    /**\r
+     * Registers a YANG module to session and global context \r
+     * \r
+     * @param module\r
+     */\r
+    void addModule(Module module);\r
+    \r
+    /**\r
+     * Unregisters a YANG module from session context\r
+     * \r
+     * @param module\r
+     */\r
+    void removeModule(Module module);\r
+    \r
+    /**\r
+     * Returns session specific YANG schema context\r
+     * @return\r
+     */\r
+    SchemaContext getSessionContext();\r
+    \r
+    /**\r
+     * Returns global schema context\r
+     * \r
+     * @return\r
+     */\r
+    SchemaContext getGlobalContext();\r
+}\r
index b582349f544fc28cfd70fe2bfbcd0944c1d21bf6..fa0ea393ab4bcea4a3dba91395c6eac7e2d9660b 100644 (file)
@@ -12,7 +12,7 @@ import java.io.IOException;
 import java.io.InputStreamReader;\r
 \r
 import org.opendaylight.controller.sal.core.impl.BrokerImpl;\r
-import org.opendaylight.controller.sal.core.impl.notify.NotificationModule;\r
+import org.opendaylight.controller.sal.core.impl.NotificationModule;\r
 \r
 \r
 public class SALDemo {\r