<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
<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
* @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
*/\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
\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
*/
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;
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) {
consumer.onSessionInitialized(session);
sessions.add(session);
-
return session;
-
}
@Override
}
+ 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;
}
@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() {
@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");
}
}
+ 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());
+ }
+
+ }
}
--- /dev/null
+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
+
+ }
+
+ }
+
+}
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);
T forClass(Class<?> obj);
}
+
+
}
--- /dev/null
+/*
+ * 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);
+ }
+}
<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
-
/*\r
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
*\r
*/\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
\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
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
}\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
-
+++ /dev/null
-
-/*\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
+++ /dev/null
-/*\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
-}
* 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
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
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
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
}\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
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
}\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
break;\r
}\r
\r
- return RpcUtils.getRpcResult(successful, null, errors);\r
+ return Rpcs.getRpcResult(successful, null, errors);\r
}\r
\r
@Override\r
break;\r
}\r
\r
- return RpcUtils.getRpcResult(successful, null, errors);\r
+ return Rpcs.getRpcResult(successful, null, errors);\r
}\r
\r
@Override\r
break;\r
}\r
\r
- return RpcUtils.getRpcResult(successful, null, errors);\r
+ return Rpcs.getRpcResult(successful, null, errors);\r
}\r
\r
@Override\r
}\r
}\r
}\r
-
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
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
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
+++ /dev/null
-
-/*\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
-
+++ /dev/null
-
-/*\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
+++ /dev/null
-/*\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
+++ /dev/null
-package org.opendaylight.controller.sal.core.impl.rpc;\r
-\r
-public interface RpcModule {\r
-\r
-}\r
+++ /dev/null
-/*\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
--- /dev/null
+<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
* 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
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
\r
}\r
}\r
-
-<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
*/\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
*/\r
public interface DataBrokerService extends BrokerService {\r
\r
+ \r
+ Set<DataStoreIdentifier> getDataStores();\r
+ \r
/**\r
* Returns a data from specified Data Store.\r
* \r
--- /dev/null
+/*\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
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