From: Tony Tkacik Date: Fri, 18 Jul 2014 08:39:08 +0000 (+0000) Subject: Merge "BUG-692 Replace strings with ModifyAction enum" X-Git-Tag: release/helium~472 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=224e583f77a6181119b0cc447f5a040d1f5b261d;hp=41c5b0b79896f1e50f4cc0bda3659717e7263b8c Merge "BUG-692 Replace strings with ModifyAction enum" --- diff --git a/features/base/src/main/resources/features.xml b/features/base/src/main/resources/features.xml index 60286175c1..b9107b9f62 100644 --- a/features/base/src/main/resources/features.xml +++ b/features/base/src/main/resources/features.xml @@ -79,6 +79,8 @@ mvn:eclipselink/javax.persistence/2.0.4.v201112161009 mvn:eclipselink/javax.resource/1.5.0.v200906010428 + mvn:org.eclipse.persistence/org.eclipse.persistence.moxy/2.5.0 + mvn:org.eclipse.persistence/org.eclipse.persistence.core/2.5.0 http diff --git a/opendaylight/config/feature/pom.xml b/features/config/pom.xml similarity index 97% rename from opendaylight/config/feature/pom.xml rename to features/config/pom.xml index aaf33ccc0f..01a4ea74a2 100644 --- a/opendaylight/config/feature/pom.xml +++ b/features/config/pom.xml @@ -5,6 +5,7 @@ org.opendaylight.controller config-subsystem 0.2.5-SNAPSHOT + ../../opendaylight/config/ config-features diff --git a/features/config/src/main/resources/features.xml b/features/config/src/main/resources/features.xml new file mode 100644 index 0000000000..7c11b5b18b --- /dev/null +++ b/features/config/src/main/resources/features.xml @@ -0,0 +1,82 @@ + + + + mvn:org.opendaylight.yangtools/features-yangtools/${yangtools.version}/xml/features + mvn:org.opendaylight.controller/netconf-features/${netconf.version}/xml/features + + + odl-config-netconf-connector + odl-config-persister + odl-netconf-impl + + + + yangtools-concepts + yangtools-binding + yangtools-binding-generator + odl-mdsal-commons + odl-config-api + mvn:org.opendaylight.controller/config-util/${project.version} + mvn:org.opendaylight.controller/yang-jmx-generator/${project.version} + mvn:org.opendaylight.controller/shutdown-api/${project.version} + mvn:org.opendaylight.controller/shutdown-impl/${project.version} + mvn:org.osgi/org.osgi.core/${osgi.core.version} + wrap:mvn:com.google.guava/guava/${guava.version} + mvn:org.javassist/javassist/${javassist.version} + + + odl-config-core + mvn:org.opendaylight.controller/config-manager/${project.version} + + + odl-netconf-api + odl-config-api + yangtools-binding-generator + mvn:org.opendaylight.controller/config-persister-api/${project.version} + mvn:org.opendaylight.controller/config-persister-file-xml-adapter/${project.version} + mvn:org.opendaylight.controller/config-persister-directory-xml-adapter/${project.version} + mvn:org.opendaylight.controller/config-persister-impl/${project.version} + + mvn:org.opendaylight.controller/netconf-util/${netconf.version} + mvn:org.opendaylight.controller/netconf-mapping-api/${netconf.version} + + mvn:com.google.guava/guava/${guava.version} + mvn:commons-io/commons-io/${commons.io.version} + mvn:org.apache.commons/commons-lang3/${commons.lang3.version} + mvn:org.eclipse.persistence/org.eclipse.persistence.core/${eclipse.persistence.version} + mvn:org.eclipse.persistence/org.eclipse.persistence.moxy/${eclipse.persistence.version} + + + mvn:org.opendaylight.controller/config-api/${project.version} + + + yangtools-concepts + yangtools-binding + + + + mvn:org.opendaylight.controller/netty-config-api/${project.version} + + + mvn:io.netty/netty-transport/${netty.version} + mvn:io.netty/netty-common/${netty.version} + mvn:io.netty/netty-buffer/${netty.version} + + odl-config-api + + + odl-config-netty-config-api + mvn:org.opendaylight.controller/netty-event-executor-config/${project.version} + mvn:org.opendaylight.controller/netty-threadgroup-config/${project.version} + mvn:org.opendaylight.controller/netty-timer-config/${project.version} + mvn:org.opendaylight.controller/threadpool-config-api/${project.version} + mvn:org.opendaylight.controller/threadpool-config-impl/${project.version} + odl-config-startup + + + mvn:org.opendaylight.controller/netconf-config-dispatcher/${project.version} + + + \ No newline at end of file diff --git a/opendaylight/md-sal/feature/pom.xml b/features/mdsal/pom.xml similarity index 97% rename from opendaylight/md-sal/feature/pom.xml rename to features/mdsal/pom.xml index c08c3e5606..2983c5efab 100644 --- a/opendaylight/md-sal/feature/pom.xml +++ b/features/mdsal/pom.xml @@ -5,6 +5,7 @@ org.opendaylight.controller sal-parent 1.1-SNAPSHOT + ../../opendaylight/md-sal mdsal-features diff --git a/opendaylight/md-sal/feature/src/main/resources/features.xml b/features/mdsal/src/main/resources/features.xml similarity index 56% rename from opendaylight/md-sal/feature/src/main/resources/features.xml rename to features/mdsal/src/main/resources/features.xml index 16b4574037..7d393bc64c 100644 --- a/opendaylight/md-sal/feature/src/main/resources/features.xml +++ b/features/mdsal/src/main/resources/features.xml @@ -9,20 +9,20 @@ odl-mdsal-restconf - yangtools-concepts - yangtools-binding + yangtools-data-binding mvn:org.opendaylight.controller/sal-common/${project.version} mvn:org.opendaylight.controller/sal-common-api/${project.version} mvn:org.opendaylight.controller/sal-common-impl/${project.version} mvn:org.opendaylight.controller/sal-common-util/${project.version} - wrap:mvn:com.google.guava/guava/${guava.version} - wrap:mvn:org.eclipse.xtend/org.eclipse.xtend.lib/${xtend.version} yangtools-concepts yangtools-binding odl-mdsal-commons - odl-config-subsystem + odl-config-core + odl-config-manager + odl-config-api + odl-config-persister mvn:org.opendaylight.controller/sal-core-api/${project.version} mvn:org.opendaylight.controller/sal-core-spi/${project.version} mvn:org.opendaylight.controller/sal-broker-impl/${project.version} @@ -31,6 +31,7 @@ mvn:org.opendaylight.controller/sal-binding-broker-impl/${project.version} mvn:org.opendaylight.controller/sal-binding-util/${project.version} mvn:org.opendaylight.controller/sal-connector-api/${project.version} + mvn:org.opendaylight.controller/sal-inmemory-datastore/${project.version} odl-mdsal-broker @@ -46,4 +47,32 @@ wrap:mvn:io.netty/netty-handler/${netty.version} wrap:mvn:io.netty/netty-transport/${netty.version} + + mvn:org.opendaylight.controller.model/model-flow-base/${project.version} + mvn:org.opendaylight.controller.model/model-flow-management/${project.version} + mvn:org.opendaylight.controller.model/model-flow-service/${project.version} + mvn:org.opendaylight.controller.model/model-flow-statistics/${project.version} + mvn:org.opendaylight.controller.model/model-inventory/${project.version} + mvn:org.opendaylight.controller.model/model-topology/${project.version} + + + yangtools-concepts + yangtools-binding + odl-mdsal-broker + odl-mdsal-all + mvn:org.opendaylight.controller.samples/sample-toaster/${project.version} + mvn:org.opendaylight.controller.samples/sample-toaster-consumer/${project.version} + mvn:org.opendaylight.controller.samples/sample-toaster-provider/${project.version} + + + mvn:org.opendaylight.controller/sal-netconf-connector/${project.version} + mvn:org.opendaylight.controller/sal-restconf-broker/${project.version} + mvn:org.opendaylight.controller/sal-remote/${project.version} + mvn:org.opendaylight.controller.md/topology-manager/${project.version} + mvn:org.opendaylight.controller.md/topology-lldp-discovery/${project.version} + mvn:org.opendaylight.controller.md/statistics-manager/${project.version} + mvn:org.opendaylight.controller.md/inventory-manager/${project.version} + mvn:org.opendaylight.controller.md/forwardingrules-manager/${project.version} + + diff --git a/features/netconf/pom.xml b/features/netconf/pom.xml new file mode 100644 index 0000000000..457fc64edd --- /dev/null +++ b/features/netconf/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.opendaylight.controller + netconf-subsystem + 0.2.5-SNAPSHOT + ../../opendaylight/netconf + + netconf-features + + pom + + + features.xml + + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + + scm:git:ssh://git.opendaylight.org:29418/controller.git + scm:git:ssh://git.opendaylight.org:29418/controller.git + HEAD + https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL + + diff --git a/features/netconf/src/main/resources/features.xml b/features/netconf/src/main/resources/features.xml new file mode 100644 index 0000000000..50a537b50a --- /dev/null +++ b/features/netconf/src/main/resources/features.xml @@ -0,0 +1,59 @@ + + + + mvn:org.opendaylight.controller/features-odl-protocol-framework/${protocol-framework.version}/xml/features + mvn:org.opendaylight.controller/config-features/${config.version}/xml/features + + + mvn:org.opendaylight.controller/netconf-api/${project.version} + mvn:org.opendaylight.controller/ietf-netconf-monitoring/${project.version} + mvn:org.opendaylight.controller/ietf-netconf-monitoring-extension/${project.version} + odl-protocol-framework + mvn:org.opendaylight.yangtools.model/ietf-inet-types/${ietf-inet-types.version} + mvn:org.opendaylight.yangtools.model/ietf-yang-types/${ietf-yang-types.version} + + + odl-netconf-api + mvn:org.opendaylight.controller/netconf-mapping-api/${project.version} + + + odl-netconf-mapping-api + mvn:org.opendaylight.controller/netconf-util/${project.version} + + + odl-config-manager + mvn:org.opendaylight.controller/config-netconf-connector/${project.version} + odl-netconf-api + odl-netconf-mapping-api + odl-netconf-util + + + + mvn:org.opendaylight.controller/netconf-impl/${project.version} + odl-netconf-api + odl-netconf-mapping-api + odl-netconf-util + odl-netconf-netty-util + + + mvn:org.opendaylight.controller/netconf-netty-util/${project.version} + odl-netconf-api + odl-netconf-mapping-api + odl-netconf-util + mvn:org.opendaylight.controller.thirdparty/ganymed/${ganymed.version} + mvn:org.openexi/nagasena/${exi.nagasena.version} + mvn:io.netty/netty-codec/${netty.version} + mvn:io.netty/netty-handler/${netty.version} + mvn:io.netty/netty-common/${netty.version} + mvn:io.netty/netty-buffer/${netty.version} + mvn:io.netty/netty-transport/${netty.version} + + + mvn:org.opendaylight.controller/netconf-client/${project.version} + mvn:org.opendaylight.controller/netconf-monitoring/${project.version} + mvn:org.opendaylight.controller/netconf-tcp/${project.version} + + + \ No newline at end of file diff --git a/features/pom.xml b/features/pom.xml new file mode 100644 index 0000000000..dce47faea6 --- /dev/null +++ b/features/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + org.opendaylight.controller + commons.opendaylight + 1.4.2-SNAPSHOT + ../opendaylight/commons/opendaylight + + features-controller + pom + + 3.0 + + + config + mdsal + netconf + protocol-framework + + diff --git a/features/protocol-framework/pom.xml b/features/protocol-framework/pom.xml new file mode 100644 index 0000000000..f0208d6452 --- /dev/null +++ b/features/protocol-framework/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.opendaylight.controller + commons.opendaylight + 1.4.2-SNAPSHOT + ../../opendaylight/commons/opendaylight + + features-odl-protocol-framework + ${protocol-framework.version} + pom + + + features.xml + + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + + scm:git:ssh://git.opendaylight.org:29418/controller.git + scm:git:ssh://git.opendaylight.org:29418/controller.git + HEAD + https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL + + diff --git a/features/protocol-framework/src/main/resources/features.xml b/features/protocol-framework/src/main/resources/features.xml new file mode 100644 index 0000000000..d2560f5cb0 --- /dev/null +++ b/features/protocol-framework/src/main/resources/features.xml @@ -0,0 +1,12 @@ + + + + mvn:org.opendaylight.controller/config-features/${config.version}/xml/features + + mvn:org.opendaylight.controller/protocol-framework/${protocol-framework.version} + odl-config-api + odl-config-netty-config-api + + \ No newline at end of file diff --git a/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/jaxb/Context.java b/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/jaxb/Context.java index dbe0745725..cec780c9ec 100644 --- a/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/jaxb/Context.java +++ b/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/jaxb/Context.java @@ -69,9 +69,10 @@ public class Context { initialized = true; } - public List findMatchingFilters(String pathInfo) { + public List findMatchingFilters(String path) { + logger.trace("findMatchingFilters({})", path); checkState(initialized, "Not initialized"); - return urlMatcher.findMatchingFilters(pathInfo); + return urlMatcher.findMatchingFilters(path); } @XmlAttribute(name = "path") diff --git a/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/FilterProcessor.java b/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/FilterProcessor.java index dc3e9dcd49..ae9d79a63d 100644 --- a/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/FilterProcessor.java +++ b/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/FilterProcessor.java @@ -37,14 +37,14 @@ public class FilterProcessor { throws IOException, ServletException { String contextPath = request.getContext().getPath(); - String pathInfo = request.getPathInfo(); + String path = request.getDecodedRequestURI(); Optional maybeContext = host.findContext(contextPath); - logger.trace("Processing context {} path {}, found {}", contextPath, pathInfo, maybeContext); + logger.trace("Processing context {} path {}, found {}", contextPath, path, maybeContext); if (maybeContext.isPresent()) { // process filters Context context = maybeContext.get(); - List matchingFilters = context.findMatchingFilters(pathInfo); + List matchingFilters = context.findMatchingFilters(path); FilterChain fromLast = nextValveFilterChain; ListIterator it = matchingFilters.listIterator(matchingFilters.size()); final boolean trace = logger.isTraceEnabled(); diff --git a/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/UrlMatcher.java b/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/UrlMatcher.java index 9535fb1f70..210326f5d1 100644 --- a/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/UrlMatcher.java +++ b/opendaylight/commons/filter-valve/src/main/java/org/opendaylight/controller/filtervalve/cors/model/UrlMatcher.java @@ -62,31 +62,31 @@ public class UrlMatcher { /** * Find filters matching path * - * @param pathInfo as returned by request.getPathInfo() + * @param path relative and decoded path to resource * @return list of matching filters */ - public List findMatchingFilters(String pathInfo) { - checkNotNull(pathInfo); + public List findMatchingFilters(String path) { + checkNotNull(path); TreeMap sortedMap = new TreeMap<>(); // add matching prefixes for (Entry> prefixEntry : prefixMap.entrySet()) { - if (pathInfo.startsWith(prefixEntry.getKey())) { + if (path.startsWith(prefixEntry.getKey())) { put(sortedMap, prefixEntry.getValue()); } } // add matching suffixes for (Entry> suffixEntry : suffixMap.entrySet()) { - if (pathInfo.endsWith(suffixEntry.getKey())) { + if (path.endsWith(suffixEntry.getKey())) { put(sortedMap, suffixEntry.getValue()); } } // add exact match - Entry exactMatch = exactMatchMap.get(pathInfo); + Entry exactMatch = exactMatchMap.get(path); if (exactMatch != null) { put(sortedMap, exactMatch); } ArrayList filters = new ArrayList<>(sortedMap.values()); - logger.trace("Matching filters for path {} are {}", pathInfo, filters); + logger.trace("Matching filters for path {} are {}", path, filters); return filters; } diff --git a/opendaylight/commons/opendaylight/pom.xml b/opendaylight/commons/opendaylight/pom.xml index 28c23c8259..163c64ed52 100644 --- a/opendaylight/commons/opendaylight/pom.xml +++ b/opendaylight/commons/opendaylight/pom.xml @@ -91,6 +91,7 @@ 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.6.0-SNAPSHOT + 1.1-SNAPSHOT 0.5.2-SNAPSHOT 0.5.2-SNAPSHOT 0.4.2-SNAPSHOT @@ -1498,7 +1499,7 @@ org.opendaylight.controller.thirdparty ganymed - 1.1-SNAPSHOT + ${ganymed.version} diff --git a/opendaylight/config/feature/src/main/resources/features.xml b/opendaylight/config/feature/src/main/resources/features.xml deleted file mode 100644 index a84a74305f..0000000000 --- a/opendaylight/config/feature/src/main/resources/features.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - odl-config-subsystem - - - - yangtools-concepts - yangtools-binding - yangtools-binding-generator - odl-mdsal-commons - mvn:org.opendaylight.controller/config-api/${project.version} - mvn:org.opendaylight.controller/config-util/${project.version} - mvn:org.opendaylight.controller/config-manager/${project.version} - mvn:org.opendaylight.controller/yang-jmx-generator/${project.version} - mvn:org.opendaylight.controller/config-persister-api/${project.version} - mvn:org.opendaylight.controller/config-persister-file-xml-adapter/${project.version} - mvn:org.opendaylight.controller/config-persister-directory-xml-adapter/${project.version} - mvn:org.opendaylight.controller/shutdown-api/${project.version} - mvn:org.opendaylight.controller/shutdown-impl/${project.version} - mvn:org.osgi/org.osgi.core/${osgi.core.version} - wrap:mvn:com.google.guava/guava/${guava.version} - mvn:org.javassist/javassist/${javassist.version} - - \ No newline at end of file diff --git a/opendaylight/config/pom.xml b/opendaylight/config/pom.xml index a8a4c87a4e..66bb01f051 100644 --- a/opendaylight/config/pom.xml +++ b/opendaylight/config/pom.xml @@ -39,7 +39,6 @@ shutdown-impl netconf-config-dispatcher config-module-archetype - feature diff --git a/opendaylight/distribution/opendaylight-karaf/pom.xml b/opendaylight/distribution/opendaylight-karaf/pom.xml index 221bfa78e8..4ef0b8e86b 100644 --- a/opendaylight/distribution/opendaylight-karaf/pom.xml +++ b/opendaylight/distribution/opendaylight-karaf/pom.xml @@ -61,6 +61,22 @@ kar runtime + + org.opendaylight.controller + features-odl-protocol-framework + ${protocol-framework.version} + features + xml + runtime + + + org.opendaylight.controller + netconf-features + ${netconf.version} + features + xml + runtime + org.opendaylight.controller config-features @@ -85,14 +101,6 @@ xml runtime - - org.opendaylight.yangtools - features-yangtools - ${yangtools.version} - features - xml - runtime - diff --git a/opendaylight/distribution/opendaylight-karaf/src/main/resources/configuration/initial/02-clustering.xml b/opendaylight/distribution/opendaylight-karaf/src/main/resources/configuration/initial/02-clustering.xml deleted file mode 100644 index 7853b8681b..0000000000 --- a/opendaylight/distribution/opendaylight-karaf/src/main/resources/configuration/initial/02-clustering.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - prefix:remote-zeromq-rpc-server - remoter - 5666 - - prefix:dom-broker-osgi-registry - dom-broker - - - - - - - - - - urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28 - urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 - urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 - urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc?module=odl-sal-dom-rpc-remote-cfg&revision=2013-10-28 - - - diff --git a/opendaylight/md-sal/compatibility/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FRMRuntimeDataProvider.java b/opendaylight/md-sal/compatibility/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FRMRuntimeDataProvider.java index be3add1042..ff68176f1f 100644 --- a/opendaylight/md-sal/compatibility/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FRMRuntimeDataProvider.java +++ b/opendaylight/md-sal/compatibility/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FRMRuntimeDataProvider.java @@ -7,8 +7,6 @@ */ package org.opendaylight.controller.md.frm.compatibility; -import java.util.Collections; - import org.opendaylight.controller.forwardingrulesmanager.FlowConfig; import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager; import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener; @@ -17,7 +15,6 @@ import org.opendaylight.controller.md.sal.common.api.data.DataModification; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider; import org.opendaylight.controller.sal.common.util.Arguments; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey; import org.opendaylight.yangtools.concepts.Registration; @@ -26,8 +23,8 @@ import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import com.google.common.base.Objects; import com.google.common.base.Preconditions; @@ -89,7 +86,7 @@ public class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHa this.manager.removeStaticFlow(flow.getName(), flow.getNode()); this.manager.addStaticFlow(flow); } - return Rpcs. getRpcResult(true, null, Collections. emptySet()); + return RpcResultBuilder. success().build(); } public RpcResult rollback(final FlowCommitTransaction transaction) { diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java index 01d75acfe6..56c7afb253 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java @@ -10,7 +10,6 @@ package org.opendaylight.controller.sal.compatibility.adsal; import java.math.BigInteger; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.compatibility.InventoryMapping; import org.opendaylight.controller.sal.compatibility.ToSalConversionsUtils; import org.opendaylight.controller.sal.flowprogrammer.Flow; @@ -32,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103. import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,7 +70,8 @@ public class FlowServiceAdapter implements SalFlowService, IFlowProgrammerListen AddFlowOutputBuilder builder = new AddFlowOutputBuilder(); builder.setTransactionId(new TransactionId(BigInteger.valueOf(status.getRequestId()))); AddFlowOutput rpcResultType = builder.build(); - return Futures.immediateFuture(Rpcs.getRpcResult(status.isSuccess(), rpcResultType, null)); + return Futures.immediateFuture(RpcResultBuilder.status(status.isSuccess()) + .withResult(rpcResultType).build()); } @Override @@ -84,7 +85,8 @@ public class FlowServiceAdapter implements SalFlowService, IFlowProgrammerListen RemoveFlowOutputBuilder builder = new RemoveFlowOutputBuilder(); builder.setTransactionId(new TransactionId(BigInteger.valueOf(status.getRequestId()))); RemoveFlowOutput rpcResultType = builder.build(); - return Futures.immediateFuture(Rpcs.getRpcResult(status.isSuccess(), rpcResultType, null)); + return Futures.immediateFuture(RpcResultBuilder.status(status.isSuccess()) + .withResult(rpcResultType).build()); } diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowStatisticsAdapter.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowStatisticsAdapter.java index c5cbecabed..e63cb54b86 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowStatisticsAdapter.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowStatisticsAdapter.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.concurrent.Future; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.compatibility.FromSalConversionsUtils; import org.opendaylight.controller.sal.compatibility.InventoryMapping; import org.opendaylight.controller.sal.compatibility.NodeMapping; @@ -60,6 +59,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.n import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,7 +107,8 @@ public class FlowStatisticsAdapter implements OpendaylightFlowStatisticsService, LOG.error(e.getMessage()); } - return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null)); + return Futures.immediateFuture(RpcResultBuilder. + status(rpcResultBool).withResult(rpcResultType).build()); } /** @@ -133,7 +134,8 @@ public class FlowStatisticsAdapter implements OpendaylightFlowStatisticsService, LOG.error(e.getMessage()); } - return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null)); + return Futures.immediateFuture(RpcResultBuilder. + status(rpcResultBool).withResult(rpcResultType).build()); } @Override @@ -154,7 +156,8 @@ public class FlowStatisticsAdapter implements OpendaylightFlowStatisticsService, LOG.error(e.getMessage()); } - return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null)); + return Futures.immediateFuture(RpcResultBuilder. + status(rpcResultBool).withResult(rpcResultType).build()); } @Override diff --git a/opendaylight/md-sal/model/model-inventory/src/main/yang/opendaylight-inventory.yang b/opendaylight/md-sal/model/model-inventory/src/main/yang/opendaylight-inventory.yang index 396206e28e..64d212e9bc 100644 --- a/opendaylight/md-sal/model/model-inventory/src/main/yang/opendaylight-inventory.yang +++ b/opendaylight/md-sal/model/model-inventory/src/main/yang/opendaylight-inventory.yang @@ -9,8 +9,8 @@ module opendaylight-inventory { revision "2013-08-19" { description "Initial revision of Inventory model"; } - - + + typedef support-type { type enumeration { enum native; @@ -21,43 +21,79 @@ module opendaylight-inventory { typedef node-id { type inet:uri; + description "Identifier for a particular node. For example: + + myprotocol: + + myprotocol:12 + + It is a good practice to always lead with a scoping identifier. + In the example above the scoping was 'myprotocol'. In your app you + could use 'myapp' etc."; } typedef node-connector-id { type inet:uri; + description "Identifier for a particular node-connector. For example: + + myprotocol: + myprotocol:3 + + It is a good practice to always lead with a scoping identifier. + In the example above the scoping was 'myprotocol'. In your app you + could use 'myapp' etc."; + } + //YANG does not have a statement which limits the scope of an instance-identifier to a particular subtree, + //which is why we are using a type capture and not an instance-identifier to define a node-ref and a node-connector-ref. typedef node-ref { type instance-identifier; + description "A reference that points to an opendaylight-light:nodes/node in the data tree."; } typedef node-connector-ref { type instance-identifier; + description "A reference that points to an opendaylight-list:nodes/node/{node-id}/node-connector in the data tree."; } identity node-context { - description "Identity used to mark node context"; + description "A node-context is a classifier for node elements which allows an RPC to provide a service on behalf of a particular element in the data tree."; } identity node-connector-context { - description "Identity used to mark node connector context"; + description "A node-connector-context is a classifier for node-connector elements which allows an RPC to provide a service on behalf of a particular element in the data tree."; } + //We are defining a base identity here because there are limitations with yang enums. Yang doesn't allow you to extend enumeratations. + //Therefore by defining a base identity we allow other yang files to extend this identity to define additional "enumerations". By + //using node-type as their base they are able to pass their object to fields that accept "node-types" while uniquely describing their + //type of node, such as "router-node" or "switch-node" etc. + //See https://wiki.opendaylight.org/view/YANG_Tools:YANG_to_Java_Mapping#Identity for more information. identity node-type { - description "Base identity for node types"; + description "A base identity definition which represents a generic node type and can be extended in other yang files."; } identity node-connector-type { - description "Base identity for node connectors type"; + description "A base identity definition which represents a generic node connector type and can be extended in other yang files."; } grouping node { + + description "Describes the contents of a generic node - + essentially an ID and a list of node-connectors. + Acts as an augmentation point where other yang files + can add additional information."; + leaf id { type node-id; + description "The unique identifier for the node."; } list "node-connector" { key "id"; + + description "A list of node connectors that belong this node."; ext:context-instance "node-connector-context"; uses node-connector; @@ -65,55 +101,117 @@ module opendaylight-inventory { } grouping node-connector { + + description "Describes a generic node connector which consists of an ID. + Acts as an augmentation point where other yang files can + add additional information."; + leaf id { type node-connector-id; + description "The unique identifier for the node-connector."; } } grouping node-context-ref { - description - "Helper grouping which contains a reference to node context."; + description + "A helper grouping which contains a reference to a node classified with a node-context. This allows RPCs in other yang files to refine their input to a particular node instance."; + leaf node { ext:context-reference "node-context"; type node-ref; + description "A reference to a particular node."; } } /** Base structure **/ container nodes { + + description "The root container of all nodes."; + list node { key "id"; ext:context-instance "node-context"; - - uses node; + description "A list of nodes (as defined by the 'grouping node')."; + uses node; //this refers to the 'grouping node' defined above. } } + //The following notifications should really be replaced by direct writes to the data tree with data change listeners listening to those changes. + //Notifications should be reserved for one time events which do not require persistence to the data tree. notification node-updated { + + status deprecated; + + description "A notification sent by someone who realized there was a modification to a node, but did not modify the data tree. + Describes that something on the node has been updated (including addition of a new node), but is for + whatever reason is not modifying the data tree. + + Deprecated: If a process determines that a node was updated, then that + logic should update the node using the DataBroker directly. Listeners interested + update changes should register a data change listener for notifications on removals."; + leaf node-ref { ext:context-reference "node-context"; + description "A reference to the node which changed."; + type node-ref; } uses node; } notification node-connector-updated { + + status deprecated; + + description "A notification sent by someone who realized there was a modification to a node-connector, but did not modify the data tree. + Describes that something on the node-connector has been updated (including addition of a new node-connector), but is for + whatever reason is not modifying the data tree. + + Deprecated: If a process determines that a node-connector was updated, then that + logic should update the node-connector using the DataBroker directly. Listeners interested + update changes should register a data change listener for notifications on removals."; + leaf node-connector-ref { ext:context-reference "node-connector-context"; type node-connector-ref; + description "A reference to the node-connector which changed."; } uses node-connector; } notification node-removed { + + status deprecated; + + description "A notification sent by someone who realized there was a node was removed, but did not modify the data tree. + Describes that a node has been removed but is for + whatever reason is not modifying the data tree. + + Deprecated: If a process determines that a node was removed, then that + logic should remove the node from the DataBroker directly. Listeners interested + in changes should register a data change listener for notifications on removals."; + leaf node-ref { + description "A reference to the node that was removed."; ext:context-reference "node-context"; type node-ref; } } notification node-connector-removed { + + status deprecated; + + description "A notification sent by someone who realized there was a node-connector was removed, but did not modify the data tree. + Describes that a node-connector has been removed but is for + whatever reason is not modifying the data tree. + + Deprecated: If a process determines that a node-connector was removed, then that + logic should remove the node-connector from the DataBroker directly. Listeners interested + in changes should register a data change listener for notifications on removals."; + leaf node-connector-ref { + description "A reference to the node-connector that was removed."; ext:context-reference "node-connector-context"; type node-connector-ref; } diff --git a/opendaylight/md-sal/pom.xml b/opendaylight/md-sal/pom.xml index d3f6d2d005..1cfd5a6639 100644 --- a/opendaylight/md-sal/pom.xml +++ b/opendaylight/md-sal/pom.xml @@ -63,9 +63,6 @@ sal-protocolbuffer-encoding - - feature - sal-test-model diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBackwardsCompatibleDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBackwardsCompatibleDataBroker.java index 1c6447a4e7..b45450ae3a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBackwardsCompatibleDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBackwardsCompatibleDataBroker.java @@ -33,7 +33,6 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; import org.opendaylight.yangtools.concepts.Delegator; @@ -42,8 +41,8 @@ import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.concepts.util.ListenerRegistry; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -163,7 +162,7 @@ public class ForwardedBackwardsCompatibleDataBroker extends AbstractForwardedDat if(requestCommitSuccess) { return tx.getDelegate().commit(); } - return Futures.immediateFuture(Rpcs.getRpcResult(false, TransactionStatus.FAILED, Collections.emptySet())); + return Futures.immediateFuture(RpcResultBuilder.failed().withResult(TransactionStatus.FAILED).build()); } }); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java index 052fd2169a..709b62fee2 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java @@ -37,8 +37,6 @@ RpcRouter, RouteChangeListener, InstanceIdentif private static final Logger LOG = LoggerFactory.getLogger(RpcRouterCodegenInstance.class); - private T defaultService; - private final Class serviceType; private final T invocationProxy; @@ -49,11 +47,8 @@ RpcRouter, RouteChangeListener, InstanceIdentif private final Map, RpcRoutingTableImpl> routingTables; - private final String name; - @SuppressWarnings("unchecked") public RpcRouterCodegenInstance(final String name,final Class type, final T routerImpl, final Iterable> contexts) { - this.name = name; this.listeners = ListenerRegistry.create(); this.serviceType = type; this.invocationProxy = routerImpl; @@ -90,7 +85,7 @@ RpcRouter, RouteChangeListener, InstanceIdentif @Override public T getDefaultService() { - return defaultService; + return RuntimeCodeHelper.getDelegate(invocationProxy); } @Override @@ -125,11 +120,17 @@ RpcRouter, RouteChangeListener, InstanceIdentif return new RoutedRpcRegistrationImpl(service); } + public void removeDefaultImplementation(final T instance) { + RpcService current = RuntimeCodeHelper.getDelegate(invocationProxy); + if(instance == current) { + RuntimeCodeHelper.setDelegate(invocationProxy, null); + } + } + @Override public RpcRegistration registerDefaultService(final T service) { - // TODO Auto-generated method stub RuntimeCodeHelper.setDelegate(invocationProxy, service); - return null; + return new DefaultRpcImplementationRegistration(service); } private class RoutedRpcRegistrationImpl extends AbstractObjectRegistration implements RoutedRpcRegistration { @@ -168,4 +169,24 @@ RpcRouter, RouteChangeListener, InstanceIdentif } } + + private class DefaultRpcImplementationRegistration extends AbstractObjectRegistration implements RpcRegistration { + + + protected DefaultRpcImplementationRegistration(final T instance) { + super(instance); + } + + @Override + protected void removeRegistration() { + removeDefaultImplementation(this.getInstance()); + } + + @Override + public Class getServiceType() { + return serviceType; + } + } + + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java index 542dfa7e7b..952d84d885 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java @@ -7,6 +7,15 @@ */ package org.opendaylight.controller.sal.binding.impl; +import static com.google.common.base.Preconditions.checkState; + +import java.util.EventListener; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.WeakHashMap; + import org.opendaylight.controller.md.sal.common.api.routing.RouteChange; import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher; @@ -28,15 +37,6 @@ import org.opendaylight.yangtools.yang.binding.RpcService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.EventListener; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.WeakHashMap; - -import static com.google.common.base.Preconditions.checkState; - public class RpcProviderRegistryImpl implements // RpcProviderRegistry, // RouteChangePublisher> { @@ -60,19 +60,19 @@ public class RpcProviderRegistryImpl implements // return name; } - public RpcProviderRegistryImpl(String name) { + public RpcProviderRegistryImpl(final String name) { super(); this.name = name; } @Override - public final RoutedRpcRegistration addRoutedRpcImplementation(Class type, - T implementation) throws IllegalStateException { + public final RoutedRpcRegistration addRoutedRpcImplementation(final Class type, + final T implementation) throws IllegalStateException { return getRpcRouter(type).addRoutedRpcImplementation(implementation); } @Override - public final RpcRegistration addRpcImplementation(Class type, T implementation) + public final RpcRegistration addRpcImplementation(final Class type, final T implementation) throws IllegalStateException { @SuppressWarnings("unchecked") RpcRouter potentialRouter = (RpcRouter) rpcRouters.get(type); @@ -92,7 +92,7 @@ public class RpcProviderRegistryImpl implements // @SuppressWarnings("unchecked") @Override - public final T getRpcService(Class type) { + public final T getRpcService(final Class type) { T potentialProxy = (T) publicProxies.get(type); if (potentialProxy != null) { @@ -115,8 +115,8 @@ public class RpcProviderRegistryImpl implements // } } - @SuppressWarnings("unchecked") - public RpcRouter getRpcRouter(Class type) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public RpcRouter getRpcRouter(final Class type) { RpcRouter potentialRouter = rpcRouters.get(type); if (potentialRouter != null) { return (RpcRouter) potentialRouter; @@ -140,7 +140,7 @@ public class RpcProviderRegistryImpl implements // } } - private void notifyGlobalRpcAdded(Class type) { + private void notifyGlobalRpcAdded(final Class type) { for(ListenerRegistration listener : globalRpcListeners) { try { listener.getInstance().onGlobalRpcRegistered(type); @@ -151,7 +151,7 @@ public class RpcProviderRegistryImpl implements // } - private void notifyListenersRoutedCreated(RpcRouter router) { + private void notifyListenersRoutedCreated(final RpcRouter router) { for (ListenerRegistration listener : routerInstantiationListener) { try { @@ -164,7 +164,7 @@ public class RpcProviderRegistryImpl implements // } public ListenerRegistration registerRouterInstantiationListener( - RouterInstantiationListener listener) { + final RouterInstantiationListener listener) { ListenerRegistration reg = routerInstantiationListener.register(listener); try { for (RpcRouter router : rpcRouters.values()) { @@ -176,9 +176,10 @@ public class RpcProviderRegistryImpl implements // return reg; } + @SuppressWarnings("unchecked") @Override public >> ListenerRegistration registerRouteChangeListener( - L listener) { + final L listener) { return (ListenerRegistration) routeChangeListeners.register(listener); } @@ -186,7 +187,7 @@ public class RpcProviderRegistryImpl implements // return rpcFactory; } - public void setRpcFactory(RuntimeCodeGenerator rpcFactory) { + public void setRpcFactory(final RuntimeCodeGenerator rpcFactory) { this.rpcFactory = rpcFactory; } @@ -194,7 +195,7 @@ public class RpcProviderRegistryImpl implements // void onRpcRouterCreated(RpcRouter router); } - public ListenerRegistration registerGlobalRpcRegistrationListener(GlobalRpcRegistrationListener listener) { + public ListenerRegistration registerGlobalRpcRegistrationListener(final GlobalRpcRegistrationListener listener) { return globalRpcListeners.register(listener); } @@ -209,12 +210,12 @@ public class RpcProviderRegistryImpl implements // private final Class type; - public RouteChangeForwarder(Class type) { + public RouteChangeForwarder(final Class type) { this.type = type; } @Override - public void onRouteChange(RouteChange, InstanceIdentifier> change) { + public void onRouteChange(final RouteChange, InstanceIdentifier> change) { Map>> announcements = new HashMap<>(); for (Entry, Set>> entry : change.getAnnouncements() .entrySet()) { @@ -245,7 +246,7 @@ public class RpcProviderRegistryImpl implements // private final Class serviceType; private RpcProviderRegistryImpl registry; - public RpcProxyRegistration(Class type, T service, RpcProviderRegistryImpl registry) { + public RpcProxyRegistration(final Class type, final T service, final RpcProviderRegistryImpl registry) { super(service); this.serviceType = type; this.registry = registry; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingToDomTransaction.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingToDomTransaction.java index 20a786e774..081adb44dc 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingToDomTransaction.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingToDomTransaction.java @@ -1,18 +1,17 @@ package org.opendaylight.controller.sal.binding.impl.connect.dom; -import java.util.Collections; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataModification; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; class BindingToDomTransaction implements DataCommitHandler.DataCommitTransaction, DataObject> { @@ -41,7 +40,8 @@ class BindingToDomTransaction implements try { RpcResult biResult = result.get(); domOpenedTransactions.remove(backing.getIdentifier()); - return Rpcs.getRpcResult(biResult.isSuccessful(), null, biResult.getErrors()); + return RpcResultBuilder. status(biResult.isSuccessful()) + .withRpcErrors(biResult.getErrors()).build(); } catch (InterruptedException e) { throw new IllegalStateException("", e); } catch (ExecutionException e) { @@ -54,6 +54,6 @@ class BindingToDomTransaction implements @Override public RpcResult rollback() throws IllegalStateException { domOpenedTransactions.remove(backing.getIdentifier()); - return Rpcs.getRpcResult(true, null, Collections. emptySet()); + return RpcResultBuilder. success().build(); } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/DomToBindingTransaction.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/DomToBindingTransaction.java index 45be5c96fa..cb271a1a91 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/DomToBindingTransaction.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/DomToBindingTransaction.java @@ -1,15 +1,14 @@ package org.opendaylight.controller.sal.binding.impl.connect.dom; -import java.util.Collections; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataModification; -import org.opendaylight.controller.sal.common.util.Rpcs; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; @@ -39,7 +38,7 @@ class DomToBindingTransaction implements @Override public RpcResult rollback() throws IllegalStateException { bindingOpenedTransactions.remove(backing.getIdentifier()); - return Rpcs.getRpcResult(true, null, Collections.emptySet()); + return RpcResultBuilder. success().build(); } @Override @@ -48,7 +47,8 @@ class DomToBindingTransaction implements try { RpcResult baResult = result.get(); bindingOpenedTransactions.remove(backing.getIdentifier()); - return Rpcs.getRpcResult(baResult.isSuccessful(), null, baResult.getErrors()); + return RpcResultBuilder. status(baResult.isSuccessful()) + .withRpcErrors(baResult.getErrors()).build(); } catch (InterruptedException e) { throw new IllegalStateException("", e); } catch (ExecutionException e) { diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategy.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategy.java index d08b217e71..f03d07eb99 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategy.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategy.java @@ -10,19 +10,17 @@ package org.opendaylight.controller.sal.binding.impl.connect.dom; import java.lang.ref.WeakReference; import java.lang.reflect.Method; -import java.util.Collection; import java.util.Collections; import java.util.concurrent.Future; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.Node; import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; @@ -89,7 +87,7 @@ public class RpcInvocationStrategy { public ListenableFuture> forwardToDomBroker(final DataObject input) { if(biRpcRegistry == null) { - return Futures.> immediateFuture(Rpcs.getRpcResult(false)); + return Futures.> immediateFuture(RpcResultBuilder.failed().build()); } CompositeNode inputXml = null; @@ -102,6 +100,7 @@ public class RpcInvocationStrategy { Function, RpcResult> transformationFunction = new Function, RpcResult>() { + @SuppressWarnings("rawtypes") @Override public RpcResult apply(RpcResult result) { @@ -114,7 +113,7 @@ public class RpcInvocationStrategy { } } - return Rpcs.getRpcResult(result.isSuccessful(), output, result.getErrors()); + return RpcResultBuilder.from( (RpcResult)result ).withResult( output ).build(); } }; @@ -135,22 +134,18 @@ public class RpcInvocationStrategy { } if (futureResult == null) { - return Rpcs.getRpcResult(false); + return RpcResultBuilder.failed().build(); } - RpcResult bindingResult = futureResult.get(); - - Collection errors = bindingResult.getErrors(); - if( errors == null ) { - errors = Collections.emptySet(); - } + @SuppressWarnings("rawtypes") + RpcResult bindingResult = futureResult.get(); final Object resultObj = bindingResult.getResult(); - CompositeNode output = null; + Object output = null; if (resultObj instanceof DataObject) { output = mappingService.toDataDom((DataObject)resultObj); } - return Rpcs.getRpcResult( bindingResult.isSuccessful(), output, errors); + return RpcResultBuilder.from( bindingResult ).withResult( output ).build(); } public RpcResult invokeOn(final RpcService rpcService, final CompositeNode domInput) throws Exception { diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.java deleted file mode 100644 index aa6a9a21e5..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.sal.binding.impl.util; - -import com.google.common.collect.Multimap; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map.Entry; -import org.opendaylight.yangtools.concepts.Path; - -@SuppressWarnings("all") -public class MapUtils { - public static

, V extends Object> Collection> getAllChildren(final Multimap map, final P path) { - HashSet> _hashSet = new HashSet>(); - final HashSet> ret = _hashSet; - final Collection> entries = map.entries(); - for (final Entry entry : entries) { - { - final P currentPath = entry.getKey(); - if (path.contains(currentPath)) { - ret.add(entry); - } else if (currentPath.contains(path)){ - ret.add(entry); - } - } - } - return ret; - } -} - diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java new file mode 100644 index 0000000000..110e5b4dce --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/RpcProviderRegistryTest.java @@ -0,0 +1,137 @@ +package org.opendaylight.controller.md.sal.binding.impl.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; +import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_BAR_KEY; +import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_FOO_KEY; +import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.path; + +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.opendaylight.controller.md.sal.binding.test.AssertCollections; +import org.opendaylight.controller.md.sal.common.api.routing.RouteChange; +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; +import org.opendaylight.controller.sal.binding.impl.RpcProviderRegistryImpl; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.TopLevelList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.OpendaylightTestRoutedRpcService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.TestContext; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +import com.google.common.util.concurrent.SettableFuture; + + +public class RpcProviderRegistryTest { + + private static InstanceIdentifier FOO_PATH = path(TOP_FOO_KEY); + private static InstanceIdentifier BAR_PATH = path(TOP_BAR_KEY); + private static RpcContextIdentifier ROUTING_CONTEXT = RpcContextIdentifier.contextFor(OpendaylightTestRoutedRpcService.class, TestContext.class); + + private RpcProviderRegistryImpl rpcRegistry; + + @Before + public void setup() { + rpcRegistry = new RpcProviderRegistryImpl("test"); + } + + private static class TestListener implements RouteChangeListener> { + + final SettableFuture>> event = SettableFuture.create(); + @Override + public void onRouteChange( + final RouteChange> change) { + event.set(change); + } + } + + @Test + public void testGlobalRpcRegistrations() throws Exception { + OpendaylightTestRpcServiceService one = Mockito.mock(OpendaylightTestRpcServiceService.class); + OpendaylightTestRpcServiceService two = Mockito.mock(OpendaylightTestRpcServiceService.class); + + RpcRegistration regOne = rpcRegistry.addRpcImplementation(OpendaylightTestRpcServiceService.class, one); + assertNotNull(regOne); + + try { + rpcRegistry.addRpcImplementation(OpendaylightTestRpcServiceService.class, two); + fail("Second call for registration of same RPC must throw IllegalStateException"); + } catch (IllegalStateException e) { + assertNotNull(e.getMessage()); + } + + regOne.close(); + + RpcRegistration regTwo = rpcRegistry.addRpcImplementation(OpendaylightTestRpcServiceService.class, two); + assertNotNull(regTwo); + } + + @Test + public void testRpcRouterInstance() throws Exception { + OpendaylightTestRoutedRpcService def = Mockito.mock(OpendaylightTestRoutedRpcService.class); + + RpcRouter router = rpcRegistry.getRpcRouter(OpendaylightTestRoutedRpcService.class); + + assertEquals(OpendaylightTestRoutedRpcService.class, router.getServiceType()); + assertNotNull(router.getInvocationProxy()); + assertNull(router.getDefaultService()); + + AssertCollections.assertContains(router.getContexts(), TestContext.class); + + RpcRegistration regDef = router.registerDefaultService(def); + assertNotNull(regDef); + assertEquals(OpendaylightTestRoutedRpcService.class,regDef.getServiceType()); + assertEquals(def,regDef.getInstance()); + assertEquals(def, router.getDefaultService()); + + regDef.close(); + assertNull("Default instance should be null after closing registration", router.getDefaultService()); + } + + @Test + public void testRoutedRpcPathChangeEvents() throws InterruptedException, TimeoutException, ExecutionException { + OpendaylightTestRoutedRpcService one = Mockito.mock(OpendaylightTestRoutedRpcService.class); + OpendaylightTestRoutedRpcService two = Mockito.mock(OpendaylightTestRoutedRpcService.class); + RoutedRpcRegistration regOne = rpcRegistry.addRoutedRpcImplementation(OpendaylightTestRoutedRpcService.class, one); + RoutedRpcRegistration regTwo = rpcRegistry.addRoutedRpcImplementation(OpendaylightTestRoutedRpcService.class, two); + assertNotNull(regOne); + assertNotNull(regTwo); + + final TestListener addListener = new TestListener(); + rpcRegistry.registerRouteChangeListener(addListener); + regOne.registerPath(TestContext.class, FOO_PATH); + + RouteChange> fooAddEvent = addListener.event.get(500, TimeUnit.MILLISECONDS); + Set> announce = fooAddEvent.getAnnouncements().get(ROUTING_CONTEXT); + assertNotNull(announce); + AssertCollections.assertContains(announce, FOO_PATH); + AssertCollections.assertNotContains(announce, BAR_PATH); + + + + final TestListener removeListener = new TestListener(); + rpcRegistry.registerRouteChangeListener(removeListener); + + regOne.unregisterPath(TestContext.class, FOO_PATH); + + RouteChange> fooRemoveEvent = removeListener.event.get(500, TimeUnit.MILLISECONDS); + Set> removal = fooRemoveEvent.getRemovals().get(ROUTING_CONTEXT); + assertNotNull(removal); + AssertCollections.assertContains(removal, FOO_PATH); + AssertCollections.assertNotContains(removal, BAR_PATH); + + + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategyTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategyTest.java index c5aea8f2ab..6977588a01 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategyTest.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/impl/connect/dom/RpcInvocationStrategyTest.java @@ -25,13 +25,13 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService; @@ -96,9 +96,11 @@ public class RpcInvocationStrategyTest { private void setupForForwardToDom(boolean hasOutput, boolean hasInput, int expectedErrorSize) { - if (expectedErrorSize > 0) + if (expectedErrorSize > 0) { errors.add(rpcError); - RpcResult result = Rpcs.getRpcResult(true, invokeRpcResult, errors); + } + RpcResult result = RpcResultBuilder.success(invokeRpcResult) + .withRpcErrors( errors ).build(); futureCompNode = Futures.immediateFuture(result); if( hasInput ) { @@ -191,22 +193,28 @@ public class RpcInvocationStrategyTest { * invokeOn Tests */ private void setupRpcResultsWithOutput(int expectedErrorSize) { - if (expectedErrorSize > 0) + if (expectedErrorSize > 0) { errors.add(rpcError); - RpcResult resultCompNode = Rpcs.getRpcResult(true, inputInvokeOn, errors); + } + RpcResult resultCompNode = RpcResultBuilder.success(inputInvokeOn) + .withRpcErrors(errors).build(); futureCompNode = Futures.immediateFuture(resultCompNode); - RpcResult resultDataObj = Rpcs.getRpcResult(true, toDataDomInput, errors); + RpcResult resultDataObj = RpcResultBuilder.success(toDataDomInput) + .withRpcErrors(errors).build(); futureDataObj = Futures.immediateFuture(resultDataObj); when(mockMappingService.toDataDom(toDataDomInput)).thenReturn(outputInvokeOn); } private void setupRpcResultsNoOutput(int expectedErrorSize) { - if (expectedErrorSize > 0) + if (expectedErrorSize > 0) { errors.add(rpcError); - RpcResult resultCompNode = Rpcs.getRpcResult(true, inputInvokeOn, errors); + } + RpcResult resultCompNode = RpcResultBuilder.success(inputInvokeOn) + .withRpcErrors(errors).build(); futureCompNode = Futures.immediateFuture(resultCompNode); - RpcResult resultDataObj = Rpcs.getRpcResult(true, null, errors); + RpcResult resultDataObj = RpcResultBuilder.success() + .withRpcErrors(errors).build(); futureDataObj = Futures.immediateFuture(resultDataObj); } diff --git a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerRpcTest.java b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerRpcTest.java index ca38ed0797..48e1db0e63 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerRpcTest.java +++ b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerRpcTest.java @@ -23,7 +23,6 @@ import org.junit.Test; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.controller.sal.binding.test.util.BindingBrokerTestFactory; import org.opendaylight.controller.sal.binding.test.util.BindingTestContext; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; @@ -42,12 +41,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -136,7 +134,7 @@ public class CrossBrokerRpcTest { @Override public ListenableFuture> invokeRpc(QName rpc, CompositeNode input) { CompositeNode result = testContext.getBindingToDomMappingService().toDataDom(output); - return Futures.immediateFuture(Rpcs.getRpcResult(true, result, ImmutableList.of())); + return Futures.immediateFuture(RpcResultBuilder.success(result).build()); } }); registration.registerPath(NodeContext.QNAME, BI_NODE_C_ID); @@ -168,7 +166,7 @@ public class CrossBrokerRpcTest { private Future> addFlowResult(boolean success, long xid) { AddFlowOutput output = new AddFlowOutputBuilder() // .setTransactionId(new TransactionId(BigInteger.valueOf(xid))).build(); - RpcResult result = Rpcs.getRpcResult(success, output, ImmutableList. of()); + RpcResult result = RpcResultBuilder.status(success).withResult(output).build(); return Futures.immediateFuture(result); } diff --git a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/DOMRpcServiceTestBugfix560.java b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/DOMRpcServiceTestBugfix560.java index c87b93625f..0c123ebe66 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/DOMRpcServiceTestBugfix560.java +++ b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/DOMRpcServiceTestBugfix560.java @@ -25,7 +25,6 @@ import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance; import org.opendaylight.controller.sal.binding.api.mount.MountProviderService; import org.opendaylight.controller.sal.binding.test.util.BindingBrokerTestFactory; import org.opendaylight.controller.sal.binding.test.util.BindingTestContext; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; @@ -39,6 +38,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -135,8 +135,8 @@ public class DOMRpcServiceTestBugfix560 { public ListenableFuture> invokeRpc( final QName rpc, final CompositeNode input) { - return Futures.immediateFuture(Rpcs - . getRpcResult(true)); + return Futures.immediateFuture(RpcResultBuilder + . success().build()); } @Override diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java index a51dc64816..007122e41d 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java @@ -8,7 +8,6 @@ package org.opendaylight.controller.md.sal.common.impl.service; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -21,10 +20,9 @@ import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.yangtools.concepts.Path; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,8 +66,7 @@ public class TwoPhaseCommit

, D extends Object, DCL extends Dat log.trace("Transaction: {} Finished successfully (no effects).", transactionId); - return Rpcs. getRpcResult(true, TransactionStatus.COMMITED, - Collections. emptySet()); + return RpcResultBuilder. success( TransactionStatus.COMMITED ).build(); } final ImmutableList.Builder> listenersBuilder = ImmutableList.builder(); @@ -127,8 +124,7 @@ public class TwoPhaseCommit

, D extends Object, DCL extends Dat log.trace("Transaction: {} Notifying listeners.", transactionId); publishDataChangeEvent(listeners); - return Rpcs. getRpcResult(true, TransactionStatus.COMMITED, - Collections. emptySet()); + return RpcResultBuilder. success(TransactionStatus.COMMITED).build(); } private void captureInitialState(ImmutableList> listeners) { @@ -240,7 +236,6 @@ public class TwoPhaseCommit

, D extends Object, DCL extends Dat for (final DataCommitTransaction transaction : transactions) { transaction.rollback(); } - Set _emptySet = Collections. emptySet(); - return Rpcs. getRpcResult(false, TransactionStatus.FAILED, _emptySet); + return RpcResultBuilder. failed().withResult(TransactionStatus.FAILED).build(); } } diff --git a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java index 1af7ccc79a..9aacf1e0a8 100644 --- a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java +++ b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java @@ -7,13 +7,11 @@ */ package org.opendaylight.controller.sal.common.util; -import java.util.Collections; - import org.opendaylight.controller.md.sal.common.api.data.DataModification; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; import org.opendaylight.yangtools.concepts.Path; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; public class CommitHandlerTransactions { @@ -26,11 +24,11 @@ public class CommitHandlerTransactions { } @Override public RpcResult rollback() throws IllegalStateException { - return Rpcs.getRpcResult(true, null, Collections.emptyList()); + return RpcResultBuilder.success().build(); } @Override public RpcResult finish() throws IllegalStateException { - return Rpcs.getRpcResult(true, null, Collections.emptyList()); + return RpcResultBuilder.success().build(); } @Override diff --git a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/RpcErrors.java b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/RpcErrors.java index 4d41249b4d..cacb167f6f 100644 --- a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/RpcErrors.java +++ b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/RpcErrors.java @@ -12,9 +12,9 @@ import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; /** - * @author mirehak - * + * @deprecated Use {@link org.opendaylight.yangtools.yang.common.RpcResultBuilder} */ +@Deprecated public class RpcErrors { /** diff --git a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Rpcs.java b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Rpcs.java index f303941871..69458b6a6d 100644 --- a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Rpcs.java +++ b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Rpcs.java @@ -16,6 +16,10 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import com.google.common.collect.ImmutableList; +/** + * @deprecated Use {@link org.opendaylight.yangtools.yang.common.RpcResultBuilder} + */ +@Deprecated public class Rpcs { public static RpcResult getRpcResult(boolean successful) { diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMDataCommitCoordinatorImpl.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMDataCommitCoordinatorImpl.java index 540e2fe20c..13a0093d34 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMDataCommitCoordinatorImpl.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMDataCommitCoordinatorImpl.java @@ -6,7 +6,6 @@ */ package org.opendaylight.controller.md.sal.dom.broker.impl; -import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -16,10 +15,9 @@ import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -221,7 +219,7 @@ public class DOMDataCommitCoordinatorImpl implements DOMDataCommitExecutor { */ private RpcResult commitBlocking() throws TransactionCommitFailedException { commitAll().checkedGet(); - return Rpcs.getRpcResult(true, TransactionStatus.COMMITED, Collections. emptySet()); + return RpcResultBuilder.success(TransactionStatus.COMMITED).build(); } /** diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/GlobalRpcRegistration.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/GlobalRpcRegistration.java new file mode 100644 index 0000000000..f63e5ea768 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/GlobalRpcRegistration.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.sal.dom.broker.impl; + +import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration; +import org.opendaylight.controller.sal.core.api.RpcImplementation; +import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; +import org.opendaylight.yangtools.yang.common.QName; + +class GlobalRpcRegistration extends AbstractObjectRegistration implements + RpcRegistration { + private final QName type; + private SchemaAwareRpcBroker router; + + public GlobalRpcRegistration(final QName type, final RpcImplementation instance, final SchemaAwareRpcBroker router) { + super(instance); + this.type = type; + this.router = router; + } + + @Override + public QName getType() { + return type; + } + + @Override + protected void removeRegistration() { + if (router != null) { + router.remove(this); + router = null; + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.java index 50dfbe852b..d7309b9ed3 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.java @@ -7,7 +7,6 @@ */ package org.opendaylight.controller.sal.dom.broker.impl; -import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -15,10 +14,9 @@ import java.util.concurrent.ConcurrentHashMap; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataModification; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.data.DataStore; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.slf4j.Logger; @@ -70,8 +68,7 @@ public final class HashMapDataStore implements DataStore, AutoCloseable { } public RpcResult rollback(HashMapDataStoreTransaction transaction) { - return Rpcs. getRpcResult(true, null, - Collections. emptySet()); + return RpcResultBuilder. success().build(); } public RpcResult finish(HashMapDataStoreTransaction transaction) { @@ -100,8 +97,7 @@ public final class HashMapDataStore implements DataStore, AutoCloseable { configuration.putAll(modification.getUpdatedConfigurationData()); operational.putAll(modification.getUpdatedOperationalData()); - return Rpcs. getRpcResult(true, null, - Collections. emptySet()); + return RpcResultBuilder. success().build(); } public void remove(final Map map, diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RoutedRpcRegImpl.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RoutedRpcRegImpl.java new file mode 100644 index 0000000000..e4f19bbb2a --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RoutedRpcRegImpl.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.sal.dom.broker.impl; + +import org.opendaylight.controller.sal.core.api.Broker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.core.api.RpcImplementation; +import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +class RoutedRpcRegImpl extends AbstractObjectRegistration implements + RoutedRpcRegistration { + + private final QName type; + private final RoutedRpcSelector router; + + public RoutedRpcRegImpl(final QName rpcType, final RpcImplementation implementation, final RoutedRpcSelector routedRpcSelector) { + super(implementation); + this.type = rpcType; + router = routedRpcSelector; + } + + @Override + public void registerPath(final QName context, final InstanceIdentifier path) { + router.addPath(context, path, this); + } + + @Override + public void unregisterPath(final QName context, final InstanceIdentifier path) { + router.removePath(context, path, this); + } + + @Override + protected void removeRegistration() { + + } + + @Override + public QName getType() { + return type; + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RoutedRpcSelector.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RoutedRpcSelector.java new file mode 100644 index 0000000000..a22aed7ab1 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RoutedRpcSelector.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.sal.dom.broker.impl; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.opendaylight.controller.md.sal.dom.broker.spi.rpc.RpcRoutingStrategy; +import org.opendaylight.controller.sal.core.api.Broker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.core.api.RpcImplementation; +import org.opendaylight.controller.sal.core.api.RpcRoutingContext; +import org.opendaylight.yangtools.concepts.Identifiable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.SimpleNode; + +import com.google.common.collect.ImmutableSet; +import com.google.common.util.concurrent.ListenableFuture; + +class RoutedRpcSelector implements RpcImplementation, AutoCloseable, Identifiable { + + private final RpcRoutingStrategy strategy; + private final Set supportedRpcs; + private final RpcRoutingContext identifier; + final ConcurrentMap implementations = new ConcurrentHashMap<>(); + private final SchemaAwareRpcBroker router; + + public RoutedRpcSelector(final RpcRoutingStrategy strategy, final SchemaAwareRpcBroker router) { + super(); + this.strategy = strategy; + supportedRpcs = ImmutableSet.of(strategy.getIdentifier()); + identifier = RpcRoutingContext.create(strategy.getContext(), strategy.getIdentifier()); + this.router = router; + } + + @Override + public RpcRoutingContext getIdentifier() { + return identifier; + } + + @Override + public void close() throws Exception { + + } + + @Override + public Set getSupportedRpcs() { + return supportedRpcs; + } + + public RoutedRpcRegistration addRoutedRpcImplementation(final QName rpcType, final RpcImplementation implementation) { + return new RoutedRpcRegImpl(rpcType, implementation, this); + } + + @Override + public ListenableFuture> invokeRpc(final QName rpc, final CompositeNode input) { + CompositeNode inputContainer = input.getFirstCompositeByName(QName.create(rpc,"input")); + checkArgument(inputContainer != null, "Rpc payload must contain input element"); + SimpleNode routeContainer = inputContainer.getFirstSimpleByName(strategy.getLeaf()); + checkArgument(routeContainer != null, "Leaf %s must be set with value", strategy.getLeaf()); + Object route = routeContainer.getValue(); + checkArgument(route instanceof InstanceIdentifier, + "The routed node %s is not an instance identifier", route); + RpcImplementation potential = null; + if (route != null) { + RoutedRpcRegImpl potentialReg = implementations.get(route); + if (potentialReg != null) { + potential = potentialReg.getInstance(); + } + } + if (potential == null) { + return router.invokeRpc(rpc, (InstanceIdentifier) route, input); + } + checkState(potential != null, "No implementation is available for rpc:%s path:%s", rpc, route); + return potential.invokeRpc(rpc, input); + } + + public void addPath(final QName context, final InstanceIdentifier path, final RoutedRpcRegImpl routedRpcRegImpl) { + //checkArgument(strategy.getContext().equals(context),"Supplied context is not supported."); + RoutedRpcRegImpl previous = implementations.put(path, routedRpcRegImpl); + if (previous == null) { + router.notifyPathAnnouncement(context,strategy.getIdentifier(), path); + } + + } + + public void removePath(final QName context, final InstanceIdentifier path, final RoutedRpcRegImpl routedRpcRegImpl) { + boolean removed = implementations.remove(path, routedRpcRegImpl); + if (removed) { + router.notifyPathWithdrawal(context, strategy.getIdentifier(), path); + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java index 32139308b1..7bc827dcb0 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java @@ -14,10 +14,10 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import com.google.common.base.Preconditions; import org.opendaylight.controller.md.sal.common.api.routing.RouteChange; import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; import org.opendaylight.controller.md.sal.common.impl.routing.RoutingUtils; +import org.opendaylight.controller.md.sal.dom.broker.spi.rpc.RpcRoutingStrategy; import org.opendaylight.controller.sal.core.api.Broker.RoutedRpcRegistration; import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration; import org.opendaylight.controller.sal.core.api.RoutedRpcDefaultImplementation; @@ -25,7 +25,6 @@ import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.controller.sal.core.api.RpcRegistrationListener; import org.opendaylight.controller.sal.core.api.RpcRoutingContext; import org.opendaylight.controller.sal.dom.broker.spi.RpcRouter; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.util.ListenerRegistry; @@ -33,17 +32,13 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.SimpleNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -53,8 +48,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro private static final Logger LOG = LoggerFactory.getLogger(SchemaAwareRpcBroker.class); - private static final QName CONTEXT_REFERENCE = QName.create("urn:opendaylight:yang:extension:yang-ext", - "2013-07-09", "context-reference"); + private final ListenerRegistry rpcRegistrationListeners = new ListenerRegistry<>(); private final ListenerRegistry> routeChangeListeners = new ListenerRegistry<>(); @@ -65,7 +59,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro private SchemaContextProvider schemaProvider; private RoutedRpcDefaultImplementation defaultDelegate; - public SchemaAwareRpcBroker(String identifier, SchemaContextProvider schemaProvider) { + public SchemaAwareRpcBroker(final String identifier, final SchemaContextProvider schemaProvider) { super(); this.identifier = identifier; this.schemaProvider = schemaProvider; @@ -75,7 +69,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro return defaultImplementation; } - public void setDefaultImplementation(RpcImplementation defaultImplementation) { + public void setDefaultImplementation(final RpcImplementation defaultImplementation) { this.defaultImplementation = defaultImplementation; } @@ -83,7 +77,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro return schemaProvider; } - public void setSchemaProvider(SchemaContextProvider schemaProvider) { + public void setSchemaProvider(final SchemaContextProvider schemaProvider) { this.schemaProvider = schemaProvider; } @@ -92,18 +86,18 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro } @Override - public void setRoutedRpcDefaultDelegate(RoutedRpcDefaultImplementation defaultDelegate) { + public void setRoutedRpcDefaultDelegate(final RoutedRpcDefaultImplementation defaultDelegate) { this.defaultDelegate = defaultDelegate; } @Override - public RoutedRpcRegistration addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation) { + public RoutedRpcRegistration addRoutedRpcImplementation(final QName rpcType, final RpcImplementation implementation) { checkArgument(rpcType != null, "RPC Type should not be null"); checkArgument(implementation != null, "RPC Implementatoin should not be null"); return getOrCreateRoutedRpcRouter(rpcType).addRoutedRpcImplementation(rpcType, implementation); } - private RoutedRpcSelector getOrCreateRoutedRpcRouter(QName rpcType) { + private RoutedRpcSelector getOrCreateRoutedRpcRouter(final QName rpcType) { RoutedRpcSelector potential = getRoutedRpcRouter(rpcType); if (potential != null) { return potential; @@ -114,15 +108,15 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro return potential; } RpcDefinition definition = findRpcDefinition(rpcType); - RoutingStrategy strategy = getRoutingStrategy(definition); - checkState(strategy instanceof RoutedRpcStrategy, "Rpc %s is not routed.", rpcType); - potential = new RoutedRpcSelector((RoutedRpcStrategy) strategy, this); + RpcRoutingStrategy strategy = RpcRoutingStrategy.from(definition); + checkState(strategy.isContextBasedRouted(), "Rpc %s is not routed.", rpcType); + potential = new RoutedRpcSelector( strategy, this); implementations.put(rpcType, potential); return potential; } } - private RoutedRpcSelector getRoutedRpcRouter(QName rpcType) { + private RoutedRpcSelector getRoutedRpcRouter(final QName rpcType) { RpcImplementation potential = implementations.get(rpcType); if (potential != null) { checkState(potential instanceof RoutedRpcSelector, "Rpc %s is not routed.", rpcType); @@ -133,13 +127,13 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro } @Override - public RpcRegistration addRpcImplementation(QName rpcType, RpcImplementation implementation) + public RpcRegistration addRpcImplementation(final QName rpcType, final RpcImplementation implementation) throws IllegalArgumentException { checkArgument(rpcType != null, "RPC Type should not be null"); checkArgument(implementation != null, "RPC Implementatoin should not be null"); checkState(!hasRpcImplementation(rpcType), "Implementation already registered"); RpcDefinition definition = findRpcDefinition(rpcType); - checkArgument(!isRoutedRpc(definition), "RPC Type must not be routed."); + checkArgument(!RpcRoutingStrategy.from(definition).isContextBasedRouted(), "RPC Type must not be content routed."); GlobalRpcRegistration reg = new GlobalRpcRegistration(rpcType, implementation, this); final RpcImplementation previous = implementations.putIfAbsent(rpcType, implementation); Preconditions.checkState(previous == null, "Rpc %s is already registered.",rpcType); @@ -147,7 +141,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro return reg; } - private void notifyRpcAdded(QName rpcType) { + private void notifyRpcAdded(final QName rpcType) { for (ListenerRegistration listener : rpcRegistrationListeners) { try { listener.getInstance().onRpcImplementationAdded(rpcType); @@ -158,12 +152,8 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro } } - private boolean isRoutedRpc(RpcDefinition definition) { - return getRoutingStrategy(definition) instanceof RoutedRpcStrategy; - } - @Override - public ListenerRegistration addRpcRegistrationListener(RpcRegistrationListener listener) { + public ListenerRegistration addRpcRegistrationListener(final RpcRegistrationListener listener) { ListenerRegistration reg = rpcRegistrationListeners.register(listener); for (QName impl : implementations.keySet()) { listener.onRpcImplementationAdded(impl); @@ -182,11 +172,11 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro } @Override - public ListenableFuture> invokeRpc(QName rpc, CompositeNode input) { + public ListenableFuture> invokeRpc(final QName rpc, final CompositeNode input) { return findRpcImplemention(rpc).invokeRpc(rpc, input); } - private RpcImplementation findRpcImplemention(QName rpc) { + private RpcImplementation findRpcImplemention(final QName rpc) { checkArgument(rpc != null, "Rpc name should not be null"); RpcImplementation potentialImpl = implementations.get(rpc); if (potentialImpl != null) { @@ -201,11 +191,11 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro return potentialImpl; } - private boolean hasRpcImplementation(QName rpc) { + private boolean hasRpcImplementation(final QName rpc) { return implementations.containsKey(rpc); } - private RpcDefinition findRpcDefinition(QName rpcType) { + private RpcDefinition findRpcDefinition(final QName rpcType) { checkArgument(rpcType != null, "Rpc name must be supplied."); checkState(schemaProvider != null, "Schema Provider is not available."); SchemaContext ctx = schemaProvider.getSchemaContext(); @@ -215,7 +205,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro return findRpcDefinition(rpcType, module.getRpcs()); } - static private RpcDefinition findRpcDefinition(QName rpcType, Set rpcs) { + static private RpcDefinition findRpcDefinition(final QName rpcType, final Set rpcs) { checkState(rpcs != null, "Rpc schema is not available."); for (RpcDefinition rpc : rpcs) { if (rpcType.equals(rpc.getQName())) { @@ -225,225 +215,17 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro throw new IllegalArgumentException("Supplied Rpc Type is not defined."); } - private RoutingStrategy getRoutingStrategy(RpcDefinition rpc) { - ContainerSchemaNode input = rpc.getInput(); - if (input != null) { - for (DataSchemaNode schemaNode : input.getChildNodes()) { - Optional context = getRoutingContext(schemaNode); - if (context.isPresent()) { - return createRoutedStrategy(rpc, context.get(), schemaNode.getQName()); - } - } - } - return createGlobalStrategy(rpc); - } - - private static RoutingStrategy createRoutedStrategy(RpcDefinition rpc, QName context, QName leafNode) { - return new RoutedRpcStrategy(rpc.getQName(), context, leafNode); - } - - private Optional getRoutingContext(DataSchemaNode schemaNode) { - for (UnknownSchemaNode extension : schemaNode.getUnknownSchemaNodes()) { - if (CONTEXT_REFERENCE.equals(extension.getNodeType())) { - return Optional.fromNullable(extension.getQName()); - } - } - return Optional.absent(); - } - - private static RoutingStrategy createGlobalStrategy(RpcDefinition rpc) { - GlobalRpcStrategy ret = new GlobalRpcStrategy(rpc.getQName()); - return ret; - } - @Override - public ListenableFuture> invokeRpc(QName rpc, InstanceIdentifier identifier, CompositeNode input) { - checkState(defaultDelegate != null); - return defaultDelegate.invokeRpc(rpc, identifier, input); - } - - private static abstract class RoutingStrategy implements Identifiable { - - private final QName identifier; - - public RoutingStrategy(QName identifier) { - super(); - this.identifier = identifier; - } - - @Override - public QName getIdentifier() { - return identifier; - } - } - - private static class GlobalRpcStrategy extends RoutingStrategy { - - public GlobalRpcStrategy(QName identifier) { - super(identifier); - } - } - - private static class RoutedRpcStrategy extends RoutingStrategy { - - private final QName context; - private final QName leaf; - - public RoutedRpcStrategy(QName identifier, QName ctx, QName leaf) { - super(identifier); - this.context = ctx; - this.leaf = leaf; - } - - public QName getContext() { - return context; - } - - public QName getLeaf() { - return leaf; - } + public ListenableFuture> invokeRpc(final QName rpc, final InstanceIdentifier route, final CompositeNode input) { + checkState(defaultDelegate != null, "No implementation is available for rpc:%s path:%s", rpc, route); + return defaultDelegate.invokeRpc(rpc, route, input); } - private static class RoutedRpcSelector implements RpcImplementation, AutoCloseable, Identifiable { - - private final RoutedRpcStrategy strategy; - private final Set supportedRpcs; - private final RpcRoutingContext identifier; - private RpcImplementation defaultDelegate; - private final ConcurrentMap implementations = new ConcurrentHashMap<>(); - private final SchemaAwareRpcBroker router; - - public RoutedRpcSelector(RoutedRpcStrategy strategy, SchemaAwareRpcBroker router) { - super(); - this.strategy = strategy; - supportedRpcs = ImmutableSet.of(strategy.getIdentifier()); - identifier = RpcRoutingContext.create(strategy.context, strategy.getIdentifier()); - this.router = router; - } - - @Override - public RpcRoutingContext getIdentifier() { - return identifier; - } - - @Override - public void close() throws Exception { - - } - - @Override - public Set getSupportedRpcs() { - return supportedRpcs; - } - - public RoutedRpcRegistration addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation) { - return new RoutedRpcRegImpl(rpcType, implementation, this); - } - - @Override - public ListenableFuture> invokeRpc(QName rpc, CompositeNode input) { - CompositeNode inputContainer = input.getFirstCompositeByName(QName.create(rpc,"input")); - checkArgument(inputContainer != null, "Rpc payload must contain input element"); - SimpleNode routeContainer = inputContainer.getFirstSimpleByName(strategy.getLeaf()); - checkArgument(routeContainer != null, "Leaf %s must be set with value", strategy.getLeaf()); - Object route = routeContainer.getValue(); - checkArgument(route instanceof InstanceIdentifier, - "The routed node %s is not an instance identifier", route); - RpcImplementation potential = null; - if (route != null) { - RoutedRpcRegImpl potentialReg = implementations.get(route); - if (potentialReg != null) { - potential = potentialReg.getInstance(); - } - } - if (potential == null) { - return router.invokeRpc(rpc, (InstanceIdentifier) route, input); - } - checkState(potential != null, "No implementation is available for rpc:%s path:%s", rpc, route); - return potential.invokeRpc(rpc, input); - } - - public void addPath(QName context, InstanceIdentifier path, RoutedRpcRegImpl routedRpcRegImpl) { - //checkArgument(strategy.getContext().equals(context),"Supplied context is not supported."); - RoutedRpcRegImpl previous = implementations.put(path, routedRpcRegImpl); - if (previous == null) { - router.notifyPathAnnouncement(context,strategy.getIdentifier(), path); - } - - } - - public void removePath(QName context, InstanceIdentifier path, RoutedRpcRegImpl routedRpcRegImpl) { - boolean removed = implementations.remove(path, routedRpcRegImpl); - if (removed) { - router.notifyPathWithdrawal(context, strategy.getIdentifier(), path); - } - } - } - - private static class GlobalRpcRegistration extends AbstractObjectRegistration implements - RpcRegistration { - private final QName type; - private SchemaAwareRpcBroker router; - - public GlobalRpcRegistration(QName type, RpcImplementation instance, SchemaAwareRpcBroker router) { - super(instance); - this.type = type; - this.router = router; - } - - @Override - public QName getType() { - return type; - } - - @Override - protected void removeRegistration() { - if (router != null) { - router.remove(this); - router = null; - } - } - } - - private static class RoutedRpcRegImpl extends AbstractObjectRegistration implements - RoutedRpcRegistration { - - private final QName type; - private final RoutedRpcSelector router; - - public RoutedRpcRegImpl(QName rpcType, RpcImplementation implementation, RoutedRpcSelector routedRpcSelector) { - super(implementation); - this.type = rpcType; - router = routedRpcSelector; - } - - @Override - public void registerPath(QName context, InstanceIdentifier path) { - router.addPath(context, path, this); - } - - @Override - public void unregisterPath(QName context, InstanceIdentifier path) { - router.removePath(context, path, this); - } - - @Override - protected void removeRegistration() { - - } - - @Override - public QName getType() { - return type; - } - - } - - private void remove(GlobalRpcRegistration registration) { + void remove(final GlobalRpcRegistration registration) { implementations.remove(registration.getType(), registration); } - private void notifyPathAnnouncement(QName context, QName identifier, InstanceIdentifier path) { + void notifyPathAnnouncement(final QName context, final QName identifier, final InstanceIdentifier path) { RpcRoutingContext contextWrapped = RpcRoutingContext.create(context, identifier); RouteChange change = RoutingUtils.announcementChange(contextWrapped , path); for(ListenerRegistration> routeListener : routeChangeListeners) { @@ -451,15 +233,12 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro routeListener.getInstance().onRouteChange(change); } catch (Exception e) { LOG.error("Unhandled exception during invoking onRouteChange for {}",routeListener.getInstance(),e); - } } } - - - private void notifyPathWithdrawal(QName context,QName identifier, InstanceIdentifier path) { + void notifyPathWithdrawal(final QName context,final QName identifier, final InstanceIdentifier path) { RpcRoutingContext contextWrapped = RpcRoutingContext.create(context, identifier); RouteChange change = RoutingUtils.removalChange(contextWrapped , path); for(ListenerRegistration> routeListener : routeChangeListeners) { @@ -473,7 +252,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro @Override public > ListenerRegistration registerRouteChangeListener( - L listener) { + final L listener) { ListenerRegistration reg = routeChangeListeners.registerWithType(listener); RouteChange initial = createInitialRouteChange(); try { diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/broker/spi/rpc/RpcRoutingStrategy.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/broker/spi/rpc/RpcRoutingStrategy.java new file mode 100644 index 0000000000..81203c55fe --- /dev/null +++ b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/broker/spi/rpc/RpcRoutingStrategy.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.dom.broker.spi.rpc; + +import org.opendaylight.yangtools.concepts.Identifiable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; + +import com.google.common.base.Optional; + +public abstract class RpcRoutingStrategy implements Identifiable { + + private final QName identifier; + private static final QName CONTEXT_REFERENCE = QName.create("urn:opendaylight:yang:extension:yang-ext", + "2013-07-09", "context-reference"); + + private RpcRoutingStrategy(final QName identifier) { + super(); + this.identifier = identifier; + } + + /** + * Returns leaf QName in which RPC Route is stored + * + * + * @return leaf QName in which RPC Route is stored + * @throws UnsupportedOperationException If RPC is not content routed. + * ({@link #isContextBasedRouted()} returned false) + */ + public abstract QName getLeaf(); + + /** + * Returns identity QName which represents RPC Routing context + * + * @return identity QName which represents RPC Routing context + * @throws UnsupportedOperationException If RPC is not content routed. + * ({@link #isContextBasedRouted()} returned false) + */ + public abstract QName getContext(); + + @Override + public QName getIdentifier() { + return identifier; + } + + /** + * Returns true if RPC is routed by context. + * + * @return true if RPC is routed by content. + */ + public abstract boolean isContextBasedRouted(); + + public static RpcRoutingStrategy from(final RpcDefinition rpc) { + ContainerSchemaNode input = rpc.getInput(); + if (input != null) { + for (DataSchemaNode schemaNode : input.getChildNodes()) { + Optional context = getRoutingContext(schemaNode); + if (context.isPresent()) { + return createRoutedStrategy(rpc, context.get(), schemaNode.getQName()); + } + } + } + return createGlobalStrategy(rpc); + } + + public static Optional getRoutingContext(final DataSchemaNode schemaNode) { + for (UnknownSchemaNode extension : schemaNode.getUnknownSchemaNodes()) { + if (CONTEXT_REFERENCE.equals(extension.getNodeType())) { + return Optional.fromNullable(extension.getQName()); + } + } + return Optional.absent(); + } + + private static RpcRoutingStrategy createRoutedStrategy(final RpcDefinition rpc, final QName context, final QName leafNode) { + return new RoutedRpcStrategy(rpc.getQName(), context, leafNode); + } + + + + private static RpcRoutingStrategy createGlobalStrategy(final RpcDefinition rpc) { + GlobalRpcStrategy ret = new GlobalRpcStrategy(rpc.getQName()); + return ret; + } + + private static class RoutedRpcStrategy extends RpcRoutingStrategy { + + final QName context; + private final QName leaf; + + private RoutedRpcStrategy(final QName identifier, final QName ctx, final QName leaf) { + super(identifier); + this.context = ctx; + this.leaf = leaf; + } + + @Override + public QName getContext() { + return context; + } + + @Override + public QName getLeaf() { + return leaf; + } + + @Override + public boolean isContextBasedRouted() { + return true; + } + } + + private static class GlobalRpcStrategy extends RpcRoutingStrategy { + + public GlobalRpcStrategy(final QName identifier) { + super(identifier); + } + + @Override + public boolean isContextBasedRouted() { + return false; + } + + @Override + public QName getContext() { + throw new UnsupportedOperationException("Not routed strategy does not have context."); + } + + @Override + public QName getLeaf() { + throw new UnsupportedOperationException("Not routed strategy does not have context."); + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModule.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModule.java index 3ed02dfb41..01a5989dcd 100644 --- a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModule.java +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModule.java @@ -1,14 +1,17 @@ package org.opendaylight.controller.config.yang.inmemory_datastore_provider; -import com.google.common.util.concurrent.MoreExecutors; +import java.util.concurrent.Executors; + import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; +import com.google.common.util.concurrent.MoreExecutors; + public class InMemoryConfigDataStoreProviderModule extends org.opendaylight.controller.config.yang.inmemory_datastore_provider.AbstractInMemoryConfigDataStoreProviderModule { - public InMemoryConfigDataStoreProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + public InMemoryConfigDataStoreProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public InMemoryConfigDataStoreProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.inmemory_datastore_provider.InMemoryConfigDataStoreProviderModule oldModule, java.lang.AutoCloseable oldInstance) { + public InMemoryConfigDataStoreProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final org.opendaylight.controller.config.yang.inmemory_datastore_provider.InMemoryConfigDataStoreProviderModule oldModule, final java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @@ -19,7 +22,7 @@ public class InMemoryConfigDataStoreProviderModule extends org.opendaylight.cont @Override public java.lang.AutoCloseable createInstance() { - InMemoryDOMDataStore ids = new InMemoryDOMDataStore("DOM-CFG", MoreExecutors.sameThreadExecutor()); + InMemoryDOMDataStore ids = new InMemoryDOMDataStore("DOM-CFG", MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor())); getSchemaServiceDependency().registerSchemaServiceListener(ids); return ids; } diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModule.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModule.java index eea95990a1..172b0dbc01 100644 --- a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModule.java +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModule.java @@ -1,14 +1,17 @@ package org.opendaylight.controller.config.yang.inmemory_datastore_provider; -import com.google.common.util.concurrent.MoreExecutors; +import java.util.concurrent.Executors; + import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; +import com.google.common.util.concurrent.MoreExecutors; + public class InMemoryOperationalDataStoreProviderModule extends org.opendaylight.controller.config.yang.inmemory_datastore_provider.AbstractInMemoryOperationalDataStoreProviderModule { - public InMemoryOperationalDataStoreProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + public InMemoryOperationalDataStoreProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public InMemoryOperationalDataStoreProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.inmemory_datastore_provider.InMemoryOperationalDataStoreProviderModule oldModule, java.lang.AutoCloseable oldInstance) { + public InMemoryOperationalDataStoreProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final org.opendaylight.controller.config.yang.inmemory_datastore_provider.InMemoryOperationalDataStoreProviderModule oldModule, final java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @@ -19,7 +22,7 @@ public class InMemoryOperationalDataStoreProviderModule extends org.opendaylight @Override public java.lang.AutoCloseable createInstance() { - InMemoryDOMDataStore ids = new InMemoryDOMDataStore("DOM-OPER", MoreExecutors.sameThreadExecutor()); + InMemoryDOMDataStore ids = new InMemoryDOMDataStore("DOM-OPER", MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor())); getSchemaServiceDependency().registerSchemaServiceListener(ids); return ids; } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicator.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicator.java index f36ad9abcb..8045f8cb4a 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicator.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicator.java @@ -8,7 +8,6 @@ package org.opendaylight.controller.sal.connect.netconf.listener; import java.util.ArrayDeque; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Queue; @@ -26,16 +25,14 @@ import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguratio import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfiguration; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlUtil; -import org.opendaylight.controller.sal.common.util.RpcErrors; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.connect.api.RemoteDevice; import org.opendaylight.controller.sal.connect.api.RemoteDeviceCommunicator; import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil; -import org.opendaylight.controller.sal.connect.util.FailedRpcResult; import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -140,9 +137,10 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, private RpcResult createErrorRpcResult( RpcError.ErrorType errorType, String message ) { - return new FailedRpcResult( RpcErrors.getRpcError( null, - NetconfDocumentedException.ErrorTag.operation_failed.getTagValue(), - null, RpcError.ErrorSeverity.ERROR, message, errorType, null ) ); + return RpcResultBuilder.failed() + .withError( errorType, NetconfDocumentedException.ErrorTag.operation_failed.getTagValue(), + message ) + .build(); } @Override @@ -208,8 +206,8 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, logger.warn( "{}: Invalid request-reply match, reply message contains different message-id, request: {}, response: {}", id, msgToS( request.request ), msgToS( message ), e ); - request.future.set( new FailedRpcResult( - NetconfMessageTransformUtil.toRpcError( e ) ) ); + request.future.set( RpcResultBuilder.failed() + .withRpcError( NetconfMessageTransformUtil.toRpcError( e ) ).build() ); return; } @@ -220,12 +218,12 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, logger.warn( "{}: Error reply from remote device, request: {}, response: {}", id, msgToS( request.request ), msgToS( message ), e ); - request.future.set( new FailedRpcResult( - NetconfMessageTransformUtil.toRpcError( e ) ) ); + request.future.set( RpcResultBuilder.failed() + .withRpcError( NetconfMessageTransformUtil.toRpcError( e ) ).build() ); return; } - request.future.set(Rpcs.getRpcResult( true, message, Collections.emptySet() ) ); + request.future.set( RpcResultBuilder.success( message ).build() ); } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceCommitHandler.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceCommitHandler.java index 8b6ac7d567..26c6a2758c 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceCommitHandler.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceCommitHandler.java @@ -11,12 +11,11 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataModification; -import org.opendaylight.controller.sal.common.util.RpcErrors; -import org.opendaylight.controller.sal.connect.util.FailedRpcResult; import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.slf4j.Logger; @@ -74,8 +73,8 @@ public final class NetconfDeviceCommitHandler implements DataCommitHandler finish() throws IllegalStateException { - return new FailedRpcResult<>(RpcErrors.getRpcError(null, null, null, RpcError.ErrorSeverity.ERROR, - id + ": Unexpected operation error during pre-commit operations", RpcError.ErrorType.APPLICATION, e)); + return RpcResultBuilder.failed().withError( RpcError.ErrorType.APPLICATION, + id + ": Unexpected operation error during pre-commit operations", e ).build(); } @Override diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java index 6a62b1e20b..8d5b7aed2f 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java @@ -9,17 +9,19 @@ package org.opendaylight.controller.sal.connect.netconf.sal; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; + import java.util.Collections; import java.util.Set; import javax.annotation.Nullable; + import org.opendaylight.controller.netconf.api.NetconfMessage; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.connect.api.MessageTransformer; import org.opendaylight.controller.sal.connect.api.RemoteDeviceCommunicator; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import com.google.common.util.concurrent.ListenableFuture; @@ -66,7 +68,8 @@ public final class NetconfDeviceRpc implements RpcImplementation { if (netconfMessageRpcResult.isSuccessful()) { return transformer.toRpcResult(netconfMessageRpcResult.getResult(), rpc); } else { - return Rpcs.getRpcResult(false, netconfMessageRpcResult.getErrors()); + return RpcResultBuilder. failed() + .withRpcErrors(netconfMessageRpcResult.getErrors()).build(); } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTwoPhaseCommitTransaction.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTwoPhaseCommitTransaction.java index f2698e17d2..960f2ef2e8 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTwoPhaseCommitTransaction.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTwoPhaseCommitTransaction.java @@ -33,14 +33,13 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; import org.opendaylight.controller.md.sal.common.api.data.DataModification; -import org.opendaylight.controller.sal.common.util.RpcErrors; import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil; -import org.opendaylight.controller.sal.connect.util.FailedRpcResult; import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; @@ -214,8 +213,8 @@ final class NetconfDeviceTwoPhaseCommitTransaction implements DataCommitTransact throw new RuntimeException(id + ": Interrupted while waiting for response", e); } catch (final ExecutionException e) { LOG.warn("{}: Failed to finish commit operation", id, e); - return new FailedRpcResult<>(RpcErrors.getRpcError(null, null, null, RpcError.ErrorSeverity.ERROR, - id + ": Unexpected operation error during commit operation", RpcError.ErrorType.APPLICATION, e)); + return RpcResultBuilder.failed().withError( RpcError.ErrorType.APPLICATION, + id + ": Unexpected operation error during commit operation", e ).build(); } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java index f9e6239bed..80d0f67ac4 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java @@ -8,18 +8,19 @@ package org.opendaylight.controller.sal.connect.netconf.schema.mapping; import com.google.common.base.Optional; -import java.util.Collections; + import java.util.List; import java.util.Set; + import javax.activation.UnsupportedDataTypeException; + import org.opendaylight.controller.netconf.api.NetconfMessage; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.connect.api.MessageTransformer; import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil; import org.opendaylight.controller.sal.connect.util.MessageCounter; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl; import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; @@ -90,7 +91,7 @@ public class NetconfMessageTransformer implements MessageTransformeremptySet()); + return RpcResultBuilder.success( node ).build(); } } @@ -114,7 +115,7 @@ public class NetconfMessageTransformer implements MessageTransformer emptySet()); + return RpcResultBuilder.success( compositeNode ).build(); } @Override diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NetconfMessageTransformUtil.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NetconfMessageTransformUtil.java index 6d087a9cc3..0aeec64690 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NetconfMessageTransformUtil.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NetconfMessageTransformUtil.java @@ -27,9 +27,9 @@ import javax.annotation.Nullable; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.util.messages.NetconfMessageUtil; -import org.opendaylight.controller.sal.common.util.RpcErrors; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; @@ -140,9 +140,14 @@ public class NetconfMessageTransformUtil { } } - return RpcErrors.getRpcError( null, ex.getErrorTag().getTagValue(), infoBuilder.toString(), - toRpcErrorSeverity( ex.getErrorSeverity() ), ex.getLocalizedMessage(), - toRpcErrorType( ex.getErrorType() ), ex.getCause() ); + ErrorSeverity severity = toRpcErrorSeverity( ex.getErrorSeverity() ); + return severity == ErrorSeverity.ERROR ? + RpcResultBuilder.newError( + toRpcErrorType( ex.getErrorType() ), ex.getErrorTag().getTagValue(), + ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause() ) : + RpcResultBuilder.newWarning( + toRpcErrorType( ex.getErrorType() ), ex.getErrorTag().getTagValue(), + ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause() ); } private static ErrorSeverity toRpcErrorSeverity( final NetconfDocumentedException.ErrorSeverity severity ) { diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/util/FailedRpcResult.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/util/FailedRpcResult.java deleted file mode 100644 index 49b16d4cfb..0000000000 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/util/FailedRpcResult.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.connect.util; - -import java.util.Collection; -import java.util.Collections; - -import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcResult; - -public final class FailedRpcResult implements RpcResult { - - private final RpcError rpcError; - - public FailedRpcResult(final RpcError rpcError) { - this.rpcError = rpcError; - } - - @Override - public boolean isSuccessful() { - return false; - } - - @Override - public T getResult() { - return null; - } - - @Override - public Collection getErrors() { - return Collections.singletonList(rpcError); - } -} diff --git a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTest.java b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTest.java index cd81a869f1..defaab629f 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTest.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTest.java @@ -28,7 +28,6 @@ import org.junit.Test; import org.mockito.Mockito; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.connect.api.MessageTransformer; import org.opendaylight.controller.sal.connect.api.RemoteDeviceCommunicator; import org.opendaylight.controller.sal.connect.api.RemoteDeviceHandler; @@ -39,8 +38,8 @@ import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransf import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -66,8 +65,8 @@ public class NetconfDeviceTest { } } - private static final RpcResult rpcResult = Rpcs.getRpcResult(true, netconfMessage, Collections.emptySet()); - private static final RpcResult rpcResultC = Rpcs.getRpcResult(true, compositeNode, Collections.emptySet()); + private static final RpcResult rpcResult = RpcResultBuilder.success(netconfMessage).build(); + private static final RpcResult rpcResultC = RpcResultBuilder.success(compositeNode).build(); public static final String TEST_NAMESPACE = "test:namespace"; public static final String TEST_MODULE = "test-module"; @@ -227,4 +226,4 @@ public class NetconfDeviceTest { doReturn(Futures.immediateFuture(rpcResult)).when(remoteDeviceCommunicator).sendRequest(any(NetconfMessage.class), any(QName.class)); return remoteDeviceCommunicator; } -} \ No newline at end of file +} diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java index a2c228788f..ead1740ffd 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java @@ -8,12 +8,13 @@ package org.opendaylight.controller.sal.restconf.impl; import com.google.common.util.concurrent.Futures; -import java.util.Collections; + import java.util.concurrent.Future; + import javax.ws.rs.core.Response.Status; + import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.DataReader; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession; import org.opendaylight.controller.sal.core.api.data.DataBrokerService; import org.opendaylight.controller.sal.core.api.data.DataChangeListener; @@ -24,8 +25,8 @@ import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorType; import org.opendaylight.controller.sal.streams.listeners.ListenerAdapter; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.slf4j.Logger; @@ -176,8 +177,8 @@ public class BrokerFacade implements DataReader getRpcResult(true, TransactionStatus.COMMITED, - Collections. emptyList())); + return Futures.immediateFuture(RpcResultBuilder. + success(TransactionStatus.COMMITED).build()); } transaction.removeConfigurationData(path); return transaction.commit(); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/InvokeRpcMethodTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/InvokeRpcMethodTest.java index d12bf9e44e..313b766ed3 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/InvokeRpcMethodTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/InvokeRpcMethodTest.java @@ -36,8 +36,7 @@ import javax.ws.rs.core.UriInfo; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.opendaylight.controller.sal.common.util.RpcErrors; -import org.opendaylight.controller.sal.common.util.Rpcs; + import org.opendaylight.controller.sal.core.api.mount.MountInstance; import org.opendaylight.controller.sal.restconf.impl.BrokerFacade; import org.opendaylight.controller.sal.restconf.impl.ControllerContext; @@ -50,8 +49,8 @@ import org.opendaylight.controller.sal.restconf.impl.RestconfImpl; import org.opendaylight.controller.sal.restconf.impl.StructuredData; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.ModifyAction; import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode; @@ -112,7 +111,7 @@ public class InvokeRpcMethodTest { CompositeNode payload = preparePayload(); when(mockedBrokerFacade.invokeRpc(any(QName.class), any(CompositeNode.class))).thenReturn( - Futures.> immediateFuture(Rpcs. getRpcResult(true))); + Futures.> immediateFuture(RpcResultBuilder.success().build())); StructuredData structData = restconf.invokeRpc("invoke-rpc-module:rpc-test", payload, uriInfo); assertTrue(structData == null); @@ -132,7 +131,7 @@ public class InvokeRpcMethodTest { @Test public void testInvokeRpcWithNoPayloadRpc_FailNoErrors() { - RpcResult rpcResult = Rpcs. getRpcResult(false); + RpcResult rpcResult = RpcResultBuilder.failed().build(); BrokerFacade brokerFacade = mock(BrokerFacade.class); when( @@ -177,11 +176,13 @@ public class InvokeRpcMethodTest { @Test public void testInvokeRpcWithNoPayloadRpc_FailWithRpcError() { - List rpcErrors = Arrays.asList(RpcErrors.getRpcError(null, "bogusTag", null, ErrorSeverity.ERROR, - "foo", RpcError.ErrorType.TRANSPORT, null), RpcErrors.getRpcError("app-tag", "in-use", null, - ErrorSeverity.WARNING, "bar", RpcError.ErrorType.RPC, null)); + List rpcErrors = Arrays.asList( + RpcResultBuilder.newError( RpcError.ErrorType.TRANSPORT, "bogusTag", "foo" ), + RpcResultBuilder.newWarning( RpcError.ErrorType.RPC, "in-use", "bar", + "app-tag", null, null ) ); - RpcResult rpcResult = Rpcs. getRpcResult(false, rpcErrors); + RpcResult rpcResult = RpcResultBuilder.failed() + .withRpcErrors(rpcErrors).build(); BrokerFacade brokerFacade = mock(BrokerFacade.class); when( @@ -205,7 +206,7 @@ public class InvokeRpcMethodTest { @Test public void testInvokeRpcWithNoPayload_Success() { - RpcResult rpcResult = Rpcs. getRpcResult(true); + RpcResult rpcResult = RpcResultBuilder.success().build(); BrokerFacade brokerFacade = mock(BrokerFacade.class); when( @@ -246,7 +247,7 @@ public class InvokeRpcMethodTest { @Test public void testInvokeRpcMethodWithInput() { - RpcResult rpcResult = Rpcs. getRpcResult(true); + RpcResult rpcResult = RpcResultBuilder.success().build(); CompositeNode payload = mock(CompositeNode.class); @@ -279,8 +280,8 @@ public class InvokeRpcMethodTest { @Test public void testInvokeRpcWithNoPayloadWithOutput_Success() { CompositeNode compositeNode = mock(CompositeNode.class); - RpcResult rpcResult = Rpcs. getRpcResult(true, compositeNode, - Collections. emptyList()); + RpcResult rpcResult = + RpcResultBuilder.success(compositeNode).build(); BrokerFacade brokerFacade = mock(BrokerFacade.class); when( @@ -299,7 +300,7 @@ public class InvokeRpcMethodTest { @Test public void testMountedRpcCallNoPayload_Success() throws Exception { - RpcResult rpcResult = Rpcs. getRpcResult(true); + RpcResult rpcResult = RpcResultBuilder.success().build(); ListenableFuture> mockListener = mock(ListenableFuture.class); when(mockListener.get()).thenReturn(rpcResult); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPostOperationTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPostOperationTest.java index 1442338e2c..af9dd28359 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPostOperationTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPostOperationTest.java @@ -37,7 +37,6 @@ import org.junit.BeforeClass; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; -import org.opendaylight.controller.sal.common.util.RpcErrors; import org.opendaylight.controller.sal.core.api.mount.MountInstance; import org.opendaylight.controller.sal.core.api.mount.MountService; import org.opendaylight.controller.sal.rest.api.Draft02; @@ -52,7 +51,7 @@ import org.opendaylight.controller.sal.restconf.impl.ControllerContext; import org.opendaylight.controller.sal.restconf.impl.RestconfImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.CompositeNode; @@ -125,10 +124,10 @@ public class RestPostOperationTest extends JerseyTest { assertEquals(500, post(uri, MediaType.APPLICATION_XML, xmlDataRpcInput)); List rpcErrors = new ArrayList<>(); - rpcErrors.add(RpcErrors.getRpcError("applicationTag1", "tag1", "info1", ErrorSeverity.ERROR, "message1", - ErrorType.RPC, null)); - rpcErrors.add(RpcErrors.getRpcError("applicationTag2", "tag2", "info2", ErrorSeverity.WARNING, "message2", - ErrorType.PROTOCOL, null)); + rpcErrors.add( RpcResultBuilder.newError( ErrorType.RPC, "tag1", "message1", + "applicationTag1", "info1", null ) ); + rpcErrors.add( RpcResultBuilder.newWarning( ErrorType.PROTOCOL, "tag2", "message2", + "applicationTag2", "info2", null ) ); mockInvokeRpc(null, false, rpcErrors); assertEquals(500, post(uri, MediaType.APPLICATION_XML, xmlDataRpcInput)); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestconfErrorTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestconfErrorTest.java index f0d3fb6822..18311104a4 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestconfErrorTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestconfErrorTest.java @@ -11,7 +11,6 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; -import static org.opendaylight.controller.sal.common.util.RpcErrors.getRpcError; import java.util.HashMap; import java.util.Map; @@ -23,6 +22,7 @@ import org.opendaylight.controller.sal.restconf.impl.RestconfError; import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorTag; import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; /** * Unit tests for RestconfError. @@ -144,41 +144,41 @@ public class RestconfErrorTest { public void testRestConfErrorWithRpcError() { // All fields set - RpcError rpcError = getRpcError("mock app-tag", ErrorTag.BAD_ATTRIBUTE.getTagValue(), "mock error-info", - RpcError.ErrorSeverity.ERROR, "mock error-message", RpcError.ErrorType.PROTOCOL, new Exception( - "mock cause")); + RpcError rpcError = RpcResultBuilder.newError( + RpcError.ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE.getTagValue(), "mock error-message", + "mock app-tag", "mock error-info", new Exception( "mock cause" ) ); validateRestConfError("mock error-message", ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE, "mock app-tag", "mock error-info", new RestconfError(rpcError)); // All fields set except 'info' - expect error-info set to 'cause' - rpcError = getRpcError("mock app-tag", ErrorTag.BAD_ATTRIBUTE.getTagValue(), null, - RpcError.ErrorSeverity.ERROR, "mock error-message", RpcError.ErrorType.PROTOCOL, new Exception( - "mock cause")); + rpcError = RpcResultBuilder.newError( + RpcError.ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE.getTagValue(), "mock error-message", + "mock app-tag", null, new Exception( "mock cause" ) ); validateRestConfError("mock error-message", ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE, "mock app-tag", new Contains("mock cause"), new RestconfError(rpcError)); // Some fields set - expect error-info set to ErrorSeverity - rpcError = getRpcError(null, ErrorTag.ACCESS_DENIED.getTagValue(), null, RpcError.ErrorSeverity.ERROR, null, - RpcError.ErrorType.RPC, null); + rpcError = RpcResultBuilder.newError( + RpcError.ErrorType.RPC, ErrorTag.ACCESS_DENIED.getTagValue(), null, null, null, null ); validateRestConfError(null, ErrorType.RPC, ErrorTag.ACCESS_DENIED, null, "error", new RestconfError(rpcError)); // 'tag' field not mapped to ErrorTag - expect error-tag set to // OPERATION_FAILED - rpcError = getRpcError(null, "not mapped", null, RpcError.ErrorSeverity.WARNING, null, - RpcError.ErrorType.TRANSPORT, null); + rpcError = RpcResultBuilder.newWarning( + RpcError.ErrorType.TRANSPORT, "not mapped", null, null, null, null ); validateRestConfError(null, ErrorType.TRANSPORT, ErrorTag.OPERATION_FAILED, null, "warning", new RestconfError(rpcError)); // No fields set - edge case - rpcError = getRpcError(null, null, null, null, null, null, null); + rpcError = RpcResultBuilder.newError( null, null, null, null, null, null ); - validateRestConfError(null, ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, null, (String) null, - new RestconfError(rpcError)); + validateRestConfError( null, ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, + null, "error", new RestconfError( rpcError ) ); } private void validateRestConfError(String expectedMessage, ErrorType expectedErrorType, ErrorTag expectedErrorTag, diff --git a/opendaylight/md-sal/sal-test-model/src/main/yang/opendaylight-test-routed-rpc.yang b/opendaylight/md-sal/sal-test-model/src/main/yang/opendaylight-test-routed-rpc.yang new file mode 100644 index 0000000000..c3a982473c --- /dev/null +++ b/opendaylight/md-sal/sal-test-model/src/main/yang/opendaylight-test-routed-rpc.yang @@ -0,0 +1,46 @@ +module opendaylight-test-routed-rpc { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:test:rpc:routing"; + prefix "rpc"; + import yang-ext { prefix ext; } + + description + "Test model for testing of registering rpc service on binding independent mount point + and retrieving rpc service via binding aware mount point."; + + revision "2014-07-01" { + description + "Initial revision"; + } + + identity test-context { + description "Test Context"; + } + + typedef encapsulated-route { + type instance-identifier; + } + + grouping route-in-grouping { + leaf route { + type instance-identifier; + ext:context-reference test-context; + } + } + + grouping encapsulated-route-in-grouping { + leaf route { + type encapsulated-route; + ext:context-reference test-context; + } + } + + rpc routed-simple-route { + input { + leaf route { + type instance-identifier; + ext:context-reference test-context; + } + } + } +} diff --git a/opendaylight/md-sal/samples/toaster-consumer/src/main/java/org/opendaylight/controller/sample/kitchen/impl/KitchenServiceImpl.java b/opendaylight/md-sal/samples/toaster-consumer/src/main/java/org/opendaylight/controller/sample/kitchen/impl/KitchenServiceImpl.java index 50ae8fd04f..c6aa545935 100644 --- a/opendaylight/md-sal/samples/toaster-consumer/src/main/java/org/opendaylight/controller/sample/kitchen/impl/KitchenServiceImpl.java +++ b/opendaylight/md-sal/samples/toaster-consumer/src/main/java/org/opendaylight/controller/sample/kitchen/impl/KitchenServiceImpl.java @@ -1,15 +1,12 @@ package org.opendaylight.controller.sample.kitchen.impl; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; + import org.opendaylight.controller.config.yang.config.kitchen_service.impl.KitchenServiceRuntimeMXBean; -import org.opendaylight.controller.sal.common.util.RpcErrors; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sample.kitchen.api.EggsType; import org.opendaylight.controller.sample.kitchen.api.KitchenService; import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.MakeToastInput; @@ -20,10 +17,10 @@ import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterRestocked; import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterService; import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.WheatBread; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -89,7 +86,8 @@ public class KitchenServiceImpl implements KitchenService, KitchenServiceRuntime } return Futures.immediateFuture( - Rpcs. getRpcResult( atLeastOneSucceeded, errorList.build() ) ); + RpcResultBuilder. status( atLeastOneSucceeded ) + .withRpcErrors( errorList.build() ).build() ); } } ); } @@ -102,7 +100,7 @@ public class KitchenServiceImpl implements KitchenService, KitchenServiceRuntime public RpcResult call() throws Exception { // We don't actually do anything here - just return a successful result. - return Rpcs. getRpcResult( true, Collections.emptyList() ); + return RpcResultBuilder. success().build(); } } ); } @@ -113,11 +111,9 @@ public class KitchenServiceImpl implements KitchenService, KitchenServiceRuntime if( toasterOutOfBread ) { log.info( "We're out of toast but we can make eggs" ); - return Futures.immediateFuture( Rpcs. getRpcResult( true, - Arrays.asList( RpcErrors.getRpcError( "", "partial-operation", null, - ErrorSeverity.WARNING, - "Toaster is out of bread but we can make you eggs", - ErrorType.APPLICATION, null ) ) ) ); + return Futures.immediateFuture( RpcResultBuilder. success() + .withWarning( ErrorType.APPLICATION, "partial-operation", + "Toaster is out of bread but we can make you eggs" ).build() ); } // Access the ToasterService to make the toast. diff --git a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java index d2b0f90194..de5ddd9a75 100644 --- a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java +++ b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java @@ -7,9 +7,6 @@ */ package org.opendaylight.controller.sample.toaster.provider; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -28,8 +25,6 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; -import org.opendaylight.controller.sal.common.util.RpcErrors; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.DisplayString; import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.MakeToastInput; import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.RestockToasterInput; @@ -43,7 +38,7 @@ import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120 import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; @@ -163,8 +158,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti } // Always return success from the cancel toast call. - return Futures.immediateFuture( Rpcs. getRpcResult( true, - Collections.emptyList() ) ); + return Futures.immediateFuture( RpcResultBuilder. success().build() ); } /** @@ -181,17 +175,14 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti return futureResult; } - private List makeToasterOutOfBreadError() { - return Arrays.asList( - RpcErrors.getRpcError( "out-of-stock", "resource-denied", null, null, - "Toaster is out of bread", - ErrorType.APPLICATION, null ) ); + private RpcError makeToasterOutOfBreadError() { + return RpcResultBuilder.newError( ErrorType.APPLICATION, "resource-denied", + "Toaster is out of bread", "out-of-stock", null, null ); } - private List makeToasterInUseError() { - return Arrays.asList( - RpcErrors.getRpcError( "", "in-use", null, ErrorSeverity.WARNING, - "Toaster is busy", ErrorType.APPLICATION, null ) ); + private RpcError makeToasterInUseError() { + return RpcResultBuilder.newWarning( ErrorType.APPLICATION, "in-use", + "Toaster is busy", null, null, null ); } private void checkStatusAndMakeToast( final MakeToastInput input, @@ -225,8 +216,8 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti if( outOfBread() ) { LOG.debug( "Toaster is out of bread" ); - return Futures.immediateFuture( Rpcs.getRpcResult( - false, null, makeToasterOutOfBreadError() ) ); + return Futures.immediateFuture( RpcResultBuilder.failed() + .withRpcError( makeToasterOutOfBreadError() ).build() ); } LOG.debug( "Setting Toaster status to Down" ); @@ -244,8 +235,8 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti // Return an error since we are already making toast. This will get // propagated to the commitFuture below which will interpret the null // TransactionStatus in the RpcResult as an error condition. - return Futures.immediateFuture( Rpcs.getRpcResult( - false, null, makeToasterInUseError() ) ); + return Futures.immediateFuture( RpcResultBuilder.failed() + .withRpcError( makeToasterInUseError() ).build() ); } } ); @@ -265,7 +256,8 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti // the read above returned ToasterStatus.Down. Either way, fail the // futureResult and copy the errors. - futureResult.set( Rpcs.getRpcResult( false, null, result.getErrors() ) ); + futureResult.set( RpcResultBuilder.failed().withRpcErrors( + result.getErrors() ).build() ); } } @@ -286,10 +278,8 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti LOG.error( "Failed to commit Toaster status", ex ); // Got some unexpected error so fail. - futureResult.set( Rpcs. getRpcResult( false, null, Arrays.asList( - RpcErrors.getRpcError( null, null, null, ErrorSeverity.ERROR, - ex.getMessage(), - ErrorType.APPLICATION, ex ) ) ) ); + futureResult.set( RpcResultBuilder. failed() + .withError( ErrorType.APPLICATION, ex.getMessage() ).build() ); } } } ); @@ -312,7 +302,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti notificationProvider.publish( reStockedNotification ); } - return Futures.immediateFuture(Rpcs. getRpcResult(true, Collections.emptyList())); + return Futures.immediateFuture( RpcResultBuilder. success().build() ); } /** @@ -416,8 +406,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti LOG.debug("Toast done"); - futureResult.set( Rpcs.getRpcResult( true, null, - Collections.emptyList() ) ); + futureResult.set( RpcResultBuilder.success().build() ); return null; } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java index af61db1a80..b1db280c24 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java @@ -95,6 +95,8 @@ final class FlowComparator { if (statsFlow == storedFlow) { return true; } + if (storedFlow == null && statsFlow != null) return false; + if (statsFlow == null && storedFlow != null) return false; if (storedFlow.getClass() != statsFlow.getClass()) { return false; } diff --git a/pom.xml b/pom.xml index af84002429..242ab8eb89 100644 --- a/pom.xml +++ b/pom.xml @@ -133,6 +133,7 @@ opendaylight/dummy-console opendaylight/karaf-branding opendaylight/distribution/opendaylight-karaf + features scm:git:ssh://git.opendaylight.org:29418/controller.git