From: Ed Warnicke Date: Thu, 26 Jun 2014 12:16:48 +0000 (+0000) Subject: Merge "Bug-835:Reserve ports should be logical ports" X-Git-Tag: release/helium~598 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=80aa861b74f7b0b3574f0962cdb45740ff71946c;hp=8ed8fa9905f7187797c771bef12c14596a3e2da7 Merge "Bug-835:Reserve ports should be logical ports" --- diff --git a/features/base/pom.xml b/features/base/pom.xml index 922b2d6bdf..d925f51b94 100644 --- a/features/base/pom.xml +++ b/features/base/pom.xml @@ -22,6 +22,24 @@ + + org.apache.karaf.tooling + karaf-maven-plugin + ${karaf.version} + true + + + features-create-kar + + features-create-kar + + + ${project.build.directory}/classes/${features.file} + + + + + org.apache.maven.plugins maven-resources-plugin diff --git a/features/base/src/main/resources/features.xml b/features/base/src/main/resources/features.xml index 5677ab66d0..60286175c1 100644 --- a/features/base/src/main/resources/features.xml +++ b/features/base/src/main/resources/features.xml @@ -73,7 +73,7 @@ mvn:org.javassist/javassist/${javassist.version} mvn:commons-io/commons-io/${commons.io.version} mvn:commons-codec/commons-codec/${commons.codec.version} - mvn:org.apache.commons/commons-lang3/${commons.lang.version} + mvn:org.apache.commons/commons-lang3/${commons.lang3.version} mvn:commons-net/commons-net/${commons.net.version} @@ -121,6 +121,7 @@ mvn:orbit/org.apache.juli.extras/7.0.32.v201211081135 mvn:orbit/org.apache.tomcat.api/7.0.32.v201211081135 mvn:orbit/org.apache.tomcat.util/7.0.32.v201211201952 + wrap:mvn:virgomirror/org.eclipse.jdt.core.compiler.batch/3.8.0.I20120518-2145 mvn:org.ow2.asm/asm-all/${asm.version} diff --git a/opendaylight/commons/opendaylight/pom.xml b/opendaylight/commons/opendaylight/pom.xml index 3f1fa38ebd..c83bf751ee 100644 --- a/opendaylight/commons/opendaylight/pom.xml +++ b/opendaylight/commons/opendaylight/pom.xml @@ -2,11 +2,13 @@ 4.0.0 - org.opendaylight.controller - commons.parent - 1.0.2-SNAPSHOT - ../parent + org.opendaylight.odlparent + odlparent + 1.4.2-SNAPSHOT + + + org.opendaylight.controller commons.opendaylight 1.4.2-SNAPSHOT pom @@ -15,6 +17,7 @@ + 2.3.2 1.0.0 0.4.2-SNAPSHOT @@ -22,7 +25,6 @@ 1.1.0 0.5.2-SNAPSHOT - 0.5.2-SNAPSHOT 4.1 1.50 @@ -30,7 +32,7 @@ 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT - 2.10 + 2.12 0.5.1-SNAPSHOT 0.4.3-SNAPSHOT 0.4.2-SNAPSHOT @@ -49,7 +51,7 @@ 2.4 7.0.32.v201211201952 7.0.32.v201211081135 - 3.1 + 3.1 0.0.2-SNAPSHOT 3.0.1 0.1.2-SNAPSHOT @@ -59,6 +61,7 @@ 7.0.32.v201211081135 7.0.32.v201211201952 2.3.2 + 0.1.2-SNAPSHOT 0.5.2-SNAPSHOT 0.2.5-SNAPSHOT 0.4.3-SNAPSHOT @@ -69,8 +72,6 @@ 0.5.2-SNAPSHOT 0.5.2-SNAPSHOT 0.0.2-SNAPSHOT - 7.0.42 - 0.2.0 0.4.2-SNAPSHOT 1.1.0-SNAPSHOT 2.5.0 @@ -80,23 +81,16 @@ 3.0.0 + 0000.0002.0038.0 - 2.15 - 1.0.1 - 3.0.1 - 3.1.0 - 3.1.6 - 4.2.0 1.4.2-SNAPSHOT + 2.4.0 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.5.2-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.6.0-SNAPSHOT - 2.2.0.RELEASE - 2.2.4 - 14.0.1 0.5.2-SNAPSHOT 0.5.2-SNAPSHOT 0.4.2-SNAPSHOT @@ -107,19 +101,7 @@ 2013.10.19.1-SNAPSHOT 2013.10.21.2-SNAPSHOT 2010.09.24.4-SNAPSHOT - 2.3.2 - 0.6.2.201302030002 - 2.4 - 1.7 - 1.7 - 3.17.1-GA - 1.2 - - 1.17 - 1.17 - 4.0 - 2.8 - 1.3.3 + 2.0-beta-2 src/main/yang-gen-config 0.0.2-SNAPSHOT 1.1.4 @@ -130,16 +112,12 @@ 1.0.0-SNAPSHOT 3.0.0 3.0.1 + 1.0.0 1.0.9 0.4.2-SNAPSHOT - 2.5.1 - - 1.7 - 1.7 + 3.0.5 1.1-SNAPSHOT - 1.9.5 0.2.5-SNAPSHOT - 4.0.19.Final 0.0.3-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT @@ -150,18 +128,11 @@ 1.4.2-SNAPSHOT 1.4.2-SNAPSHOT 2013.08.27.4-SNAPSHOT - 20080701 0.0.2-SNAPSHOT - 5.0.0 - 5.0.0 - UTF-8 - UTF-8 - 2.6 1.0-alpha-2 0.5.0-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT - 2.3.2 0.4.2-SNAPSHOT 0.1.2-SNAPSHOT 0.4.2-SNAPSHOT @@ -175,19 +146,12 @@ 2.11 0.4.2-SNAPSHOT dav:http://nexus.opendaylight.org/content/sites/site - 3.2 - 1.7.2 ${user.name}-private-view https://sonar.opendaylight.org/ jacoco java org.openflow.openflowj,net.sf.jung2 - 1.0.0 - 1.2.1 - 3.1.4.RELEASE - 3.1.3.RELEASE - 3.1.3.RELEASE 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.5.1-SNAPSHOT @@ -201,14 +165,11 @@ 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT - 1.5.0 0.4.2-SNAPSHOT 0.0.2-SNAPSHOT 0.4.2-SNAPSHOT - 3.6.0.RELEASE 0.4.2-SNAPSHOT src/main/xtend-gen - 2.4.3 2013.09.07.4-SNAPSHOT 1.0.0-SNAPSHOT 0.6.2-SNAPSHOT @@ -216,7 +177,7 @@ - + ${project.groupId} ietf-netconf-monitoring @@ -298,6 +259,12 @@ guava ${guava.version} + + + com.jcabi + jcabi-maven-slf4j + 0.8 + com.sun.jersey @@ -340,6 +307,11 @@ akka-remote_${scala.version} ${akka.version} + + com.typesafe.akka + akka-testkit_${scala.version} + ${akka.version} + commons-codec commons-codec @@ -355,6 +327,11 @@ commons-io ${commons.io.version} + + commons-lang + commons-lang + ${commons.lang.version} + commons-net commons-net @@ -517,6 +494,11 @@ jsr311-api ${jsr311.api.version} + + net.sourceforge.pmd + pmd + 5.1.0 + orbit javax.activation @@ -610,7 +592,7 @@ org.apache.commons commons-lang3 - ${commons.lang.version} + ${commons.lang3.version} org.apache.felix @@ -650,11 +632,26 @@ enunciate-core-annotations ${enunciate.version} + + org.codehaus.gmaven.runtime + gmaven-runtime-2.0 + 1.5 + org.codehaus.jettison jettison ${jettison.version} + + org.eclipse + jdt + 3.3.0-v20070607-1300 + + + org.eclipse.equinox + app + 1.0.0-v20070606 + @@ -662,6 +659,11 @@ servlet 1.0.0-v20070606 + + org.eclipse.jdt + core + 3.3.0-v_771 + org.eclipse.persistence org.eclipse.persistence.antlr @@ -684,11 +686,21 @@ org.eclipse.xtend.lib ${xtend.version} + + org.glassfish.jersey.test-framework.providers + jersey-test-framework-provider-grizzly2 + 2.4 + org.javassist javassist ${javassist.version} + + org.jboss.resteasy + jaxrs-api + 3.0.4.Final + org.jboss.spec.javax.transaction jboss-transaction-api_1.1_spec @@ -889,6 +901,11 @@ filter-valve ${filtervalve.version} + + org.opendaylight.controller + flow-management-compatibility + ${mdsal.version} + org.opendaylight.controller flowprogrammer.northbound @@ -979,6 +996,12 @@ netconf-client ${netconf.version} + + org.opendaylight.controller + netconf-client + ${netconf.version} + test-jar + @@ -1103,6 +1126,11 @@ protocol_plugins.stub ${protocol_plugins.stub.version} + + org.opendaylight.controller + remoterpc-routingtable.implementation + ${mdsal.version} + org.opendaylight.controller routing.dijkstra_implementation @@ -1430,6 +1458,37 @@ model-inventory ${mdsal.version} + + org.opendaylight.controller.model + model-topology + ${mdsal.version} + + + org.opendaylight.controller.samples + sample-toaster + ${mdsal.version} + + + org.opendaylight.controller.samples + sample-toaster-consumer + ${mdsal.version} + + + + org.opendaylight.controller.samples + sample-toaster-provider + ${mdsal.version} + + + org.opendaylight.controller.tests + sal-remoterpc-connector-test-consumer + ${mdsal.version} + + + org.opendaylight.controller.tests + sal-remoterpc-connector-test-provider + ${mdsal.version} + org.opendaylight.controller.thirdparty com.sun.jersey.jersey-servlet @@ -1599,6 +1658,16 @@ yang-ext ${yang-ext.version} + + org.opendaylight.yangtools.thirdparty + antlr4-runtime-osgi-nohead + 4.0 + + + org.opendaylight.yangtools.thirdparty + xtend-lib-osgi + ${xtend.version} + org.openexi nagasena @@ -1619,17 +1688,10 @@ org.osgi.core ${osgi.core.version} - - - org.ow2.asm - asm-all - 4.1 - - - org.ow2.chameleon.management - chameleon-mbeans - 1.0.0 + org.reflections + reflections + 0.9.9-RC1 org.scala-lang @@ -1653,81 +1715,9 @@ compile - org.springframework - org.springframework.aop - ${spring.version} - - - org.springframework - org.springframework.asm - ${spring.version} - - - org.springframework - org.springframework.beans - ${spring.version} - - - org.springframework - org.springframework.context - ${spring.version} - - - org.springframework - org.springframework.context.support - ${spring.version} - - - org.springframework - org.springframework.core - ${spring.version} - - - org.springframework - org.springframework.expression - ${spring.version} - - - org.springframework - org.springframework.transaction - ${spring-security.version} - - - org.springframework - org.springframework.web - ${spring.version} - - - org.springframework - org.springframework.web.servlet - ${spring.version} - - - - - org.springframework.security - spring-security-config - ${spring-security.version} - - - org.springframework.security - spring-security-core - ${spring-security.version} - - - org.springframework.security - spring-security-taglibs - ${spring-security.version} - - - org.springframework.security - spring-security-web - ${spring-security.version} - - - virgomirror - org.eclipse.jdt.core.compiler.batch - 3.8.0.I20120518-2145 + org.slf4j + slf4j-simple + ${slf4j.version} junit @@ -1735,12 +1725,6 @@ ${junit.version} test - - org.mockito - mockito-all - ${mockito.version} - test - org.opendaylight.controller commons.logback_settings @@ -1766,44 +1750,6 @@ ${yangtools.version} test - - - org.ops4j.pax.exam - pax-exam-container-native - ${exam.version} - test - - - org.ops4j.pax.exam - pax-exam-junit4 - ${exam.version} - test - - - org.ops4j.pax.exam - pax-exam-link-mvn - ${exam.version} - test - - - org.ops4j.pax.url - pax-url-aether - ${url.version} - test - - - - org.springframework.osgi - spring-osgi-mock - ${spring-osgi.version} - test - - - xmlunit - xmlunit - 1.5 - test - @@ -1950,7 +1896,7 @@ org.eclipse.m2e lifecycle-mapping - 1.0.0 + ${lifecycle.mapping.version} @@ -2062,6 +2008,21 @@ + + + org.codehaus.mojo + javacc-maven-plugin + [0.0,) + + javacc + + + + + false + + + @@ -2294,7 +2255,7 @@ opendaylight-mirror opendaylight-mirror - ${nexusproxy}/groups/public/ + http://nexus.opendaylight.org/content/groups/public/ @@ -2306,7 +2267,7 @@ opendaylight-snapshot opendaylight-snapshot - ${nexusproxy}/repositories/${nexus.repository.snapshot}/ + http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ @@ -2322,7 +2283,7 @@ opendaylight-mirror opendaylight-mirror - ${nexusproxy}/groups/public/ + http://nexus.opendaylight.org/content/groups/public/ @@ -2334,19 +2295,19 @@ opendaylight-snapshot opendaylight-snapshot - ${nexusproxy}/repositories/${nexus.repository.snapshot}/ + http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ opendaylight-release - ${nexusproxy}/repositories/${nexus.repository.release}/ + http://nexus.opendaylight.org/content/repositories/opendaylight.release/ opendaylight-snapshot - ${nexusproxy}/repositories/${nexus.repository.snapshot}/ + http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ diff --git a/opendaylight/config/config-manager/pom.xml b/opendaylight/config/config-manager/pom.xml index 79fd5268e6..fc2c0fd85b 100644 --- a/opendaylight/config/config-manager/pom.xml +++ b/opendaylight/config/config-manager/pom.xml @@ -25,13 +25,7 @@ com.google.guava guava - + commons-io commons-io diff --git a/opendaylight/config/netconf-config-dispatcher/pom.xml b/opendaylight/config/netconf-config-dispatcher/pom.xml index 65ebdaf938..b9d218ead1 100644 --- a/opendaylight/config/netconf-config-dispatcher/pom.xml +++ b/opendaylight/config/netconf-config-dispatcher/pom.xml @@ -26,7 +26,6 @@ ${project.groupId} netconf-client - ${netconf.version} diff --git a/opendaylight/config/pom.xml b/opendaylight/config/pom.xml index 5f34a9aa82..76fbd7f6e5 100644 --- a/opendaylight/config/pom.xml +++ b/opendaylight/config/pom.xml @@ -81,12 +81,11 @@ org.apache.maven.plugins maven-antrun-plugin - 1.3 + ${maven.antrun.plugin.version} org.apache.maven.plugins maven-jar-plugin - 2.4 @@ -99,7 +98,6 @@ org.apache.maven.plugins maven-surefire-plugin - 2.14.1 true classes @@ -112,7 +110,7 @@ org.codehaus.groovy.maven gmaven-plugin - 1.0 + ${gmaven.plugin.version} org.opendaylight.yangtools @@ -155,7 +153,6 @@ org.apache.maven.plugins maven-checkstyle-plugin - 2.12 false false diff --git a/opendaylight/config/threadpool-config-impl/pom.xml b/opendaylight/config/threadpool-config-impl/pom.xml index 4bc080bbff..4fd0d681a1 100644 --- a/opendaylight/config/threadpool-config-impl/pom.xml +++ b/opendaylight/config/threadpool-config-impl/pom.xml @@ -23,7 +23,6 @@ ${project.groupId} threadpool-config-api - ${project.version} com.google.guava diff --git a/opendaylight/config/yang-jmx-generator-plugin/pom.xml b/opendaylight/config/yang-jmx-generator-plugin/pom.xml index b8831f6979..5f51980b94 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/pom.xml +++ b/opendaylight/config/yang-jmx-generator-plugin/pom.xml @@ -24,7 +24,6 @@ com.jcabi jcabi-maven-slf4j - 0.8 @@ -40,7 +39,6 @@ org.codehaus.gmaven.runtime gmaven-runtime-2.0 - 1.5 org.sonatype.gossip @@ -77,14 +75,12 @@ net.sourceforge.pmd pmd - 5.1.0 test org.eclipse jdt - 3.3.0-v20070607-1300 test @@ -98,14 +94,12 @@ org.eclipse.equinox app - 1.0.0-v20070606 test org.eclipse.jdt core - 3.3.0-v_771 test diff --git a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java index 5b0196cdda..fac4d57432 100644 --- a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java +++ b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java @@ -185,7 +185,9 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute { OpenType innerCompositeType; if(isDerivedType(innerTypeBaseType, innerType)) { - innerCompositeType = getCompositeType(innerTypeBaseType, baseInnerTypeDefinition); + innerCompositeType = baseInnerTypeDefinition instanceof UnionTypeDefinition ? + getCompositeTypeForUnion(baseInnerTypeDefinition) : + getCompositeType(innerTypeBaseType, baseInnerTypeDefinition); } else { innerCompositeType = SimpleTypeResolver.getSimpleType(innerType); } diff --git a/opendaylight/config/yang-test-plugin/pom.xml b/opendaylight/config/yang-test-plugin/pom.xml index 173227f0bc..c7fb73f385 100644 --- a/opendaylight/config/yang-test-plugin/pom.xml +++ b/opendaylight/config/yang-test-plugin/pom.xml @@ -24,7 +24,7 @@ org.apache.maven maven-plugin-api - 3.0.5 + ${maven.plugin.api.version} diff --git a/opendaylight/config/yang-test/pom.xml b/opendaylight/config/yang-test/pom.xml index 8c8065dd67..247b3c0745 100644 --- a/opendaylight/config/yang-test/pom.xml +++ b/opendaylight/config/yang-test/pom.xml @@ -64,7 +64,7 @@ org.eclipse.m2e lifecycle-mapping - 1.0.0 + ${lifecycle.mapping.version} diff --git a/opendaylight/distribution/opendaylight-karaf/pom.xml b/opendaylight/distribution/opendaylight-karaf/pom.xml index 6a6a12d1de..8a23a6b5e6 100644 --- a/opendaylight/distribution/opendaylight-karaf/pom.xml +++ b/opendaylight/distribution/opendaylight-karaf/pom.xml @@ -38,13 +38,11 @@ xml runtime - org.opendaylight.controller base-features ${project.version} - pom + kar runtime @@ -82,7 +80,7 @@ org.opendaylight.yangtools - features-file + features-yangtools ${yangtools.version} features xml diff --git a/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/custom.properties b/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/custom.properties index 502e1a261c..6c1ca421c2 100644 --- a/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/custom.properties +++ b/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/custom.properties @@ -1,11 +1,17 @@ # Extra packages to import from the boot class loader org.osgi.framework.system.packages.extra=org.apache.karaf.branding,sun.reflect,sun.reflect.misc,sun.misc,sun.nio.ch +# https://bugs.eclipse.org/bugs/show_bug.cgi?id=325578 +# Extend the framework to avoid the resources to be presented with +# a URL of type bundleresource: but to be presented as file: +osgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator # Embedded Tomcat configuration File org.eclipse.gemini.web.tomcat.config.path=configuration/tomcat-server.xml org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true +# Use Equinox as default OSGi Framework Implementation +karaf.framework=equinox # Netconf startup configuration netconf.tcp.address=127.0.0.1 diff --git a/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/startup.properties b/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/startup.properties index 288fe629f8..ca8c83c380 100644 --- a/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/startup.properties +++ b/opendaylight/distribution/opendaylight-karaf/src/main/resources/etc/startup.properties @@ -7,7 +7,7 @@ mvn\:org.ops4j.pax.swissbox/pax-swissbox-bnd/1.7.0 = 5 mvn\:org.ops4j.pax.url/pax-url-maven-commons/1.6.0 = 5 mvn\:org.ops4j.pax.url/pax-url-aether/1.6.0 = 5 mvn\:org.ops4j.pax.url/pax-url-wrap/1.6.0 = 5 -#mvn\:javax.annotation/javax.annotation-api/1.2 = 5 +mvn\:javax.annotation/javax.annotation-api/1.2 = 5 mvn\:org.ops4j.pax.logging/pax-logging-api/1.7.2 = 8 mvn\:org.ops4j.pax.logging/pax-logging-service/1.7.2 = 8 mvn\:org.apache.karaf.service/org.apache.karaf.service.guard/3.0.1 = 10 diff --git a/opendaylight/distribution/opendaylight/pom.xml b/opendaylight/distribution/opendaylight/pom.xml index 3916e05496..149154334d 100644 --- a/opendaylight/distribution/opendaylight/pom.xml +++ b/opendaylight/distribution/opendaylight/pom.xml @@ -994,6 +994,11 @@ org.opendaylight.controller sal-core-spi + + org.opendaylight.controller + sal-inmemory-datastore + 1.1-SNAPSHOT + org.opendaylight.controller sal-netconf-connector @@ -1320,5 +1325,18 @@ + + docs + + false + + + + org.opendaylight.controller + swagger-ui + 0.0.1-SNAPSHOT + + + diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/01-md-sal.xml b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/01-md-sal.xml index d872bfd47b..7b1df98247 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/01-md-sal.xml +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/01-md-sal.xml @@ -15,6 +15,7 @@ prefix:schema-service-singleton yang-schema-service + prefix:runtime-generated-mapping runtime-mapping-singleton @@ -36,6 +37,25 @@ + + + prefix:inmemory-config-datastore-provider + config-store-service + + dom:schema-service + yang-schema-service + + + + + prefix:inmemory-operational-datastore-provider + operational-store-service + + dom:schema-service + yang-schema-service + + + sal-rest-docgen - - feature + + sal-inmemory-datastore + + + sal-protocolbuffer-encoding + + + feature @@ -88,7 +94,7 @@ org.eclipse.m2e lifecycle-mapping - 1.0.0 + ${lifecycle.mapping.version} @@ -163,7 +169,7 @@ org.codehaus.mojo findbugs-maven-plugin - 2.4.0 + ${findbugs.maven.plugin.version} Max Low @@ -173,7 +179,7 @@ org.codehaus.mojo jdepend-maven-plugin - 2.0-beta-2 + ${jdepend.maven.plugin.version} diff --git a/opendaylight/md-sal/remoterpc-routingtable/integrationtest/pom.xml b/opendaylight/md-sal/remoterpc-routingtable/integrationtest/pom.xml index 6db143ab3e..ce11be1e77 100644 --- a/opendaylight/md-sal/remoterpc-routingtable/integrationtest/pom.xml +++ b/opendaylight/md-sal/remoterpc-routingtable/integrationtest/pom.xml @@ -21,37 +21,30 @@ org.opendaylight.controller remoterpc-routingtable.implementation - 0.4.1-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT org.opendaylight.controller sal.implementation - 0.4.0-SNAPSHOT org.opendaylight.controller containermanager - 0.5.0-SNAPSHOT org.opendaylight.controller containermanager.it.implementation - 0.5.0-SNAPSHOT org.opendaylight.controller clustering.stub - 0.4.0-SNAPSHOT junit @@ -62,11 +55,6 @@ pax-exam-container-native test - - org.ops4j.pax.exam - pax-exam-junit4 - test - org.ops4j.pax.exam pax-exam-link-mvn @@ -104,7 +92,6 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT org.opendaylight.yangtools @@ -117,12 +104,10 @@ org.opendaylight.controller sal-connector-api - 1.0-SNAPSHOT org.opendaylight.controller sal-common-util - 1.0-SNAPSHOT @@ -132,22 +117,10 @@ org.opendaylight.controller sal-common-api - 1.0-SNAPSHOT - - - org.opendaylight.controller - sal-common-util - 1.0-SNAPSHOT - - - org.opendaylight.controller - sal-binding-broker-impl - 1.0-SNAPSHOT org.opendaylight.controller sal-binding-broker-impl - 1.0-SNAPSHOT org.ops4j.pax.exam @@ -171,44 +144,36 @@ org.opendaylight.controller config-manager - 0.2.3-SNAPSHOT equinoxSDK381 org.eclipse.osgi - 3.8.1.v20120830-144521 test org.slf4j log4j-over-slf4j - 1.7.2 ch.qos.logback logback-core - 1.0.9 ch.qos.logback logback-classic - 1.0.9 org.opendaylight.yangtools.thirdparty antlr4-runtime-osgi-nohead - 4.0 org.opendaylight.yangtools.thirdparty xtend-lib-osgi - 2.4.3 org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT junit @@ -219,22 +184,16 @@ equinoxSDK381 org.eclipse.osgi - 3.8.1.v20120830-144521 org.ops4j.pax.exam pax-exam-junit4 - 3.0.0 - - - org.ops4j.pax.exam - pax-exam-junit4 - 3.0.0 + ${exam.version} org.ops4j.pax.exam pax-exam - 3.0.0 + ${exam.version} diff --git a/opendaylight/md-sal/remoterpc-routingtable/integrationtest/test-nb/pom.xml b/opendaylight/md-sal/remoterpc-routingtable/integrationtest/test-nb/pom.xml index 1fd4b762c1..d74e7130a4 100644 --- a/opendaylight/md-sal/remoterpc-routingtable/integrationtest/test-nb/pom.xml +++ b/opendaylight/md-sal/remoterpc-routingtable/integrationtest/test-nb/pom.xml @@ -5,7 +5,7 @@ sal-remoterpc-connector-test-parent org.opendaylight.controller.tests - 1.0-SNAPSHOT + 1.1-SNAPSHOT remoterpc-routingtable-nb-it @@ -56,23 +56,19 @@ org.opendaylight.controller containermanager - 0.5.1-SNAPSHOT org.opendaylight.controller commons.northbound - 0.4.1-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT org.osgi org.osgi.core - 5.0.0 junit @@ -81,7 +77,6 @@ org.opendaylight.controller remoterpc-routingtable.implementation - 0.4.1-SNAPSHOT com.google.guava diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java index c6a9efe21c..7eee5c8b62 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java @@ -13,7 +13,7 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -public interface BindingDataBroker extends AsyncDataBroker, DataObject, BindingDataChangeListener>{ +public interface BindingDataBroker extends AsyncDataBroker, DataObject, BindingDataChangeListener>, BindingService { @Override BindingDataReadTransaction newReadOnlyTransaction(); diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingService.java new file mode 100644 index 0000000000..ccce73c7d7 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingService.java @@ -0,0 +1,30 @@ +/* + * 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.binding.api; + +import org.opendaylight.controller.sal.binding.api.BindingAwareService; + +/** + * + * Marker interface for MD-SAL services which are available for users of MD-SAL. + * + * BindingService is marker interface for infrastructure services provided by + * the SAL. These services may be session-specific, and wrapped by custom + * delegator patterns in order to introduce additional semantics / checks + * to the system. + * + * This interface extends {@link BindingAwareService}, order to be make + * new services available via + * {@link org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext} + * and via + * {@link org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext} + * + */ +public interface BindingService extends BindingAwareService { + +} diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java index 6e8bda56d8..46e372aea6 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationService.java @@ -7,7 +7,7 @@ */ package org.opendaylight.controller.sal.binding.api; -import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.Notification; public interface NotificationService extends BindingAwareService { @@ -16,9 +16,9 @@ public interface NotificationService extends BindingAwareService { * * @param notificationType * @param listener - * @return Registration for listener. To unregister listener invoke {@link Registration#close()} method. + * @return Registration for listener. To unregister listener invoke {@link ListenerRegistration#close()} method. */ - Registration> registerNotificationListener( + ListenerRegistration> registerNotificationListener( Class notificationType, NotificationListener listener); /** @@ -27,8 +27,8 @@ public interface NotificationService extends BindingAwareService { * Listener is registered for all notifications present in implemented interfaces. * * @param listener - * @return Registration for listener. To unregister listener invoke {@link Registration#close()} method. + * @return Registration for listener. To unregister listener invoke {@link ListenerRegistration#close()} method. */ - Registration registerNotificationListener( + ListenerRegistration registerNotificationListener( org.opendaylight.yangtools.yang.binding.NotificationListener listener); } diff --git a/opendaylight/md-sal/sal-binding-broker/pom.xml b/opendaylight/md-sal/sal-binding-broker/pom.xml index 2470ba5133..35b186db6a 100644 --- a/opendaylight/md-sal/sal-binding-broker/pom.xml +++ b/opendaylight/md-sal/sal-binding-broker/pom.xml @@ -82,7 +82,6 @@ org.reflections reflections - 0.9.9-RC1 compile @@ -142,7 +141,7 @@ org.opendaylight.controller.md.sal.binding.impl, org.opendaylight.controller.sal.binding.osgi.*, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.binding.impl.rev131028 + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.binding.impl.rev131028.* diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingAsyncDataBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingAsyncDataBrokerImplModule.java new file mode 100644 index 0000000000..17cd67a857 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingAsyncDataBrokerImplModule.java @@ -0,0 +1,75 @@ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import java.util.Collection; +import java.util.Collections; + +import org.opendaylight.controller.md.sal.binding.impl.ForwardedBindingDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.sal.core.api.Broker; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; +import org.opendaylight.controller.sal.core.api.Provider; +import org.opendaylight.controller.sal.core.api.model.SchemaService; +import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService; +import org.osgi.framework.BundleContext; + +public class BindingAsyncDataBrokerImplModule extends + org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingAsyncDataBrokerImplModule implements + Provider { + private BundleContext bundleContext; + + public BindingAsyncDataBrokerImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public BindingAsyncDataBrokerImplModule( + final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + final org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingAsyncDataBrokerImplModule oldModule, + final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + Broker domBroker = getDomAsyncBrokerDependency(); + BindingIndependentMappingService mappingService = getBindingMappingServiceDependency(); + + // FIXME: Switch this to DOM Broker registration which would not require + // BundleContext when API are updated. + ProviderSession session = domBroker.registerProvider(this, getBundleContext()); + DOMDataBroker domDataBroker = session.getService(DOMDataBroker.class); + SchemaService schemaService = session.getService(SchemaService.class); + return new ForwardedBindingDataBroker(domDataBroker, mappingService, schemaService); + } + + // FIXME: Remove this when DOM Broker registration would not require + // BundleContext + @Deprecated + private BundleContext getBundleContext() { + return bundleContext; + } + + // FIXME: Remove this when DOM Broker registration would not require + // BundleContext + @Deprecated + void setBundleContext(final BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + @Override + public Collection getProviderFunctionality() { + return Collections.emptySet(); + } + + @Override + public void onSessionInitiated(final ProviderSession arg0) { + // intentional NOOP + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingAsyncDataBrokerImplModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingAsyncDataBrokerImplModuleFactory.java new file mode 100644 index 0000000000..763e6ad3ca --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingAsyncDataBrokerImplModuleFactory.java @@ -0,0 +1,37 @@ +/* +* Generated file +* +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-forwarded-data-broker +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Fri May 16 17:18:18 CEST 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import org.opendaylight.controller.config.api.DependencyResolver; +import org.osgi.framework.BundleContext; + +public class BindingAsyncDataBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingAsyncDataBrokerImplModuleFactory { + + + + + @Override + public BindingAsyncDataBrokerImplModule instantiateModule(final String instanceName, + final DependencyResolver dependencyResolver, final BindingAsyncDataBrokerImplModule oldModule, + final AutoCloseable oldInstance, final BundleContext bundleContext) { + BindingAsyncDataBrokerImplModule module = super.instantiateModule(instanceName, dependencyResolver, oldModule, oldInstance, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + + @Override + public BindingAsyncDataBrokerImplModule instantiateModule(final String instanceName, + final DependencyResolver dependencyResolver, final BundleContext bundleContext) { + // TODO Auto-generated method stub + BindingAsyncDataBrokerImplModule module = super.instantiateModule(instanceName, dependencyResolver, bundleContext); + module.setBundleContext(bundleContext); + return module; + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java index 44a508c0a0..188272fb60 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java @@ -31,14 +31,14 @@ public final class BindingBrokerImplModule extends private BundleContext bundleContext; - public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, - org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + public BindingBrokerImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, - org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - BindingBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + public BindingBrokerImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + final BindingBrokerImplModule oldModule, final java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @@ -63,23 +63,24 @@ public final class BindingBrokerImplModule extends private RootBindingAwareBroker createStandaloneBroker() { RootBindingAwareBroker broker = new RootBindingAwareBroker(getIdentifier().getInstanceName()); - broker.setDataBroker(getDataBrokerDependency()); + broker.setLegacyDataBroker(getDataBrokerDependency()); broker.setNotificationBroker(getNotificationServiceDependency()); broker.setRpcBroker(new RpcProviderRegistryImpl(broker.getIdentifier())); + // FIXME: Also set Async Data Broker return broker; } private RootBindingAwareBroker createForwardedBroker() { DomForwardedBindingBrokerImpl broker = new DomForwardedBindingBrokerImpl(getIdentifier().getInstanceName()); - broker.setDataBroker(getDataBrokerDependency()); + broker.setLegacyDataBroker(getDataBrokerDependency()); broker.setNotificationBroker(getNotificationServiceDependency()); broker.setRpcBroker(new RpcProviderRegistryImpl(broker.getIdentifier())); broker.getMountManager().setDataCommitExecutor(SingletonHolder.getDefaultCommitExecutor()); broker.getMountManager().setNotificationExecutor(SingletonHolder.getDefaultNotificationExecutor()); - + // FIXME: Also set Async Data Broker DomForwardingUtils.reuseForwardingFrom(broker, broker.getDataBroker()); broker.startForwarding(); return broker; @@ -89,7 +90,7 @@ public final class BindingBrokerImplModule extends return bundleContext; } - public void setBundleContext(BundleContext bundleContext) { + public void setBundleContext(final BundleContext bundleContext) { this.bundleContext = bundleContext; } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java index 647ca85671..7467e544fd 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java @@ -59,10 +59,9 @@ public final class ForwardedCompatibleDataBrokerImplModule extends Broker domBroker = getDomAsyncBrokerDependency(); ProviderSession session = domBroker.registerProvider(this, getBundleContext()); DOMDataBroker domDataBroker = session.getService(DOMDataBroker.class); + SchemaService schemaService = session.getService(SchemaService.class); ForwardedBackwardsCompatibleDataBroker dataBroker = new ForwardedBackwardsCompatibleDataBroker(domDataBroker, - mappingService, listeningExecutor); - - session.getService(SchemaService.class).registerSchemaServiceListener(dataBroker); + mappingService, schemaService,listeningExecutor); dataBroker.setConnector(BindingDomConnectorDeployer.createConnector(getBindingMappingServiceDependency())); dataBroker.setDomProviderContext(session); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java index 2a866a94b3..b09cd1c80a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java @@ -23,6 +23,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataChangeListener; import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; import org.opendaylight.controller.sal.binding.impl.forward.DomForwardedBroker; import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; +import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.concepts.ListenerRegistration; @@ -33,6 +34,7 @@ import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMapping import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; +import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +42,7 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; public abstract class AbstractForwardedDataBroker implements Delegator, DomForwardedBroker, - SchemaContextListener { + SchemaContextListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(AbstractForwardedDataBroker.class); // The Broker to whom we do all forwarding @@ -53,12 +55,14 @@ public abstract class AbstractForwardedDataBroker implements Delegator schemaListenerRegistration; protected AbstractForwardedDataBroker(final DOMDataBroker domDataBroker, - final BindingIndependentMappingService mappingService) { + final BindingIndependentMappingService mappingService,final SchemaService schemaService) { this.domDataBroker = domDataBroker; this.mappingService = mappingService; this.codec = new BindingToNormalizedNodeCodec(mappingService); + this.schemaListenerRegistration = schemaService.registerSchemaServiceListener(this); } protected BindingToNormalizedNodeCodec getCodec() { @@ -286,4 +290,9 @@ public abstract class AbstractForwardedDataBroker implements Delegator, CommitHandlerRegistrationImpl> commitHandlers = new ConcurrentHashMap<>(); - private final ListenerRegistry fakeRegistry = ListenerRegistry.create(); private final ListeningExecutorService executorService; public ForwardedBackwardsCompatibleDataBroker(final DOMDataBroker domDataBroker, - final BindingIndependentMappingService mappingService, final ListeningExecutorService executor) { - super(domDataBroker, mappingService); + final BindingIndependentMappingService mappingService, final SchemaService schemaService,final ListeningExecutorService executor) { + super(domDataBroker, mappingService,schemaService); executorService = executor; LOG.info("ForwardedBackwardsCompatibleBroker started."); } @@ -129,12 +129,6 @@ public class ForwardedBackwardsCompatibleDataBroker extends AbstractForwardedDat throw new UnsupportedOperationException("Data reader contract is not supported."); } - @Override - public void close() throws Exception { - // TODO Auto-generated method stub - - } - public ListenableFuture> commit(final ForwardedBackwardsCompatibleTransacion tx) { final List, DataObject>> subTrans = new ArrayList<>(); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java index fb06b130ce..5ab088e20e 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java @@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; +import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -41,8 +42,8 @@ import com.google.common.util.concurrent.ListenableFuture; */ public class ForwardedBindingDataBroker extends AbstractForwardedDataBroker implements BindingDataBroker { - public ForwardedBindingDataBroker(final DOMDataBroker domDataBroker, final BindingIndependentMappingService mappingService) { - super(domDataBroker, mappingService); + public ForwardedBindingDataBroker(final DOMDataBroker domDataBroker, final BindingIndependentMappingService mappingService, final SchemaService schemaService) { + super(domDataBroker, mappingService,schemaService); } @Override diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend index 3fef544f81..00c9f1eb91 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend @@ -16,6 +16,7 @@ import org.opendaylight.yangtools.yang.binding.util.BindingReflections import org.opendaylight.yangtools.yang.binding.util.ClassLoaderUtils import static extension org.opendaylight.controller.sal.binding.codegen.RuntimeCodeSpecification.* +import org.opendaylight.yangtools.yang.binding.RpcService class RuntimeCodeGenerator extends AbstractRuntimeCodeGenerator { @@ -28,7 +29,7 @@ class RuntimeCodeGenerator extends AbstractRuntimeCodeGenerator { val proxyName = iface.directProxyName; val potentialClass = ClassLoaderUtils.tryToLoadClassWithTCCL(proxyName) if(potentialClass != null) { - return potentialClass.newInstance; + return potentialClass.newInstance as RpcService; } val supertype = iface.asCtClass val createdCls = createClass(iface.directProxyName, supertype) [ @@ -53,7 +54,7 @@ class RuntimeCodeGenerator extends AbstractRuntimeCodeGenerator { ''' ] ] - return createdCls.toClass(iface.classLoader).newInstance + return createdCls.toClass(iface.classLoader).newInstance as RpcService ] } @@ -63,7 +64,7 @@ class RuntimeCodeGenerator extends AbstractRuntimeCodeGenerator { val routerName = iface.routerName; val potentialClass = ClassLoaderUtils.tryToLoadClassWithTCCL(routerName) if(potentialClass != null) { - return potentialClass.newInstance; + return potentialClass.newInstance as RpcService; } val targetCls = createClass(iface.routerName, supertype) [ @@ -106,7 +107,7 @@ class RuntimeCodeGenerator extends AbstractRuntimeCodeGenerator { ''' ] ] - return targetCls.toClass(iface.classLoader,iface.protectionDomain).newInstance + return targetCls.toClass(iface.classLoader,iface.protectionDomain).newInstance as RpcService ]; } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java index 75d44db9d1..8acad1b2d7 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java @@ -7,7 +7,9 @@ */ package org.opendaylight.controller.sal.binding.impl; -import com.google.common.collect.ImmutableClassToInstanceMap; +import static com.google.common.base.Preconditions.checkState; + +import org.opendaylight.controller.md.sal.binding.api.BindingDataBroker; import org.opendaylight.controller.md.sal.binding.util.AbstractBindingSalProviderInstance; import org.opendaylight.controller.md.sal.binding.util.BindingContextUtils; import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; @@ -32,13 +34,13 @@ import org.opendaylight.yangtools.yang.binding.RpcService; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.google.common.base.Preconditions.checkState; + +import com.google.common.collect.ImmutableClassToInstanceMap; public class RootBindingAwareBroker implements // Mutable, // Identifiable, // - BindingAwareBroker, AutoCloseable, - RpcProviderRegistry { + BindingAwareBroker, AutoCloseable, RpcProviderRegistry { private final static Logger LOG = LoggerFactory.getLogger(RootBindingAwareBroker.class); @@ -50,7 +52,9 @@ public class RootBindingAwareBroker implements // private NotificationProviderService notificationBroker; - private DataProviderService dataBroker; + private DataProviderService legacyDataBroker; + + private BindingDataBroker dataBroker; private MountPointManagerImpl mountManager; @@ -58,7 +62,7 @@ public class RootBindingAwareBroker implements // return mountManager; } - public void setMountManager(MountPointManagerImpl mountManager) { + public void setMountManager(final MountPointManagerImpl mountManager) { this.mountManager = mountManager; } @@ -66,11 +70,12 @@ public class RootBindingAwareBroker implements // private ImmutableClassToInstanceMap supportedProviderServices; - public RootBindingAwareBroker(String instanceName) { + public RootBindingAwareBroker(final String instanceName) { this.identifier = instanceName; mountManager = new MountPointManagerImpl(); } + @Override public String getIdentifier() { return identifier; } @@ -80,7 +85,7 @@ public class RootBindingAwareBroker implements // } public DataProviderService getDataBroker() { - return this.dataBroker; + return this.legacyDataBroker; } public NotificationProviderService getNotificationBroker() { @@ -95,16 +100,16 @@ public class RootBindingAwareBroker implements // return rpcBroker; } - public void setRpcBroker(RpcProviderRegistry rpcBroker) { + public void setRpcBroker(final RpcProviderRegistry rpcBroker) { this.rpcBroker = rpcBroker; } - public void setNotificationBroker(NotificationProviderService notificationBroker) { + public void setNotificationBroker(final NotificationProviderService notificationBroker) { this.notificationBroker = notificationBroker; } - public void setDataBroker(DataProviderService dataBroker) { - this.dataBroker = dataBroker; + public void setLegacyDataBroker(final DataProviderService dataBroker) { + this.legacyDataBroker = dataBroker; } public void start() { @@ -113,29 +118,30 @@ public class RootBindingAwareBroker implements // controllerRoot = new RootSalInstance(getRpcProviderRegistry(), getNotificationBroker(), getDataBroker()); + ImmutableClassToInstanceMap.Builder consBuilder = ImmutableClassToInstanceMap.builder(); - supportedConsumerServices = ImmutableClassToInstanceMap. builder() - .put(NotificationService.class, getRoot()) // - .put(DataBrokerService.class, getRoot()) // - .put(RpcConsumerRegistry.class, getRoot()) // - .put(MountService.class, mountManager).build(); - + consBuilder.put(NotificationService.class, getRoot()); + consBuilder.put(DataBrokerService.class, getRoot()); + consBuilder.put(RpcConsumerRegistry.class, getRoot()); + if(dataBroker != null) { + consBuilder.put(BindingDataBroker.class, dataBroker); + } + consBuilder.put(MountService.class, mountManager).build(); + supportedConsumerServices = consBuilder.build(); supportedProviderServices = ImmutableClassToInstanceMap. builder() - .putAll(supportedConsumerServices) - .put(NotificationProviderService.class, getRoot()) // - .put(DataProviderService.class, getRoot()) // - .put(RpcProviderRegistry.class, getRoot()) // + .putAll(supportedConsumerServices).put(NotificationProviderService.class, getRoot()) + .put(DataProviderService.class, getRoot()).put(RpcProviderRegistry.class, getRoot()) .put(MountProviderService.class, mountManager).build(); } @Override - public ConsumerContext registerConsumer(BindingAwareConsumer consumer, BundleContext ctx) { + public ConsumerContext registerConsumer(final BindingAwareConsumer consumer, final BundleContext ctx) { checkState(supportedConsumerServices != null, "Broker is not initialized."); return BindingContextUtils.createConsumerContextAndInitialize(consumer, supportedConsumerServices); } @Override - public ProviderContext registerProvider(BindingAwareProvider provider, BundleContext ctx) { + public ProviderContext registerProvider(final BindingAwareProvider provider, final BundleContext ctx) { checkState(supportedProviderServices != null, "Broker is not initialized."); return BindingContextUtils.createProviderContextAndInitialize(provider, supportedProviderServices); } @@ -146,34 +152,38 @@ public class RootBindingAwareBroker implements // } @Override - public RoutedRpcRegistration addRoutedRpcImplementation(Class type, T implementation) - throws IllegalStateException { + public RoutedRpcRegistration addRoutedRpcImplementation(final Class type, + final T implementation) throws IllegalStateException { return getRoot().addRoutedRpcImplementation(type, implementation); } @Override - public RpcRegistration addRpcImplementation(Class type, T implementation) + public RpcRegistration addRpcImplementation(final Class type, final T implementation) throws IllegalStateException { return getRoot().addRpcImplementation(type, implementation); } @Override - public T getRpcService(Class module) { + public T getRpcService(final Class module) { return getRoot().getRpcService(module); } + @Override public >> ListenerRegistration registerRouteChangeListener( - L arg0) { + final L arg0) { return getRoot().registerRouteChangeListener(arg0); } - public class RootSalInstance extends AbstractBindingSalProviderInstance { - public RootSalInstance(RpcProviderRegistry rpcRegistry, NotificationProviderService notificationBroker, - DataProviderService dataBroker) { + public RootSalInstance(final RpcProviderRegistry rpcRegistry, + final NotificationProviderService notificationBroker, final DataProviderService dataBroker) { super(rpcRegistry, notificationBroker, dataBroker); } } + + public void setDataBroker(final BindingDataBroker asyncDataBroker) { + dataBroker = asyncDataBroker; + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang b/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang index 428025a58d..4456dea77f 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang +++ b/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang @@ -42,6 +42,12 @@ module opendaylight-sal-binding-broker-impl { config:provided-service sal:binding-data-consumer-broker; config:java-name-prefix ForwardedCompatibleDataBrokerImpl; } + + identity binding-forwarded-data-broker { + base config:module-type; + config:provided-service sal:binding-async-data-broker; + config:java-name-prefix BindingAsyncDataBrokerImpl; + } identity binding-rpc-broker { base config:module-type; @@ -62,6 +68,26 @@ module opendaylight-sal-binding-broker-impl { config:java-name-prefix RuntimeMapping; } + grouping dom-forwarding-component { + container dom-async-broker { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity dom:dom-broker-osgi-registry; + } + } + } + + container binding-mapping-service { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity binding-dom-mapping-service; + } + } + } + } + augment "/config:modules/config:module/config:configuration" { case binding-broker-impl { when "/config:modules/config:module/config:type = 'binding-broker-impl'"; @@ -123,22 +149,15 @@ module opendaylight-sal-binding-broker-impl { case binding-data-compatible-broker { when "/config:modules/config:module/config:type = 'binding-data-compatible-broker'"; - container dom-async-broker { - uses config:service-ref { - refine type { - mandatory true; - config:required-identity dom:dom-broker-osgi-registry; - } - } - } - - container binding-mapping-service { - uses config:service-ref { - refine type { - mandatory true; - config:required-identity binding-dom-mapping-service; - } - } + uses dom-forwarding-component; + } + } + + augment "/config:modules/config:module/config:configuration" { + case binding-forwarded-data-broker { + when "/config:modules/config:module/config:type = 'binding-forwarded-data-broker'"; + container binding-forwarded-data-broker { + uses dom-forwarding-component; } } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java index ae65c8889a..623b2fdd63 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java @@ -48,7 +48,6 @@ import org.opendaylight.controller.sal.dom.broker.impl.DataStoreStatsWrapper; import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore; import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter; import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareRpcBroker; -import org.opendaylight.controller.sal.dom.broker.impl.SchemaContextProvider; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.sal.binding.generator.impl.RuntimeGeneratedMappingServiceImpl; import org.opendaylight.yangtools.yang.common.QName; @@ -57,7 +56,6 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; import org.reflections.Reflections; import org.reflections.scanners.ResourcesScanner; @@ -70,7 +68,7 @@ import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.ListeningExecutorService; -public class BindingTestContext implements AutoCloseable, SchemaContextProvider { +public class BindingTestContext implements AutoCloseable { public static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier TREE_ROOT = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier .builder().toInstance(); @@ -101,22 +99,19 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider private MountPointManagerImpl biMountImpl; - private SchemaContext schemaContext; + private ImmutableMap newDatastores; private BackwardsCompatibleDataBroker biCompatibleBroker; - private final List schemaListeners = new ArrayList<>(); - private DataProviderService baData; private DOMDataBroker newDOMDataBroker; - @Override - public SchemaContext getSchemaContext() { - return schemaContext; - } + private final MockSchemaService mockSchemaService = new MockSchemaService(); + + public DOMDataBroker getDomAsyncDataBroker() { return newDOMDataBroker; @@ -128,6 +123,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider this.startWithSchema = startWithSchema; } + @Deprecated public void startDomDataStore() { checkState(dataStore == null, "DataStore already started."); checkState(biDataImpl != null, "Dom Data Broker not present"); @@ -140,7 +136,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider } else { dataStore = schemaAwareDataStore; } - + mockSchemaService.registerSchemaServiceListener(schemaAwareDataStore); biDataImpl.registerConfigurationReader(TREE_ROOT, dataStore); biDataImpl.registerOperationalReader(TREE_ROOT, dataStore); biDataImpl.registerCommitHandler(TREE_ROOT, dataStore); @@ -166,9 +162,9 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider biCompatibleBroker = new BackwardsCompatibleDataBroker(newDOMDataBroker); - schemaListeners.add(configStore); - schemaListeners.add(operStore); - schemaListeners.add(biCompatibleBroker); + mockSchemaService.registerSchemaServiceListener(configStore); + mockSchemaService.registerSchemaServiceListener(operStore); + mockSchemaService.registerSchemaServiceListener(biCompatibleBroker); biDataLegacyBroker = biCompatibleBroker; } @@ -188,7 +184,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider baBrokerImpl.getMountManager().setDataCommitExecutor(executor); baBrokerImpl.getMountManager().setNotificationExecutor(executor); baBrokerImpl.setRpcBroker(new RpcProviderRegistryImpl("test")); - baBrokerImpl.setDataBroker(baData); + baBrokerImpl.setLegacyDataBroker(baData); baBrokerImpl.setNotificationBroker(baNotifyImpl); baBrokerImpl.start(); } @@ -268,20 +264,11 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider public void startBindingToDomMappingService() { checkState(classPool != null, "ClassPool needs to be present"); mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl(classPool); + mockSchemaService.registerSchemaServiceListener(mappingServiceImpl); } public void updateYangSchema(final String[] files) { - schemaContext = getContext(files); - - if (schemaAwareDataStore != null) { - schemaAwareDataStore.onGlobalContextUpdated(schemaContext); - } - if (mappingServiceImpl != null) { - mappingServiceImpl.onGlobalContextUpdated(schemaContext); - } - for(SchemaContextListener listener : schemaListeners) { - listener.onGlobalContextUpdated(schemaContext); - } + mockSchemaService.changeSchema(getContext(files)); } public static String[] getAllYangFilesOnClasspath() { @@ -340,8 +327,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider } public void startNewBindingDataBroker() { - ForwardedBackwardsCompatibleDataBroker forwarded = new ForwardedBackwardsCompatibleDataBroker(newDOMDataBroker, mappingServiceImpl, executor); - schemaListeners.add(forwarded); + ForwardedBackwardsCompatibleDataBroker forwarded = new ForwardedBackwardsCompatibleDataBroker(newDOMDataBroker, mappingServiceImpl,mockSchemaService, executor); baData = forwarded; } @@ -353,7 +339,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider private void startDomBroker() { checkState(executor != null); biBrokerImpl = new BrokerImpl(); - biBrokerImpl.setRouter(new SchemaAwareRpcBroker("/", this)); + biBrokerImpl.setRouter(new SchemaAwareRpcBroker("/", mockSchemaService)); } @@ -429,4 +415,6 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider public MountProvisionService getDomMountProviderService() { return biMountImpl; } + + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java new file mode 100644 index 0000000000..c8acbcd994 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java @@ -0,0 +1,62 @@ +/* + * 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.test.util; + +import org.opendaylight.controller.sal.core.api.model.SchemaService; +import org.opendaylight.controller.sal.dom.broker.impl.SchemaContextProvider; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.util.ListenerRegistry; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener; + +@SuppressWarnings("deprecation") +public final class MockSchemaService implements SchemaService, SchemaContextProvider { + + private SchemaContext schemaContext; + + ListenerRegistry listeners = ListenerRegistry.create(); + + @Override + public void addModule(final Module module) { + throw new UnsupportedOperationException(); + } + + @Override + public synchronized SchemaContext getGlobalContext() { + return schemaContext; + } + + @Override + public synchronized SchemaContext getSessionContext() { + return schemaContext; + } + + @Override + public ListenerRegistration registerSchemaServiceListener( + final SchemaServiceListener listener) { + return listeners.register(listener); + } + + @Override + public void removeModule(final Module module) { + throw new UnsupportedOperationException(); + } + + @Override + public synchronized SchemaContext getSchemaContext() { + return schemaContext; + } + + public synchronized void changeSchema(final SchemaContext newContext) { + schemaContext = newContext; + for (ListenerRegistration listener : listeners) { + listener.getInstance().onGlobalContextUpdated(schemaContext); + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang b/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang index 38f0da3ccc..4a2ec8a063 100644 --- a/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang +++ b/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang @@ -22,6 +22,11 @@ module opendaylight-md-sal-binding { base "config:service-type"; config:java-class "org.opendaylight.controller.sal.binding.api.data.DataProviderService"; } + + identity binding-async-data-broker { + base "config:service-type"; + config:java-class "org.opendaylight.controller.md.sal.binding.api.BindingDataBroker"; + } identity binding-data-consumer-broker { base "config:service-type"; diff --git a/opendaylight/md-sal/sal-binding-dom-it/pom.xml b/opendaylight/md-sal/sal-binding-dom-it/pom.xml index d1354f897f..fd5c5be18d 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/pom.xml +++ b/opendaylight/md-sal/sal-binding-dom-it/pom.xml @@ -48,7 +48,6 @@ org.slf4j slf4j-simple - 1.7.2 test diff --git a/opendaylight/md-sal/sal-binding-it/pom.xml b/opendaylight/md-sal/sal-binding-it/pom.xml index 70847aabea..b8bb891e79 100644 --- a/opendaylight/md-sal/sal-binding-it/pom.xml +++ b/opendaylight/md-sal/sal-binding-it/pom.xml @@ -9,11 +9,9 @@ sal-binding-it - 3.0.0 ../sal-binding-broker/target/jacoco-it.exec ../sal-binding-broker/target/jacoco.exec - 1.5.0 @@ -80,7 +78,6 @@ org.opendaylight.yangtools.thirdparty antlr4-runtime-osgi-nohead - 4.0 @@ -90,7 +87,6 @@ org.opendaylight.yangtools.thirdparty xtend-lib-osgi - 2.4.3 org.openexi @@ -148,7 +144,7 @@ org.eclipse.m2e lifecycle-mapping - 1.0.0 + ${lifecycle.mapping.version} @@ -200,7 +196,6 @@ org.apache.maven.plugins maven-surefire-plugin - 2.14.1 false @@ -232,7 +227,6 @@ org.ops4j.pax.exam maven-paxexam-plugin - 1.2.4 generate-config diff --git a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java index a15c711e2d..5ede600d97 100644 --- a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java +++ b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java @@ -119,7 +119,7 @@ public class TestHelper { mavenBundle(CONTROLLER, "sal-common-util").versionAsInProject(), // // - + mavenBundle(CONTROLLER, "sal-inmemory-datastore").versionAsInProject(), // / mavenBundle(CONTROLLER, "sal-broker-impl").versionAsInProject(), // // mavenBundle(CONTROLLER, "sal-core-spi").versionAsInProject().update(), // diff --git a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java index 7d7e56dae0..53abd39cde 100644 --- a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java +++ b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java @@ -14,7 +14,6 @@ import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.Notification; @@ -72,13 +71,13 @@ public abstract class AbstractBindingSalConsumerInstance Registration> registerNotificationListener( + public ListenerRegistration> registerNotificationListener( Class notificationType, NotificationListener listener) { return getNotificationBrokerChecked().registerNotificationListener(notificationType, listener); } @Override - public Registration registerNotificationListener( + public ListenerRegistration registerNotificationListener( org.opendaylight.yangtools.yang.binding.NotificationListener listener) { return getNotificationBrokerChecked().registerNotificationListener(listener); } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java index 87bbfd3d06..fb429e5fd1 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java @@ -10,6 +10,52 @@ package org.opendaylight.controller.md.sal.common.api.data; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Path; +/** + * + * Provides access to a conceptual data tree store. + * + *

+ * Also provides the ability to subscribe for changes to data under a given + * branch of the tree. + * + *

+ * All operations on data tree are performed via one of the transactions: + *

    + *
  • Read-Only - allocated using {@link #newReadOnlyTransaction()} + *
  • Write-Only - allocated using {@link #newWriteOnlyTransaction()} + *
  • Read-Write - allocated using {@link #newReadWriteTransaction()} + *
+ * + *

+ * These transactions provide a stable isolated view of data tree, which is + * guaranteed to be not affected by other concurrent transactions, until + * transaction is committed. + * + *

+ * For a detailed explanation of how transaction are isolated and how transaction-local + * changes are committed to global data tree, see + * {@link AsyncReadTransaction}, {@link AsyncWriteTransaction}, + * {@link AsyncReadWriteTransaction} and {@link AsyncWriteTransaction#commit()}. + * + * + *

+ * It is strongly recommended to use the type of transaction, which + * provides only the minimal capabilities you need. This allows for + * optimizations at the data broker / data store level. For example, + * implementations may optimize the transaction for reading if they know ahead + * of time that you only need to read data - such as not keeping additional meta-data, + * which may be required for write transactions. + * + *

+ * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ public interface AsyncDataBroker

, D, L extends AsyncDataChangeListener> extends // AsyncDataTransactionFactory { @@ -17,52 +63,150 @@ public interface AsyncDataBroker

, D, L extends AsyncDataChange * * Scope of Data Change * + *

* Represents scope of data change (addition, replacement, deletion). * - * The terminology for types is reused from LDAP + * The terminology for scope types is reused from LDAP. + * + *

Examples

+ * + * Following is an example model with comments describing what notifications + * you would receive based on the scope you specify, when you are + * registering for changes on container a. * - * @see http://www.idevelopment.info/data/LDAP/LDAP_Resources/SEARCH_Setting_the_SCOPE_Parameter.shtml + *
+     * container a              // scope BASE, ONE, SUBTREE
+     *    leaf "foo"            // scope ONE, SUBTREE
+     *    container             // scope ONE, SUBTREE
+     *       leaf  "bar"        // scope SUBTREE
+     *    list list             // scope ONE, SUBTREE
+     *      list [a]            // scope SUBTREE
+     *        id "a"            // scope SUBTREE
+     *      list [b]            // scope SUBTREE
+     *        id "b"            // scope SUBTREE
+     * 
+ * + * Following is an example model with comments describing what notifications + * you would receive based on the scope you specify, when you are + * registering for changes on list list (without specifying concrete item in + * the list). + * + *
+     *  list list               // scope BASE, ONE, SUBTREE
+     *      list [a]            // scope ONE, SUBTREE
+     *        id "a"            // scope SUBTREE
+     *      list [b]            // scope ONE, SUBTREE
+     *        id "b"            // scope SUBTREE
+     * 
+ * + * + * @see http://www.idevelopment.info/data/LDAP/LDAP_Resources/ + * SEARCH_Setting_the_SCOPE_Parameter.shtml */ public enum DataChangeScope { - /** - * Represents only a direct change of the node, such as replacement of node, - * addition or deletion. - * - */ - BASE, - /** - * Represent a change (addition,replacement,deletion) - * of the node or one of it's direct childs. - * - */ - ONE, - /** - * Represents a change of the node or any of it's child nodes. - * - */ - SUBTREE + /** + * Represents only a direct change of the node, such as replacement of a + * node, addition or deletion. + * + */ + BASE, + /** + * Represent a change (addition,replacement,deletion) of the node or one + * of its direct children. + * + * This scope is superset of {@link #BASE}. + * + */ + ONE, + /** + * Represents a change of the node or any of or any of its child nodes, + * direct and nested. + * + * This scope is superset of {@link #ONE} and {@link #BASE}. + * + */ + SUBTREE } + /** + * {@inheritDoc} + */ @Override public AsyncReadTransaction newReadOnlyTransaction(); + /** + * {@inheritDoc} + */ @Override - public AsyncReadWriteTransaction newReadWriteTransaction(); + public AsyncReadWriteTransaction newReadWriteTransaction(); + /** + * {@inheritDoc} + */ @Override public AsyncWriteTransaction newWriteOnlyTransaction(); /** - * Registers {@link DataChangeListener} for Data Change callbacks - * which will be triggered on which will be triggered on the store + * Registers a {@link AsyncDataChangeListener} to receive + * notifications when data changes under a given path in the conceptual data + * tree. + *

+ * You are able to register for notifications for any node or subtree + * which can be reached via the supplied path. + *

+ * If path type P allows it, you may specify paths up to the leaf nodes + * then it is possible to listen on leaf nodes. + *

+ * You are able to register for data change notifications for a subtree even + * if it does not exist. You will receive notification once that node is + * created. + *

+ * If there is any preexisting data in data tree on path for which you are + * registering, you will receive initial data change event, which will + * contain all preexisting data, marked as created. + * + *

+ * You are also able to specify the scope of the changes you want to be + * notified. + *

+ * Supported scopes are: + *

    + *
  • {@link DataChangeScope#BASE} - notification events will only be + * triggered when a node referenced by path is created, removed or replaced. + *
  • {@link DataChangeScope#ONE} - notifications events will only be + * triggered when a node referenced by path is created, removed or replaced, + * or any or any of its immediate children are created, updated or removed. + *
  • {@link DataChangeScope#SUBTREE} - notification events will be + * triggered when a node referenced by the path is created, removed + * or replaced or any of the children in its subtree are created, removed + * or replaced. + *
+ * See {@link DataChangeScope} for examples. + *

+ * This method returns a {@link ListenerRegistration} object. To + * "unregister" your listener for changes call the "close" method on this + * returned object. + *

+ * You MUST call close when you no longer need to receive notifications + * (such as during shutdown or for example if your bundle is shutting down). * - * @param store Logical store in which listener is registered. - * @param path Path (subtree identifier) on which client listener will be invoked. - * @param listener Instance of listener which should be invoked on - * @param triggeringScope Scope of change which triggers callback. - * @return Listener registration of the listener, call {@link ListenerRegistration#close()} - * to stop delivery of change events. + * @param store + * Logical Data Store - Logical Datastore you want to listen for + * changes in. For example + * {@link LogicalDatastoreType#OPERATIONAL} or + * {@link LogicalDatastoreType#CONFIGURATION} + * @param path + * Path (subtree identifier) on which client listener will be + * invoked. + * @param listener + * Instance of listener which should be invoked on + * @param triggeringScope + * Scope of change which triggers callback. + * @return Listener registration object, which may be used to unregister + * your listener using {@link ListenerRegistration#close()} to stop + * delivery of change events. */ - ListenerRegistration registerDataChangeListener(LogicalDatastoreType store, P path, L listener, DataChangeScope triggeringScope); + ListenerRegistration registerDataChangeListener(LogicalDatastoreType store, P path, L listener, + DataChangeScope triggeringScope); } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeEvent.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeEvent.java index f612e51747..29c9bae31f 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeEvent.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeEvent.java @@ -13,63 +13,128 @@ import java.util.Set; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.concepts.Path; -public interface AsyncDataChangeEvent

,D> extends Immutable { +/** + * + * An event which contains a capture of changes in a data subtree + * + *

+ * Represents a notification indicating that some data at or under a particular + * path has changed. The notification contains a capture of the changes in the data + * subtree. This event is triggered by successful application of modifications + * from a transaction on the global data tree. Use the + * {@link AsyncDataBroker#registerDataChangeListener(LogicalDatastoreType, Path, AsyncDataChangeListener, AsyncDataBroker.DataChangeScope)} + * method to register a listener for data change events. + * + *

+ * A listener will only receive notifications for changes to data under the path + * they register for. See + * {@link AsyncDataBroker#registerDataChangeListener(LogicalDatastoreType, Path, AsyncDataChangeListener, AsyncDataBroker.DataChangeScope)} + * to learn more about registration scopes. + * + *

+ * The entire subtree under the path will be provided via instance methods of Data + * Change Event even if just a leaf node changes. + * + *

+ * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ +public interface AsyncDataChangeEvent

, D> extends Immutable { /** - * Returns a immutable map of paths and newly created objects + * Returns a map of paths and newly created objects, which were introduced by + * this change into conceptual data tree, if no new objects were introduced + * this map will be empty. + *

+ * This map contains all data tree nodes (and paths to them) which were created + * and are in the scope of listener registration. The data tree nodes + * contain their whole subtree with their current state. * * @return map of paths and newly created objects */ Map getCreatedData(); /** - * Returns a immutable map of paths and respective updated objects after update. - * - * Original state of the object is in - * {@link #getOriginalData()} + * Returns a map of paths and objects which were updated by this change in the + * conceptual data tree if no existing objects were updated + * this map will be empty. + *

+ * This map contains all data tree nodes (and paths to them) which were updated + * and are in the scope of listener registration. The data tree nodes + * contain their whole subtree with their current state. + *

+ * A Node is considered updated if it contents were replaced or one of its + * children was created, removed or updated. + *

+ * Original state of the updated data tree nodes is in + * {@link #getOriginalData()} stored with same path. * * @return map of paths and newly created objects */ Map getUpdatedData(); /** - * Returns a immutable set of removed paths. - * - * Original state of the object is in - * {@link #getOriginalData()} + * Returns an immutable set of removed paths. + *

+ * This set contains the paths to the data tree nodes which are in the scope + * of the listener registration that have been removed. + *

+ * Original state of the removed data tree nodes is in + * {@link #getOriginalData()} stored with same path. * * @return set of removed paths */ Set

getRemovedPaths(); /** - * Return a immutable map of paths and original state of updated and removed objects. + * Returns an immutable map of updated or removed paths and their original + * states prior to this change. * - * This map is populated if at changed path was previous object, and captures - * state of previous object. + *

+ * This map contains the original version of the data tree nodes (and paths + * to them), which are in the scope of the listener registration. * * @return map of paths and original state of updated and removed objects. */ Map getOriginalData(); /** - * Returns a immutable stable view of data state, which - * captures state of data store before the reported change. + * Returns an immutable stable view of data state, which captures the state of + * data store before the reported change. * + *

+ * The view is rooted at the point where the listener, to which the event is + * being delivered, was registered. + *

+ * If listener used a wildcarded path (if supported by path type) during + * registration for change listeners this method returns null, and original + * state can be accessed only via {@link #getOriginalData()} * - * The view is rooted at the point where the listener, to which the event is being delivered, was registered. - * - * @return Stable view of data before the change happened, rooted at the listener registration path. + * @return Stable view of data before the change happened, rooted at the + * listener registration path. * */ D getOriginalSubtree(); /** - * Returns a immutable stable view of data, which captures state of data store - * after the reported change. - * - * The view is rooted at the point where the listener, to which the event is being delivered, was registered. + * Returns an immutable stable view of data, which captures the state of data + * store after the reported change. + *

+ * The view is rooted at the point where the listener, to which the event is + * being delivered, was registered. + *

+ * If listener used a wildcarded path (if supported by path type) during + * registration for change listeners this method returns null, and state + * can be accessed only via {@link #getCreatedData()}, + * {@link #getUpdatedData()}, {@link #getRemovedPaths()} * - * @return Stable view of data after the change happened, rooted at the listener registration path. + * @return Stable view of data after the change happened, rooted at the + * listener registration path. */ D getUpdatedSubtree(); } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeListener.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeListener.java index 49f07bc52b..dca5200d39 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeListener.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataChangeListener.java @@ -11,13 +11,42 @@ import java.util.EventListener; import org.opendaylight.yangtools.concepts.Path; +/** + * Listener of data change events on particular subtree. + * + *

+ * User-supplied implementations of this listener interface MUST register via + * {@link AsyncDataBroker#registerDataChangeListener(LogicalDatastoreType, Path, AsyncDataChangeListener, AsyncDataBroker.DataChangeScope)} + * in order to start receiving data change events, which capture state changes + * in a subtree. + * + *

+ * Implementation Note: This interface is intended to be implemented + * by users of MD-SAL. + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ public interface AsyncDataChangeListener

, D> extends EventListener { /** - * Note that this method may be invoked from a shared thread pool, so + * + * Invoked when there is data change for the particular path, which was used to + * register this listener. + *

+ * This method may be also invoked during registration of the listener if + * there is any preexisting data in the conceptual data tree for supplied path. + * This initial event will contain all preexisting data as created. + * + *

+ * Note that this method may be invoked from a shared thread pool, so * implementations SHOULD NOT perform CPU-intensive operations and they * definitely MUST NOT invoke any potentially blocking operations. * - * @param change Data Change Event being delivered. + * @param change + * Data Change Event being delivered. */ void onDataChanged(AsyncDataChangeEvent change); } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java index 732fed0f3f..cedd883b22 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java @@ -9,12 +9,110 @@ package org.opendaylight.controller.md.sal.common.api.data; import org.opendaylight.yangtools.concepts.Path; +/** + * A factory which allocates new transactions to operate on the data + * tree. + * + *

+ * Note: This interface is not intended to be used directly, but rather + * via subinterfaces which introduces additional semantics to allocated + * transactions. + *

    + *
  • {@link AsyncDataBroker} + *
  • {@link TransactionChain} + *
+ * + *

+ * All operations on the data tree are performed via one of the transactions: + *

    + *
  • Read-Only - allocated using {@link #newReadOnlyTransaction()} + *
  • Write-Only - allocated using {@link #newWriteOnlyTransaction()} + *
  • Read-Write - allocated using {@link #newReadWriteTransaction()} + *
+ * + *

+ * These transactions provides a stable isolated view of the data tree, which is + * guaranteed to be not affected by other concurrent transactions, until + * transaction is committed. + * + *

+ * For a detailed explanation of how transaction are isolated and how transaction-local + * changes are committed to global data tree, see + * {@link AsyncReadTransaction}, {@link AsyncWriteTransaction}, + * {@link AsyncReadWriteTransaction} and {@link AsyncWriteTransaction#commit()}. + * + *

+ * It is strongly recommended to use the type of transaction, which + * provides only the minimal capabilities you need. This allows for + * optimizations at the data broker / data store level. For example, + * implementations may optimize the transaction for reading if they know ahead + * of time that you only need to read data - such as not keeping additional meta-data, + * which may be required for write transactions. + *

+ * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + * @see AsyncDataBroker + * @see TransactionChain + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ public interface AsyncDataTransactionFactory

, D> { + /** + * Allocates a new read-only transaction which provides an immutable snapshot of + * the data tree. + *

+ * The view of data tree is an immutable snapshot of current data tree state when + * transaction was allocated. + * + * @return new read-only transaction + */ AsyncReadTransaction newReadOnlyTransaction(); + /** + * Allocates new read-write transaction which provides a mutable view of the data + * tree. + * + *

+ * Preconditions for mutation of data tree are captured from the snapshot of + * data tree state, when the transaction is allocated. If data was + * changed during transaction in an incompatible way then the commit of this transaction + * will fail. See {@link AsyncWriteTransaction#commit()} for more + * details about conflicting and not-conflicting changes and + * failure scenarios. + * + * @return new read-write transaction + */ AsyncReadWriteTransaction newReadWriteTransaction(); - AsyncWriteTransaction newWriteOnlyTransaction(); + /** + * Allocates new write-only transaction based on latest state of data + * tree. + * + *

+ * Preconditions for mutation of data tree are captured from the snapshot of + * data tree state, when the transaction is allocated. If data was + * changed during transaction in an incompatible way then the commit of this transaction + * will fail. See {@link AsyncWriteTransaction#commit()} for more + * details about conflicting and not-conflicting changes and + * failure scenarios. + * + *

+ * Since this transaction does not provide a view of the data it SHOULD BE + * used only by callers which are exclusive writers (exporters of data) + * to the subtree they modify. This prevents optimistic + * lock failures as described in {@link AsyncWriteTransaction#commit()}. + *

+ * Exclusivity of writers to particular subtree SHOULD BE enforced by + * external locking mechanism. + * + * @return new write-only transaction + */ + AsyncWriteTransaction newWriteOnlyTransaction(); } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java index 7744f71888..6cf5a5b532 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java @@ -12,12 +12,61 @@ import org.opendaylight.yangtools.concepts.Path; import com.google.common.base.Optional; import com.google.common.util.concurrent.ListenableFuture; +/** + * + * Provides a stateful read-only view of the data tree. + * + *

+ * View of the data tree is a stable point-in-time snapshot of the current data tree state when + * the transaction was created. It's state and underlying data tree + * is not affected by other concurrently running transactions. + * + *

+ * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + *

Transaction isolation example

Lest assume initial state of data tree + * for PATH is A. + * + *
+ * txRead = broker.newReadOnlyTransaction();   // read Transaction is snapshot of data
+ * txWrite = broker.newReadWriteTransactoin(); // concurrent write transaction
+ *
+ * txRead.read(OPERATIONAL,PATH).get();        // will return Optional containing A
+ * txWrite = broker.put(OPERATIONAL,PATH,B);   // writes B to PATH
+ *
+ * txRead.read(OPERATIONAL,PATH).get();        // still returns Optional containing A
+ *
+ * txWrite.commit().get();                     // data tree is updated, PATH contains B
+ * txRead.read(OPERATIONAL,PATH).get();        // still returns Optional containing A
+ *
+ * txAfterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * txAfterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B;
+ * 
+ * + *

+ * Note: example contains blocking calls on future only to illustrate + * that action happened after other asynchronous action. Use of blocking call + * {@link ListenableFuture#get()} is discouraged for most uses and you should + * use + * {@link com.google.common.util.concurrent.Futures#addCallback(ListenableFuture, com.google.common.util.concurrent.FutureCallback)} + * or other functions from {@link com.google.common.util.concurrent.Futures} to + * register more specific listeners. + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ public interface AsyncReadTransaction

, D> extends AsyncTransaction { /** * - * Reads data from provided logical data store located at provided path - * + * Reads data from provided logical data store located at the provided path. + *

+ * If the target is a subtree, then the whole subtree is read (and will be + * accessible from the returned data object). * * @param store * Logical data store from which read should occur. @@ -26,10 +75,11 @@ public interface AsyncReadTransaction

, D> extends AsyncTransac * read * @return Listenable Future which contains read result *

    - *
  • If data at supplied path exists the {@link Future#get()} - * returns Optional object containing data + *
  • If data at supplied path exists the + * {@link ListeblaFuture#get()} returns Optional object containing + * data once read is done. *
  • If data at supplied path does not exists the - * {@link Future#get()} returns {@link Optional#absent()}. + * {@link ListenbleFuture#get()} returns {@link Optional#absent()}. *
*/ ListenableFuture> read(LogicalDatastoreType store, P path); diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadWriteTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadWriteTransaction.java index ce740bf41d..34101366c8 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadWriteTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadWriteTransaction.java @@ -10,12 +10,126 @@ package org.opendaylight.controller.md.sal.common.api.data; import org.opendaylight.yangtools.concepts.Path; /** - * Transaction enabling client to have combined transaction, - * which provides read and write capabilities. + * Transaction enabling a client to have a combined read/write capabilities. * + *

+ * The initial state of the write transaction is stable snapshot of current data tree + * state captured when transaction was created and it's state and underlying + * data tree are not affected by other concurrently running transactions. * - * @param

Path Type - * @param Data Type + *

+ * Write transactions are isolated from other concurrent write transactions. All + * writes are local to the transaction and represents only a proposal of state + * change for data tree and it is not visible to any other concurrently running + * transactions. + * + *

+ * Applications publish the changes proposed in the transaction by calling {@link #commit} + * on the transaction. This seals the transaction + * (preventing any further writes using this transaction) and submits it to be + * processed and applied to global conceptual data tree. + * + *

+ * The transaction commit may fail due to a concurrent transaction modifying and committing data in + * an incompatible way. See {@link #commit()} for more concrete commit failure examples. + * + * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + *

Examples

+ * + *

Transaction local state

+ * + * Let assume initial state of data tree for PATH is A + * . + * + *
+ * txWrite = broker.newReadWriteTransaction(); // concurrent write transaction
+ *
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional containing A
+ * txWrite.put(OPERATIONAL,PATH,B);            // writes B to PATH
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional Containing B
+ *
+ * txWrite.commit().get();                     // data tree is updated, PATH contains B
+ *
+ * tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
+ * 
+ * + * As you could see read-write transaction provides capabilities as + * {@link AsyncWriteTransaction} but also allows for reading proposed changes as + * if they already happened. + * + *

Transaction isolation (read transaction, read-write transaction)

Let + * assume initial state of data tree for PATH is A. + * + *
+ * txRead = broker.newReadOnlyTransaction();   // read Transaction is snapshot of data
+ * txWrite = broker.newReadWriteTransaction(); // concurrent write transaction
+ *
+ * txRead.read(OPERATIONAL,PATH).get();        // will return Optional containing A
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional containing A
+ *
+ * txWrite.put(OPERATIONAL,PATH,B);            // writes B to PATH
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional Containing B
+ *
+ * txRead.read(OPERATIONAL,PATH).get();        // concurrent read transaction still returns
+ *                                             // Optional containing A
+ *
+ * txWrite.commit().get();                     // data tree is updated, PATH contains B
+ * txRead.read(OPERATIONAL,PATH).get();        // still returns Optional containing A
+ *
+ * tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
+ * 
+ * + *

Transaction isolation (2 concurrent read-write transactions)

Let + * assume initial state of data tree for PATH is A. + * + *
+ * tx1 = broker.newReadWriteTransaction(); // read Transaction is snapshot of data
+ * tx2 = broker.newReadWriteTransaction(); // concurrent write transaction
+ *
+ * tx1.read(OPERATIONAL,PATH).get();       // will return Optional containing A
+ * tx2.read(OPERATIONAL,PATH).get()        // will return Optional containing A
+ *
+ * tx2.put(OPERATIONAL,PATH,B);            // writes B to PATH
+ * tx2.read(OPERATIONAL,PATH).get()        // will return Optional Containing B
+ *
+ * tx1.read(OPERATIONAL,PATH).get();       // tx1 read-write transaction still sees Optional
+ *                                         // containing A since is isolated from tx2
+ * tx1.put(OPERATIONAL,PATH,C);            // writes C to PATH
+ * tx1.read(OPERATIONAL,PATH).get()        // will return Optional Containing C
+ *
+ * tx2.read(OPERATIONAL,PATH).get()        // tx2 read-write transaction still sees Optional
+ *                                         // containing B since is isolated from tx1
+ *
+ * tx2.commit().get();                     // data tree is updated, PATH contains B
+ * tx1.read(OPERATIONAL,PATH).get();       // still returns Optional containing C since is isolated from tx2
+ *
+ * tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
+ *
+ * tx1.commit()                            // Will fail with OptimisticLockFailedException
+ *                                         // which means concurrent transaction changed the same PATH
+ *
+ * 
+ * + *

+ * Note: examples contains blocking calls on future only to illustrate + * that action happened after other asynchronous action. Use of blocking call + * {@link com.google.common.util.concurrent.ListenableFuture#get()} is discouraged for most uses and you should + * use + * {@link com.google.common.util.concurrent.Futures#addCallback(com.google.common.util.concurrent.ListenableFuture, com.google.common.util.concurrent.FutureCallback)} + * or other functions from {@link com.google.common.util.concurrent.Futures} to + * register more specific listeners. + * + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload */ public interface AsyncReadWriteTransaction

, D> extends AsyncReadTransaction, AsyncWriteTransaction { diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java index 23ca275ef2..c7cc91528b 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java @@ -13,7 +13,17 @@ import org.opendaylight.yangtools.concepts.Path; /** * - * @author + * A common parent for all transactions which operate on a conceptual data tree. + * + * See derived transaction types for more concrete behavior: + *

    + *
  • {@link AsyncReadTransaction} - Read capabilities, user is able to read data from data tree
  • + *
  • {@link AsyncWriteTransaction} - Write capabilities, user is able to propose changes to data tree
  • + *
  • {@link AsyncReadWriteTransaction} - Read and Write capabilities, user is able to read state and to propose changes of state.
  • + *
+ * + * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL. * * @param

Type of path (subtree identifier), which represents location in tree * @param Type of data (payload), which represents data payload diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java index 82c48d2ddb..e2734eaddc 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java @@ -13,56 +13,118 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import com.google.common.util.concurrent.ListenableFuture; -public interface AsyncWriteTransaction

, D> extends AsyncTransaction { +/** + * Write transaction provides mutation capabilities for a data tree. + * + *

+ * Initial state of write transaction is a stable snapshot of the current data tree. + * The state is captured when the transaction is created and its state and underlying + * data tree are not affected by other concurrently running transactions. + *

+ * Write transactions are isolated from other concurrent write transactions. All + * writes are local to the transaction and represent only a proposal of state + * change for the data tree and it is not visible to any other concurrently running + * transaction. + *

+ * Applications publish the changes proposed in the transaction by calling {@link #commit} + * on the transaction. This seals the transaction + * (preventing any further writes using this transaction) and submits it to be + * processed and applied to global conceptual data tree. + *

+ * The transaction commit may fail due to a concurrent transaction modifying and committing data in + * an incompatible way. See {@link #commit()} for more concrete commit failure examples. + * + * + *

+ * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ +public interface AsyncWriteTransaction

, D> extends AsyncTransaction { /** - * Cancels transaction. + * Cancels the transaction. * - * Transaction could be only cancelled if it's status - * is {@link TransactionStatus#NEW} or {@link TransactionStatus#SUBMITED} + * Transactions can only be cancelled if it's status is + * {@link TransactionStatus#NEW} or {@link TransactionStatus#SUBMITED} * - * Invoking cancel() on {@link TransactionStatus#FAILED} or {@link TransactionStatus#CANCELED} - * will have no effect. + * Invoking cancel() on {@link TransactionStatus#FAILED} or + * {@link TransactionStatus#CANCELED} will have no effect. * - * @throws IllegalStateException If transaction status is {@link TransactionStatus#COMMITED} + * @throws IllegalStateException + * If transaction status is {@link TransactionStatus#COMMITED} * */ public void cancel(); /** - * Store a piece of data at specified path. This acts as a add / replace operation, - * which is to say that whole subtree will be replaced by specified path. + * Store a piece of data at specified path. This acts as an add / replace + * operation, which is to say that whole subtree will be replaced by + * specified path. Performing the following put operations: + * + *

+     * 1) container { list [ a ] }
+     * 2) container { list [ b ] }
+     * 
+ * + * will result in the following data being present: + * + *
+     * container { list [ b ] }
+     * 
* - * If you need add or merge of current object with specified use {@link #merge(LogicalDatastoreType, Path, Object)} * - * @param store Logical data store which should be modified - * @param path Data object path - * @param data Data object to be written to specified path - * @throws IllegalStateException if the transaction is no longer {@link TransactionStatus#NEW} + * If you need to make sure that a parent object exists, but you do not want modify + * its preexisting state by using put, consider using + * {@link #merge(LogicalDatastoreType, Path, Object)} + * + * @param store + * Logical data store which should be modified + * @param path + * Data object path + * @param data + * Data object to be written to specified path + * @throws IllegalStateException + * if the transaction is no longer {@link TransactionStatus#NEW} */ public void put(LogicalDatastoreType store, P path, D data); /** - * Store a piece of data at specified path. This acts as a merge operation, + * Store a piece of data at the specified path. This acts as a merge operation, * which is to say that any pre-existing data which is not explicitly * overwritten will be preserved. This means that if you store a container, - * its child lists will be merged. Performing the following put operations: + * its child lists will be merged. Performing the following merge + * operations: * + *
      * 1) container { list [ a ] }
      * 2) container { list [ b ] }
+     * 
* * will result in the following data being present: * + *
      * container { list [ a, b ] }
+     * 
* - * This also means that storing the container will preserve any augmentations - * which have been attached to it. - * - * If you require an explicit replace operation, use {@link #put(LogicalDatastoreType, Path, Object)} instead. + * This also means that storing the container will preserve any + * augmentations which have been attached to it. + *

+ * If you require an explicit replace operation, use + * {@link #put(LogicalDatastoreType, Path, Object)} instead. * - * @param store Logical data store which should be modified - * @param path Data object path - * @param data Data object to be written to specified path - * @throws IllegalStateException if the transaction is no longer {@link TransactionStatus#NEW} + * @param store + * Logical data store which should be modified + * @param path + * Data object path + * @param data + * Data object to be written to specified path + * @throws IllegalStateException + * if the transaction is no longer {@link TransactionStatus#NEW} */ public void merge(LogicalDatastoreType store, P path, D data); @@ -70,9 +132,12 @@ public interface AsyncWriteTransaction

, D> extends AsyncTrans * Remove a piece of data from specified path. This operation does not fail * if the specified path does not exist. * - * @param store Logical data store which should be modified - * @param path Data object path - * @throws IllegalStateException if the transaction is no longer {@link TransactionStatus#NEW} + * @param store + * Logical data store which should be modified + * @param path + * Data object path + * @throws IllegalStateException + * if the transaction is no longer {@link TransactionStatus#NEW} */ public void delete(LogicalDatastoreType store, P path); @@ -80,41 +145,169 @@ public interface AsyncWriteTransaction

, D> extends AsyncTrans * * Closes transaction and resources allocated to the transaction. * - * This call does not change Transaction status. Client SHOULD - * explicitly {@link #commit()} or {@link #cancel()} transaction. + * This call does not change Transaction status. Client SHOULD explicitly + * {@link #commit()} or {@link #cancel()} transaction. * - * @throws IllegalStateException if the transaction has not been - * updated by invoking {@link #commit()} or {@link #cancel()}. + * @throws IllegalStateException + * if the transaction has not been updated by invoking + * {@link #commit()} or {@link #cancel()}. */ @Override public void close(); /** - * Initiates a commit of modification. This call logically seals the - * transaction, preventing any the client from interacting with the - * data stores. The transaction is marked as {@link TransactionStatus#SUBMITED} - * and enqueued into the data store backed for processing. + * Submits transaction to be applied to update logical data tree. + *

+ * This call logically seals the transaction, which prevents the client from + * further changing data tree using this transaction. Any subsequent calls to + * {@link #put(LogicalDatastoreType, Path, Object)}, + * {@link #merge(LogicalDatastoreType, Path, Object)} or + * {@link #delete(LogicalDatastoreType, Path)} will fail with + * {@link IllegalStateException}. + * + * The transaction is marked as {@link TransactionStatus#SUBMITED} and + * enqueued into the data store backed for processing. * *

- * The successful commit changes the state of the system and may affect - * several components. + * Whether or not the commit is successful is determined by versioning + * of data tree and validation of registered commit participants + * {@link AsyncConfigurationCommitHandler} + * if transaction changes {@link LogicalDatastoreType#CONFIGURATION} data tree. + *

+ * The effects of successful commit of data depends on + * other data change listeners {@link AsyncDataChangeListener} and + * {@link AsyncConfigurationCommitHandler}, which was registered to the + * same {@link AsyncDataBroker}, to which this transaction belongs. * + *

Failure scenarios

*

- * The effects of successful commit of data are described in the - * specifications and YANG models describing the Provider components of - * controller. It is assumed that Consumer has an understanding of this - * changes. - * - * @see DataCommitHandler for further information how two-phase commit is - * processed. - * @param store Identifier of the store, where commit should occur. + * Transaction may fail because of multiple reasons, such as + *

    + *
  • Another transaction finished earlier and modified the same node in + * non-compatible way (see below). In this case the returned future will fail with + * {@link OptimisticLockFailedException}. It is the responsibility of the + * caller to create a new transaction and submit the same modification again in + * order to update data tree.
  • + *
  • Data change introduced by this transaction did not pass validation by + * commit handlers or data was incorrectly structured. Returned future will + * fail with {@link DataValidationFailedException}. User should not retry to + * create new transaction with same data, since it probably will fail again. + *
  • + *
+ * + *

Change compatibility

+ * + * There are several sets of changes which could be considered incompatible + * between two transactions which are derived from same initial state. + * Rules for conflict detection applies recursively for each subtree + * level. + * + *

Change compatibility of leafs, leaf-list items

+ * + * Following table shows state changes and failures between two concurrent transactions, + * which are based on same initial state, Tx 1 completes successfully + * before Tx 2 is submitted. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Initial stateTx 1Tx 2Result
Emptyput(A,1)put(A,2)Tx 2 will fail, state is A=1
Emptyput(A,1)merge(A,2)A=2
Emptymerge(A,1)put(A,2)Tx 2 will fail, state is A=1
Emptymerge(A,1)merge(A,2)A=2
A=0put(A,1)put(A,2)Tx 2 will fail, A=1
A=0put(A,1)merge(A,2)A=2
A=0merge(A,1)put(A,2)Tx 2 will fail, A=1
A=0merge(A,1)merge(A,2)A=2
A=0delete(A)put(A,2)Tx 2 will fail, A does not exists
A=0delete(A)merge(A,2)A=2
+ * + *

Change compatibility of subtrees

+ * + * Following table shows state changes and failures between two concurrent transactions, + * which are based on same initial state, Tx 1 completes successfully + * before Tx 2 is submitted. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Initial stateTx 1Tx 2Result
Emptyput(TOP,[])put(TOP,[])Tx 2 will fail, state is TOP=[]
Emptyput(TOP,[])merge(TOP,[])TOP=[]
Emptyput(TOP,[FOO=1])put(TOP,[BAR=1])Tx 2 will fail, state is TOP=[FOO=1]
Emptyput(TOP,[FOO=1])merge(TOP,[BAR=1])TOP=[FOO=1,BAR=1]
Emptymerge(TOP,[FOO=1])put(TOP,[BAR=1])Tx 2 will fail, state is TOP=[FOO=1]
Emptymerge(TOP,[FOO=1])merge(TOP,[BAR=1])TOP=[FOO=1,BAR=1]
TOP=[]put(TOP,[FOO=1])put(TOP,[BAR=1])Tx 2 will fail, state is TOP=[FOO=1]
TOP=[]put(TOP,[FOO=1])merge(TOP,[BAR=1])state is TOP=[FOO=1,BAR=1]
TOP=[]merge(TOP,[FOO=1])put(TOP,[BAR=1])Tx 2 will fail, state is TOP=[FOO=1]
TOP=[]merge(TOP,[FOO=1])merge(TOP,[BAR=1])state is TOP=[FOO=1,BAR=1]
TOP=[]delete(TOP)put(TOP,[BAR=1])Tx 2 will fail, state is empty store
TOP=[]delete(TOP)merge(TOP,[BAR=1])state is TOP=[BAR=1]
TOP=[]put(TOP/FOO,1)put(TOP/BAR,1])state is TOP=[FOO=1,BAR=1]
TOP=[]put(TOP/FOO,1)merge(TOP/BAR,1)state is TOP=[FOO=1,BAR=1]
TOP=[]merge(TOP/FOO,1)put(TOP/BAR,1)state is TOP=[FOO=1,BAR=1]
TOP=[]merge(TOP/FOO,1)merge(TOP/BAR,1)state is TOP=[FOO=1,BAR=1]
TOP=[]delete(TOP)put(TOP/BAR,1)Tx 2 will fail, state is empty store
TOP=[]delete(TOP)merge(TOP/BAR,1]Tx 2 will fail, state is empty store
TOP=[FOO=1]put(TOP/FOO,2)put(TOP/BAR,1)state is TOP=[FOO=2,BAR=1]
TOP=[FOO=1]put(TOP/FOO,2)merge(TOP/BAR,1)state is TOP=[FOO=2,BAR=1]
TOP=[FOO=1]merge(TOP/FOO,2)put(TOP/BAR,1)state is TOP=[FOO=2,BAR=1]
TOP=[FOO=1]merge(TOP/FOO,2)merge(TOP/BAR,1)state is TOP=[FOO=2,BAR=1]
TOP=[FOO=1]delete(TOP/FOO)put(TOP/BAR,1)state is TOP=[BAR=1]
TOP=[FOO=1]delete(TOP/FOO)merge(TOP/BAR,1]state is TOP=[BAR=1]
+ * + * + *

Examples of failure scenarios

+ * + *

Conflict of two transactions

+ * + * This example illustrates two concurrent transactions, which derived from + * same initial state of data tree and proposes conflicting modifications. + * + *
+     * txA = broker.newWriteTransaction(); // allocates new transaction, data tree is empty
+     * txB = broker.newWriteTransaction(); // allocates new transaction, data tree is empty
+     *
+     * txA.put(CONFIGURATION, PATH, A);    // writes to PATH value A
+     * txB.put(CONFIGURATION, PATH, B)     // writes to PATH value B
+     *
+     * ListenableFuture futureA = txA.commit(); // transaction A is sealed and committed
+     * ListenebleFuture futureB = txB.commit(); // transaction B is sealed and committed
+     * 
+ * + * Commit of transaction A will be processed asynchronously and data tree + * will be updated to contain value A for PATH. + * Returned {@link ListenableFuture} will successfully complete once + * state is applied to data tree. + * + * Commit of Transaction B will fail, because previous transaction also + * modified path in a concurrent way. The state introduced by transaction B + * will not be applied. Returned {@link ListenableFuture} object will fail + * with {@link OptimisticLockFailedException} exception, which indicates to + * client that concurrent transaction prevented the submitted transaction from being + * applied. + * * @return Result of the Commit, containing success information or list of * encountered errors, if commit was not successful. The Future * blocks until {@link TransactionStatus#COMMITED} is reached. - * Future will fail with {@link TransactionCommitFailedException} - * if Commit of this transaction failed. + * Future will fail with {@link TransactionCommitFailedException} if + * Commit of this transaction failed. TODO: Usability: Consider + * change from ListenableFuture to + * {@link com.google.common.util.concurrent.CheckedFuture} which + * will throw {@link TransactionCommitFailedException}. * - * @throws IllegalStateException if the transaction is not {@link TransactionStatus#NEW} + * @throws IllegalStateException + * if the transaction is not {@link TransactionStatus#NEW} */ public ListenableFuture> commit(); diff --git a/opendaylight/md-sal/sal-common-impl/pom.xml b/opendaylight/md-sal/sal-common-impl/pom.xml index 6b387b5a61..82bd716c59 100644 --- a/opendaylight/md-sal/sal-common-impl/pom.xml +++ b/opendaylight/md-sal/sal-common-impl/pom.xml @@ -40,6 +40,11 @@ mockito-all test
+ + org.opendaylight.yangtools + yang-parser-impl + test +
diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java index a7c6b0c66f..7ce475dd59 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java @@ -10,6 +10,10 @@ package org.opendaylight.controller.md.sal.common.impl.util.compat; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -17,7 +21,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; - import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.CompositeNode; @@ -28,12 +31,15 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.Node; import org.opendaylight.yangtools.yang.data.api.SimpleNode; +import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder; +import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; @@ -45,11 +51,6 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import com.google.common.base.Optional; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; - public abstract class DataNormalizationOperation implements Identifiable { private final T identifier; @@ -612,6 +613,42 @@ public abstract class DataNormalizationOperation impleme } } + private static class AnyXmlNormalization extends DataNormalizationOperation { + + protected AnyXmlNormalization( NodeIdentifier identifier ) { + super( identifier ); + } + + @Override + public DataNormalizationOperation getChild( PathArgument child ) throws DataNormalizationException { + return null; + } + + @Override + public DataNormalizationOperation getChild( QName child ) throws DataNormalizationException { + return null; + } + + @Override + public NormalizedNode normalize( Node legacyData ) { + NormalizedNodeAttrBuilder, AnyXmlNode> builder = + Builders.anyXmlBuilder().withNodeIdentifier( + new NodeIdentifier( legacyData.getNodeType() ) ); + builder.withValue(legacyData); + return builder.build(); + } + + @Override + public boolean isLeaf() { + return false; + } + + @Override + public NormalizedNode createDefault( PathArgument currentArg ) { + return null; + } + } + private static final Optional findChildSchemaNode(final DataNodeContainer parent,final QName child) { DataSchemaNode potential = parent.getDataChildByName(child); if (potential == null) { @@ -712,6 +749,8 @@ public abstract class DataNormalizationOperation impleme return new ChoiceNodeNormalization((org.opendaylight.yangtools.yang.model.api.ChoiceNode) potential); } else if (potential instanceof LeafListSchemaNode) { return fromLeafListSchemaNode((LeafListSchemaNode) potential); + } else if (potential instanceof AnyXmlSchemaNode) { + return new AnyXmlNormalization( new NodeIdentifier(potential.getQName() ) ); } return null; } diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizer.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizer.java index f30c8ddcaa..ec8ce6ecd5 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizer.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizer.java @@ -9,11 +9,15 @@ package org.opendaylight.controller.md.sal.common.impl.util.compat; import static com.google.common.base.Preconditions.checkArgument; +import com.google.common.base.Preconditions; +import com.google.common.base.Predicates; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; @@ -21,6 +25,7 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationI import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.Node; import org.opendaylight.yangtools.yang.data.api.SimpleNode; +import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MixinNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -31,12 +36,6 @@ import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl; import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicates; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - public class DataNormalizer { private final DataNormalizationOperation operation; @@ -134,6 +133,9 @@ public class DataNormalizer { // DataContainerNode,"Node object %s, %s should be of type DataContainerNode",normalizedPath,normalizedData); if (normalizedData instanceof DataContainerNode) { return toLegacyFromDataContainer((DataContainerNode) normalizedData); + } else if (normalizedData instanceof AnyXmlNode) { + Node value = ((AnyXmlNode) normalizedData).getValue(); + return value instanceof CompositeNode ? (CompositeNode)value : null; } return null; } @@ -150,6 +152,8 @@ public class DataNormalizer { if (node instanceof DataContainerNode) { return toLegacyFromDataContainer((DataContainerNode) node); + } else if (node instanceof AnyXmlNode) { + return ((AnyXmlNode) node).getValue(); } return toLegacySimple(node); diff --git a/opendaylight/md-sal/sal-common-impl/src/test/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizerTest.java b/opendaylight/md-sal/sal-common-impl/src/test/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizerTest.java new file mode 100644 index 0000000000..ddf089c68f --- /dev/null +++ b/opendaylight/md-sal/sal-common-impl/src/test/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizerTest.java @@ -0,0 +1,768 @@ +/* + * Copyright (c) 2014 Brocade Communications 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.common.impl.util.compat; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.junit.Test; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.Node; +import org.opendaylight.yangtools.yang.data.api.SimpleNode; +import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; +import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; +import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; +import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapNode; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; +import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; +import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; +import org.opendaylight.yangtools.yang.data.impl.NodeFactory; +import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; + +public class DataNormalizerTest { + + static class NormalizedNodeData { + PathArgument nodeID; + Class nodeClass; + Object nodeData; // List for a container, value Object for a leaf + + NormalizedNodeData(PathArgument nodeID, Class nodeClass, Object nodeData) { + this.nodeID = nodeID; + this.nodeClass = nodeClass; + this.nodeData = nodeData; + } + } + + static class LegacyNodeData { + QName nodeKey; + Object nodeData; // List for a CompositeNode, value Object for a + // SimpeNode + + LegacyNodeData(QName nodeKey, Object nodeData) { + this.nodeKey = nodeKey; + this.nodeData = nodeData; + } + + @Override + public String toString() { + return nodeKey.toString(); + } + } + + static final QName TEST_QNAME = QName.create( + "urn:opendaylight:params:xml:ns:yang:controller:md:sal:normalization:test", "2014-03-13", "test"); + static final QName OUTER_LIST_QNAME = QName.create(TEST_QNAME, "outer-list"); + static final QName INNER_LIST_QNAME = QName.create(TEST_QNAME, "inner-list"); + static final QName OUTER_CHOICE_QNAME = QName.create(TEST_QNAME, "outer-choice"); + static final QName ID_QNAME = QName.create(TEST_QNAME, "id"); + static final QName NAME_QNAME = QName.create(TEST_QNAME, "name"); + static final QName VALUE_QNAME = QName.create(TEST_QNAME, "value"); + + static final InstanceIdentifier TEST_PATH = InstanceIdentifier.of(TEST_QNAME); + static final InstanceIdentifier OUTER_LIST_PATH = InstanceIdentifier.builder(TEST_PATH).node(OUTER_LIST_QNAME) + .build(); + static final QName ONE_QNAME = QName.create(TEST_QNAME, "one"); + static final QName TWO_QNAME = QName.create(TEST_QNAME, "two"); + static final QName THREE_QNAME = QName.create(TEST_QNAME, "three"); + + static final QName ANY_XML_DATA_QNAME = QName.create(TEST_QNAME, "any-xml-data"); + static final QName OUTER_CONTAINER_QNAME = QName.create(TEST_QNAME, "outer-container"); + static final QName AUGMENTED_LEAF_QNAME = QName.create(TEST_QNAME, "augmented-leaf"); + static final QName UNKEYED_LIST_QNAME = QName.create(TEST_QNAME, "unkeyed-list"); + static final QName UNORDERED_LEAF_LIST_QNAME = QName.create(TEST_QNAME, "unordered-leaf-list"); + static final QName ORDERED_LEAF_LIST_QNAME = QName.create(TEST_QNAME, "ordered-leaf-list"); + + static final Short OUTER_LIST_ID = (short) 10; + + static final InstanceIdentifier OUTER_LIST_PATH_LEGACY = InstanceIdentifier.builder(TEST_QNAME) + .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, OUTER_LIST_ID).build(); + + static final InstanceIdentifier LEAF_TWO_PATH_LEGACY = InstanceIdentifier.builder(OUTER_LIST_PATH_LEGACY) + .node(TWO_QNAME).build(); + + static final QName ANY_XML_LEAF_QNAME = QName.create(TEST_QNAME, "leaf");; + static final QName ANY_XML_INNER_QNAME = QName.create(TEST_QNAME, "inner"); + static final QName ANY_XML_INNER_LEAF_QNAME = QName.create(TEST_QNAME, "inner-leaf"); + + SchemaContext createTestContext() { + YangParserImpl parser = new YangParserImpl(); + Set modules = parser.parseYangModelsFromStreams(Collections.singletonList(DataNormalizerTest.class + .getResourceAsStream("/normalization-test.yang"))); + return parser.resolveSchemaContext(modules); + } + + @Test + public void testToNormalizedInstanceIdentifier() { + SchemaContext testCtx = createTestContext(); + DataNormalizer normalizer = new DataNormalizer(testCtx); + + InstanceIdentifier normalizedPath = normalizer.toNormalized(LEAF_TWO_PATH_LEGACY); + + verifyNormalizedInstanceIdentifier(normalizedPath, TEST_QNAME, OUTER_LIST_QNAME, new Object[] { + OUTER_LIST_QNAME, ID_QNAME, OUTER_LIST_ID }, OUTER_CHOICE_QNAME, TWO_QNAME); + } + + private void verifyNormalizedInstanceIdentifier(InstanceIdentifier actual, Object... expPath) { + + assertNotNull("Actual InstanceIdentifier is null", actual); + assertEquals("InstanceIdentifier path length", expPath.length, actual.getPath().size()); + + for (int i = 0; i < expPath.length; i++) { + PathArgument actualArg = actual.getPath().get(i); + if (expPath[i] instanceof Object[]) { // NodeIdentifierWithPredicates + Object[] exp = (Object[]) expPath[i]; + assertEquals("Actual path arg " + (i + 1) + " class", NodeIdentifierWithPredicates.class, + actualArg.getClass()); + NodeIdentifierWithPredicates actualNode = (NodeIdentifierWithPredicates) actualArg; + assertEquals("Actual path arg " + (i + 1) + " node type", exp[0], actualNode.getNodeType()); + assertEquals("Actual path arg " + (i + 1) + " key values map size", 1, actualNode.getKeyValues().size()); + Entry keyValuesEntry = actualNode.getKeyValues().entrySet().iterator().next(); + assertEquals("Actual path arg " + (i + 1) + " key values map key", exp[1], keyValuesEntry.getKey()); + assertEquals("Actual path arg " + (i + 1) + " key values map value", exp[2], keyValuesEntry.getValue()); + } else if (expPath[i] instanceof Set) { // AugmentationIdentifier + assertEquals("Actual path arg " + (i + 1) + " class", AugmentationIdentifier.class, + actualArg.getClass()); + AugmentationIdentifier actualNode = (AugmentationIdentifier) actualArg; + assertEquals("Actual path arg " + (i + 1) + " PossibleChildNames", expPath[i], + actualNode.getPossibleChildNames()); + } else { + assertEquals("Actual path arg " + (i + 1) + " node type", expPath[i], actualArg.getNodeType()); + } + } + } + + @Test + public void testToLegacyInstanceIdentifier() throws DataNormalizationException { + + DataNormalizer normalizer = new DataNormalizer(createTestContext()); + + InstanceIdentifier normalized = InstanceIdentifier.builder().node(TEST_QNAME).node(OUTER_LIST_QNAME) + .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, OUTER_LIST_ID).node(OUTER_CHOICE_QNAME).node(TWO_QNAME) + .build(); + + InstanceIdentifier legacy = normalizer.toLegacy(normalized); + + assertEquals("Legacy InstanceIdentifier", LEAF_TWO_PATH_LEGACY, legacy); + } + + @Test + public void testToLegacyNormalizedNode() { + + ChoiceNode choiceNode1 = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(OUTER_CHOICE_QNAME)) + .withChild(ImmutableNodes.leafNode(TWO_QNAME, "two")) + .withChild(ImmutableNodes.leafNode(THREE_QNAME, "three")).build(); + + MapEntryNode innerListEntryNode1 = Builders.mapEntryBuilder() + .withNodeIdentifier(new NodeIdentifierWithPredicates(INNER_LIST_QNAME, NAME_QNAME, "inner-name1")) + .withChild(ImmutableNodes.leafNode(NAME_QNAME, "inner-name1")) + .withChild(ImmutableNodes.leafNode(VALUE_QNAME, "inner-value1")).build(); + + MapEntryNode innerListEntryNode2 = Builders.mapEntryBuilder() + .withNodeIdentifier(new NodeIdentifierWithPredicates(INNER_LIST_QNAME, NAME_QNAME, "inner-name2")) + .withChild(ImmutableNodes.leafNode(NAME_QNAME, "inner-name2")) + .withChild(ImmutableNodes.leafNode(VALUE_QNAME, "inner-value2")).build(); + + OrderedMapNode innerListNode = Builders.orderedMapBuilder() + .withNodeIdentifier(new NodeIdentifier(INNER_LIST_QNAME)).withChild(innerListEntryNode1) + .withChild(innerListEntryNode2).build(); + + Short outerListID1 = Short.valueOf((short) 10); + MapEntryNode outerListEntryNode1 = Builders.mapEntryBuilder() + .withNodeIdentifier(new NodeIdentifierWithPredicates(OUTER_LIST_QNAME, ID_QNAME, outerListID1)) + .withChild(ImmutableNodes.leafNode(ID_QNAME, outerListID1)).withChild(choiceNode1) + .withChild(innerListNode).build(); + + ChoiceNode choiceNode2 = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(OUTER_CHOICE_QNAME)) + .withChild(ImmutableNodes.leafNode(ONE_QNAME, "one")).build(); + + Short outerListID2 = Short.valueOf((short) 20); + MapEntryNode outerListEntryNode2 = Builders.mapEntryBuilder() + .withNodeIdentifier(new NodeIdentifierWithPredicates(OUTER_LIST_QNAME, ID_QNAME, outerListID2)) + .withChild(ImmutableNodes.leafNode(ID_QNAME, outerListID2)).withChild(choiceNode2).build(); + + MapNode outerListNode = Builders.mapBuilder().withNodeIdentifier(new NodeIdentifier(OUTER_LIST_QNAME)) + .withChild(outerListEntryNode1).withChild(outerListEntryNode2).build(); + + UnkeyedListEntryNode unkeyedListEntryNode1 = Builders.unkeyedListEntryBuilder() + .withNodeIdentifier(new NodeIdentifier(UNKEYED_LIST_QNAME)) + .withChild(ImmutableNodes.leafNode(NAME_QNAME, "unkeyed1")).build(); + + UnkeyedListEntryNode unkeyedListEntryNode2 = Builders.unkeyedListEntryBuilder() + .withNodeIdentifier(new NodeIdentifier(UNKEYED_LIST_QNAME)) + .withChild(ImmutableNodes.leafNode(NAME_QNAME, "unkeyed2")).build(); + + UnkeyedListNode unkeyedListNode = Builders.unkeyedListBuilder() + .withNodeIdentifier(new NodeIdentifier(UNKEYED_LIST_QNAME)).withChild(unkeyedListEntryNode1) + .withChild(unkeyedListEntryNode2).build(); + + ContainerNode testContainerNode = Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(TEST_QNAME)).withChild(outerListNode).withChild(unkeyedListNode) + .build(); + + Node legacyNode = DataNormalizer.toLegacy(testContainerNode); + + verifyLegacyNode( + legacyNode, + expectCompositeNode( + TEST_QNAME, + expectCompositeNode( + OUTER_LIST_QNAME, + expectSimpleNode(ID_QNAME, outerListID1), + expectSimpleNode(TWO_QNAME, "two"), + expectSimpleNode(THREE_QNAME, "three"), + + expectCompositeNode(INNER_LIST_QNAME, expectSimpleNode(NAME_QNAME, "inner-name1"), + expectSimpleNode(VALUE_QNAME, "inner-value1")), + + expectCompositeNode(INNER_LIST_QNAME, expectSimpleNode(NAME_QNAME, "inner-name2"), + expectSimpleNode(VALUE_QNAME, "inner-value2"))), + expectCompositeNode(OUTER_LIST_QNAME, expectSimpleNode(ID_QNAME, outerListID2), + expectSimpleNode(ONE_QNAME, "one")), + expectCompositeNode(UNKEYED_LIST_QNAME, expectSimpleNode(NAME_QNAME, "unkeyed1")), + expectCompositeNode(UNKEYED_LIST_QNAME, expectSimpleNode(NAME_QNAME, "unkeyed2")))); + + // Conversion of Mixin type nodes is not supported. + + assertNull("Expected null returned for Mixin type node", DataNormalizer.toLegacy(outerListNode)); + } + + /** + * Following data are constructed: + * inner-leaf-value + * leaf-value + */ + @Test + public void testToLegacyNormalizedNodeWithAnyXml() { + + Node innerLeafChild = NodeFactory.createImmutableSimpleNode(ANY_XML_INNER_LEAF_QNAME, null, + "inner-leaf-value"); + CompositeNode innerContainer = NodeFactory.createImmutableCompositeNode(ANY_XML_INNER_QNAME, null, + Collections.> singletonList(innerLeafChild)); + + Node leafChild = NodeFactory.createImmutableSimpleNode(ANY_XML_LEAF_QNAME, null, "leaf-value"); + CompositeNode anyXmlNodeValue = NodeFactory.createImmutableCompositeNode(ANY_XML_DATA_QNAME, null, + Arrays.asList(leafChild, innerContainer)); + + AnyXmlNode testAnyXmlNode = Builders.anyXmlBuilder().withNodeIdentifier(new NodeIdentifier(TEST_QNAME)) + .withValue(anyXmlNodeValue).build(); + + ContainerNode testContainerNode = Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(TEST_QNAME)).withChild(testAnyXmlNode).build(); + + DataNormalizer normalizer = new DataNormalizer(createTestContext()); + Node legacyNode = normalizer.toLegacy(InstanceIdentifier.builder(TEST_QNAME).build(), testContainerNode); + + verifyLegacyNode( + legacyNode, + expectCompositeNode( + TEST_QNAME, + expectCompositeNode( + ANY_XML_DATA_QNAME, + expectSimpleNode(ANY_XML_LEAF_QNAME, "leaf-value"), + expectCompositeNode(ANY_XML_INNER_QNAME, + expectSimpleNode(ANY_XML_INNER_LEAF_QNAME, "inner-leaf-value"))))); + } + + @Test + public void testToLegacyNormalizedNodeWithLeafLists() { + + CompositeNodeBuilder testBuilder = ImmutableCompositeNode.builder(); + testBuilder.setQName(TEST_QNAME); + + ListNodeBuilder> leafSetBuilder = Builders.leafSetBuilder() + .withNodeIdentifier(new NodeIdentifier(UNORDERED_LEAF_LIST_QNAME)); + for (int i = 1; i <= 3; i++) { + leafSetBuilder.withChildValue("unordered-value" + i); + } + + ListNodeBuilder> orderedLeafSetBuilder = Builders.orderedLeafSetBuilder() + .withNodeIdentifier(new NodeIdentifier(ORDERED_LEAF_LIST_QNAME)); + for (int i = 3; i > 0; i--) { + orderedLeafSetBuilder.withChildValue("ordered-value" + i); + } + + ContainerNode testContainerNode = Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(TEST_QNAME)).withChild(leafSetBuilder.build()) + .withChild(orderedLeafSetBuilder.build()).build(); + + DataNormalizer normalizer = new DataNormalizer(createTestContext()); + + Node legacyNode = normalizer.toLegacy(InstanceIdentifier.builder(TEST_QNAME).build(), testContainerNode); + + verifyLegacyNode( + legacyNode, + expectCompositeNode(TEST_QNAME, expectSimpleNode(UNORDERED_LEAF_LIST_QNAME, "unordered-value1"), + expectSimpleNode(UNORDERED_LEAF_LIST_QNAME, "unordered-value2"), + expectSimpleNode(UNORDERED_LEAF_LIST_QNAME, "unordered-value3"), + expectSimpleNode(ORDERED_LEAF_LIST_QNAME, "ordered-value3"), + expectSimpleNode(ORDERED_LEAF_LIST_QNAME, "ordered-value2"), + expectSimpleNode(ORDERED_LEAF_LIST_QNAME, "ordered-value1"))); + } + + @Test + public void testToLegacyNormalizedNodeWithAugmentation() { + + AugmentationNode augmentationNode = Builders.augmentationBuilder() + .withNodeIdentifier(new AugmentationIdentifier(Sets.newHashSet(AUGMENTED_LEAF_QNAME))) + .withChild(ImmutableNodes.leafNode(AUGMENTED_LEAF_QNAME, "augmented-value")).build(); + + ContainerNode outerContainerNode = Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(OUTER_CONTAINER_QNAME)).withChild(augmentationNode).build(); + + ContainerNode testContainerNode = Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(TEST_QNAME)).withChild(outerContainerNode).build(); + + DataNormalizer normalizer = new DataNormalizer(createTestContext()); + + Node legacyNode = normalizer.toLegacy(InstanceIdentifier.builder(TEST_QNAME).build(), testContainerNode); + + verifyLegacyNode( + legacyNode, + expectCompositeNode( + TEST_QNAME, + expectCompositeNode(OUTER_CONTAINER_QNAME, + expectSimpleNode(AUGMENTED_LEAF_QNAME, "augmented-value")))); + } + + private boolean isOrdered(QName nodeName) { + return ORDERED_LEAF_LIST_QNAME.equals(nodeName) || INNER_LIST_QNAME.equals(nodeName); + } + + @SuppressWarnings("unchecked") + private void verifyLegacyNode(Node actual, LegacyNodeData expNodeData) { + + assertNotNull("Actual Node is null", actual); + assertTrue("Expected CompositeNode instance", actual instanceof CompositeNode); + CompositeNode actualCN = (CompositeNode) actual; + assertEquals("Node key", expNodeData.nodeKey, actualCN.getKey()); + + List expChildData = Lists.newArrayList(); + List unorderdChildData = Lists.newArrayList(); + for (LegacyNodeData data : (List) expNodeData.nodeData) { + if (isOrdered(data.nodeKey)) { + expChildData.add(data); + } else { + unorderdChildData.add(data); + } + } + + Collections.sort(unorderdChildData, new Comparator() { + @Override + public int compare(LegacyNodeData arg1, LegacyNodeData arg2) { + String str1 = arg1.nodeKey.getLocalName(); + if (!(arg1.nodeData instanceof List)) + str1 += arg1.nodeData; // add simple node value + + String str2 = arg2.nodeKey.getLocalName(); + if (!(arg2.nodeData instanceof List)) + str2 += arg2.nodeData; // add simple node value + + return str1.compareTo(str2); + } + }); + + expChildData.addAll(unorderdChildData); + + List> actualChildNodes = Lists.newArrayList(); + List> unorderedChildNodes = Lists.newArrayList(); + for (Node node : actualCN.getValue()) { + if (isOrdered(node.getKey())) { + actualChildNodes.add(node); + } else { + unorderedChildNodes.add(node); + } + } + + Collections.sort(unorderedChildNodes, new Comparator>() { + @Override + public int compare(Node n1, Node n2) { + String str1 = n1.getKey().getLocalName(); + if (n1 instanceof SimpleNode) + str1 += ((SimpleNode) n1).getValue(); + + String str2 = n2.getKey().getLocalName(); + if (n2 instanceof SimpleNode) + str2 += ((SimpleNode) n2).getValue(); + + return str1.compareTo(str2); + } + }); + + actualChildNodes.addAll(unorderedChildNodes); + + for (Node actualChild : actualChildNodes) { + LegacyNodeData expData = expChildData.isEmpty() ? null : expChildData.remove(0); + assertNotNull("Unexpected child node with key " + actualChild.getKey(), expData); + assertEquals("Child node QName", expData.nodeKey, actualChild.getKey()); + + if (expData.nodeData instanceof List) { // List represents a + // composite node + verifyLegacyNode(actualChild, expData); + } else { // else a simple node + assertTrue("Expected SimpleNode instance", actualChild instanceof SimpleNode); + assertEquals("Child node value with key " + actualChild.getKey(), expData.nodeData, + ((SimpleNode) actualChild).getValue()); + } + } + + if (!expChildData.isEmpty()) { + fail("Missing child nodes: " + expChildData); + } + } + + private LegacyNodeData expectCompositeNode(QName key, LegacyNodeData... childData) { + return new LegacyNodeData(key, Lists.newArrayList(childData)); + } + + private LegacyNodeData expectSimpleNode(QName key, Object value) { + return new LegacyNodeData(key, value); + } + + @Test + public void testToNormalizedCompositeNode() { + SchemaContext testCtx = createTestContext(); + DataNormalizer normalizer = new DataNormalizer(testCtx); + + CompositeNodeBuilder testBuilder = ImmutableCompositeNode.builder(); + testBuilder.setQName(TEST_QNAME); + + CompositeNodeBuilder outerListBuilder = ImmutableCompositeNode.builder(); + outerListBuilder.setQName(OUTER_LIST_QNAME); + outerListBuilder.addLeaf(ID_QNAME, 10); + outerListBuilder.addLeaf(ONE_QNAME, "one"); + + for (int i = 3; i > 0; i--) { + CompositeNodeBuilder innerListBuilder = ImmutableCompositeNode.builder(); + innerListBuilder.setQName(INNER_LIST_QNAME); + innerListBuilder.addLeaf(NAME_QNAME, "inner-name" + i); + innerListBuilder.addLeaf(VALUE_QNAME, "inner-value" + i); + outerListBuilder.add(innerListBuilder.toInstance()); + } + + testBuilder.add(outerListBuilder.toInstance()); + + outerListBuilder = ImmutableCompositeNode.builder(); + outerListBuilder.setQName(OUTER_LIST_QNAME); + outerListBuilder.addLeaf(ID_QNAME, 20); + outerListBuilder.addLeaf(TWO_QNAME, "two"); + outerListBuilder.addLeaf(THREE_QNAME, "three"); + testBuilder.add(outerListBuilder.toInstance()); + + for (int i = 1; i <= 2; i++) { + CompositeNodeBuilder unkeyedListBuilder = ImmutableCompositeNode.builder(); + unkeyedListBuilder.setQName(UNKEYED_LIST_QNAME); + unkeyedListBuilder.addLeaf(NAME_QNAME, "unkeyed-name" + i); + testBuilder.add(unkeyedListBuilder.toInstance()); + } + + Entry> normalizedNodeEntry = normalizer + .toNormalized(new AbstractMap.SimpleEntry(new InstanceIdentifier( + ImmutableList. of(new NodeIdentifier(TEST_QNAME))), testBuilder.toInstance())); + + verifyNormalizedInstanceIdentifier(normalizedNodeEntry.getKey(), TEST_QNAME); + + verifyNormalizedNode( + normalizedNodeEntry.getValue(), + expectContainerNode( + TEST_QNAME, + expectMapNode( + OUTER_LIST_QNAME, + expectMapEntryNode( + OUTER_LIST_QNAME, + ID_QNAME, + 10, + expectLeafNode(ID_QNAME, 10), + expectChoiceNode(OUTER_CHOICE_QNAME, expectLeafNode(ONE_QNAME, "one")), + expectOrderedMapNode( + INNER_LIST_QNAME, + expectMapEntryNode(INNER_LIST_QNAME, NAME_QNAME, "inner-name3", + expectLeafNode(NAME_QNAME, "inner-name3"), + expectLeafNode(VALUE_QNAME, "inner-value3")), + expectMapEntryNode(INNER_LIST_QNAME, NAME_QNAME, "inner-name2", + expectLeafNode(NAME_QNAME, "inner-name2"), + expectLeafNode(VALUE_QNAME, "inner-value2")), + expectMapEntryNode(INNER_LIST_QNAME, NAME_QNAME, "inner-name1", + expectLeafNode(NAME_QNAME, "inner-name1"), + expectLeafNode(VALUE_QNAME, "inner-value1")))), + expectMapEntryNode( + OUTER_LIST_QNAME, + ID_QNAME, + 20, + expectLeafNode(ID_QNAME, 20), + expectChoiceNode(OUTER_CHOICE_QNAME, expectLeafNode(TWO_QNAME, "two"), + expectLeafNode(THREE_QNAME, "three")))), + expectUnkeyedListNode( + UNKEYED_LIST_QNAME, + expectUnkeyedListEntryNode(UNKEYED_LIST_QNAME, + expectLeafNode(NAME_QNAME, "unkeyed-name1")), + expectUnkeyedListEntryNode(UNKEYED_LIST_QNAME, + expectLeafNode(NAME_QNAME, "unkeyed-name2"))))); + } + + @Test + public void testToNormalizedCompositeNodeWithAnyXml() { + SchemaContext testCtx = createTestContext(); + DataNormalizer normalizer = new DataNormalizer(testCtx); + + CompositeNodeBuilder testBuilder = ImmutableCompositeNode.builder(); + testBuilder.setQName(TEST_QNAME); + + CompositeNodeBuilder anyXmlBuilder = ImmutableCompositeNode.builder(); + anyXmlBuilder.setQName(ANY_XML_DATA_QNAME); + anyXmlBuilder.addLeaf(ANY_XML_LEAF_QNAME, "leaf-value"); + + CompositeNodeBuilder innerBuilder = ImmutableCompositeNode.builder(); + innerBuilder.setQName(ANY_XML_INNER_QNAME); + innerBuilder.addLeaf(ANY_XML_INNER_LEAF_QNAME, "inner-leaf-value"); + + anyXmlBuilder.add(innerBuilder.toInstance()); + CompositeNode anyXmlLegacy = anyXmlBuilder.toInstance(); + testBuilder.add(anyXmlLegacy); + + Entry> normalizedNodeEntry = normalizer + .toNormalized(new AbstractMap.SimpleEntry(new InstanceIdentifier( + ImmutableList. of(new NodeIdentifier(TEST_QNAME))), testBuilder.toInstance())); + + verifyNormalizedInstanceIdentifier(normalizedNodeEntry.getKey(), TEST_QNAME); + + verifyNormalizedNode(normalizedNodeEntry.getValue(), + expectContainerNode(TEST_QNAME, expectAnyXmlNode(ANY_XML_DATA_QNAME, anyXmlLegacy))); + } + + @Test + public void testToNormalizedCompositeNodeWithAugmentation() { + SchemaContext testCtx = createTestContext(); + DataNormalizer normalizer = new DataNormalizer(testCtx); + + CompositeNodeBuilder testBuilder = ImmutableCompositeNode.builder(); + testBuilder.setQName(TEST_QNAME); + + CompositeNodeBuilder outerContBuilder = ImmutableCompositeNode.builder(); + outerContBuilder.setQName(OUTER_CONTAINER_QNAME); + outerContBuilder.addLeaf(AUGMENTED_LEAF_QNAME, "augmented-value"); + + testBuilder.add(outerContBuilder.toInstance()); + + Entry> normalizedNodeEntry = normalizer + .toNormalized(new AbstractMap.SimpleEntry(new InstanceIdentifier( + ImmutableList. of(new NodeIdentifier(TEST_QNAME))), testBuilder.toInstance())); + + verifyNormalizedInstanceIdentifier(normalizedNodeEntry.getKey(), TEST_QNAME); + + NormalizedNodeData expAugmentation = expectAugmentation(AUGMENTED_LEAF_QNAME, + expectLeafNode(AUGMENTED_LEAF_QNAME, "augmented-value")); + + verifyNormalizedNode(normalizedNodeEntry.getValue(), + expectContainerNode(TEST_QNAME, expectContainerNode(OUTER_CONTAINER_QNAME, expAugmentation))); + + normalizedNodeEntry = normalizer.toNormalized(new AbstractMap.SimpleEntry( + new InstanceIdentifier(Lists.newArrayList(new NodeIdentifier(TEST_QNAME), new NodeIdentifier( + OUTER_CONTAINER_QNAME))), outerContBuilder.toInstance())); + + verifyNormalizedInstanceIdentifier(normalizedNodeEntry.getKey(), TEST_QNAME, OUTER_CONTAINER_QNAME, + Sets.newHashSet(AUGMENTED_LEAF_QNAME)); + + verifyNormalizedNode(normalizedNodeEntry.getValue(), expAugmentation); + } + + @Test + public void testToNormalizedCompositeNodeWithLeafLists() { + SchemaContext testCtx = createTestContext(); + DataNormalizer normalizer = new DataNormalizer(testCtx); + + CompositeNodeBuilder testBuilder = ImmutableCompositeNode.builder(); + testBuilder.setQName(TEST_QNAME); + + for (int i = 1; i <= 3; i++) { + testBuilder.addLeaf(UNORDERED_LEAF_LIST_QNAME, "unordered-value" + i); + } + + for (int i = 3; i > 0; i--) { + testBuilder.addLeaf(ORDERED_LEAF_LIST_QNAME, "ordered-value" + i); + } + + Entry> normalizedNodeEntry = normalizer + .toNormalized(new AbstractMap.SimpleEntry(new InstanceIdentifier( + ImmutableList. of(new NodeIdentifier(TEST_QNAME))), testBuilder.toInstance())); + + verifyNormalizedInstanceIdentifier(normalizedNodeEntry.getKey(), TEST_QNAME); + + verifyNormalizedNode( + normalizedNodeEntry.getValue(), + expectContainerNode( + TEST_QNAME, + expectLeafSetNode(UNORDERED_LEAF_LIST_QNAME, + expectLeafSetEntryNode(UNORDERED_LEAF_LIST_QNAME, "unordered-value1"), + expectLeafSetEntryNode(UNORDERED_LEAF_LIST_QNAME, "unordered-value2"), + expectLeafSetEntryNode(UNORDERED_LEAF_LIST_QNAME, "unordered-value3")), + expectOrderedLeafSetNode(ORDERED_LEAF_LIST_QNAME, + expectLeafSetEntryNode(ORDERED_LEAF_LIST_QNAME, "ordered-value3"), + expectLeafSetEntryNode(ORDERED_LEAF_LIST_QNAME, "ordered-value2"), + expectLeafSetEntryNode(ORDERED_LEAF_LIST_QNAME, "ordered-value1")))); + } + + @SuppressWarnings("unchecked") + private void verifyNormalizedNode(NormalizedNode actual, NormalizedNodeData expNodeData) { + + Class expNodeClass = expNodeData.nodeClass; + PathArgument expNodeID = expNodeData.nodeID; + + assertNotNull("Actual NormalizedNode is null", actual); + assertTrue("NormalizedNode instance " + actual.getClass() + " is not derived from " + expNodeClass, + expNodeClass.isAssignableFrom(actual.getClass())); + assertEquals("NormalizedNode identifier", expNodeID, actual.getIdentifier()); + + if (expNodeData.nodeData instanceof List) { + Map orderingMap = null; + if (expNodeClass.equals(OrderedMapNode.class) || expNodeClass.equals(OrderedLeafSetNode.class)) { + orderingMap = Maps.newHashMap(); + } + + int i = 1; + Map expChildDataMap = Maps.newHashMap(); + List expChildDataList = (List) expNodeData.nodeData; + for (NormalizedNodeData data : expChildDataList) { + expChildDataMap.put(data.nodeID, data); + + if (orderingMap != null) { + orderingMap.put(data.nodeID, i++); + } + } + + assertNotNull("Actual value is null for node " + actual.getIdentifier(), actual.getValue()); + assertTrue("Expected value instance Iterable for node " + actual.getIdentifier(), + Iterable.class.isAssignableFrom(actual.getValue().getClass())); + + i = 1; + for (NormalizedNode actualChild : (Iterable>) actual.getValue()) { + NormalizedNodeData expChildData = expNodeClass.equals(UnkeyedListNode.class) ? expChildDataList + .remove(0) : expChildDataMap.remove(actualChild.getIdentifier()); + + assertNotNull( + "Unexpected child node " + actualChild.getClass() + " with identifier " + + actualChild.getIdentifier() + " for parent node " + actual.getClass() + + " with identifier " + actual.getIdentifier(), expChildData); + + if (orderingMap != null) { + assertEquals("Order index for child node " + actualChild.getIdentifier(), + orderingMap.get(actualChild.getIdentifier()), Integer.valueOf(i)); + } + + verifyNormalizedNode(actualChild, expChildData); + i++; + } + + if (expNodeClass.equals(UnkeyedListNode.class)) { + if (expChildDataList.size() > 0) { + fail("Missing " + expChildDataList.size() + " child nodes for parent " + actual.getIdentifier()); + } + } else { + if (!expChildDataMap.isEmpty()) { + fail("Missing child nodes for parent " + actual.getIdentifier() + ": " + expChildDataMap.keySet()); + } + } + } else { + assertEquals("Leaf value for node " + actual.getIdentifier(), expNodeData.nodeData, actual.getValue()); + } + } + + private NormalizedNodeData expectOrderedLeafSetNode(QName nodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), OrderedLeafSetNode.class, + Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectLeafSetNode(QName nodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), LeafSetNode.class, Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectLeafSetEntryNode(QName nodeName, Object value) { + return new NormalizedNodeData(new NodeWithValue(nodeName, value), LeafSetEntryNode.class, value); + } + + private NormalizedNodeData expectUnkeyedListNode(QName nodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), UnkeyedListNode.class, + Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectUnkeyedListEntryNode(QName nodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), UnkeyedListEntryNode.class, + Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectAugmentation(QName augmentedNodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new AugmentationIdentifier(Sets.newHashSet(augmentedNodeName)), + AugmentationNode.class, Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectAnyXmlNode(QName nodeName, Object value) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), AnyXmlNode.class, value); + } + + private NormalizedNodeData expectContainerNode(QName nodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), ContainerNode.class, Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectChoiceNode(QName nodeName, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), ChoiceNode.class, Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectLeafNode(QName nodeName, Object value) { + return new NormalizedNodeData(new NodeIdentifier(nodeName), LeafNode.class, value); + + } + + private NormalizedNodeData expectMapEntryNode(QName nodeName, QName key, Object value, + NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifierWithPredicates(nodeName, key, value), MapEntryNode.class, + Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectMapNode(QName key, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(key), MapNode.class, Lists.newArrayList(childData)); + } + + private NormalizedNodeData expectOrderedMapNode(QName key, NormalizedNodeData... childData) { + return new NormalizedNodeData(new NodeIdentifier(key), OrderedMapNode.class, Lists.newArrayList(childData)); + } +} diff --git a/opendaylight/md-sal/sal-common-impl/src/test/resources/normalization-test.yang b/opendaylight/md-sal/sal-common-impl/src/test/resources/normalization-test.yang new file mode 100644 index 0000000000..6df5306850 --- /dev/null +++ b/opendaylight/md-sal/sal-common-impl/src/test/resources/normalization-test.yang @@ -0,0 +1,74 @@ +module normalization-test { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:normalization:test"; + prefix "norm-test"; + + revision "2014-03-13" { + description "Initial revision."; + } + + grouping outer-grouping { + } + + container test { + list outer-list { + key id; + leaf id { + type uint16; + } + choice outer-choice { + case one { + leaf one { + type string; + } + } + case two-three { + leaf two { + type string; + } + leaf three { + type string; + } + } + } + list inner-list { + key name; + ordered-by user; + + leaf name { + type string; + } + leaf value { + type string; + } + } + } + + list unkeyed-list { + leaf name { + type string; + } + } + + leaf-list unordered-leaf-list { + type string; + } + + leaf-list ordered-leaf-list { + ordered-by user; + type string; + } + + container outer-container { + } + + anyxml any-xml-data; + } + + augment /norm-test:test/norm-test:outer-container { + + leaf augmented-leaf { + type string; + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/pom.xml b/opendaylight/md-sal/sal-distributed-datastore/pom.xml index e7fcd83328..ea686d966f 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/pom.xml +++ b/opendaylight/md-sal/sal-distributed-datastore/pom.xml @@ -35,6 +35,11 @@ akka-remote_${scala.version} + + com.typesafe.akka + akka-testkit_${scala.version} + + @@ -52,6 +57,17 @@ sal-binding-config + + + org.opendaylight.controller + sal-broker-impl + + org.opendaylight.controller sal-common-api @@ -92,7 +108,6 @@ org.osgi.core - org.scala-lang scala-library @@ -109,6 +124,7 @@ mockito-all test + org.slf4j slf4j-simple diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java index 1bc554f3ed..8d5b0c2f4a 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java @@ -1,3 +1,11 @@ +/* + * 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.cluster.datastore; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistration.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistration.java new file mode 100644 index 0000000000..fda429f754 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistration.java @@ -0,0 +1,49 @@ +/* + * 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.cluster.datastore; + +import akka.actor.Props; +import akka.actor.UntypedActor; +import akka.japi.Creator; +import org.opendaylight.controller.cluster.datastore.messages.CloseListenerRegistration; +import org.opendaylight.controller.cluster.datastore.messages.CloseListenerRegistrationReply; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class ListenerRegistration extends UntypedActor{ + + private final org.opendaylight.yangtools.concepts.ListenerRegistration>> registration; + + public ListenerRegistration(org.opendaylight.yangtools.concepts.ListenerRegistration>> registration) { + this.registration = registration; + } + + @Override + public void onReceive(Object message) throws Exception { + if(message instanceof CloseListenerRegistration){ + closeListenerRegistration((CloseListenerRegistration) message); + } + } + + public static Props props(final org.opendaylight.yangtools.concepts.ListenerRegistration>> registration){ + return Props.create(new Creator(){ + + @Override + public ListenerRegistration create() throws Exception { + return new ListenerRegistration(registration); + } + }); + } + + private void closeListenerRegistration(CloseListenerRegistration message){ + registration.close(); + getSender().tell(new CloseListenerRegistrationReply(), getSelf()); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationProxy.java index 19e7f198df..c2fc8c0277 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationProxy.java @@ -1,3 +1,11 @@ +/* + * 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.cluster.datastore; import org.opendaylight.yangtools.concepts.ListenerRegistration; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java new file mode 100644 index 0000000000..8365328669 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java @@ -0,0 +1,71 @@ +/* + * 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.cluster.datastore; + +import akka.actor.ActorRef; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import akka.persistence.UntypedProcessor; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionChain; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionChainReply; +import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListener; +import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListenerReply; +import org.opendaylight.controller.cluster.datastore.messages.UpdateSchemaContext; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +import java.util.concurrent.Executors; + +/** + * A Shard represents a portion of the logical data tree + *

+ * Our Shard uses InMemoryDataStore as it's internal representation and delegates all requests it + * + */ +public class Shard extends UntypedProcessor { + + ListeningExecutorService storeExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(2)); + + private final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", storeExecutor); + + LoggingAdapter log = Logging.getLogger(getContext().system(), this); + + @Override + public void onReceive(Object message) throws Exception { + if (message instanceof CreateTransactionChain) { + createTransactionChain(); + } else if(message instanceof RegisterChangeListener){ + registerChangeListener((RegisterChangeListener) message); + } else if(message instanceof UpdateSchemaContext){ + updateSchemaContext((UpdateSchemaContext) message); + } + } + + private void updateSchemaContext(UpdateSchemaContext message) { + store.onGlobalContextUpdated(message.getSchemaContext()); + } + + private void registerChangeListener(RegisterChangeListener registerChangeListener) { + org.opendaylight.yangtools.concepts.ListenerRegistration>> registration = + store.registerChangeListener(registerChangeListener.getPath(), registerChangeListener.getListener(), registerChangeListener.getScope()); + ActorRef listenerRegistration = getContext().actorOf(ListenerRegistration.props(registration)); + getSender().tell(new RegisterChangeListenerReply(listenerRegistration.path()), getSelf()); + } + + private void createTransactionChain() { + DOMStoreTransactionChain chain = store.createTransactionChain(); + ActorRef transactionChain = getContext().actorOf(ShardTransactionChain.props(chain)); + getSender().tell(new CreateTransactionChainReply(transactionChain.path()), getSelf()); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java new file mode 100644 index 0000000000..63266d6308 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java @@ -0,0 +1,61 @@ +/* + * 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.cluster.datastore; + +import akka.actor.Address; +import akka.actor.UntypedActor; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import org.opendaylight.controller.cluster.datastore.messages.FindPrimary; +import org.opendaylight.controller.cluster.datastore.messages.PrimaryNotFound; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The ShardManager has the following jobs, + * + * - Create all the local shard replicas that belong on this cluster member + * - Find the primary replica for any given shard + * - Engage in shard replica elections which decide which replica should be the primary + * + * Creation of Shard replicas + * ========================== + * When the ShardManager is constructed it reads the cluster configuration to find out which shard replicas + * belong on this member. It finds out the name of the current cluster member from the Akka Clustering Service. + * + * Replica Elections + * ================= + * The Shard Manager uses multiple cues to initiate election. + * - When a member of the cluster dies + * - When a local shard replica dies + * - When a local shard replica comes alive + */ +public class ShardManager extends UntypedActor { + + // Stores a mapping between a shard name and the address of the current primary + private final Map shardNameToPrimaryAddress = new HashMap<>(); + + // Stores a mapping between a member name and the address of the member + private final Map memberNameToAddress = new HashMap<>(); + + // Stores a mapping between the shard name and all the members on which a replica of that shard are available + private final Map> shardNameToMembers = new HashMap<>(); + + LoggingAdapter log = Logging.getLogger(getContext().system(), this); + + @Override + public void onReceive(Object message) throws Exception { + if(message instanceof FindPrimary ){ + FindPrimary msg = ((FindPrimary) message); + getSender().tell(new PrimaryNotFound(msg.getShardName()), getSelf()); + } + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java new file mode 100644 index 0000000000..b316b9df04 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java @@ -0,0 +1,146 @@ +/* + * 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.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.actor.UntypedActor; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import akka.japi.Creator; +import com.google.common.base.Optional; +import com.google.common.util.concurrent.ListenableFuture; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransaction; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionReply; +import org.opendaylight.controller.cluster.datastore.messages.DeleteData; +import org.opendaylight.controller.cluster.datastore.messages.DeleteDataReply; +import org.opendaylight.controller.cluster.datastore.messages.MergeData; +import org.opendaylight.controller.cluster.datastore.messages.MergeDataReply; +import org.opendaylight.controller.cluster.datastore.messages.ReadData; +import org.opendaylight.controller.cluster.datastore.messages.ReadDataReply; +import org.opendaylight.controller.cluster.datastore.messages.ReadyTransaction; +import org.opendaylight.controller.cluster.datastore.messages.ReadyTransactionReply; +import org.opendaylight.controller.cluster.datastore.messages.WriteData; +import org.opendaylight.controller.cluster.datastore.messages.WriteDataReply; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +import java.util.concurrent.ExecutionException; + +/** + * The ShardTransaction Actor represents a remote transaction + * + * The ShardTransaction Actor delegates all actions to DOMDataReadWriteTransaction + * + * Even though the DOMStore and the DOMStoreTransactionChain implement multiple types of transactions + * the ShardTransaction Actor only works with read-write transactions. This is just to keep the logic simple. At this + * time there are no known advantages for creating a read-only or write-only transaction which may change over time + * at which point we can optimize things in the distributed store as well. + * + * Handles Messages + * ---------------- + * {@link org.opendaylight.controller.cluster.datastore.messages.ReadData} + * {@link org.opendaylight.controller.cluster.datastore.messages.WriteData} + * {@link org.opendaylight.controller.cluster.datastore.messages.MergeData} + * {@link org.opendaylight.controller.cluster.datastore.messages.DeleteData} + * {@link org.opendaylight.controller.cluster.datastore.messages.ReadyTransaction} + * {@link org.opendaylight.controller.cluster.datastore.messages.CloseTransaction} + */ +public class ShardTransaction extends UntypedActor { + + private final DOMStoreReadWriteTransaction transaction; + + private final LoggingAdapter log = Logging.getLogger(getContext().system(), this); + + public ShardTransaction(DOMStoreReadWriteTransaction transaction) { + this.transaction = transaction; + } + + + public static Props props(final DOMStoreReadWriteTransaction transaction){ + return Props.create(new Creator(){ + + @Override + public ShardTransaction create() throws Exception { + return new ShardTransaction(transaction); + } + }); + } + + @Override + public void onReceive(Object message) throws Exception { + if(message instanceof ReadData){ + readData((ReadData) message); + } else if(message instanceof WriteData){ + writeData((WriteData) message); + } else if(message instanceof MergeData){ + mergeData((MergeData) message); + } else if(message instanceof DeleteData){ + deleteData((DeleteData) message); + } else if(message instanceof ReadyTransaction){ + readyTransaction((ReadyTransaction) message); + } else if(message instanceof CloseTransaction){ + closeTransaction((CloseTransaction) message); + } + } + + private void readData(ReadData message) { + final ActorRef sender = getSender(); + final ActorRef self = getSelf(); + final InstanceIdentifier path = message.getPath(); + final ListenableFuture>> future = transaction.read(path); + + future.addListener(new Runnable() { + @Override + public void run() { + try { + Optional> optional = future.get(); + if(optional.isPresent()){ + sender.tell(new ReadDataReply(optional.get()), self); + } else { + //TODO : Need to decide what to do here + } + } catch (InterruptedException | ExecutionException e) { + log.error(e, "An exception happened when reading data from path : " + path.toString()); + } + + } + }, getContext().dispatcher()); + } + + + private void writeData(WriteData message){ + transaction.write(message.getPath(), message.getData()); + getSender().tell(new WriteDataReply(), getSelf()); + } + + private void mergeData(MergeData message){ + transaction.merge(message.getPath(), message.getData()); + getSender().tell(new MergeDataReply(), getSelf()); + } + + private void deleteData(DeleteData message){ + transaction.delete(message.getPath()); + getSender().tell(new DeleteDataReply(), getSelf()); + } + + private void readyTransaction(ReadyTransaction message){ + DOMStoreThreePhaseCommitCohort cohort = transaction.ready(); + ActorRef cohortActor = getContext().actorOf(ThreePhaseCommitCohort.props(cohort)); + getSender().tell(new ReadyTransactionReply(cohortActor.path()), getSelf()); + + } + + private void closeTransaction(CloseTransaction message){ + transaction.close(); + getSender().tell(new CloseTransactionReply(), getSelf()); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java new file mode 100644 index 0000000000..83913fe416 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java @@ -0,0 +1,54 @@ +/* + * 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.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.actor.UntypedActor; +import akka.japi.Creator; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChain; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChainReply; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransaction; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionReply; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; + +/** + * The ShardTransactionChain Actor represents a remote TransactionChain + */ +public class ShardTransactionChain extends UntypedActor{ + + private final DOMStoreTransactionChain chain; + + public ShardTransactionChain(DOMStoreTransactionChain chain) { + this.chain = chain; + } + + @Override + public void onReceive(Object message) throws Exception { + if(message instanceof CreateTransaction){ + DOMStoreReadWriteTransaction transaction = chain.newReadWriteTransaction(); + ActorRef transactionActor = getContext().actorOf(ShardTransaction.props(transaction)); + getSender().tell(new CreateTransactionReply(transactionActor.path()), getSelf()); + } else if (message instanceof CloseTransactionChain){ + chain.close(); + getSender().tell(new CloseTransactionChainReply(), getSelf()); + } + } + + public static Props props(final DOMStoreTransactionChain chain){ + return Props.create(new Creator(){ + + @Override + public ShardTransactionChain create() throws Exception { + return new ShardTransactionChain(chain); + } + }); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohort.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohort.java new file mode 100644 index 0000000000..8e21cb2d86 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohort.java @@ -0,0 +1,37 @@ +/* + * 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.cluster.datastore; + +import akka.actor.Props; +import akka.actor.UntypedActor; +import akka.japi.Creator; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; + +public class ThreePhaseCommitCohort extends UntypedActor{ + private final DOMStoreThreePhaseCommitCohort cohort; + + public ThreePhaseCommitCohort(DOMStoreThreePhaseCommitCohort cohort) { + + this.cohort = cohort; + } + + @Override + public void onReceive(Object message) throws Exception { + throw new UnsupportedOperationException("onReceive"); + } + + public static Props props(final DOMStoreThreePhaseCommitCohort cohort) { + return Props.create(new Creator(){ + @Override + public ThreePhaseCommitCohort create() throws Exception { + return new ThreePhaseCommitCohort(cohort); + } + }); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java index 20a74e30da..1ee0d89e61 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java @@ -1,3 +1,11 @@ +/* + * 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.cluster.datastore; import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java index c9a630445b..609dea0b36 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java @@ -1,3 +1,11 @@ +/* + * 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.cluster.datastore; import com.google.common.base.Optional; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseListenerRegistration.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseListenerRegistration.java new file mode 100644 index 0000000000..d55ad28d5b --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseListenerRegistration.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class CloseListenerRegistration { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseListenerRegistrationReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseListenerRegistrationReply.java new file mode 100644 index 0000000000..e195e4b959 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseListenerRegistrationReply.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class CloseListenerRegistrationReply { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransaction.java new file mode 100644 index 0000000000..6809f4b135 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransaction.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class CloseTransaction { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChain.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChain.java new file mode 100644 index 0000000000..04c422b68e --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChain.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class CloseTransactionChain { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainReply.java new file mode 100644 index 0000000000..89fa93bf9a --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainReply.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class CloseTransactionChainReply { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionReply.java new file mode 100644 index 0000000000..4910a3ea0e --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionReply.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class CloseTransactionReply { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransaction.java new file mode 100644 index 0000000000..e0cdd3cc2b --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransaction.java @@ -0,0 +1,13 @@ +/* + * 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.cluster.datastore.messages; + +public class CreateTransaction { + +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionChain.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionChain.java new file mode 100644 index 0000000000..cdad3324ab --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionChain.java @@ -0,0 +1,13 @@ +/* + * 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.cluster.datastore.messages; + +public class CreateTransactionChain { + +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionChainReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionChainReply.java new file mode 100644 index 0000000000..49dd9b63d2 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionChainReply.java @@ -0,0 +1,23 @@ +/* + * 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.cluster.datastore.messages; + +import akka.actor.ActorPath; + +public class CreateTransactionChainReply { + private final ActorPath transactionChainPath; + + public CreateTransactionChainReply(ActorPath transactionChainPath) { + this.transactionChainPath = transactionChainPath; + } + + public ActorPath getTransactionChainPath() { + return transactionChainPath; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReply.java new file mode 100644 index 0000000000..4faf9d370d --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReply.java @@ -0,0 +1,23 @@ +/* + * 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.cluster.datastore.messages; + +import akka.actor.ActorPath; + +public class CreateTransactionReply { + private final ActorPath transactionPath; + + public CreateTransactionReply(ActorPath transactionPath) { + this.transactionPath = transactionPath; + } + + public ActorPath getTransactionPath() { + return transactionPath; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DeleteData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DeleteData.java new file mode 100644 index 0000000000..384e75ae7e --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DeleteData.java @@ -0,0 +1,23 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +public class DeleteData { + private final InstanceIdentifier path; + + public DeleteData(InstanceIdentifier path) { + this.path = path; + } + + public InstanceIdentifier getPath() { + return path; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DeleteDataReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DeleteDataReply.java new file mode 100644 index 0000000000..a3c7305685 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DeleteDataReply.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class DeleteDataReply { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/FindPrimary.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/FindPrimary.java new file mode 100644 index 0000000000..f2497e6517 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/FindPrimary.java @@ -0,0 +1,31 @@ +/* + * 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.cluster.datastore.messages; + +import com.google.common.base.Preconditions; + +/** + * The FindPrimary message is used to locate the primary of any given shard + * + * TODO : Make this serializable + */ +public class FindPrimary{ + private final String shardName; + + public FindPrimary(String shardName){ + + Preconditions.checkNotNull(shardName, "shardName should not be null"); + + this.shardName = shardName; + } + + public String getShardName() { + return shardName; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java new file mode 100644 index 0000000000..75d1e95c1e --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java @@ -0,0 +1,18 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class MergeData extends ModifyData { + public MergeData(InstanceIdentifier path, NormalizedNode data) { + super(path, data); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeDataReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeDataReply.java new file mode 100644 index 0000000000..8e90972f87 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeDataReply.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class MergeDataReply { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java new file mode 100644 index 0000000000..da8608876e --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java @@ -0,0 +1,31 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public abstract class ModifyData { + private final InstanceIdentifier path; + private final NormalizedNode data; + + public ModifyData(InstanceIdentifier path, NormalizedNode data) { + this.path = path; + this.data = data; + } + + public InstanceIdentifier getPath() { + return path; + } + + public NormalizedNode getData() { + return data; + } + +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/PrimaryFound.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/PrimaryFound.java new file mode 100644 index 0000000000..1326898b0f --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/PrimaryFound.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class PrimaryFound { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/PrimaryNotFound.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/PrimaryNotFound.java new file mode 100644 index 0000000000..c66e12cb39 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/PrimaryNotFound.java @@ -0,0 +1,40 @@ +/* + * 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.cluster.datastore.messages; + +import com.google.common.base.Preconditions; + +public class PrimaryNotFound { + + private final String shardName; + + public PrimaryNotFound(String shardName){ + + Preconditions.checkNotNull(shardName, "shardName should not be null"); + + this.shardName = shardName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PrimaryNotFound that = (PrimaryNotFound) o; + + if (shardName != null ? !shardName.equals(that.shardName) : that.shardName != null) return false; + + return true; + } + + @Override + public int hashCode() { + return shardName != null ? shardName.hashCode() : 0; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadData.java new file mode 100644 index 0000000000..2f56a9740b --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadData.java @@ -0,0 +1,23 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +public class ReadData { + private final InstanceIdentifier path; + + public ReadData(InstanceIdentifier path) { + this.path = path; + } + + public InstanceIdentifier getPath() { + return path; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java new file mode 100644 index 0000000000..52e2c29249 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java @@ -0,0 +1,24 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class ReadDataReply { + private final NormalizedNode normalizedNode; + + public ReadDataReply(NormalizedNode normalizedNode){ + + this.normalizedNode = normalizedNode; + } + + public NormalizedNode getNormalizedNode() { + return normalizedNode; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadyTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadyTransaction.java new file mode 100644 index 0000000000..58eef66fc7 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadyTransaction.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class ReadyTransaction { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadyTransactionReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadyTransactionReply.java new file mode 100644 index 0000000000..48565d4fbb --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadyTransactionReply.java @@ -0,0 +1,24 @@ +/* + * 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.cluster.datastore.messages; + +import akka.actor.ActorPath; + +public class ReadyTransactionReply { + private final ActorPath path; + + public ReadyTransactionReply(ActorPath path) { + + this.path = path; + } + + public ActorPath getPath() { + return path; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterChangeListener.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterChangeListener.java new file mode 100644 index 0000000000..0123a70147 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterChangeListener.java @@ -0,0 +1,39 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class RegisterChangeListener { + private final InstanceIdentifier path; + private final AsyncDataChangeListener> listener; + private final AsyncDataBroker.DataChangeScope scope; + + + public RegisterChangeListener(InstanceIdentifier path, AsyncDataChangeListener> listener, AsyncDataBroker.DataChangeScope scope) { + this.path = path; + this.listener = listener; + this.scope = scope; + } + + public InstanceIdentifier getPath() { + return path; + } + + public AsyncDataChangeListener> getListener() { + return listener; + } + + public AsyncDataBroker.DataChangeScope getScope() { + return scope; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterChangeListenerReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterChangeListenerReply.java new file mode 100644 index 0000000000..ae8bbbd75a --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterChangeListenerReply.java @@ -0,0 +1,23 @@ +/* + * 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.cluster.datastore.messages; + +import akka.actor.ActorPath; + +public class RegisterChangeListenerReply { + private final ActorPath listenerRegistrationPath; + + public RegisterChangeListenerReply(ActorPath listenerRegistrationPath) { + this.listenerRegistrationPath = listenerRegistrationPath; + } + + public ActorPath getListenerRegistrationPath() { + return listenerRegistrationPath; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/UpdateSchemaContext.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/UpdateSchemaContext.java new file mode 100644 index 0000000000..47f9ea8c4f --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/UpdateSchemaContext.java @@ -0,0 +1,23 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.model.api.SchemaContext; + +public class UpdateSchemaContext { + private final SchemaContext schemaContext; + + public UpdateSchemaContext(SchemaContext schemaContext) { + this.schemaContext = schemaContext; + } + + public SchemaContext getSchemaContext() { + return schemaContext; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java new file mode 100644 index 0000000000..1348e65aa3 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java @@ -0,0 +1,19 @@ +/* + * 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.cluster.datastore.messages; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class WriteData extends ModifyData{ + + public WriteData(InstanceIdentifier path, NormalizedNode data) { + super(path, data); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteDataReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteDataReply.java new file mode 100644 index 0000000000..2a2b4ed25d --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteDataReply.java @@ -0,0 +1,12 @@ +/* + * 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.cluster.datastore.messages; + +public class WriteDataReply { +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java new file mode 100644 index 0000000000..a8ab5c4bd3 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java @@ -0,0 +1,28 @@ +/* + * 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.cluster.datastore.shardstrategy; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +/** + * The DefaultShardStrategy basically puts all data into the default Shard + *

+ * The default shard stores data for all modules for which a specific set of shards has not been configured + *

+ */ +public class DefaultShardStrategy implements ShardStrategy{ + + public static final String NAME = "default"; + public static final String DEFAULT_SHARD = "default"; + + @Override + public String findShard(InstanceIdentifier path) { + return DEFAULT_SHARD; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java new file mode 100644 index 0000000000..f75eb2d863 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java @@ -0,0 +1,24 @@ +/* + * 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.cluster.datastore.shardstrategy; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +/** + * The role of ShardStrategy is to figure out which Shards a given piece of data belongs to + */ +public interface ShardStrategy { + /** + * Find the name of the shard in which the data pointed to by the specified path belongs in + * + * @param path The location of the data in the logical tree + * @return + */ + String findShard(InstanceIdentifier path); +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.java new file mode 100644 index 0000000000..210537925b --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.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.cluster.datastore.shardstrategy; + +import com.google.common.base.Preconditions; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ShardStrategyFactory { + private static final Map moduleNameToStrategyMap = new ConcurrentHashMap(); + + private static final String UNKNOWN_MODULE_NAME = "unknown"; + + public static ShardStrategy getStrategy(InstanceIdentifier path){ + Preconditions.checkNotNull(path, "path should not be null"); + + String moduleName = getModuleName(path); + ShardStrategy shardStrategy = moduleNameToStrategyMap.get(moduleName); + if(shardStrategy == null){ + return new DefaultShardStrategy(); + } + + return shardStrategy; + } + + + private static String getModuleName(InstanceIdentifier path){ + return UNKNOWN_MODULE_NAME; + } + + /** + * This is to be used in the future to register a custom shard strategy + * + * @param moduleName + * @param shardStrategy + */ + public static void registerShardStrategy(String moduleName, ShardStrategy shardStrategy){ + throw new UnsupportedOperationException("registering a custom shard strategy not supported yet"); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractActorTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractActorTest.java new file mode 100644 index 0000000000..2fe7b69cc9 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractActorTest.java @@ -0,0 +1,34 @@ +/* + * 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.cluster.datastore; + +import akka.actor.ActorSystem; +import akka.testkit.JavaTestKit; +import org.junit.AfterClass; +import org.junit.BeforeClass; + +public abstract class AbstractActorTest { + private static ActorSystem system; + + @BeforeClass + public static void setUp(){ + system = ActorSystem.create("test"); + } + + @AfterClass + public static void tearDown(){ + JavaTestKit.shutdownActorSystem(system); + system = null; + } + + protected ActorSystem getSystem(){ + return system; + } + +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationTest.java new file mode 100644 index 0000000000..0f155ef597 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ListenerRegistrationTest.java @@ -0,0 +1,72 @@ +package org.opendaylight.controller.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.testkit.JavaTestKit; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.CloseListenerRegistration; +import org.opendaylight.controller.cluster.datastore.messages.CloseListenerRegistrationReply; +import org.opendaylight.controller.md.cluster.datastore.model.TestModel; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +import static org.junit.Assert.assertEquals; + +public class ListenerRegistrationTest extends AbstractActorTest { + private static ListeningExecutorService storeExecutor = MoreExecutors.listeningDecorator(MoreExecutors.sameThreadExecutor()); + + private static final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", storeExecutor); + + static { + store.onGlobalContextUpdated(TestModel.createTestContext()); + } + + + @Test + public void testOnReceiveCloseListenerRegistration() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ListenerRegistration.props(store.registerChangeListener(TestModel.TEST_PATH, noOpDataChangeListener(), AsyncDataBroker.DataChangeScope.BASE)); + final ActorRef subject = getSystem().actorOf(props, "testCloseListenerRegistration"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new CloseListenerRegistration(), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof CloseListenerRegistrationReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + } + + private AsyncDataChangeListener> noOpDataChangeListener(){ + return new AsyncDataChangeListener>() { + @Override + public void onDataChanged(AsyncDataChangeEvent> change) { + + } + }; + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java new file mode 100644 index 0000000000..9c1ea70fdb --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java @@ -0,0 +1,52 @@ +package org.opendaylight.controller.cluster.datastore; + +import akka.actor.ActorSystem; +import akka.actor.Props; +import akka.testkit.JavaTestKit; +import akka.testkit.TestActorRef; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.FindPrimary; +import org.opendaylight.controller.cluster.datastore.messages.PrimaryNotFound; +import scala.concurrent.duration.Duration; + +public class ShardManagerTest { + private static ActorSystem system; + + @BeforeClass + public static void setUp(){ + system = ActorSystem.create("test"); + } + + @AfterClass + public static void tearDown(){ + JavaTestKit.shutdownActorSystem(system); + system = null; + } + + @Test + public void testOnReceiveFindPrimary() throws Exception { + + new JavaTestKit(system) {{ + final Props props = Props.create(ShardManager.class); + final TestActorRef subject = TestActorRef.create(system, props, "test"); + + // can also use JavaTestKit “from the outside” + final JavaTestKit probe = new JavaTestKit(system); + + // the run() method needs to finish within 3 seconds + new Within(duration("3 seconds")) { + protected void run() { + + subject.tell(new FindPrimary("inventory"), getRef()); + + expectMsgEquals(Duration.Zero(), new PrimaryNotFound("inventory")); + + // Will wait for the rest of the 3 seconds + expectNoMsg(); + } + }; + }}; + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java new file mode 100644 index 0000000000..b5a341d95c --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java @@ -0,0 +1,98 @@ +package org.opendaylight.controller.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.testkit.JavaTestKit; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionChain; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionChainReply; +import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListener; +import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListenerReply; +import org.opendaylight.controller.cluster.datastore.messages.UpdateSchemaContext; +import org.opendaylight.controller.md.cluster.datastore.model.TestModel; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +import static org.junit.Assert.assertTrue; + +public class ShardTest extends AbstractActorTest{ + @Test + public void testOnReceiveCreateTransactionChain() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = Props.create(Shard.class); + final ActorRef subject = getSystem().actorOf(props, "testCreateTransactionChain"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new CreateTransactionChain(), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof CreateTransactionChainReply) { + CreateTransactionChainReply reply = (CreateTransactionChainReply) in; + return reply.getTransactionChainPath().toString(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertTrue(out.matches("akka:\\/\\/test\\/user\\/testCreateTransactionChain\\/\\$.*")); + // Will wait for the rest of the 3 seconds + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testOnReceiveRegisterListener() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = Props.create(Shard.class); + final ActorRef subject = getSystem().actorOf(props, "testRegisterChangeListener"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new UpdateSchemaContext(TestModel.createTestContext()), getRef()); + + subject.tell(new RegisterChangeListener(InstanceIdentifier.builder().build(), noOpDataChangeListener() , AsyncDataBroker.DataChangeScope.BASE), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof RegisterChangeListenerReply) { + RegisterChangeListenerReply reply = (RegisterChangeListenerReply) in; + return reply.getListenerRegistrationPath().toString(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertTrue(out.matches("akka:\\/\\/test\\/user\\/testRegisterChangeListener\\/\\$.*")); + // Will wait for the rest of the 3 seconds + expectNoMsg(); + } + + + }; + }}; + } + + private AsyncDataChangeListener> noOpDataChangeListener(){ + return new AsyncDataChangeListener>() { + @Override + public void onDataChanged(AsyncDataChangeEvent> change) { + + } + }; + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChainTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChainTest.java new file mode 100644 index 0000000000..bc3a104656 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChainTest.java @@ -0,0 +1,91 @@ +package org.opendaylight.controller.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.testkit.JavaTestKit; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChain; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChainReply; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransaction; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionReply; +import org.opendaylight.controller.md.cluster.datastore.model.TestModel; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ShardTransactionChainTest extends AbstractActorTest { + + private static ListeningExecutorService storeExecutor = MoreExecutors.listeningDecorator(MoreExecutors.sameThreadExecutor()); + + private static final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", storeExecutor); + + static { + store.onGlobalContextUpdated(TestModel.createTestContext()); + } + @Test + public void testOnReceiveCreateTransaction() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransactionChain.props(store.createTransactionChain()); + final ActorRef subject = getSystem().actorOf(props, "testCreateTransaction"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new CreateTransaction(), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof CreateTransactionReply) { + return ((CreateTransactionReply) in).getTransactionPath().toString(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertTrue(out.matches("akka:\\/\\/test\\/user\\/testCreateTransaction\\/\\$.*")); + // Will wait for the rest of the 3 seconds + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testOnReceiveCloseTransactionChain() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransactionChain.props(store.createTransactionChain()); + final ActorRef subject = getSystem().actorOf(props, "testCloseTransactionChain"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new CloseTransactionChain(), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof CloseTransactionChainReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + // Will wait for the rest of the 3 seconds + expectNoMsg(); + } + + + }; + }}; + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java new file mode 100644 index 0000000000..36633c55d5 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java @@ -0,0 +1,236 @@ +package org.opendaylight.controller.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.testkit.JavaTestKit; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransaction; +import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionReply; +import org.opendaylight.controller.cluster.datastore.messages.DeleteData; +import org.opendaylight.controller.cluster.datastore.messages.DeleteDataReply; +import org.opendaylight.controller.cluster.datastore.messages.MergeData; +import org.opendaylight.controller.cluster.datastore.messages.MergeDataReply; +import org.opendaylight.controller.cluster.datastore.messages.ReadData; +import org.opendaylight.controller.cluster.datastore.messages.ReadDataReply; +import org.opendaylight.controller.cluster.datastore.messages.ReadyTransaction; +import org.opendaylight.controller.cluster.datastore.messages.ReadyTransactionReply; +import org.opendaylight.controller.cluster.datastore.messages.WriteData; +import org.opendaylight.controller.cluster.datastore.messages.WriteDataReply; +import org.opendaylight.controller.md.cluster.datastore.model.TestModel; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; + +import static org.junit.Assert.assertEquals; + +public class ShardTransactionTest extends AbstractActorTest { + private static ListeningExecutorService storeExecutor = MoreExecutors.listeningDecorator(MoreExecutors.sameThreadExecutor()); + + private static final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", storeExecutor); + + static { + store.onGlobalContextUpdated(TestModel.createTestContext()); + } + + @Test + public void testOnReceiveReadData() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransaction.props(store.newReadWriteTransaction()); + final ActorRef subject = getSystem().actorOf(props, "testReadData"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new ReadData(InstanceIdentifier.builder().build()), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof ReadDataReply) { + if (((ReadDataReply) in).getNormalizedNode() != null) { + return "match"; + } + return null; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testOnReceiveWriteData() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransaction.props(store.newReadWriteTransaction()); + final ActorRef subject = getSystem().actorOf(props, "testWriteData"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new WriteData(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof WriteDataReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testOnReceiveMergeData() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransaction.props(store.newReadWriteTransaction()); + final ActorRef subject = getSystem().actorOf(props, "testMergeData"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new MergeData(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof MergeDataReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testOnReceiveDeleteData() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransaction.props(store.newReadWriteTransaction()); + final ActorRef subject = getSystem().actorOf(props, "testDeleteData"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new DeleteData(TestModel.TEST_PATH), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof DeleteDataReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + } + + + @Test + public void testOnReceiveReadyTransaction() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransaction.props(store.newReadWriteTransaction()); + final ActorRef subject = getSystem().actorOf(props, "testReadyTransaction"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new ReadyTransaction(), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof ReadyTransactionReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + + } + + @Test + public void testOnReceiveCloseTransaction() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = ShardTransaction.props(store.newReadWriteTransaction()); + final ActorRef subject = getSystem().actorOf(props, "testCloseTransaction"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new CloseTransaction(), getRef()); + + final String out = new ExpectMsg("match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof CloseTransactionReply) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("match", out); + + expectNoMsg(); + } + + + }; + }}; + + } + + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/FindPrimaryTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/FindPrimaryTest.java new file mode 100644 index 0000000000..7e4ec10501 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/FindPrimaryTest.java @@ -0,0 +1,21 @@ +package org.opendaylight.controller.cluster.datastore.messages; + +import org.junit.Test; + +public class FindPrimaryTest { + + @Test + public void testNewBuilderForType() throws Exception { + + } + + @Test + public void testToBuilder() throws Exception { + + } + + @Test + public void testGetDefaultInstanceForType() throws Exception { + + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategyTest.java new file mode 100644 index 0000000000..d3ba9b1c15 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategyTest.java @@ -0,0 +1,14 @@ +package org.opendaylight.controller.cluster.datastore.shardstrategy; + +import junit.framework.Assert; +import org.junit.Test; +import org.opendaylight.controller.md.cluster.datastore.model.TestModel; + +public class DefaultShardStrategyTest { + + @Test + public void testFindShard() throws Exception { + String shard = new DefaultShardStrategy().findShard(TestModel.TEST_PATH); + Assert.assertEquals(DefaultShardStrategy.DEFAULT_SHARD, shard); + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java new file mode 100644 index 0000000000..2cff981b68 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java @@ -0,0 +1,29 @@ +package org.opendaylight.controller.cluster.datastore.shardstrategy; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.opendaylight.controller.md.cluster.datastore.model.TestModel; + +import static junit.framework.Assert.assertNotNull; + +public class ShardStrategyFactoryTest { + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testGetStrategy(){ + ShardStrategy strategy = ShardStrategyFactory.getStrategy(TestModel.TEST_PATH); + assertNotNull(strategy); + } + + @Test + public void testGetStrategyNullPointerExceptionWhenPathIsNull(){ + expectedEx.expect(NullPointerException.class); + expectedEx.expectMessage("path should not be null"); + + ShardStrategyFactory.getStrategy(null); + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/TestModel.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/TestModel.java new file mode 100644 index 0000000000..7a1def9f89 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/TestModel.java @@ -0,0 +1,51 @@ +/* + * 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.cluster.datastore.model; + +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; + +import java.io.InputStream; +import java.util.Collections; +import java.util.Set; + +public class TestModel { + + public static final QName TEST_QNAME = QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test", "2014-03-13", + "test"); + public static final QName OUTER_LIST_QNAME = QName.create(TEST_QNAME, "outer-list"); + public static final QName INNER_LIST_QNAME = QName.create(TEST_QNAME, "inner-list"); + public static final QName OUTER_CHOICE_QNAME = QName.create(TEST_QNAME, "outer-choice"); + public static final QName ID_QNAME = QName.create(TEST_QNAME, "id"); + public static final QName NAME_QNAME = QName.create(TEST_QNAME, "name"); + public static final QName VALUE_QNAME = QName.create(TEST_QNAME, "value"); + private static final String DATASTORE_TEST_YANG = "/odl-datastore-test.yang"; + + public static final InstanceIdentifier TEST_PATH = InstanceIdentifier.of(TEST_QNAME); + public static final InstanceIdentifier OUTER_LIST_PATH = InstanceIdentifier.builder(TEST_PATH).node(OUTER_LIST_QNAME).build(); + public static final QName TWO_QNAME = QName.create(TEST_QNAME,"two"); + public static final QName THREE_QNAME = QName.create(TEST_QNAME,"three"); + + + public static final InputStream getDatastoreTestInputStream() { + return getInputStream(DATASTORE_TEST_YANG); + } + + private static InputStream getInputStream(final String resourceName) { + return TestModel.class.getResourceAsStream(DATASTORE_TEST_YANG); + } + + public static SchemaContext createTestContext() { + YangParserImpl parser = new YangParserImpl(); + Set modules = parser.parseYangModelsFromStreams(Collections.singletonList(getDatastoreTestInputStream())); + return parser.resolveSchemaContext(modules); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/resources/odl-datastore-test.yang b/opendaylight/md-sal/sal-distributed-datastore/src/test/resources/odl-datastore-test.yang new file mode 100644 index 0000000000..f6d0202fd5 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/resources/odl-datastore-test.yang @@ -0,0 +1,42 @@ +module odl-datastore-test { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test"; + prefix "store-test"; + + revision "2014-03-13" { + description "Initial revision."; + } + + container test { + list outer-list { + key id; + leaf id { + type uint16; + } + choice outer-choice { + case one { + leaf one { + type string; + } + } + case two-three { + leaf two { + type string; + } + leaf three { + type string; + } + } + } + list inner-list { + key name; + leaf name { + type string; + } + leaf value { + type string; + } + } + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/pom.xml b/opendaylight/md-sal/sal-dom-broker/pom.xml index bac9146bf5..022882fceb 100644 --- a/opendaylight/md-sal/sal-dom-broker/pom.xml +++ b/opendaylight/md-sal/sal-dom-broker/pom.xml @@ -42,6 +42,12 @@ org.opendaylight.controller sal-core-spi
+ + org.opendaylight.controller + sal-inmemory-datastore + 1.1-SNAPSHOT + + org.opendaylight.yangtools util @@ -88,8 +94,6 @@ org.opendaylight.controller.config.yang.md.sal.dom.statistics, org.opendaylight.controller.md.sal.dom.broker.impl, org.opendaylight.controller.md.sal.dom.broker.impl.*, - org.opendaylight.controller.md.sal.dom.store.impl, - org.opendaylight.controller.md.sal.dom.store.impl.*, org.opendaylight.yangtools.yang.util, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.dom.impl.rev131028.* * diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomInmemoryDataBrokerModule.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomInmemoryDataBrokerModule.java index ad0de54bc0..d3852d28c5 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomInmemoryDataBrokerModule.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomInmemoryDataBrokerModule.java @@ -7,9 +7,9 @@ */ package org.opendaylight.controller.config.yang.md.sal.dom.impl; -import java.util.Hashtable; -import java.util.concurrent.Executors; - +import com.google.common.collect.ImmutableMap; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.broker.impl.DOMDataBrokerImpl; @@ -17,9 +17,8 @@ import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; import org.opendaylight.controller.sal.core.spi.data.DOMStore; import org.osgi.framework.BundleContext; -import com.google.common.collect.ImmutableMap; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; +import java.util.Hashtable; +import java.util.concurrent.Executors; /** * @@ -49,8 +48,22 @@ public final class DomInmemoryDataBrokerModule extends @Override public java.lang.AutoCloseable createInstance() { ListeningExecutorService storeExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(2)); - InMemoryDOMDataStore operStore = new InMemoryDOMDataStore("DOM-OPER", storeExecutor); - InMemoryDOMDataStore configStore = new InMemoryDOMDataStore("DOM-CFG", storeExecutor); + //Initializing Operational DOM DataStore defaulting to InMemoryDOMDataStore if one is not configured + DOMStore operStore = getOperationalDataStoreDependency(); + if(operStore == null){ + //we will default to InMemoryDOMDataStore creation + operStore = new InMemoryDOMDataStore("DOM-OPER", storeExecutor); + //here we will register the SchemaContext listener + getSchemaServiceDependency().registerSchemaServiceListener((InMemoryDOMDataStore)operStore); + } + + DOMStore configStore = getConfigDataStoreDependency(); + if(configStore == null){ + //we will default to InMemoryDOMDataStore creation + configStore = new InMemoryDOMDataStore("DOM-CFG", storeExecutor); + //here we will register the SchemaContext listener + getSchemaServiceDependency().registerSchemaServiceListener((InMemoryDOMDataStore)configStore); + } ImmutableMap datastores = ImmutableMap . builder().put(LogicalDatastoreType.OPERATIONAL, operStore) .put(LogicalDatastoreType.CONFIGURATION, configStore).build(); @@ -59,8 +72,6 @@ public final class DomInmemoryDataBrokerModule extends getBundleContext().registerService(DOMDataBroker.class, newDataBroker, new Hashtable()); - getSchemaServiceDependency().registerSchemaServiceListener(operStore); - getSchemaServiceDependency().registerSchemaServiceListener(configStore); return newDataBroker; } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java deleted file mode 100644 index 3625d3356a..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java +++ /dev/null @@ -1,33 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; - -/** - * Exception thrown when a proposed change fails validation before being - * applied into the Data Tree because the Data Tree has been modified - * in way that a conflicting - * node is present. - */ -public class ConflictingModificationAppliedException extends DataValidationFailedException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public ConflictingModificationAppliedException(final InstanceIdentifier path, final String message, final Throwable cause) { - super(path, message, cause); - } - - public ConflictingModificationAppliedException(final InstanceIdentifier path, final String message) { - super(path, message); - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java deleted file mode 100644 index 4807e15653..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java +++ /dev/null @@ -1,51 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Interface representing a data tree which can be modified in an MVCC fashion. - */ -public interface DataTree { - /** - * Take a read-only point-in-time snapshot of the tree. - * - * @return Data tree snapshot. - */ - DataTreeSnapshot takeSnapshot(); - - /** - * Make the data tree use a new schema context. The context will be used - * only by subsequent operations. - * - * @param newSchemaContext new SchemaContext - * @throws IllegalArgumentException if the new context is incompatible - */ - void setSchemaContext(SchemaContext newSchemaContext); - - /** - * Validate whether a particular modification can be applied to the data tree. - */ - void validate(DataTreeModification modification) throws DataValidationFailedException; - - /** - * Prepare a modification for commit. - * - * @param modification - * @return candidate data tree - */ - DataTreeCandidate prepare(DataTreeModification modification); - - /** - * Commit a data tree candidate. - * - * @param candidate data tree candidate - */ - void commit(DataTreeCandidate candidate); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeCandidate.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeCandidate.java deleted file mode 100644 index d860dfc064..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeCandidate.java +++ /dev/null @@ -1,35 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; - -/** - * An encapsulation of a validated data tree modification. This candidate - * is ready for atomic commit to the datastore. It allows access to before- - * and after-state as it will be seen in to subsequent commit. This capture - * can be accessed for reference, but cannot be modified and the content - * is limited to nodes which were affected by the modification from which - * this instance originated. - */ -public interface DataTreeCandidate { - /** - * Get the candidate tree root node. - * - * @return Candidate tree root node - */ - DataTreeCandidateNode getRootNode(); - - /** - * Get the candidate tree root path. This is the path of the root node - * relative to the root of InstanceIdentifier namespace. - * - * @return Relative path of the root node - */ - InstanceIdentifier getRootPath(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeCandidateNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeCandidateNode.java deleted file mode 100644 index 528419d235..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeCandidateNode.java +++ /dev/null @@ -1,58 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Optional; - -/** - * A single node within a {@link DataTreeCandidate}. The nodes are organized - * in tree hierarchy, reflecting the modification from which this candidate - * was created. The node itself exposes the before- and after-image of the - * tree restricted to the modified nodes. - */ -public interface DataTreeCandidateNode { - /** - * Get the node identifier. - * - * @return The node identifier. - */ - PathArgument getIdentifier(); - - /** - * Get an unmodifiable iterable of modified child nodes. - * - * @return Unmodifiable iterable of modified child nodes. - */ - Iterable getChildNodes(); - - /** - * Return the type of modification this node is undergoing. - * - * @return Node modification type. - */ - ModificationType getModificationType(); - - /** - * Return the before-image of data corresponding to the node. - * - * @return Node data as they were present in the tree before - * the modification was applied. - */ - Optional> getDataAfter(); - - /** - * Return the after-image of data corresponding to the node. - * - * @return Node data as they will be present in the tree after - * the modification is applied. - */ - Optional> getDataBefore(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeModification.java deleted file mode 100644 index e4370c46a0..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeModification.java +++ /dev/null @@ -1,50 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -/** - * Class encapsulation of set of modifications to a base tree. This tree is backed - * by a read-only snapshot and tracks modifications on top of that. The modification - * has the ability to rebase itself to a new snapshot. - */ -public interface DataTreeModification extends DataTreeSnapshot { - /** - * Delete the node at specified path. - * - * @param path Node path - */ - void delete(InstanceIdentifier path); - - /** - * Merge the specified data with the currently-present data - * at specified path. - * - * @param path Node path - * @param data Data to be merged - */ - void merge(InstanceIdentifier path, NormalizedNode data); - - /** - * Replace the data at specified path with supplied data. - * - * @param path Node path - * @param data New node data - */ - void write(InstanceIdentifier path, NormalizedNode data); - - /** - * Finish creation of a modification, making it ready for application - * to the data tree. Any calls to this object's methods will result - * in undefined behavior, possibly with an - * {@link IllegalStateException} being thrown. - */ - void ready(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeSnapshot.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeSnapshot.java deleted file mode 100644 index a94acc5658..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeSnapshot.java +++ /dev/null @@ -1,37 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Optional; - -/** - * Read-only snapshot of a {@link DataTree}. The snapshot is stable and isolated, - * e.g. data tree changes occurring after the snapshot has been taken are not - * visible through the snapshot. - */ -public interface DataTreeSnapshot { - /** - * Read a particular node from the snapshot. - * - * @param path Path of the node - * @return Optional result encapsulating the presence and value of the node - */ - Optional> readNode(InstanceIdentifier path); - - /** - * Create a new data tree modification based on this snapshot, using the - * specified data application strategy. - * - * @param strategy data modification strategy - * @return A new data tree modification - */ - DataTreeModification newModification(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataValidationFailedException.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataValidationFailedException.java deleted file mode 100644 index 3683240f57..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataValidationFailedException.java +++ /dev/null @@ -1,53 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; - -import com.google.common.base.Preconditions; - -/** - * Exception thrown when a proposed change fails validation before being - * applied into the datastore. This can have multiple reasons, for example - * the datastore has been concurrently modified such that a conflicting - * node is present, or the modification is structurally incorrect. - */ -public class DataValidationFailedException extends Exception { - private static final long serialVersionUID = 1L; - private final InstanceIdentifier path; - - /** - * Create a new instance. - * - * @param path Object path which caused this exception - * @param message Specific message describing the failure - */ - public DataValidationFailedException(final InstanceIdentifier path, final String message) { - this(path, message, null); - } - /** - * Create a new instance, initializing - * - * @param path Object path which caused this exception - * @param message Specific message describing the failure - * @param cause Exception which triggered this failure, may be null - */ - public DataValidationFailedException(final InstanceIdentifier path, final String message, final Throwable cause) { - super(message, cause); - this.path = Preconditions.checkNotNull(path); - } - - /** - * Returns the offending object path. - * - * @return Path of the offending object - */ - public InstanceIdentifier getPath() { - return path; - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java deleted file mode 100644 index 87482a9156..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java +++ /dev/null @@ -1,33 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; - -/** - * Exception thrown when a proposed change fails validation before being - * applied into the datastore because of incorrect structure of user supplied - * data. - * - */ -public class IncorrectDataStructureException extends DataValidationFailedException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IncorrectDataStructureException(final InstanceIdentifier path, final String message, final Throwable cause) { - super(path, message, cause); - } - - public IncorrectDataStructureException(final InstanceIdentifier path, final String message) { - super(path, message); - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ModificationType.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ModificationType.java deleted file mode 100644 index b9a26f5c00..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ModificationType.java +++ /dev/null @@ -1,45 +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.md.sal.dom.store.impl.tree; - -/** - * Enumeration of all possible node modification states. These are used in - * data tree modification context to quickly assess what sort of modification - * the node is undergoing. - */ -public enum ModificationType { - /** - * Node is currently unmodified. - */ - UNMODIFIED, - - /** - * A child node, either direct or indirect, has been modified. This means - * that the data representation of this node has potentially changed. - */ - SUBTREE_MODIFIED, - - /** - * This node has been placed into the tree, potentially completely replacing - * pre-existing contents. - */ - WRITE, - - /** - * This node has been deleted along with any of its child nodes. - */ - DELETE, - - /** - * Node has been written into the tree, but instead of replacing pre-existing - * contents, it has been merged. This means that any incoming nodes which - * were present in the tree have been replaced, but their child nodes have - * been retained. - */ - MERGE, -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/StoreTreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/StoreTreeNode.java deleted file mode 100644 index d714f1cc85..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/StoreTreeNode.java +++ /dev/null @@ -1,29 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; - -import com.google.common.base.Optional; - -/** - * A tree node which has references to its child leaves. This are typically - * internal non-data leaves, such as containers, lists, etc. - * - * @param Final node type - */ -public interface StoreTreeNode> { - - /** - * Returns a direct child of the node - * - * @param child Identifier of child - * @return Optional with node if the child is existing, {@link Optional#absent()} otherwise. - */ - Optional getChild(PathArgument child); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/StoreUtils.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/StoreUtils.java deleted file mode 100644 index b634866856..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/StoreUtils.java +++ /dev/null @@ -1,70 +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.md.sal.dom.store.impl.tree; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; - -import com.google.common.base.Strings; - -/** - * Data store tree manipulation utilities. - */ -public final class StoreUtils { - private static final int STRINGTREE_INDENT = 4; - - private StoreUtils() { - throw new UnsupportedOperationException("Utility class should not be instantiated"); - } - - /** - * Convert a data subtree under a node into a human-readable string format. - * - * @param node Data subtree root - * @return String containing a human-readable form of the subtree. - */ - public static String toStringTree(final NormalizedNode node) { - final StringBuilder builder = new StringBuilder(); - toStringTree(builder, node, 0); - return builder.toString(); - } - - private static void toStringTree(final StringBuilder builder, final NormalizedNode node, final int offset) { - final String prefix = Strings.repeat(" ", offset); - - builder.append(prefix).append(toStringTree(node.getIdentifier())); - if (node instanceof NormalizedNodeContainer) { - final NormalizedNodeContainer container = (NormalizedNodeContainer) node; - - builder.append(" {\n"); - for (NormalizedNode child : container.getValue()) { - toStringTree(builder, child, offset + STRINGTREE_INDENT); - } - - builder.append(prefix).append('}'); - } else { - builder.append(' ').append(node.getValue()); - } - builder.append('\n'); - } - - private static String toStringTree(final PathArgument identifier) { - if (identifier instanceof NodeIdentifierWithPredicates) { - StringBuilder builder = new StringBuilder(); - builder.append(identifier.getNodeType().getLocalName()); - builder.append(((NodeIdentifierWithPredicates) identifier).getKeyValues().values()); - return builder.toString(); - } else if (identifier instanceof AugmentationIdentifier) { - return "augmentation"; - } - return identifier.getNodeType().getLocalName(); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java deleted file mode 100644 index fe98468b5c..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java +++ /dev/null @@ -1,107 +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.md.sal.dom.store.impl.tree; - -import java.util.AbstractMap.SimpleEntry; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; - -/** - * A set of utility methods for interacting with {@link org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode} objects. - */ -public final class TreeNodeUtils { - private TreeNodeUtils() { - throw new UnsupportedOperationException("Utility class should not be instantiated"); - } - - /** - * Finds a node in tree - * - * @param tree Data Tree - * @param path Path to the node - * @return Optional with node if the node is present in tree, {@link Optional#absent()} otherwise. - */ - public static > Optional findNode(final T tree, final InstanceIdentifier path) { - Optional current = Optional. of(tree); - Iterator pathIter = path.getPath().iterator(); - while (current.isPresent() && pathIter.hasNext()) { - current = current.get().getChild(pathIter.next()); - } - return current; - } - - public static > T findNodeChecked(final T tree, final InstanceIdentifier path) { - T current = tree; - List nested = new ArrayList<>(path.getPath().size()); - for(PathArgument pathArg : path.getPath()) { - Optional potential = current.getChild(pathArg); - nested.add(pathArg); - Preconditions.checkArgument(potential.isPresent(),"Child %s is not present in tree.",nested); - current = potential.get(); - } - return current; - } - - /** - * Finds a node or closest parent in the tree - * - * @param tree Data Tree - * @param path Path to the node - * @return Map.Entry Entry with key which is path to closest parent and value is parent node. - * - */ - public static > Map.Entry findClosest(final T tree, final InstanceIdentifier path) { - return findClosestsOrFirstMatch(tree, path, Predicates.alwaysFalse()); - } - - public static > Map.Entry findClosestsOrFirstMatch(final T tree, final InstanceIdentifier path, final Predicate predicate) { - Optional parent = Optional.of(tree); - Optional current = Optional. of(tree); - - int nesting = 0; - Iterator pathIter = path.getPath().iterator(); - while (current.isPresent() && pathIter.hasNext() && !predicate.apply(current.get())) { - parent = current; - current = current.get().getChild(pathIter.next()); - nesting++; - } - if(current.isPresent()) { - final InstanceIdentifier currentPath = new InstanceIdentifier(path.getPath().subList(0, nesting)); - return new SimpleEntry(currentPath,current.get()); - } - - /* - * Subtracting 1 from nesting level at this point is safe, because we - * cannot reach here with nesting == 0: that would mean the above check - * for current.isPresent() failed, which it cannot, as current is always - * present. At any rate we check state just to be on the safe side. - */ - Preconditions.checkState(nesting > 0); - final InstanceIdentifier parentPath = new InstanceIdentifier(path.getPath().subList(0, nesting - 1)); - - return new SimpleEntry(parentPath,parent.get()); - } - - public static > Optional getChild(final Optional parent,final PathArgument child) { - if(parent.isPresent()) { - return parent.get().getChild(child); - } - return Optional.absent(); - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AbstractDataTreeCandidate.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AbstractDataTreeCandidate.java deleted file mode 100644 index cddda5ccc5..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AbstractDataTreeCandidate.java +++ /dev/null @@ -1,27 +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.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; - -import com.google.common.base.Preconditions; - -abstract class AbstractDataTreeCandidate implements DataTreeCandidate { - private final InstanceIdentifier rootPath; - - protected AbstractDataTreeCandidate(final InstanceIdentifier rootPath) { - this.rootPath = Preconditions.checkNotNull(rootPath); - } - - @Override - public final InstanceIdentifier getRootPath() { - return rootPath; - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java deleted file mode 100644 index c09a1a38b5..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; - -import com.google.common.base.Optional; - -/** - * An implementation of apply operation which fails to do anything, - * consistently. An instance of this class is used by the data tree - * if it does not have a SchemaContext attached and hence cannot - * perform anything meaningful. - */ -final class AlwaysFailOperation implements ModificationApplyOperation { - @Override - public Optional apply(final ModifiedNode modification, - final Optional storeMeta, final Version version) { - throw new IllegalStateException("Schema Context is not available."); - } - - @Override - public void checkApplicable(final InstanceIdentifier path,final NodeModification modification, final Optional storeMetadata) { - throw new IllegalStateException("Schema Context is not available."); - } - - @Override - public Optional getChild(final PathArgument child) { - throw new IllegalStateException("Schema Context is not available."); - } - - @Override - public void verifyStructure(final ModifiedNode modification) { - throw new IllegalStateException("Schema Context is not available."); - } -} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/DataNodeContainerModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/DataNodeContainerModificationStrategy.java deleted file mode 100644 index dc891482ab..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/DataNodeContainerModificationStrategy.java +++ /dev/null @@ -1,160 +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.md.sal.dom.store.impl.tree.data; - -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ExecutionException; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.AugmentationSchemaProxy; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; - -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; - -/** - * Base strategy for applying changes to a ContainerNode, irrespective of its - * actual type. - * - * @param Type of the container node - */ -abstract class DataNodeContainerModificationStrategy extends NormalizedNodeContainerModificationStrategy { - - private final T schema; - private final LoadingCache childCache = CacheBuilder.newBuilder() - .build(CacheLoader.from(new Function() { - - @Override - public ModificationApplyOperation apply(final PathArgument identifier) { - if (identifier instanceof AugmentationIdentifier && schema instanceof AugmentationTarget) { - return from(schema, (AugmentationTarget) schema, (AugmentationIdentifier) identifier); - } - - DataSchemaNode child = schema.getDataChildByName(identifier.getNodeType()); - if (child == null) { - return null; - } - return from(child); - } - })); - - protected DataNodeContainerModificationStrategy(final T schema, - final Class> nodeClass) { - super(nodeClass); - this.schema = schema; - } - - protected T getSchema() { - return schema; - } - - @Override - public Optional getChild(final PathArgument identifier) { - try { - return Optional. fromNullable(childCache.get(identifier)); - } catch (ExecutionException e) { - return Optional.absent(); - } - } - - @Override - @SuppressWarnings("rawtypes") - protected abstract DataContainerNodeBuilder createBuilder(NormalizedNode original); - - @Override - public String toString() { - return getClass().getSimpleName() + " [" + schema + "]"; - } - - public static class AugmentationModificationStrategy extends DataNodeContainerModificationStrategy { - - protected AugmentationModificationStrategy(final AugmentationSchema schema, final DataNodeContainer resolved) { - super(createAugmentProxy(schema,resolved), AugmentationNode.class); - } - - @Override - @SuppressWarnings("rawtypes") - protected DataContainerNodeBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof AugmentationNode); - return ImmutableAugmentationNodeBuilder.create((AugmentationNode) original); - } - - - private static AugmentationSchema createAugmentProxy(final AugmentationSchema schema, final DataNodeContainer resolved) { - Set realChildSchemas = new HashSet<>(); - for(DataSchemaNode augChild : schema.getChildNodes()) { - realChildSchemas.add(resolved.getDataChildByName(augChild.getQName())); - } - return new AugmentationSchemaProxy(schema, realChildSchemas); - } - } - - public static class ContainerModificationStrategy extends DataNodeContainerModificationStrategy { - - public ContainerModificationStrategy(final ContainerSchemaNode schemaNode) { - super(schemaNode, ContainerNode.class); - } - - @Override - @SuppressWarnings("rawtypes") - protected DataContainerNodeBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof ContainerNode); - return ImmutableContainerNodeBuilder.create((ContainerNode) original); - } - } - - public static class ListEntryModificationStrategy extends DataNodeContainerModificationStrategy { - - protected ListEntryModificationStrategy(final ListSchemaNode schema) { - super(schema, MapEntryNode.class); - } - - @Override - @SuppressWarnings("rawtypes") - protected final DataContainerNodeBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof MapEntryNode); - return ImmutableMapEntryNodeBuilder.create((MapEntryNode) original); - } - } - - public static class UnkeyedListItemModificationStrategy extends DataNodeContainerModificationStrategy { - - public UnkeyedListItemModificationStrategy(final ListSchemaNode schemaNode) { - super(schemaNode, UnkeyedListEntryNode.class); - } - - @Override - @SuppressWarnings("rawtypes") - protected DataContainerNodeBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof UnkeyedListEntryNode); - return ImmutableUnkeyedListEntryNodeBuilder.create((UnkeyedListEntryNode) original); - } - } -} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java deleted file mode 100644 index 4ffa6f91b0..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java +++ /dev/null @@ -1,138 +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.md.sal.dom.store.impl.tree.data; - -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTree; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreUtils; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - -/** - * Read-only snapshot of the data tree. - */ -final class InMemoryDataTree implements DataTree { - private static final Logger LOG = LoggerFactory.getLogger(InMemoryDataTree.class); - private static final InstanceIdentifier PUBLIC_ROOT_PATH = InstanceIdentifier.builder().build(); - - private final ReadWriteLock rwLock = new ReentrantReadWriteLock(true); - private ModificationApplyOperation applyOper = new AlwaysFailOperation(); - private SchemaContext currentSchemaContext; - private TreeNode rootNode; - - public InMemoryDataTree(final TreeNode rootNode, final SchemaContext schemaContext) { - this.rootNode = Preconditions.checkNotNull(rootNode); - - if (schemaContext != null) { - // Also sets applyOper - setSchemaContext(schemaContext); - } - } - - @Override - public synchronized void setSchemaContext(final SchemaContext newSchemaContext) { - Preconditions.checkNotNull(newSchemaContext); - - LOG.info("Attepting to install schema context {}", newSchemaContext); - - /* - * FIXME: we should walk the schema contexts, both current and new and see - * whether they are compatible here. Reject incompatible changes. - */ - - // Instantiate new apply operation, this still may fail - final ModificationApplyOperation newApplyOper = SchemaAwareApplyOperation.from(newSchemaContext); - - // Ready to change the context now, make sure no operations are running - rwLock.writeLock().lock(); - try { - this.applyOper = newApplyOper; - this.currentSchemaContext = newSchemaContext; - } finally { - rwLock.writeLock().unlock(); - } - } - - @Override - public InMemoryDataTreeSnapshot takeSnapshot() { - rwLock.readLock().lock(); - try { - return new InMemoryDataTreeSnapshot(currentSchemaContext, rootNode, applyOper); - } finally { - rwLock.readLock().unlock(); - } - } - - @Override - public void validate(final DataTreeModification modification) throws DataValidationFailedException { - Preconditions.checkArgument(modification instanceof InMemoryDataTreeModification, "Invalid modification class %s", modification.getClass()); - - final InMemoryDataTreeModification m = (InMemoryDataTreeModification)modification; - m.getStrategy().checkApplicable(PUBLIC_ROOT_PATH, m.getRootModification(), Optional.of(rootNode)); - } - - @Override - public synchronized DataTreeCandidate prepare(final DataTreeModification modification) { - Preconditions.checkArgument(modification instanceof InMemoryDataTreeModification, "Invalid modification class %s", modification.getClass()); - - final InMemoryDataTreeModification m = (InMemoryDataTreeModification)modification; - final ModifiedNode root = m.getRootModification(); - - if (root.getType() == ModificationType.UNMODIFIED) { - return new NoopDataTreeCandidate(PUBLIC_ROOT_PATH, root); - } - - rwLock.writeLock().lock(); - try { - final Optional newRoot = m.getStrategy().apply(m.getRootModification(), - Optional.of(rootNode), rootNode.getSubtreeVersion().next()); - Preconditions.checkState(newRoot.isPresent(), "Apply strategy failed to produce root node"); - return new InMemoryDataTreeCandidate(PUBLIC_ROOT_PATH, root, rootNode, newRoot.get()); - } finally { - rwLock.writeLock().unlock(); - } - } - - @Override - public synchronized void commit(final DataTreeCandidate candidate) { - if (candidate instanceof NoopDataTreeCandidate) { - return; - } - - Preconditions.checkArgument(candidate instanceof InMemoryDataTreeCandidate, "Invalid candidate class %s", candidate.getClass()); - final InMemoryDataTreeCandidate c = (InMemoryDataTreeCandidate)candidate; - - LOG.debug("Updating datastore from {} to {}", rootNode, c.getAfterRoot()); - - if (LOG.isTraceEnabled()) { - LOG.trace("Data Tree is {}", StoreUtils.toStringTree(c.getAfterRoot().getData())); - } - - // Ready to change the context now, make sure no operations are running - rwLock.writeLock().lock(); - try { - Preconditions.checkState(c.getBeforeRoot() == rootNode, - String.format("Store tree %s and candidate base %s differ.", rootNode, c.getBeforeRoot())); - this.rootNode = c.getAfterRoot(); - } finally { - rwLock.writeLock().unlock(); - } - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java deleted file mode 100644 index bafea6bd97..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidateNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; - -final class InMemoryDataTreeCandidate extends AbstractDataTreeCandidate { - private static abstract class AbstractNode implements DataTreeCandidateNode { - private final ModifiedNode mod; - private final TreeNode newMeta; - private final TreeNode oldMeta; - - protected AbstractNode(final ModifiedNode mod, - final TreeNode oldMeta, final TreeNode newMeta) { - this.newMeta = newMeta; - this.oldMeta = oldMeta; - this.mod = Preconditions.checkNotNull(mod); - } - - protected final ModifiedNode getMod() { - return mod; - } - - protected final TreeNode getNewMeta() { - return newMeta; - } - - protected final TreeNode getOldMeta() { - return oldMeta; - } - - private static final TreeNode childMeta(final TreeNode parent, final PathArgument id) { - if (parent != null) { - return parent.getChild(id).orNull(); - } else { - return null; - } - } - - @Override - public Iterable getChildNodes() { - return Iterables.transform(mod.getChildren(), new Function() { - @Override - public DataTreeCandidateNode apply(final ModifiedNode input) { - final PathArgument id = input.getIdentifier(); - return new ChildNode(input, childMeta(oldMeta, id), childMeta(newMeta, id)); - } - }); - } - - @Override - public ModificationType getModificationType() { - return mod.getType(); - } - - private Optional> optionalData(final TreeNode meta) { - if (meta != null) { - return Optional.>of(meta.getData()); - } else { - return Optional.absent(); - } - } - - @Override - public Optional> getDataAfter() { - return optionalData(newMeta); - } - - @Override - public Optional> getDataBefore() { - return optionalData(oldMeta); - } - } - - private static final class ChildNode extends AbstractNode { - public ChildNode(final ModifiedNode mod, final TreeNode oldMeta, final TreeNode newMeta) { - super(mod, oldMeta, newMeta); - } - - @Override - public PathArgument getIdentifier() { - return getMod().getIdentifier(); - } - } - - private static final class RootNode extends AbstractNode { - public RootNode(final ModifiedNode mod, final TreeNode oldMeta, final TreeNode newMeta) { - super(mod, oldMeta, newMeta); - } - - @Override - public PathArgument getIdentifier() { - throw new IllegalStateException("Attempted to get identifier of the root node"); - } - } - - private final RootNode root; - - InMemoryDataTreeCandidate(final InstanceIdentifier rootPath, final ModifiedNode modificationRoot, - final TreeNode beforeRoot, final TreeNode afterRoot) { - super(rootPath); - this.root = new RootNode(modificationRoot, beforeRoot, afterRoot); - } - - TreeNode getAfterRoot() { - return root.getNewMeta(); - } - - TreeNode getBeforeRoot() { - return root.getOldMeta(); - } - - @Override - public DataTreeCandidateNode getRootNode() { - return root; - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java deleted file mode 100644 index 4640be43e7..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * A factory for creating in-memory data trees. - */ -public final class InMemoryDataTreeFactory implements DataTreeFactory { - private static final InMemoryDataTreeFactory INSTANCE = new InMemoryDataTreeFactory(); - - private InMemoryDataTreeFactory() { - // Never instantiated externally - } - - @Override - public InMemoryDataTree create() { - final NodeIdentifier root = new NodeIdentifier(SchemaContext.NAME); - final NormalizedNode data = Builders.containerBuilder().withNodeIdentifier(root).build(); - - return new InMemoryDataTree(TreeNodeFactory.createTreeNode(data, Version.initial()), null); - } - - /** - * Get an instance of this factory. This method cannot fail. - * - * @return Data tree factory instance. - */ - public static final InMemoryDataTreeFactory getInstance() { - return INSTANCE; - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java deleted file mode 100644 index 39ff4f0aa0..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java +++ /dev/null @@ -1,178 +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.md.sal.dom.store.impl.tree.data; - -import java.util.Map.Entry; - -import javax.annotation.concurrent.GuardedBy; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.TreeNodeUtils; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - -final class InMemoryDataTreeModification implements DataTreeModification { - private static final Logger LOG = LoggerFactory.getLogger(InMemoryDataTreeModification.class); - private final ModificationApplyOperation strategyTree; - private final InMemoryDataTreeSnapshot snapshot; - private final ModifiedNode rootNode; - - @GuardedBy("this") - private boolean sealed = false; - - InMemoryDataTreeModification(final InMemoryDataTreeSnapshot snapshot, final ModificationApplyOperation resolver) { - this.snapshot = Preconditions.checkNotNull(snapshot); - this.strategyTree = Preconditions.checkNotNull(resolver); - this.rootNode = ModifiedNode.createUnmodified(snapshot.getRootNode()); - } - - ModifiedNode getRootModification() { - return rootNode; - } - - ModificationApplyOperation getStrategy() { - return strategyTree; - } - - @Override - public synchronized void write(final InstanceIdentifier path, final NormalizedNode value) { - checkSealed(); - resolveModificationFor(path).write(value); - } - - @Override - public synchronized void merge(final InstanceIdentifier path, final NormalizedNode data) { - checkSealed(); - mergeImpl(resolveModificationFor(path),data); - } - - private void mergeImpl(final OperationWithModification op,final NormalizedNode data) { - - if(data instanceof NormalizedNodeContainer) { - @SuppressWarnings({ "rawtypes", "unchecked" }) - NormalizedNodeContainer> dataContainer = (NormalizedNodeContainer) data; - for(NormalizedNode child : dataContainer.getValue()) { - PathArgument childId = child.getIdentifier(); - mergeImpl(op.forChild(childId), child); - } - } - op.merge(data); - } - - @Override - public synchronized void delete(final InstanceIdentifier path) { - checkSealed(); - resolveModificationFor(path).delete(); - } - - @Override - public synchronized Optional> readNode(final InstanceIdentifier path) { - /* - * Walk the tree from the top, looking for the first node between root and - * the requested path which has been modified. If no such node exists, - * we use the node itself. - */ - final Entry entry = TreeNodeUtils.findClosestsOrFirstMatch(rootNode, path, ModifiedNode.IS_TERMINAL_PREDICATE); - final InstanceIdentifier key = entry.getKey(); - final ModifiedNode mod = entry.getValue(); - - final Optional result = resolveSnapshot(key, mod); - if (result.isPresent()) { - NormalizedNode data = result.get().getData(); - return NormalizedNodeUtils.findNode(key, data, path); - } else { - return Optional.absent(); - } - } - - private Optional resolveSnapshot(final InstanceIdentifier path, - final ModifiedNode modification) { - final Optional> potentialSnapshot = modification.getSnapshotCache(); - if(potentialSnapshot.isPresent()) { - return potentialSnapshot.get(); - } - - try { - return resolveModificationStrategy(path).apply(modification, modification.getOriginal(), - snapshot.getRootNode().getSubtreeVersion().next()); - } catch (Exception e) { - LOG.error("Could not create snapshot for {}:{}", path,modification,e); - throw e; - } - } - - private ModificationApplyOperation resolveModificationStrategy(final InstanceIdentifier path) { - LOG.trace("Resolving modification apply strategy for {}", path); - return TreeNodeUtils.findNodeChecked(strategyTree, path); - } - - private OperationWithModification resolveModificationFor(final InstanceIdentifier path) { - ModifiedNode modification = rootNode; - // We ensure strategy is present. - ModificationApplyOperation operation = resolveModificationStrategy(path); - for (PathArgument pathArg : path.getPath()) { - modification = modification.modifyChild(pathArg); - } - return OperationWithModification.from(operation, modification); - } - - @Override - public synchronized void ready() { - Preconditions.checkState(!sealed, "Attempted to seal an already-sealed Data Tree."); - sealed = true; - rootNode.seal(); - } - - @GuardedBy("this") - private void checkSealed() { - Preconditions.checkState(!sealed, "Data Tree is sealed. No further modifications allowed."); - } - - @Override - public String toString() { - return "MutableDataTree [modification=" + rootNode + "]"; - } - - @Override - public synchronized DataTreeModification newModification() { - Preconditions.checkState(sealed, "Attempted to chain on an unsealed modification"); - - if(rootNode.getType() == ModificationType.UNMODIFIED) { - return snapshot.newModification(); - } - - /* - * FIXME: Add advanced transaction chaining for modification of not rebased - * modification. - * - * Current computation of tempRoot may yeld incorrect subtree versions - * if there are multiple concurrent transactions, which may break - * versioning preconditions for modification of previously occured write, - * directly nested under parent node, since node version is derived from - * subtree version. - * - * For deeper nodes subtree version is derived from their respective metadata - * nodes, so this incorrect root subtree version is not affecting us. - */ - TreeNode originalSnapshotRoot = snapshot.getRootNode(); - Optional tempRoot = strategyTree.apply(rootNode, Optional.of(originalSnapshotRoot), originalSnapshotRoot.getSubtreeVersion().next()); - - InMemoryDataTreeSnapshot tempTree = new InMemoryDataTreeSnapshot(snapshot.getSchemaContext(), tempRoot.get(), strategyTree); - return tempTree.newModification(); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeSnapshot.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeSnapshot.java deleted file mode 100644 index ee91e62518..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeSnapshot.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeSnapshot; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - -final class InMemoryDataTreeSnapshot implements DataTreeSnapshot { - private final ModificationApplyOperation applyOper; - private final SchemaContext schemaContext; - private final TreeNode rootNode; - - InMemoryDataTreeSnapshot(final SchemaContext schemaContext, final TreeNode rootNode, - final ModificationApplyOperation applyOper) { - this.schemaContext = Preconditions.checkNotNull(schemaContext); - this.rootNode = Preconditions.checkNotNull(rootNode); - this.applyOper = Preconditions.checkNotNull(applyOper); - } - - TreeNode getRootNode() { - return rootNode; - } - - SchemaContext getSchemaContext() { - return schemaContext; - } - - @Override - public Optional> readNode(final InstanceIdentifier path) { - return NormalizedNodeUtils.findNode(rootNode.getData(), path); - } - - @Override - public InMemoryDataTreeModification newModification() { - return new InMemoryDataTreeModification(this, applyOper); - } - - @Override - public String toString() { - return rootNode.getSubtreeVersion().toString(); - } - -} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java deleted file mode 100644 index f72d575194..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java +++ /dev/null @@ -1,93 +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.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; - -import com.google.common.base.Optional; - -/** - * - * Operation responsible for applying {@link ModifiedNode} on tree. - * - * Operation is composite - operation on top level node consists of - * suboperations on child nodes. This allows to walk operation hierarchy and - * invoke suboperations independently. - * - * Implementation notes - *
    - *
  • - * Implementations MUST expose all nested suboperations which operates on child - * nodes expose via {@link #getChild(PathArgument)} method. - *
  • Same suboperations SHOULD be used when invoked via - * {@link #apply(ModifiedNode, Optional)} if applicable. - * - * - * Hierarchical composite operation which is responsible for applying - * modification on particular subtree and creating updated subtree - * - * - */ -interface ModificationApplyOperation extends StoreTreeNode { - - /** - * - * Implementation of this operation must be stateless and must not change - * state of this object. - * - * @param modification - * NodeModification to be applied - * @param storeMeta - * Store Metadata Node on which NodeModification should be - * applied - * @param version New subtree version of parent node - * @throws IllegalArgumentException - * If it is not possible to apply Operation on provided Metadata - * node - * @return new {@link StoreMetadataNode} if operation resulted in updating - * node, {@link Optional#absent()} if {@link ModifiedNode} - * resulted in deletion of this node. - */ - Optional apply(ModifiedNode modification, Optional storeMeta, Version version); - - /** - * - * Performs structural verification of NodeModification, such as writen values / types - * uses right structural elements. - * - * @param modification to be verified. - * @throws IllegalArgumentException If provided NodeModification does not adhere to the structure. - */ - void verifyStructure(ModifiedNode modification) throws IllegalArgumentException; - - /** - * Returns a suboperation for specified tree node - * - * @return Reference to suboperation for specified tree node, {@link Optional#absent()} - * if suboperation is not supported for specified tree node. - */ - @Override - Optional getChild(PathArgument child); - - /** - * - * Checks if provided node modification could be applied to current metadata node. - * - * @param modification Modification - * @param current Metadata Node to which modification should be applied - * @return true if modification is applicable - * false if modification is no applicable - * @throws DataValidationFailedException - */ - void checkApplicable(InstanceIdentifier path, NodeModification modification, Optional current) throws DataValidationFailedException; -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModifiedNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModifiedNode.java deleted file mode 100644 index f83ea1a2de..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModifiedNode.java +++ /dev/null @@ -1,225 +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.md.sal.dom.store.impl.tree.data; - -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.annotation.concurrent.GuardedBy; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.yangtools.concepts.Identifiable; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; - -/** - * Node Modification Node and Tree - * - * Tree which structurally resembles data tree and captures client modifications - * to the data store tree. - * - * This tree is lazily created and populated via {@link #modifyChild(PathArgument)} - * and {@link StoreMetadataNode} which represents original state {@link #getOriginal()}. - */ -final class ModifiedNode implements StoreTreeNode, Identifiable, NodeModification { - - public static final Predicate IS_TERMINAL_PREDICATE = new Predicate() { - @Override - public boolean apply(final ModifiedNode input) { - switch (input.getType()) { - case DELETE: - case MERGE: - case WRITE: - return true; - case SUBTREE_MODIFIED: - case UNMODIFIED: - return false; - } - - throw new IllegalArgumentException(String.format("Unhandled modification type %s", input.getType())); - } - }; - - private final Map children = new LinkedHashMap<>(); - private final Optional original; - private final PathArgument identifier; - private ModificationType modificationType = ModificationType.UNMODIFIED; - private Optional snapshotCache; - private NormalizedNode value; - - private ModifiedNode(final PathArgument identifier, final Optional original) { - this.identifier = identifier; - this.original = original; - } - - /** - * - * - * @return - */ - public NormalizedNode getWrittenValue() { - return value; - } - - @Override - public PathArgument getIdentifier() { - return identifier; - } - - /** - * - * Returns original store metadata - * @return original store metadata - */ - @Override - public Optional getOriginal() { - return original; - } - - /** - * Returns modification type - * - * @return modification type - */ - @Override - public ModificationType getType() { - return modificationType; - } - - /** - * - * Returns child modification if child was modified - * - * @return Child modification if direct child or it's subtree - * was modified. - * - */ - @Override - public Optional getChild(final PathArgument child) { - return Optional. fromNullable(children.get(child)); - } - - /** - * - * Returns child modification if child was modified, creates {@link ModifiedNode} - * for child otherwise. - * - * If this node's {@link ModificationType} is {@link ModificationType#UNMODIFIED} - * changes modification type to {@link ModificationType#SUBTREE_MODIFIED} - * - * @param child - * @return {@link ModifiedNode} for specified child, with {@link #getOriginal()} - * containing child metadata if child was present in original data. - */ - public ModifiedNode modifyChild(final PathArgument child) { - clearSnapshot(); - if (modificationType == ModificationType.UNMODIFIED) { - updateModificationType(ModificationType.SUBTREE_MODIFIED); - } - final ModifiedNode potential = children.get(child); - if (potential != null) { - return potential; - } - - final Optional currentMetadata; - if (original.isPresent()) { - final TreeNode orig = original.get(); - currentMetadata = orig.getChild(child); - } else { - currentMetadata = Optional.absent(); - } - - ModifiedNode newlyCreated = new ModifiedNode(child, currentMetadata); - children.put(child, newlyCreated); - return newlyCreated; - } - - /** - * - * Returns all recorded direct child modification - * - * @return all recorded direct child modifications - */ - @Override - public Iterable getChildren() { - return children.values(); - } - - /** - * - * Records a delete for associated node. - * - */ - public void delete() { - clearSnapshot(); - updateModificationType(ModificationType.DELETE); - children.clear(); - this.value = null; - } - - /** - * - * Records a write for associated node. - * - * @param value - */ - public void write(final NormalizedNode value) { - clearSnapshot(); - updateModificationType(ModificationType.WRITE); - children.clear(); - this.value = value; - } - - public void merge(final NormalizedNode data) { - clearSnapshot(); - updateModificationType(ModificationType.MERGE); - // FIXME: Probably merge with previous value. - this.value = data; - } - - void seal() { - clearSnapshot(); - for (ModifiedNode child : children.values()) { - child.seal(); - } - } - - private void clearSnapshot() { - snapshotCache = null; - } - - public Optional storeSnapshot(final Optional snapshot) { - snapshotCache = snapshot; - return snapshot; - } - - public Optional> getSnapshotCache() { - return Optional.fromNullable(snapshotCache); - } - - @GuardedBy("this") - private void updateModificationType(final ModificationType type) { - modificationType = type; - clearSnapshot(); - } - - @Override - public String toString() { - return "NodeModification [identifier=" + identifier + ", modificationType=" - + modificationType + ", childModification=" + children + "]"; - } - - public static ModifiedNode createUnmodified(final TreeNode metadataTree) { - return new ModifiedNode(metadataTree.getIdentifier(), Optional.of(metadataTree)); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java deleted file mode 100644 index e7e79f8916..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java +++ /dev/null @@ -1,44 +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.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.yangtools.concepts.Identifiable; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; - -import com.google.common.base.Optional; - -/** - * Internal interface representing a modification action of a particular node. - * It is used by the validation code to allow for a read-only view of the - * modification tree as we should never modify that during validation. - */ -interface NodeModification extends Identifiable { - /** - * Get the type of modification. - * - * @return Modification type. - */ - ModificationType getType(); - - /** - * Get the original tree node to which the modification is to be applied. - * - * @return The original node, or {@link Optional#absent()} if the node is - * a new node. - */ - Optional getOriginal(); - - /** - * Get a read-only view of children nodes. - * - * @return Iterable of all children nodes. - */ - Iterable getChildren(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NoopDataTreeCandidate.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NoopDataTreeCandidate.java deleted file mode 100644 index 227684ae35..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NoopDataTreeCandidate.java +++ /dev/null @@ -1,63 +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.md.sal.dom.store.impl.tree.data; - -import java.util.Collections; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidateNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - -/** - * Internal utility class for an empty candidate. We instantiate this class - * for empty modifications, saving memory and processing speed. Instances - * of this class are explicitly recognized and processing of them is skipped. - */ -final class NoopDataTreeCandidate extends AbstractDataTreeCandidate { - private static final DataTreeCandidateNode ROOT = new DataTreeCandidateNode() { - @Override - public ModificationType getModificationType() { - return ModificationType.UNMODIFIED; - } - - @Override - public Iterable getChildNodes() { - return Collections.emptyList(); - } - - @Override - public PathArgument getIdentifier() { - throw new IllegalStateException("Attempted to read identifier of the no-operation change"); - } - - @Override - public Optional> getDataAfter() { - return Optional.absent(); - } - - @Override - public Optional> getDataBefore() { - return Optional.absent(); - } - }; - - protected NoopDataTreeCandidate(final InstanceIdentifier rootPath, final ModifiedNode modificationRoot) { - super(rootPath); - Preconditions.checkArgument(modificationRoot.getType() == ModificationType.UNMODIFIED); - } - - @Override - public DataTreeCandidateNode getRootNode() { - return ROOT; - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java deleted file mode 100644 index 1d10ab6ea5..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java +++ /dev/null @@ -1,337 +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.md.sal.dom.store.impl.tree.data; - -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.Map; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.DataNodeContainerModificationStrategy.ListEntryModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.ValueNodeModificationStrategy.LeafSetEntryModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.MutableTreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; -import org.opendaylight.yangtools.yang.model.api.ChoiceNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - -abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareApplyOperation { - - private final Class> nodeClass; - - protected NormalizedNodeContainerModificationStrategy(final Class> nodeClass) { - this.nodeClass = nodeClass; - } - - @Override - public void verifyStructure(final ModifiedNode modification) throws IllegalArgumentException { - if (modification.getType() == ModificationType.WRITE) { - - } - for (ModifiedNode childModification : modification.getChildren()) { - resolveChildOperation(childModification.getIdentifier()).verifyStructure(childModification); - } - } - - @Override - protected void checkWriteApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataValidationFailedException { - // FIXME: Implement proper write check for replacement of node container - // prerequisite is to have transaction chain available for clients - // otherwise this will break chained writes to same node. - } - - @SuppressWarnings("rawtypes") - @Override - protected void verifyWrittenStructure(final NormalizedNode writtenValue) { - checkArgument(nodeClass.isInstance(writtenValue), "Node should must be of type %s", nodeClass); - checkArgument(writtenValue instanceof NormalizedNodeContainer); - - NormalizedNodeContainer container = (NormalizedNodeContainer) writtenValue; - for (Object child : container.getValue()) { - checkArgument(child instanceof NormalizedNode); - - /* - * FIXME: fail-fast semantics: - * - * We can validate the data structure here, aborting the commit - * before it ever progresses to being committed. - */ - } - } - - @Override - protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final Version version) { - final NormalizedNode newValue = modification.getWrittenValue(); - final TreeNode newValueMeta = TreeNodeFactory.createTreeNode(newValue, version); - - if (Iterables.isEmpty(modification.getChildren())) { - return newValueMeta; - } - - /* - * This is where things get interesting. The user has performed a write and - * then she applied some more modifications to it. So we need to make sense - * of that an apply the operations on top of the written value. We could have - * done it during the write, but this operation is potentially expensive, so - * we have left it out of the fast path. - * - * As it turns out, once we materialize the written data, we can share the - * code path with the subtree change. So let's create an unsealed TreeNode - * and run the common parts on it -- which end with the node being sealed. - */ - final MutableTreeNode mutable = newValueMeta.mutable(); - mutable.setSubtreeVersion(version); - - @SuppressWarnings("rawtypes") - final NormalizedNodeContainerBuilder dataBuilder = createBuilder(newValue); - - return mutateChildren(mutable, dataBuilder, version, modification.getChildren()); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - private TreeNode mutateChildren(final MutableTreeNode meta, final NormalizedNodeContainerBuilder data, - final Version nodeVersion, final Iterable modifications) { - - for (ModifiedNode mod : modifications) { - final PathArgument id = mod.getIdentifier(); - final Optional cm = meta.getChild(id); - - Optional result = resolveChildOperation(id).apply(mod, cm, nodeVersion); - if (result.isPresent()) { - final TreeNode tn = result.get(); - meta.addChild(tn); - data.addChild(tn.getData()); - } else { - meta.removeChild(id); - data.removeChild(id); - } - } - - meta.setData(data.build()); - return meta.seal(); - } - - @Override - protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final Version version) { - // For Node Containers - merge is same as subtree change - we only replace children. - return applySubtreeChange(modification, currentMeta, version); - } - - @Override - public TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final Version version) { - final MutableTreeNode newMeta = currentMeta.mutable(); - newMeta.setSubtreeVersion(version); - - @SuppressWarnings("rawtypes") - NormalizedNodeContainerBuilder dataBuilder = createBuilder(currentMeta.getData()); - - return mutateChildren(newMeta, dataBuilder, version, modification.getChildren()); - } - - @Override - protected void checkSubtreeModificationApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataValidationFailedException { - checkConflicting(path, current.isPresent(), "Node was deleted by other transaction."); - checkChildPreconditions(path, modification, current); - } - - private void checkChildPreconditions(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { - final TreeNode currentMeta = current.get(); - for (NodeModification childMod : modification.getChildren()) { - final PathArgument childId = childMod.getIdentifier(); - final Optional childMeta = currentMeta.getChild(childId); - - InstanceIdentifier childPath = path.node(childId); - resolveChildOperation(childId).checkApplicable(childPath, childMod, childMeta); - } - } - - @Override - protected void checkMergeApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataValidationFailedException { - if(current.isPresent()) { - checkChildPreconditions(path, modification,current); - } - } - - @SuppressWarnings("rawtypes") - protected abstract NormalizedNodeContainerBuilder createBuilder(NormalizedNode original); - - public static class ChoiceModificationStrategy extends NormalizedNodeContainerModificationStrategy { - - private final Map childNodes; - - public ChoiceModificationStrategy(final ChoiceNode schemaNode) { - super(org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode.class); - ImmutableMap.Builder child = ImmutableMap.builder(); - - for (ChoiceCaseNode caze : schemaNode.getCases()) { - for (DataSchemaNode cazeChild : caze.getChildNodes()) { - SchemaAwareApplyOperation childNode = from(cazeChild); - child.put(new NodeIdentifier(cazeChild.getQName()), childNode); - } - } - childNodes = child.build(); - } - - @Override - public Optional getChild(final PathArgument child) { - return Optional.fromNullable(childNodes.get(child)); - } - - @Override - @SuppressWarnings("rawtypes") - protected DataContainerNodeBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode); - return ImmutableChoiceNodeBuilder.create((org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode) original); - } - } - - public static class OrderedLeafSetModificationStrategy extends NormalizedNodeContainerModificationStrategy { - - private final Optional entryStrategy; - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected OrderedLeafSetModificationStrategy(final LeafListSchemaNode schema) { - super((Class) LeafSetNode.class); - entryStrategy = Optional. of(new LeafSetEntryModificationStrategy(schema)); - } - - @SuppressWarnings("rawtypes") - @Override - protected NormalizedNodeContainerBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof OrderedLeafSetNode); - return ImmutableOrderedLeafSetNodeBuilder.create((OrderedLeafSetNode) original); - } - - @Override - public Optional getChild(final PathArgument identifier) { - if (identifier instanceof NodeWithValue) { - return entryStrategy; - } - return Optional.absent(); - } - } - - public static class OrderedMapModificationStrategy extends NormalizedNodeContainerModificationStrategy { - - private final Optional entryStrategy; - - protected OrderedMapModificationStrategy(final ListSchemaNode schema) { - super(OrderedMapNode.class); - entryStrategy = Optional. of(new ListEntryModificationStrategy(schema)); - } - - @SuppressWarnings("rawtypes") - @Override - protected NormalizedNodeContainerBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof OrderedMapNode); - return ImmutableOrderedMapNodeBuilder.create((OrderedMapNode) original); - } - - @Override - public Optional getChild(final PathArgument identifier) { - if (identifier instanceof NodeIdentifierWithPredicates) { - return entryStrategy; - } - return Optional.absent(); - } - - @Override - public String toString() { - return "OrderedMapModificationStrategy [entry=" + entryStrategy + "]"; - } - } - - public static class UnorderedLeafSetModificationStrategy extends NormalizedNodeContainerModificationStrategy { - - private final Optional entryStrategy; - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected UnorderedLeafSetModificationStrategy(final LeafListSchemaNode schema) { - super((Class) LeafSetNode.class); - entryStrategy = Optional. of(new LeafSetEntryModificationStrategy(schema)); - } - - @SuppressWarnings("rawtypes") - @Override - protected NormalizedNodeContainerBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof LeafSetNode); - return ImmutableLeafSetNodeBuilder.create((LeafSetNode) original); - } - - @Override - public Optional getChild(final PathArgument identifier) { - if (identifier instanceof NodeWithValue) { - return entryStrategy; - } - return Optional.absent(); - } - } - - public static class UnorderedMapModificationStrategy extends NormalizedNodeContainerModificationStrategy { - - private final Optional entryStrategy; - - protected UnorderedMapModificationStrategy(final ListSchemaNode schema) { - super(MapNode.class); - entryStrategy = Optional. of(new ListEntryModificationStrategy(schema)); - } - - @SuppressWarnings("rawtypes") - @Override - protected NormalizedNodeContainerBuilder createBuilder(final NormalizedNode original) { - checkArgument(original instanceof MapNode); - return ImmutableMapNodeBuilder.create((MapNode) original); - } - - @Override - public Optional getChild(final PathArgument identifier) { - if (identifier instanceof NodeIdentifierWithPredicates) { - return entryStrategy; - } - return Optional.absent(); - } - - @Override - public String toString() { - return "UnorderedMapModificationStrategy [entry=" + entryStrategy + "]"; - } - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java deleted file mode 100644 index e1cc1a17e5..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java +++ /dev/null @@ -1,68 +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.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Optional; - -final class OperationWithModification { - - private final ModifiedNode modification; - - private final ModificationApplyOperation applyOperation; - - private OperationWithModification(final ModificationApplyOperation op, final ModifiedNode mod) { - this.modification = mod; - this.applyOperation = op; - } - - public OperationWithModification write(final NormalizedNode value) { - modification.write(value); - applyOperation.verifyStructure(modification); - return this; - } - - public OperationWithModification delete() { - modification.delete(); - return this; - } - - public ModifiedNode getModification() { - return modification; - } - - public ModificationApplyOperation getApplyOperation() { - return applyOperation; - } - - public Optional apply(final Optional data, final Version version) { - return applyOperation.apply(modification, data, version); - } - - public static OperationWithModification from(final ModificationApplyOperation operation, - final ModifiedNode modification) { - return new OperationWithModification(operation, modification); - - } - - public void merge(final NormalizedNode data) { - modification.merge(data); - applyOperation.verifyStructure(modification); - - } - - public OperationWithModification forChild(final PathArgument childId) { - ModifiedNode childMod = modification.modifyChild(childId); - Optional childOp = applyOperation.getChild(childId); - return from(childOp.get(),childMod); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java deleted file mode 100644 index f6006359af..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java +++ /dev/null @@ -1,281 +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.md.sal.dom.store.impl.tree.data; - -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.List; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ConflictingModificationAppliedException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.IncorrectDataStructureException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.DataNodeContainerModificationStrategy.ContainerModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.DataNodeContainerModificationStrategy.UnkeyedListItemModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.NormalizedNodeContainerModificationStrategy.ChoiceModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.NormalizedNodeContainerModificationStrategy.OrderedLeafSetModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.NormalizedNodeContainerModificationStrategy.OrderedMapModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.NormalizedNodeContainerModificationStrategy.UnorderedLeafSetModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.ValueNodeModificationStrategy.LeafModificationStrategy; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; -import org.opendaylight.yangtools.yang.model.api.ChoiceNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - -abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { - private static final Logger LOG = LoggerFactory.getLogger(SchemaAwareApplyOperation.class); - - public static SchemaAwareApplyOperation from(final DataSchemaNode schemaNode) { - if (schemaNode instanceof ContainerSchemaNode) { - return new ContainerModificationStrategy((ContainerSchemaNode) schemaNode); - } else if (schemaNode instanceof ListSchemaNode) { - return fromListSchemaNode((ListSchemaNode) schemaNode); - } else if (schemaNode instanceof ChoiceNode) { - return new ChoiceModificationStrategy((ChoiceNode) schemaNode); - } else if (schemaNode instanceof LeafListSchemaNode) { - return fromLeafListSchemaNode((LeafListSchemaNode) schemaNode); - } else if (schemaNode instanceof LeafSchemaNode) { - return new LeafModificationStrategy((LeafSchemaNode) schemaNode); - } - throw new IllegalArgumentException("Not supported schema node type for " + schemaNode.getClass()); - } - - public static SchemaAwareApplyOperation from(final DataNodeContainer resolvedTree, - final AugmentationTarget augSchemas, final AugmentationIdentifier identifier) { - AugmentationSchema augSchema = null; - - allAugments: - for (AugmentationSchema potential : augSchemas.getAvailableAugmentations()) { - for (DataSchemaNode child : potential.getChildNodes()) { - if (identifier.getPossibleChildNames().contains(child.getQName())) { - augSchema = potential; - break allAugments; - } - } - } - - if (augSchema != null) { - return new DataNodeContainerModificationStrategy.AugmentationModificationStrategy(augSchema, resolvedTree); - } - return null; - } - - public static boolean checkConflicting(final InstanceIdentifier path, final boolean condition, final String message) throws ConflictingModificationAppliedException { - if(!condition) { - throw new ConflictingModificationAppliedException(path, message); - } - return condition; - } - - private static SchemaAwareApplyOperation fromListSchemaNode(final ListSchemaNode schemaNode) { - List keyDefinition = schemaNode.getKeyDefinition(); - if (keyDefinition == null || keyDefinition.isEmpty()) { - return new UnkeyedListModificationStrategy(schemaNode); - } - if (schemaNode.isUserOrdered()) { - return new OrderedMapModificationStrategy(schemaNode); - } - - return new NormalizedNodeContainerModificationStrategy.UnorderedMapModificationStrategy(schemaNode); - } - - private static SchemaAwareApplyOperation fromLeafListSchemaNode(final LeafListSchemaNode schemaNode) { - if(schemaNode.isUserOrdered()) { - return new OrderedLeafSetModificationStrategy(schemaNode); - } else { - return new UnorderedLeafSetModificationStrategy(schemaNode); - } - } - - private static final void checkNotConflicting(final InstanceIdentifier path, final TreeNode original, final TreeNode current) throws ConflictingModificationAppliedException { - checkConflicting(path, original.getVersion().equals(current.getVersion()), - "Node was replaced by other transaction."); - checkConflicting(path, original.getSubtreeVersion().equals(current.getSubtreeVersion()), - "Node children was modified by other transaction"); - } - - protected final ModificationApplyOperation resolveChildOperation(final PathArgument child) { - Optional potential = getChild(child); - checkArgument(potential.isPresent(), "Operation for child %s is not defined.", child); - return potential.get(); - } - - @Override - public void verifyStructure(final ModifiedNode modification) throws IllegalArgumentException { - if (modification.getType() == ModificationType.WRITE) { - verifyWrittenStructure(modification.getWrittenValue()); - } - } - - @Override - public final void checkApplicable(final InstanceIdentifier path,final NodeModification modification, final Optional current) throws DataValidationFailedException { - switch (modification.getType()) { - case DELETE: - checkDeleteApplicable(modification, current); - case SUBTREE_MODIFIED: - checkSubtreeModificationApplicable(path, modification, current); - return; - case WRITE: - checkWriteApplicable(path, modification, current); - return; - case MERGE: - checkMergeApplicable(path, modification, current); - return; - case UNMODIFIED: - return; - default: - throw new UnsupportedOperationException("Suplied modification type "+ modification.getType()+ "is not supported."); - } - - } - - protected void checkMergeApplicable(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { - Optional original = modification.getOriginal(); - if (original.isPresent() && current.isPresent()) { - /* - * We need to do conflict detection only and only if the value of leaf changed - * before two transactions. If value of leaf is unchanged between two transactions - * it should not cause transaction to fail, since result of this merge - * leads to same data. - */ - if(!original.get().getData().equals(current.get().getData())) { - checkNotConflicting(path, original.get(), current.get()); - } - } - } - - protected void checkWriteApplicable(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { - Optional original = modification.getOriginal(); - if (original.isPresent() && current.isPresent()) { - checkNotConflicting(path, original.get(), current.get()); - } else if(original.isPresent()) { - throw new ConflictingModificationAppliedException(path,"Node was deleted by other transaction."); - } - } - - private void checkDeleteApplicable(final NodeModification modification, final Optional current) { - // Delete is always applicable, we do not expose it to subclasses - if (current.isPresent()) { - LOG.trace("Delete operation turned to no-op on missing node {}", modification); - } - } - - @Override - public final Optional apply(final ModifiedNode modification, - final Optional currentMeta, final Version version) { - - switch (modification.getType()) { - case DELETE: - return modification.storeSnapshot(Optional. absent()); - case SUBTREE_MODIFIED: - Preconditions.checkArgument(currentMeta.isPresent(), "Metadata not available for modification", - modification); - return modification.storeSnapshot(Optional.of(applySubtreeChange(modification, currentMeta.get(), - version))); - case MERGE: - if(currentMeta.isPresent()) { - return modification.storeSnapshot(Optional.of(applyMerge(modification,currentMeta.get(), version))); - } // Fallback to write is intentional - if node is not preexisting merge is same as write - case WRITE: - return modification.storeSnapshot(Optional.of(applyWrite(modification, currentMeta, version))); - case UNMODIFIED: - return currentMeta; - default: - throw new IllegalArgumentException("Provided modification type is not supported."); - } - } - - protected abstract TreeNode applyMerge(ModifiedNode modification, - TreeNode currentMeta, Version version); - - protected abstract TreeNode applyWrite(ModifiedNode modification, - Optional currentMeta, Version version); - - protected abstract TreeNode applySubtreeChange(ModifiedNode modification, - TreeNode currentMeta, Version version); - - /** - * - * Checks is supplied {@link NodeModification} is applicable for Subtree Modification. - * - * @param path Path to current node - * @param modification Node modification which should be applied. - * @param current Current state of data tree - * @throws ConflictingModificationAppliedException If subtree was changed in conflicting way - * @throws IncorrectDataStructureException If subtree modification is not applicable (e.g. leaf node). - */ - protected abstract void checkSubtreeModificationApplicable(InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataValidationFailedException; - - protected abstract void verifyWrittenStructure(NormalizedNode writtenValue); - - public static class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation { - - private final Optional entryStrategy; - - protected UnkeyedListModificationStrategy(final ListSchemaNode schema) { - entryStrategy = Optional. of(new UnkeyedListItemModificationStrategy(schema)); - } - - @Override - protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final Version version) { - return applyWrite(modification, Optional.of(currentMeta), version); - } - - @Override - protected TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final Version version) { - throw new UnsupportedOperationException("UnkeyedList does not support subtree change."); - } - - @Override - protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final Version version) { - return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), version); - } - - @Override - public Optional getChild(final PathArgument child) { - if (child instanceof NodeIdentifier) { - return entryStrategy; - } - return Optional.absent(); - } - - @Override - protected void verifyWrittenStructure(final NormalizedNode writtenValue) { - - } - - @Override - protected void checkSubtreeModificationApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws IncorrectDataStructureException { - throw new IncorrectDataStructureException(path, "Subtree modification is not allowed."); - } - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java deleted file mode 100644 index 900fa320a1..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java +++ /dev/null @@ -1,88 +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.md.sal.dom.store.impl.tree.data; - -import static com.google.common.base.Preconditions.checkArgument; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.IncorrectDataStructureException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; - -import com.google.common.base.Optional; - -abstract class ValueNodeModificationStrategy extends SchemaAwareApplyOperation { - - private final T schema; - private final Class> nodeClass; - - protected ValueNodeModificationStrategy(final T schema, final Class> nodeClass) { - super(); - this.schema = schema; - this.nodeClass = nodeClass; - } - - @Override - protected void verifyWrittenStructure(final NormalizedNode writtenValue) { - checkArgument(nodeClass.isInstance(writtenValue), "Node should must be of type %s", nodeClass); - } - - @Override - public Optional getChild(final PathArgument child) { - throw new UnsupportedOperationException("Node " + schema.getPath() - + "is leaf type node. Child nodes not allowed"); - } - - @Override - protected TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final Version version) { - throw new UnsupportedOperationException("Node " + schema.getPath() - + "is leaf type node. Subtree change is not allowed."); - } - - @Override - protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final Version version) { - // Just overwrite whatever was there - return applyWrite(modification, null, version); - } - - @Override - protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final Version version) { - return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), version); - } - - @Override - protected void checkSubtreeModificationApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws IncorrectDataStructureException { - throw new IncorrectDataStructureException(path, "Subtree modification is not allowed."); - } - - public static class LeafSetEntryModificationStrategy extends ValueNodeModificationStrategy { - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected LeafSetEntryModificationStrategy(final LeafListSchemaNode schema) { - super(schema, (Class) LeafSetEntryNode.class); - } - } - - public static class LeafModificationStrategy extends ValueNodeModificationStrategy { - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected LeafModificationStrategy(final LeafSchemaNode schema) { - super(schema, (Class) LeafNode.class); - } - } -} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java deleted file mode 100644 index 522bf3c84d..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java +++ /dev/null @@ -1,41 +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.md.sal.dom.store.impl.tree.spi; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -import com.google.common.base.Preconditions; - -/** - * A very basic data tree node. - */ -abstract class AbstractTreeNode implements TreeNode { - private final NormalizedNode data; - private final Version version; - - protected AbstractTreeNode(final NormalizedNode data, final Version version) { - this.data = Preconditions.checkNotNull(data); - this.version = Preconditions.checkNotNull(version); - } - - @Override - public PathArgument getIdentifier() { - return data.getIdentifier(); - } - - @Override - public final Version getVersion() { - return version; - } - - @Override - public final NormalizedNode getData() { - return data; - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java deleted file mode 100644 index 3ca8db2405..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java +++ /dev/null @@ -1,118 +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.md.sal.dom.store.impl.tree.spi; - -import java.util.HashMap; -import java.util.Map; - -import org.opendaylight.yangtools.util.MapAdaptor; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedNodeContainer; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - -/** - * A TreeNode capable of holding child nodes. The fact that any of the children - * changed is tracked by the subtree version. - */ -final class ContainerNode extends AbstractTreeNode { - private final Map children; - private final Version subtreeVersion; - - protected ContainerNode(final NormalizedNode data, final Version version, - final Map children, final Version subtreeVersion) { - super(data, version); - this.children = Preconditions.checkNotNull(children); - this.subtreeVersion = Preconditions.checkNotNull(subtreeVersion); - } - - @Override - public Version getSubtreeVersion() { - return subtreeVersion; - } - - @Override - public Optional getChild(final PathArgument key) { - return Optional.fromNullable(children.get(key)); - } - - @Override - public MutableTreeNode mutable() { - return new Mutable(this); - } - - private static final class Mutable implements MutableTreeNode { - private final Version version; - private Map children; - private NormalizedNode data; - private Version subtreeVersion; - - private Mutable(final ContainerNode parent) { - this.data = parent.getData(); - this.children = MapAdaptor.getDefaultInstance().takeSnapshot(parent.children); - this.subtreeVersion = parent.getSubtreeVersion(); - this.version = parent.getVersion(); - } - - @Override - public Optional getChild(final PathArgument child) { - return Optional.fromNullable(children.get(child)); - } - - @Override - public void setSubtreeVersion(final Version subtreeVersion) { - this.subtreeVersion = Preconditions.checkNotNull(subtreeVersion); - } - - @Override - public void addChild(final TreeNode child) { - children.put(child.getIdentifier(), child); - } - - @Override - public void removeChild(final PathArgument id) { - children.remove(id); - } - - @Override - public TreeNode seal() { - final TreeNode ret = new ContainerNode(data, version, MapAdaptor.getDefaultInstance().optimize(children), subtreeVersion); - - // This forces a NPE if this class is accessed again. Better than corruption. - children = null; - return ret; - } - - @Override - public void setData(final NormalizedNode data) { - this.data = Preconditions.checkNotNull(data); - } - } - - private static ContainerNode create(final Version version, final NormalizedNode data, - final Iterable> children) { - - final Map map = new HashMap<>(); - for (NormalizedNode child : children) { - map.put(child.getIdentifier(), TreeNodeFactory.createTreeNode(child, version)); - } - - return new ContainerNode(data, version, map, version); - } - - public static ContainerNode create(final Version version, final NormalizedNodeContainer> container) { - return create(version, container, container.getValue()); - } - - public static ContainerNode create(final Version version, final OrderedNodeContainer> container) { - return create(version, container, container.getValue()); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java deleted file mode 100644 index 087f4de666..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java +++ /dev/null @@ -1,59 +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.md.sal.dom.store.impl.tree.spi; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -/** - * A mutable tree node. This is a transient view materialized from a pre-existing - * node. Modifications are isolated. Once this object is {@link #seal()}-ed, - * any interactions with it will result in undefined behavior. - */ -public interface MutableTreeNode extends StoreTreeNode { - /** - * Set the data component of the node. - * - * @param data New data component, may not be null. - */ - void setData(NormalizedNode data); - - /** - * Set the new subtree version. This is typically invoked when the user - * has modified some of this node's children. - * - * @param subtreeVersion New subtree version. - */ - void setSubtreeVersion(Version subtreeVersion); - - /** - * Add a new child node. This acts as add-or-replace operation, e.g. it - * succeeds even if a conflicting child is already present. - * - * @param child New child node. - */ - void addChild(TreeNode child); - - /** - * Remove a child node. This acts as delete-or-nothing operation, e.g. it - * succeeds even if the corresponding child is not present. - * - * @param id Child identificator. - */ - void removeChild(PathArgument id); - - /** - * Finish node modification and return a read-only view of this node. After - * this method is invoked, any further calls to this object's method result - * in undefined behavior. - * - * @return Read-only view of this node. - */ - TreeNode seal(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java deleted file mode 100644 index def1958123..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java +++ /dev/null @@ -1,48 +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.md.sal.dom.store.impl.tree.spi; - -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; -import org.opendaylight.yangtools.concepts.Identifiable; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -/** - * A very basic data tree node. It has a version (when it was last modified), - * a subtree version (when any of its children were modified) and some read-only - * data. - */ -public interface TreeNode extends Identifiable, StoreTreeNode { - /** - * Get the data node version. - * - * @return Current data node version. - */ - Version getVersion(); - - /** - * Get the subtree version. - * - * @return Current subtree version. - */ - Version getSubtreeVersion(); - - /** - * Get a read-only view of the underlying data. - * - * @return Unmodifiable view of the underlying data. - */ - NormalizedNode getData(); - - /** - * Get a mutable, isolated copy of the node. - * - * @return Mutable copy - */ - MutableTreeNode mutable(); -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNodeFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNodeFactory.java deleted file mode 100644 index 9547628ae9..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNodeFactory.java +++ /dev/null @@ -1,46 +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.md.sal.dom.store.impl.tree.spi; - -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedNodeContainer; - -/** - * Public entrypoint for other packages. Allows instantiating a tree node - * with specified version. - */ -public final class TreeNodeFactory { - private TreeNodeFactory() { - throw new UnsupportedOperationException("Utility class should not be instantiated"); - } - - /** - * Create a new AbstractTreeNode from a data node, descending recursively as needed. - * This method should only ever be used for new data. - * - * @param data data node - * @param version data node version - * @return new AbstractTreeNode instance, covering the data tree provided - */ - public static final TreeNode createTreeNode(final NormalizedNode data, final Version version) { - if (data instanceof NormalizedNodeContainer) { - @SuppressWarnings("unchecked") - NormalizedNodeContainer> container = (NormalizedNodeContainer>) data; - return ContainerNode.create(version, container); - - } - if (data instanceof OrderedNodeContainer) { - @SuppressWarnings("unchecked") - OrderedNodeContainer> container = (OrderedNodeContainer>) data; - return ContainerNode.create(version, container); - } - - return new ValueNode(data, version); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java deleted file mode 100644 index d89928b51e..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java +++ /dev/null @@ -1,48 +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.md.sal.dom.store.impl.tree.spi; - -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Optional; - -/** - * Concretization of AbstractTreeNode for leaf nodes which only contain data. - * Instances of this class report all children as absent, subtree version - * equal to this node's version and do not support mutable view. - */ -final class ValueNode extends AbstractTreeNode { - private static final Logger LOG = LoggerFactory.getLogger(ValueNode.class); - - protected ValueNode(final NormalizedNode data, final Version version) { - super(data, version); - } - - @Override - public Optional getChild(final PathArgument childId) { - LOG.warn("Attempted to access child {} of value-node {}", childId, this); - return Optional.absent(); - } - - @Override - public Version getSubtreeVersion() { - return getVersion(); - } - - @Override - public MutableTreeNode mutable() { - /** - * Value nodes can only we read/written/delete, which does a straight - * replace. That means they don't haver need to be made mutable. - */ - throw new UnsupportedOperationException(String.format("Attempted to mutate value-node %s", this)); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java deleted file mode 100644 index 09a35d3b1a..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java +++ /dev/null @@ -1,37 +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.md.sal.dom.store.impl.tree.spi; - -/** - * The concept of a version, either node version, or a subtree version. The - * only interface contract this class has is that no two versions are the - * same. - */ -public final class Version { - private Version() { - - } - - /** - * Create a new version, distinct from any other version. - * - * @return a new version. - */ - public Version next() { - return new Version(); - } - - /** - * Create an initial version. - * - * @return a new version. - */ - public static final Version initial() { - return new Version(); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang b/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang index 3c29fe5885..82897b0198 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang +++ b/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang @@ -6,9 +6,14 @@ module opendaylight-sal-dom-broker-impl { import config { prefix config; revision-date 2013-04-05; } import opendaylight-md-sal-dom {prefix sal;} import opendaylight-md-sal-common {prefix common;} + import opendaylight-config-dom-datastore {prefix config-dom-store-spi;} + import opendaylight-operational-dom-datastore {prefix operational-dom-store-spi;} description - "Service definition for Binding Aware MD-SAL."; + "Service definition for Binding Aware MD-SAL. + Note: The dom-inmemory-data-broker utilizes configurable config-dom-datastore + and operation-dom-datastore. If configuration is not done for this stores + then it defaults to InMemoryDOMDataStore"; revision "2013-10-28" { description @@ -66,7 +71,8 @@ module opendaylight-sal-dom-broker-impl { augment "/config:modules/config:module/config:configuration" { case dom-inmemory-data-broker { when "/config:modules/config:module/config:type = 'dom-inmemory-data-broker'"; - + + container schema-service { uses config:service-ref { refine type { @@ -74,7 +80,25 @@ module opendaylight-sal-dom-broker-impl { config:required-identity sal:schema-service; } } - + + } + + container config-data-store{ + uses config:service-ref { + refine type { + mandatory false; + config:required-identity config-dom-store-spi:config-dom-datastore; + } + } + } + + container operational-data-store{ + uses config:service-ref { + refine type { + mandatory false; + config:required-identity operational-dom-store-spi:operational-dom-datastore; + } + } } } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMBrokerPerformanceTest.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMBrokerPerformanceTest.java index 66d57f9f87..29e078918e 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMBrokerPerformanceTest.java +++ b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMBrokerPerformanceTest.java @@ -63,8 +63,8 @@ public class DOMBrokerPerformanceTest { @Before public void setupStore() { - InMemoryDOMDataStore operStore = new InMemoryDOMDataStore("OPER", MoreExecutors.sameThreadExecutor()); - InMemoryDOMDataStore configStore = new InMemoryDOMDataStore("CFG", MoreExecutors.sameThreadExecutor()); + InMemoryDOMDataStore operStore = new InMemoryDOMDataStore("OPER", MoreExecutors.sameThreadExecutor()); + InMemoryDOMDataStore configStore = new InMemoryDOMDataStore("CFG", MoreExecutors.sameThreadExecutor()); schemaContext = TestModel.createTestContext(); operStore.onGlobalContextUpdated(schemaContext); diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMTransactionChainTest.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMTransactionChainTest.java index 2a955e5f42..38f08b30f9 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMTransactionChainTest.java +++ b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMTransactionChainTest.java @@ -104,28 +104,29 @@ public class DOMTransactionChainTest { */ DOMDataReadWriteTransaction thirdDeleteTx = allocateAndDelete(txChain); - /** - * third transaction is sealed. - */ - ListenableFuture> thirdDeleteTxFuture = thirdDeleteTx.commit(); - /** * We commit first transaction * */ assertCommitSuccessful(firstWriteTxFuture); - // Alocates store transaction + /** + * + * Allocates transaction from data store. + * + */ DOMDataReadTransaction storeReadTx = domBroker.newReadOnlyTransaction(); + /** * We verify transaction is commited to store, container should exists * in datastore. */ assertTestContainerExists(storeReadTx); + /** - * We commit third transaction - * + * third transaction is sealed and commited */ + ListenableFuture> thirdDeleteTxFuture = thirdDeleteTx.commit(); assertCommitSuccessful(thirdDeleteTxFuture); /** diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DataNormalizerTest.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DataNormalizerTest.java deleted file mode 100644 index ac7b87a9f5..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DataNormalizerTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.opendaylight.controller.md.sal.dom.broker.impl; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer; -import org.opendaylight.controller.md.sal.dom.store.impl.TestModel; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.Node; -import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -public class DataNormalizerTest { - - private static final Short OUTER_LIST_ID = (short)10; - - private static final InstanceIdentifier OUTER_LIST_PATH_LEGACY = InstanceIdentifier.builder(TestModel.TEST_QNAME) - .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME,OUTER_LIST_ID).build(); - - private static final InstanceIdentifier LEAF_TWO_PATH_LEGACY = InstanceIdentifier.builder(OUTER_LIST_PATH_LEGACY) - .node(TestModel.TWO_QNAME).build(); - - private static final ChoiceNode OUTER_CHOICE_ITEM = Builders.choiceBuilder() - .withNodeIdentifier(new NodeIdentifier(TestModel.OUTER_CHOICE_QNAME)) - .withChild(ImmutableNodes.leafNode(TestModel.TWO_QNAME, "two")) - .withChild(ImmutableNodes.leafNode(TestModel.THREE_QNAME, "three")) - .build(); - - private static final MapEntryNode OUTER_LIST_WITHOUT_CHOICE = Builders.mapEntryBuilder() - .withNodeIdentifier(new NodeIdentifierWithPredicates(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME,OUTER_LIST_ID)) - .withChild(ImmutableNodes.leafNode(TestModel.ID_QNAME, OUTER_LIST_ID)) - .build(); - - private static final MapEntryNode OUTER_LIST_WITH_CHOICE = Builders.mapEntryBuilder() - .withNodeIdentifier(new NodeIdentifierWithPredicates(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME,OUTER_LIST_ID)) - .withChild(ImmutableNodes.leafNode(TestModel.ID_QNAME, OUTER_LIST_ID)) - .withChild(OUTER_CHOICE_ITEM) - .build(); - - @Test - public void test() { - SchemaContext testCtx = TestModel.createTestContext(); - DataNormalizer normalizer = new DataNormalizer(testCtx); - - InstanceIdentifier normalizedPath = normalizer.toNormalized(LEAF_TWO_PATH_LEGACY); - - Node outerListLegacy = DataNormalizer.toLegacy(OUTER_LIST_WITH_CHOICE); - assertNotNull(outerListLegacy); - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java deleted file mode 100644 index 413d81d029..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java +++ /dev/null @@ -1,250 +0,0 @@ -package org.opendaylight.controller.md.sal.dom.store.impl; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.concurrent.ExecutionException; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.MoreExecutors; - -public class InMemoryDataStoreTest { - - private SchemaContext schemaContext; - private InMemoryDOMDataStore domStore; - - @Before - public void setupStore() { - domStore = new InMemoryDOMDataStore("TEST", MoreExecutors.sameThreadExecutor()); - schemaContext = TestModel.createTestContext(); - domStore.onGlobalContextUpdated(schemaContext); - - } - - @Test - public void testTransactionIsolation() throws InterruptedException, ExecutionException { - - assertNotNull(domStore); - - DOMStoreReadTransaction readTx = domStore.newReadOnlyTransaction(); - assertNotNull(readTx); - - DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction(); - assertNotNull(writeTx); - /** - * - * Writes /test in writeTx - * - */ - writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); - - /** - * - * Reads /test from writeTx Read should return container. - * - */ - ListenableFuture>> writeTxContainer = writeTx.read(TestModel.TEST_PATH); - assertTrue(writeTxContainer.get().isPresent()); - - /** - * - * Reads /test from readTx Read should return Absent. - * - */ - ListenableFuture>> readTxContainer = readTx.read(TestModel.TEST_PATH); - assertFalse(readTxContainer.get().isPresent()); - } - - @Test - public void testTransactionCommit() throws InterruptedException, ExecutionException { - - DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction(); - assertNotNull(writeTx); - /** - * - * Writes /test in writeTx - * - */ - writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); - - /** - * - * Reads /test from writeTx Read should return container. - * - */ - ListenableFuture>> writeTxContainer = writeTx.read(TestModel.TEST_PATH); - assertTrue(writeTxContainer.get().isPresent()); - - DOMStoreThreePhaseCommitCohort cohort = writeTx.ready(); - - assertThreePhaseCommit(cohort); - - Optional> afterCommitRead = domStore.newReadOnlyTransaction().read(TestModel.TEST_PATH) - .get(); - assertTrue(afterCommitRead.isPresent()); - } - - @Test - public void testTransactionAbort() throws InterruptedException, ExecutionException { - - DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction(); - assertNotNull(writeTx); - - assertTestContainerWrite(writeTx); - - DOMStoreThreePhaseCommitCohort cohort = writeTx.ready(); - - assertTrue(cohort.canCommit().get().booleanValue()); - cohort.preCommit().get(); - cohort.abort().get(); - - Optional> afterCommitRead = domStore.newReadOnlyTransaction().read(TestModel.TEST_PATH) - .get(); - assertFalse(afterCommitRead.isPresent()); - } - - @Test - public void testTransactionChain() throws InterruptedException, ExecutionException { - DOMStoreTransactionChain txChain = domStore.createTransactionChain(); - assertNotNull(txChain); - - /** - * We alocate new read-write transaction and write /test - * - * - */ - DOMStoreReadWriteTransaction firstTx = txChain.newReadWriteTransaction(); - assertTestContainerWrite(firstTx); - - /** - * First transaction is marked as ready, we are able to allocate chained - * transactions - */ - DOMStoreThreePhaseCommitCohort firstWriteTxCohort = firstTx.ready(); - - /** - * We alocate chained transaction - read transaction, note first one is - * still not commited to datastore. - */ - DOMStoreReadTransaction secondReadTx = txChain.newReadOnlyTransaction(); - - /** - * - * We test if we are able to read data from tx, read should not fail - * since we are using chained transaction. - * - * - */ - assertTestContainerExists(secondReadTx); - - /** - * - * We alocate next transaction, which is still based on first one, but - * is read-write. - * - */ - DOMStoreReadWriteTransaction thirdDeleteTx = txChain.newReadWriteTransaction(); - - /** - * We test existence of /test in third transaction container should - * still be visible from first one (which is still uncommmited). - * - * - */ - assertTestContainerExists(thirdDeleteTx); - - /** - * We delete node in third transaction - */ - thirdDeleteTx.delete(TestModel.TEST_PATH); - - /** - * third transaction is sealed. - */ - DOMStoreThreePhaseCommitCohort thirdDeleteTxCohort = thirdDeleteTx.ready(); - - /** - * We commit first transaction - * - */ - assertThreePhaseCommit(firstWriteTxCohort); - - // Alocates store transacion - DOMStoreReadTransaction storeReadTx = domStore.newReadOnlyTransaction(); - /** - * We verify transaction is commited to store, container should exists - * in datastore. - */ - assertTestContainerExists(storeReadTx); - /** - * We commit third transaction - * - */ - assertThreePhaseCommit(thirdDeleteTxCohort); - } - - @Test - @Ignore - public void testTransactionConflict() throws InterruptedException, ExecutionException { - DOMStoreReadWriteTransaction txOne = domStore.newReadWriteTransaction(); - DOMStoreReadWriteTransaction txTwo = domStore.newReadWriteTransaction(); - assertTestContainerWrite(txOne); - assertTestContainerWrite(txTwo); - - /** - * Commits transaction - */ - assertThreePhaseCommit(txOne.ready()); - - /** - * Asserts that txTwo could not be commited - */ - assertFalse(txTwo.ready().canCommit().get()); - } - - private static void assertThreePhaseCommit(final DOMStoreThreePhaseCommitCohort cohort) - throws InterruptedException, ExecutionException { - assertTrue(cohort.canCommit().get().booleanValue()); - cohort.preCommit().get(); - cohort.commit().get(); - } - - private static Optional> assertTestContainerWrite(final DOMStoreReadWriteTransaction writeTx) - throws InterruptedException, ExecutionException { - /** - * - * Writes /test in writeTx - * - */ - writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); - - return assertTestContainerExists(writeTx); - } - - /** - * - * Reads /test from readTx Read should return container. - * - */ - private static Optional> assertTestContainerExists(DOMStoreReadTransaction readTx) - throws InterruptedException, ExecutionException { - - ListenableFuture>> writeTxContainer = readTx.read(TestModel.TEST_PATH); - assertTrue(writeTxContainer.get().isPresent()); - return writeTxContainer.get(); - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java index 2c965047db..91aa57c259 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java +++ b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java @@ -7,16 +7,16 @@ */ package org.opendaylight.controller.md.sal.dom.store.impl; -import java.io.InputStream; -import java.util.Collections; -import java.util.Set; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; +import java.io.InputStream; +import java.util.Collections; +import java.util.Set; + public class TestModel { public static final QName TEST_QNAME = QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test", "2014-03-13", diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java deleted file mode 100644 index 4fb190fc82..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java +++ /dev/null @@ -1,259 +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.md.sal.dom.store.impl.tree.data; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.ID_QNAME; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.INNER_LIST_QNAME; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.NAME_QNAME; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.OUTER_LIST_PATH; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.OUTER_LIST_QNAME; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.TEST_PATH; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.TEST_QNAME; -import static org.opendaylight.controller.md.sal.dom.store.impl.TestModel.VALUE_QNAME; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntry; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder; - -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.controller.md.sal.dom.store.impl.TestModel; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTree; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -import com.google.common.base.Optional; - -/** - * - * Schema structure of document is - * - *
    - * container root { 
    - *      list list-a {
    - *              key leaf-a;
    - *              leaf leaf-a;
    - *              choice choice-a {
    - *                      case one {
    - *                              leaf one;
    - *                      }
    - *                      case two-three {
    - *                              leaf two;
    - *                              leaf three;
    - *                      }
    - *              }
    - *              list list-b {
    - *                      key leaf-b;
    - *                      leaf leaf-b;
    - *              }
    - *      }
    - * }
    - * 
    - * - */ -public class ModificationMetadataTreeTest { - - private static final Short ONE_ID = 1; - private static final Short TWO_ID = 2; - private static final String TWO_ONE_NAME = "one"; - private static final String TWO_TWO_NAME = "two"; - - private static final InstanceIdentifier OUTER_LIST_1_PATH = InstanceIdentifier.builder(OUTER_LIST_PATH) - .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, ONE_ID) // - .build(); - - private static final InstanceIdentifier OUTER_LIST_2_PATH = InstanceIdentifier.builder(OUTER_LIST_PATH) - .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, TWO_ID) // - .build(); - - private static final InstanceIdentifier TWO_TWO_PATH = InstanceIdentifier.builder(OUTER_LIST_2_PATH) - .node(INNER_LIST_QNAME) // - .nodeWithKey(INNER_LIST_QNAME, NAME_QNAME, TWO_TWO_NAME) // - .build(); - - private static final InstanceIdentifier TWO_TWO_VALUE_PATH = InstanceIdentifier.builder(TWO_TWO_PATH) - .node(VALUE_QNAME) // - .build(); - - private static final MapEntryNode BAR_NODE = mapEntryBuilder(OUTER_LIST_QNAME, ID_QNAME, TWO_ID) // - .withChild(mapNodeBuilder(INNER_LIST_QNAME) // - .withChild(mapEntry(INNER_LIST_QNAME, NAME_QNAME, TWO_ONE_NAME)) // - .withChild(mapEntry(INNER_LIST_QNAME, NAME_QNAME, TWO_TWO_NAME)) // - .build()) // - .build(); - - private SchemaContext schemaContext; - private ModificationApplyOperation applyOper; - - @Before - public void prepare() { - schemaContext = TestModel.createTestContext(); - assertNotNull("Schema context must not be null.", schemaContext); - applyOper = SchemaAwareApplyOperation.from(schemaContext); - } - - /** - * Returns a test document - * - *
    -     * test
    -     *     outer-list
    -     *          id 1
    -     *     outer-list
    -     *          id 2
    -     *          inner-list
    -     *                  name "one"
    -     *          inner-list
    -     *                  name "two"
    -     *
    -     * 
    - * - * @return - */ - public NormalizedNode createDocumentOne() { - return ImmutableContainerNodeBuilder - .create() - .withNodeIdentifier(new NodeIdentifier(schemaContext.getQName())) - .withChild(createTestContainer()).build(); - - } - - private ContainerNode createTestContainer() { - return ImmutableContainerNodeBuilder - .create() - .withNodeIdentifier(new NodeIdentifier(TEST_QNAME)) - .withChild( - mapNodeBuilder(OUTER_LIST_QNAME) - .withChild(mapEntry(OUTER_LIST_QNAME, ID_QNAME, ONE_ID)) - .withChild(BAR_NODE).build()).build(); - } - - @Test - public void basicReadWrites() { - DataTreeModification modificationTree = new InMemoryDataTreeModification(new InMemoryDataTreeSnapshot(schemaContext, - TreeNodeFactory.createTreeNode(createDocumentOne(), Version.initial()), applyOper), - new SchemaAwareApplyOperationRoot(schemaContext)); - Optional> originalBarNode = modificationTree.readNode(OUTER_LIST_2_PATH); - assertTrue(originalBarNode.isPresent()); - assertSame(BAR_NODE, originalBarNode.get()); - - // writes node to /outer-list/1/inner_list/two/value - modificationTree.write(TWO_TWO_VALUE_PATH, ImmutableNodes.leafNode(VALUE_QNAME, "test")); - - // reads node to /outer-list/1/inner_list/two/value - // and checks if node is already present - Optional> barTwoCModified = modificationTree.readNode(TWO_TWO_VALUE_PATH); - assertTrue(barTwoCModified.isPresent()); - assertEquals(ImmutableNodes.leafNode(VALUE_QNAME, "test"), barTwoCModified.get()); - - // delete node to /outer-list/1/inner_list/two/value - modificationTree.delete(TWO_TWO_VALUE_PATH); - Optional> barTwoCAfterDelete = modificationTree.readNode(TWO_TWO_VALUE_PATH); - assertFalse(barTwoCAfterDelete.isPresent()); - } - - - public DataTreeModification createEmptyModificationTree() { - /** - * Creates empty Snapshot with associated schema context. - */ - DataTree t = InMemoryDataTreeFactory.getInstance().create(); - t.setSchemaContext(schemaContext); - - /** - * - * Creates Mutable Data Tree based on provided snapshot and schema - * context. - * - */ - return t.takeSnapshot().newModification(); - } - - @Test - public void createFromEmptyState() { - - DataTreeModification modificationTree = createEmptyModificationTree(); - /** - * Writes empty container node to /test - * - */ - modificationTree.write(TEST_PATH, ImmutableNodes.containerNode(TEST_QNAME)); - - /** - * Writes empty list node to /test/outer-list - */ - modificationTree.write(OUTER_LIST_PATH, ImmutableNodes.mapNodeBuilder(OUTER_LIST_QNAME).build()); - - /** - * Reads list node from /test/outer-list - */ - Optional> potentialOuterList = modificationTree.readNode(OUTER_LIST_PATH); - assertTrue(potentialOuterList.isPresent()); - - /** - * Reads container node from /test and verifies that it contains test - * node - */ - Optional> potentialTest = modificationTree.readNode(TEST_PATH); - ContainerNode containerTest = assertPresentAndType(potentialTest, ContainerNode.class); - - /** - * - * Gets list from returned snapshot of /test and verifies it contains - * outer-list - * - */ - assertPresentAndType(containerTest.getChild(new NodeIdentifier(OUTER_LIST_QNAME)), MapNode.class); - - } - - @Test - public void writeSubtreeReadChildren() { - DataTreeModification modificationTree = createEmptyModificationTree(); - modificationTree.write(TEST_PATH, createTestContainer()); - Optional> potential = modificationTree.readNode(TWO_TWO_PATH); - assertPresentAndType(potential, MapEntryNode.class); - } - - @Test - public void writeSubtreeDeleteChildren() { - DataTreeModification modificationTree = createEmptyModificationTree(); - modificationTree.write(TEST_PATH, createTestContainer()); - - // We verify data are present - Optional> potentialBeforeDelete = modificationTree.readNode(TWO_TWO_PATH); - assertPresentAndType(potentialBeforeDelete, MapEntryNode.class); - - modificationTree.delete(TWO_TWO_PATH); - Optional> potentialAfterDelete = modificationTree.readNode(TWO_TWO_PATH); - assertFalse(potentialAfterDelete.isPresent()); - - } - - private static T assertPresentAndType(final Optional potential, final Class type) { - assertNotNull(potential); - assertTrue(potential.isPresent()); - assertTrue(type.isInstance(potential.get())); - return type.cast(potential.get()); - } - -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperationRoot.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperationRoot.java deleted file mode 100644 index 03ece2f5e0..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperationRoot.java +++ /dev/null @@ -1,39 +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.md.sal.dom.store.impl.tree.data; - -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -public class SchemaAwareApplyOperationRoot extends DataNodeContainerModificationStrategy { - private final SchemaContext context; - - public SchemaAwareApplyOperationRoot(final SchemaContext context) { - super(context,ContainerNode.class); - this.context = context; - } - - public SchemaContext getContext() { - return context; - } - - @Override - public String toString() { - return "SchemaAwareApplyOperationRoot [context=" + context + "]"; - } - - @Override - @SuppressWarnings("rawtypes") - protected DataContainerNodeBuilder createBuilder(NormalizedNode original) { - return ImmutableContainerNodeBuilder.create((ContainerNode) original); - } -} diff --git a/opendaylight/md-sal/sal-dom-spi/pom.xml b/opendaylight/md-sal/sal-dom-spi/pom.xml index 660a67923f..88ac86a45e 100644 --- a/opendaylight/md-sal/sal-dom-spi/pom.xml +++ b/opendaylight/md-sal/sal-dom-spi/pom.xml @@ -15,6 +15,39 @@ sal-core-api + + + + org.opendaylight.yangtools + yang-maven-plugin + + + config + + generate-sources + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + ${jmxGeneratorPath} + + urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + ${salGeneratorPath} + + + true + + + + + + + scm:git:ssh://git.opendaylight.org:29418/controller.git scm:git:ssh://git.opendaylight.org:29418/controller.git diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/yang/opendaylight-config-dom-datastore.yang b/opendaylight/md-sal/sal-dom-spi/src/main/yang/opendaylight-config-dom-datastore.yang new file mode 100644 index 0000000000..9a3ab181e0 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-spi/src/main/yang/opendaylight-config-dom-datastore.yang @@ -0,0 +1,22 @@ +module opendaylight-config-dom-datastore { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:config-dom-store"; + prefix "config-dom-store-spi"; + + import config { prefix config; revision-date 2013-04-05; } + + description + "DOM Service Provider Interface definition for MD-SAL config store"; + + revision "2014-06-17" { + description + "Initial revision"; + } + + identity config-dom-datastore { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.core.spi.data.DOMStore"; + + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/yang/opendaylight-operational-dom-datastore.yang b/opendaylight/md-sal/sal-dom-spi/src/main/yang/opendaylight-operational-dom-datastore.yang new file mode 100644 index 0000000000..fd408840bb --- /dev/null +++ b/opendaylight/md-sal/sal-dom-spi/src/main/yang/opendaylight-operational-dom-datastore.yang @@ -0,0 +1,22 @@ +module opendaylight-operational-dom-datastore { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:operational-dom-store"; + prefix "operational-dom-store-spi"; + + import config { prefix config; revision-date 2013-04-05; } + + description + "DOM Service Provider Interface definition for MD-SAL operational store"; + + revision "2014-06-17" { + description + "Initial revision"; + } + + identity operational-dom-datastore { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.core.spi.data.DOMStore"; + + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-inmemory-datastore/pom.xml b/opendaylight/md-sal/sal-inmemory-datastore/pom.xml new file mode 100644 index 0000000000..dadef821eb --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/pom.xml @@ -0,0 +1,191 @@ + + + 4.0.0 + + org.opendaylight.controller + sal-parent + 1.1-SNAPSHOT + + + sal-inmemory-datastore + + bundle + + + + com.google.guava + guava + + + + + + org.opendaylight.controller + config-api + + + + org.opendaylight.controller + sal-binding-api + + + + org.opendaylight.controller + sal-binding-config + + + + org.opendaylight.controller + sal-common-api + + + + org.opendaylight.controller + sal-common-util + + + + org.opendaylight.controller + sal-core-api + + + org.opendaylight.controller + sal-core-spi + + + + org.opendaylight.yangtools + concepts + + + + org.opendaylight.yangtools + util + + + + org.opendaylight.yangtools + yang-binding + + + + org.opendaylight.yangtools + yang-common + + + + org.opendaylight.yangtools + yang-data-api + + + org.opendaylight.yangtools + yang-data-impl + + + org.opendaylight.yangtools + yang-parser-impl + + + + org.osgi + org.osgi.core + + + + org.slf4j + slf4j-api + + + + + junit + junit + test + + + org.slf4j + slf4j-simple + ${slf4j.version} + test + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.groupId}.${project.artifactId} + + org.opendaylight.controller.md.sal.dom.store.impl.* + + * + + + + + org.jacoco + jacoco-maven-plugin + + + org.opendaylight.controller.* + + false + + + + pre-test + + prepare-agent + + + + post-test + + report + + test + + + + + org.opendaylight.yangtools + yang-maven-plugin + + + config + + generate-sources + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + ${jmxGeneratorPath} + + urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + ${salGeneratorPath} + + + true + + + + + + + + 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:Architecture:Clustering + + + 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 new file mode 100644 index 0000000000..3ed02dfb41 --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModule.java @@ -0,0 +1,27 @@ +package org.opendaylight.controller.config.yang.inmemory_datastore_provider; + +import com.google.common.util.concurrent.MoreExecutors; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; + +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) { + 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) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + InMemoryDOMDataStore ids = new InMemoryDOMDataStore("DOM-CFG", MoreExecutors.sameThreadExecutor()); + 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/InMemoryConfigDataStoreProviderModuleFactory.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModuleFactory.java new file mode 100644 index 0000000000..1931c14347 --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryConfigDataStoreProviderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: opendaylight-inmemory-datastore-provider yang module local name: inmemory-config-datastore-provider +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Thu Jun 19 17:10:42 PDT 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.inmemory_datastore_provider; +public class InMemoryConfigDataStoreProviderModuleFactory extends org.opendaylight.controller.config.yang.inmemory_datastore_provider.AbstractInMemoryConfigDataStoreProviderModuleFactory { + +} 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 new file mode 100644 index 0000000000..eea95990a1 --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModule.java @@ -0,0 +1,27 @@ +package org.opendaylight.controller.config.yang.inmemory_datastore_provider; + +import com.google.common.util.concurrent.MoreExecutors; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; + +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) { + 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) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + InMemoryDOMDataStore ids = new InMemoryDOMDataStore("DOM-OPER", MoreExecutors.sameThreadExecutor()); + 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/InMemoryOperationalDataStoreProviderModuleFactory.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModuleFactory.java new file mode 100644 index 0000000000..49bc6a2064 --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/config/yang/inmemory_datastore_provider/InMemoryOperationalDataStoreProviderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: opendaylight-inmemory-datastore-provider yang module local name: inmemory-operational-datastore-provider +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Thu Jun 19 17:10:42 PDT 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.inmemory_datastore_provider; +public class InMemoryOperationalDataStoreProviderModuleFactory extends org.opendaylight.controller.config.yang.inmemory_datastore_provider.AbstractInMemoryOperationalDataStoreProviderModuleFactory { + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/AbstractDOMStoreTransaction.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/AbstractDOMStoreTransaction.java similarity index 100% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/AbstractDOMStoreTransaction.java rename to opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/AbstractDOMStoreTransaction.java diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ChangeListenerNotifyTask.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ChangeListenerNotifyTask.java similarity index 100% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ChangeListenerNotifyTask.java rename to opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ChangeListenerNotifyTask.java diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java similarity index 100% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java rename to opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeListenerRegistration.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeListenerRegistration.java similarity index 100% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeListenerRegistration.java rename to opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeListenerRegistration.java diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java similarity index 95% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java rename to opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java index b0c4274fa5..bef37980e5 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java @@ -7,27 +7,25 @@ */ package org.opendaylight.controller.md.sal.dom.store.impl; -import static com.google.common.base.Preconditions.checkState; - -import java.util.Collections; -import java.util.concurrent.Callable; -import java.util.concurrent.atomic.AtomicLong; - -import javax.annotation.concurrent.GuardedBy; - +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.SnapshotBackedWriteTransaction.TransactionReadyPrototype; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ConflictingModificationAppliedException; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTree; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeSnapshot; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; +import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.InMemoryDataTreeFactory; +import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory; import org.opendaylight.controller.sal.core.spi.data.DOMStore; import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction; import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; @@ -44,12 +42,12 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; +import javax.annotation.concurrent.GuardedBy; +import java.util.Collections; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicLong; + +import static com.google.common.base.Preconditions.checkState; /** * In-memory DOM Data Store @@ -61,12 +59,13 @@ import com.google.common.util.concurrent.ListeningExecutorService; * */ public class InMemoryDOMDataStore implements DOMStore, Identifiable, SchemaContextListener, - TransactionReadyPrototype { + TransactionReadyPrototype,AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(InMemoryDOMDataStore.class); private final DataTree dataTree = InMemoryDataTreeFactory.getInstance().create(); private final ListenerTree listenerTree = ListenerTree.create(); private final AtomicLong txCounter = new AtomicLong(0); private final ListeningExecutorService executor; + private final String name; public InMemoryDOMDataStore(final String name, final ListeningExecutorService executor) { @@ -104,6 +103,10 @@ public class InMemoryDOMDataStore implements DOMStore, Identifiable, Sch dataTree.setSchemaContext(ctx); } + @Override + public void close(){ + executor.shutdownNow(); + } @Override public >> ListenerRegistration registerChangeListener( final InstanceIdentifier path, final L listener, final DataChangeScope scope) { @@ -218,6 +221,8 @@ public class InMemoryDOMDataStore implements DOMStore, Identifiable, Sch @Override public void close() { + executor.shutdownNow(); + } protected synchronized void onTransactionFailed(final SnapshotBackedWriteTransaction transaction, diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java similarity index 97% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java rename to opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java index 2a163d8dbc..71a3534c81 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java @@ -7,26 +7,18 @@ */ package org.opendaylight.controller.md.sal.dom.store.impl; -import static org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.builder; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.Callable; - +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Multimap; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.Builder; import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.SimpleEventFactory; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidateNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree.Node; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree.Walker; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; @@ -34,15 +26,22 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; +import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; 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.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Multimap; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.Callable; + +import static org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.builder; /** * Resolve Data Change Events based on modifications and listeners @@ -94,7 +93,7 @@ final class ResolveDataChangeEventsTask implements Callable> afterCont = (NormalizedNodeContainer>) afterData; return resolveNodeContainerReplaced(path, listeners, beforeCont, afterCont); } else if (!beforeData.equals(afterData)) { - // Node is either of Leaf type (does not contain child nodes) - // or we do not have listeners, so normal equals method is - // sufficient for determining change. + // Node is Leaf type (does not contain child nodes) + // so normal equals method is sufficient for determining change. LOG.trace("Resolving leaf replace event for {} , before {}, after {}",path,beforeData,afterData); DOMImmutableDataChangeEvent event = builder(DataChangeScope.BASE).setBefore(beforeData).setAfter(afterData) .addUpdated(path, beforeData, afterData).build(); @@ -421,9 +419,6 @@ final class ResolveDataChangeEventsTask implements Callable, Identifiable { diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/main/yang/opendaylight-inmemory-datastore-provider.yang b/opendaylight/md-sal/sal-inmemory-datastore/src/main/yang/opendaylight-inmemory-datastore-provider.yang new file mode 100644 index 0000000000..03220a3e5d --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/yang/opendaylight-inmemory-datastore-provider.yang @@ -0,0 +1,71 @@ + +module opendaylight-inmemory-datastore-provider { + + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:inmemory-datastore-provider"; + prefix "inmemory-datastore-provider"; + + import config { prefix config; revision-date 2013-04-05; } + import rpc-context { prefix rpcx; revision-date 2013-06-17; } + import opendaylight-config-dom-datastore {prefix config-dom-store-spi;} + import opendaylight-operational-dom-datastore {prefix operational-dom-store-spi;} + import opendaylight-md-sal-dom {prefix sal;} + + description + "InMemory datastore provider implementation for config & operational datastore"; + + revision "2014-06-17" { + description + "Initial revision."; + } + + // This is the definition of the service implementation as a module identity. + identity inmemory-config-datastore-provider { + base config:module-type; + config:provided-service config-dom-store-spi:config-dom-datastore; + config:java-name-prefix InMemoryConfigDataStoreProvider; + } + + // This is the definition of the service implementation as a module identity. + + identity inmemory-operational-datastore-provider { + base config:module-type; + config:provided-service operational-dom-store-spi:operational-dom-datastore; + config:java-name-prefix InMemoryOperationalDataStoreProvider; + } + + + // Augments the 'configuration' choice node under modules/module. + augment "/config:modules/config:module/config:configuration" { + case inmemory-config-datastore-provider { + when "/config:modules/config:module/config:type = 'inmemory-config-datastore-provider'"; + + container schema-service { + uses config:service-ref { + refine type { + mandatory false; + config:required-identity sal:schema-service; + } + } + } + } + } + + + + // Augments the 'configuration' choice node under modules/module. + augment "/config:modules/config:module/config:configuration" { + case inmemory-operational-datastore-provider { + when "/config:modules/config:module/config:type = 'inmemory-operational-datastore-provider'"; + + container schema-service { + uses config:service-ref { + refine type { + mandatory false; + config:required-identity sal:schema-service; + } + } + } + } + } +} diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java b/opendaylight/md-sal/sal-inmemory-datastore/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java new file mode 100644 index 0000000000..369a7da138 --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java @@ -0,0 +1,248 @@ +package org.opendaylight.controller.md.sal.dom.store.impl; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; + +import java.util.concurrent.ExecutionException; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + + +public class InMemoryDataStoreTest { + + private SchemaContext schemaContext; + private InMemoryDOMDataStore domStore; + + @Before + public void setupStore() { + domStore = new InMemoryDOMDataStore("TEST", MoreExecutors.sameThreadExecutor()); + schemaContext = TestModel.createTestContext(); + domStore.onGlobalContextUpdated(schemaContext); + + } + + @Test + public void testTransactionIsolation() throws InterruptedException, ExecutionException { + + assertNotNull(domStore); + + DOMStoreReadTransaction readTx = domStore.newReadOnlyTransaction(); + assertNotNull(readTx); + + DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction(); + assertNotNull(writeTx); + /** + * + * Writes /test in writeTx + * + */ + writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); + + /** + * + * Reads /test from writeTx Read should return container. + * + */ + ListenableFuture>> writeTxContainer = writeTx.read(TestModel.TEST_PATH); + assertTrue(writeTxContainer.get().isPresent()); + + /** + * + * Reads /test from readTx Read should return Absent. + * + */ + ListenableFuture>> readTxContainer = readTx.read(TestModel.TEST_PATH); + assertFalse(readTxContainer.get().isPresent()); + } + + @Test + public void testTransactionCommit() throws InterruptedException, ExecutionException { + + DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction(); + assertNotNull(writeTx); + /** + * + * Writes /test in writeTx + * + */ + writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); + + /** + * + * Reads /test from writeTx Read should return container. + * + */ + ListenableFuture>> writeTxContainer = writeTx.read(TestModel.TEST_PATH); + assertTrue(writeTxContainer.get().isPresent()); + + DOMStoreThreePhaseCommitCohort cohort = writeTx.ready(); + + assertThreePhaseCommit(cohort); + + Optional> afterCommitRead = domStore.newReadOnlyTransaction().read(TestModel.TEST_PATH) + .get(); + assertTrue(afterCommitRead.isPresent()); + } + + @Test + public void testTransactionAbort() throws InterruptedException, ExecutionException { + + DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction(); + assertNotNull(writeTx); + + assertTestContainerWrite(writeTx); + + DOMStoreThreePhaseCommitCohort cohort = writeTx.ready(); + + assertTrue(cohort.canCommit().get().booleanValue()); + cohort.preCommit().get(); + cohort.abort().get(); + + Optional> afterCommitRead = domStore.newReadOnlyTransaction().read(TestModel.TEST_PATH) + .get(); + assertFalse(afterCommitRead.isPresent()); + } + + @Test + public void testTransactionChain() throws InterruptedException, ExecutionException { + DOMStoreTransactionChain txChain = domStore.createTransactionChain(); + assertNotNull(txChain); + + /** + * We alocate new read-write transaction and write /test + * + * + */ + DOMStoreReadWriteTransaction firstTx = txChain.newReadWriteTransaction(); + assertTestContainerWrite(firstTx); + + /** + * First transaction is marked as ready, we are able to allocate chained + * transactions + */ + DOMStoreThreePhaseCommitCohort firstWriteTxCohort = firstTx.ready(); + + /** + * We alocate chained transaction - read transaction, note first one is + * still not commited to datastore. + */ + DOMStoreReadTransaction secondReadTx = txChain.newReadOnlyTransaction(); + + /** + * + * We test if we are able to read data from tx, read should not fail + * since we are using chained transaction. + * + * + */ + assertTestContainerExists(secondReadTx); + + /** + * + * We alocate next transaction, which is still based on first one, but + * is read-write. + * + */ + DOMStoreReadWriteTransaction thirdDeleteTx = txChain.newReadWriteTransaction(); + + /** + * We test existence of /test in third transaction container should + * still be visible from first one (which is still uncommmited). + * + * + */ + assertTestContainerExists(thirdDeleteTx); + + /** + * We delete node in third transaction + */ + thirdDeleteTx.delete(TestModel.TEST_PATH); + + /** + * third transaction is sealed. + */ + DOMStoreThreePhaseCommitCohort thirdDeleteTxCohort = thirdDeleteTx.ready(); + + /** + * We commit first transaction + * + */ + assertThreePhaseCommit(firstWriteTxCohort); + + // Alocates store transacion + DOMStoreReadTransaction storeReadTx = domStore.newReadOnlyTransaction(); + /** + * We verify transaction is commited to store, container should exists + * in datastore. + */ + assertTestContainerExists(storeReadTx); + /** + * We commit third transaction + * + */ + assertThreePhaseCommit(thirdDeleteTxCohort); + } + + @Test + @Ignore + public void testTransactionConflict() throws InterruptedException, ExecutionException { + DOMStoreReadWriteTransaction txOne = domStore.newReadWriteTransaction(); + DOMStoreReadWriteTransaction txTwo = domStore.newReadWriteTransaction(); + assertTestContainerWrite(txOne); + assertTestContainerWrite(txTwo); + + /** + * Commits transaction + */ + assertThreePhaseCommit(txOne.ready()); + + /** + * Asserts that txTwo could not be commited + */ + assertFalse(txTwo.ready().canCommit().get()); + } + + private static void assertThreePhaseCommit(final DOMStoreThreePhaseCommitCohort cohort) + throws InterruptedException, ExecutionException { + assertTrue(cohort.canCommit().get().booleanValue()); + cohort.preCommit().get(); + cohort.commit().get(); + } + + private static Optional> assertTestContainerWrite(final DOMStoreReadWriteTransaction writeTx) + throws InterruptedException, ExecutionException { + /** + * + * Writes /test in writeTx + * + */ + writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); + + return assertTestContainerExists(writeTx); + } + + /** + * Reads /test from readTx Read should return container. + */ + private static Optional> assertTestContainerExists(DOMStoreReadTransaction readTx) + throws InterruptedException, ExecutionException { + + ListenableFuture>> writeTxContainer = readTx.read(TestModel.TEST_PATH); + assertTrue(writeTxContainer.get().isPresent()); + return writeTxContainer.get(); + } + +} diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java b/opendaylight/md-sal/sal-inmemory-datastore/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java new file mode 100644 index 0000000000..3feeb29672 --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/TestModel.java @@ -0,0 +1,51 @@ +/* + * 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.store.impl; + +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; + +import java.io.InputStream; +import java.util.Collections; +import java.util.Set; + +public class TestModel { + + public static final QName TEST_QNAME = QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test", "2014-03-13", + "test"); + public static final QName OUTER_LIST_QNAME = QName.create(TEST_QNAME, "outer-list"); + public static final QName INNER_LIST_QNAME = QName.create(TEST_QNAME, "inner-list"); + public static final QName OUTER_CHOICE_QNAME = QName.create(TEST_QNAME, "outer-choice"); + public static final QName ID_QNAME = QName.create(TEST_QNAME, "id"); + public static final QName NAME_QNAME = QName.create(TEST_QNAME, "name"); + public static final QName VALUE_QNAME = QName.create(TEST_QNAME, "value"); + private static final String DATASTORE_TEST_YANG = "/odl-datastore-test.yang"; + + public static final InstanceIdentifier TEST_PATH = InstanceIdentifier.of(TEST_QNAME); + public static final InstanceIdentifier OUTER_LIST_PATH = InstanceIdentifier.builder(TEST_PATH).node(OUTER_LIST_QNAME).build(); + public static final QName TWO_QNAME = QName.create(TEST_QNAME, "two"); + public static final QName THREE_QNAME = QName.create(TEST_QNAME, "three"); + + + public static final InputStream getDatastoreTestInputStream() { + return getInputStream(DATASTORE_TEST_YANG); + } + + private static InputStream getInputStream(final String resourceName) { + return TestModel.class.getResourceAsStream(DATASTORE_TEST_YANG); + } + + public static SchemaContext createTestContext() { + YangParserImpl parser = new YangParserImpl(); + Set modules = parser.parseYangModelsFromStreams(Collections.singletonList(getDatastoreTestInputStream())); + return parser.resolveSchemaContext(modules); + } +} diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/test/resources/odl-datastore-test.yang b/opendaylight/md-sal/sal-inmemory-datastore/src/test/resources/odl-datastore-test.yang new file mode 100644 index 0000000000..17541fecab --- /dev/null +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/test/resources/odl-datastore-test.yang @@ -0,0 +1,42 @@ +module odl-datastore-test { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test"; + prefix "store-test"; + + revision "2014-03-13" { + description "Initial revision."; + } + + container test { + list outer-list { + key id; + leaf id { + type uint16; + } + choice outer-choice { + case one { + leaf one { + type string; + } + } + case two-three { + leaf two { + type string; + } + leaf three { + type string; + } + } + } + list inner-list { + key name; + leaf name { + type string; + } + leaf value { + type string; + } + } + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-netconf-connector/pom.xml b/opendaylight/md-sal/sal-netconf-connector/pom.xml index 0dd25292c2..0bf4b3238d 100644 --- a/opendaylight/md-sal/sal-netconf-connector/pom.xml +++ b/opendaylight/md-sal/sal-netconf-connector/pom.xml @@ -25,7 +25,6 @@ ${project.groupId} sal-common-util - 1.1-SNAPSHOT ${project.groupId} 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 e78f2b32df..4da727f5c2 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 @@ -10,17 +10,20 @@ 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; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.api.NetconfTerminationReason; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.client.NetconfClientDispatcher; import org.opendaylight.controller.netconf.client.NetconfClientSession; import org.opendaylight.controller.netconf.client.NetconfClientSessionListener; import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfiguration; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.opendaylight.controller.sal.common.util.RpcErrors; import org.opendaylight.controller.sal.common.util.Rpcs; @@ -35,6 +38,8 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Strings; +import com.google.common.collect.Lists; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -45,12 +50,9 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, private static final Logger logger = LoggerFactory.getLogger(NetconfDeviceCommunicator.class); - private static final RpcResult FAILED_RPC_RESULT = new FailedRpcResult<>(RpcErrors.getRpcError( - null, null, null, RpcError.ErrorSeverity.ERROR, "Netconf session disconnected", - RpcError.ErrorType.PROTOCOL, null)); - private final RemoteDevice remoteDevice; private final RemoteDeviceId id; + private final Lock sessionLock = new ReentrantLock(); public NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice remoteDevice) { @@ -62,14 +64,21 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, private NetconfClientSession session; @Override - public synchronized void onSessionUp(final NetconfClientSession session) { - logger.debug("{}: Session established", id); - this.session = session; + public void onSessionUp(final NetconfClientSession session) { + sessionLock.lock(); + try { + logger.debug("{}: Session established", id); + this.session = session; - final NetconfSessionCapabilities netconfSessionCapabilities = NetconfSessionCapabilities.fromNetconfSession(session); - logger.trace("{}: Session advertised capabilities: {}", id, netconfSessionCapabilities); + final NetconfSessionCapabilities netconfSessionCapabilities = + NetconfSessionCapabilities.fromNetconfSession(session); + logger.trace("{}: Session advertised capabilities: {}", id, netconfSessionCapabilities); - remoteDevice.onRemoteSessionUp(netconfSessionCapabilities, this); + remoteDevice.onRemoteSessionUp(netconfSessionCapabilities, this); + } + finally { + sessionLock.unlock(); + } } public void initializeRemoteConnection(final NetconfClientDispatcher dispatch, @@ -77,37 +86,75 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, dispatch.createReconnectingClient(config); } - private synchronized void tearDown(final Exception e) { - remoteDevice.onRemoteSessionDown(); - session = null; + private void tearDown( String reason ) { + List>> futuresToCancel = Lists.newArrayList(); + sessionLock.lock(); + try { + if( session != null ) { + session = null; + + /* + * Walk all requests, check if they have been executing + * or cancelled and remove them from the queue. + */ + final Iterator it = requests.iterator(); + while (it.hasNext()) { + final Request r = it.next(); + if (r.future.isUncancellable()) { + futuresToCancel.add( r.future ); + it.remove(); + } else if (r.future.isCancelled()) { + // This just does some house-cleaning + it.remove(); + } + } - /* - * Walk all requests, check if they have been executing - * or cancelled and remove them from the queue. - */ - final Iterator it = requests.iterator(); - while (it.hasNext()) { - final Request r = it.next(); - if (r.future.isUncancellable()) { - r.future.setException(e); - it.remove(); - } else if (r.future.isCancelled()) { - // This just does some house-cleaning - it.remove(); + remoteDevice.onRemoteSessionDown(); + } + } + finally { + sessionLock.unlock(); + } + + // Notify pending request futures outside of the sessionLock to avoid unnecessarily + // blocking the caller. + for( UncancellableFuture> future: futuresToCancel ) { + if( Strings.isNullOrEmpty( reason ) ) { + future.set( createSessionDownRpcResult() ); + } else { + future.set( createErrorRpcResult( RpcError.ErrorType.TRANSPORT, reason ) ); } } } + private RpcResult createSessionDownRpcResult() + { + return createErrorRpcResult( RpcError.ErrorType.TRANSPORT, + String.format( "The netconf session to %1$s is disconnected", id.getName() ) ); + } + + 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 ) ); + } + @Override public void onSessionDown(final NetconfClientSession session, final Exception e) { logger.warn("{}: Session went down", id, e); - tearDown(e); + tearDown( null ); } @Override public void onSessionTerminated(final NetconfClientSession session, final NetconfTerminationReason reason) { logger.warn("{}: Session terminated {}", id, reason); - tearDown(new RuntimeException(reason.getErrorMessage())); + tearDown( reason.getErrorMessage() ); + } + + @Override + public void close() { + tearDown( String.format( "The netconf session to %1$s has been closed", id.getName() ) ); } @Override @@ -123,73 +170,109 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, } } - private synchronized void processMessage(final NetconfMessage message) { - final Request r = requests.peek(); - if (r.future.isUncancellable()) { - requests.poll(); + private void processMessage(final NetconfMessage message) { + Request request = null; + sessionLock.lock(); + try { + request = requests.peek(); + if (request.future.isUncancellable()) { + requests.poll(); + } + else { + request = null; + logger.warn("{}: Ignoring unsolicited message {}", id, msgToS(message)); + } + } + finally { + sessionLock.unlock(); + } + + if( request != null ) { logger.debug("{}: Message received {}", id, message); if(logger.isTraceEnabled()) { - logger.trace("{}: Matched request: {} to response: {}", id, msgToS(r.request), msgToS(message)); + logger.trace( "{}: Matched request: {} to response: {}", id, + msgToS( request.request ), msgToS( message ) ); } try { - NetconfMessageTransformUtil.checkValidReply(r.request, message); - } catch (final IllegalStateException e) { - logger.warn("{}: Invalid request-reply match, reply message contains different message-id, request: {}, response: {}", id, - msgToS(r.request), msgToS(message), e); - r.future.setException(e); + NetconfMessageTransformUtil.checkValidReply( request.request, message ); + } + catch (final NetconfDocumentedException e) { + 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 ) ) ); return; } try { NetconfMessageTransformUtil.checkSuccessReply(message); - } catch (NetconfDocumentedException | IllegalStateException e) { - logger.warn("{}: Error reply from remote device, request: {}, response: {}", id, - msgToS(r.request), msgToS(message), e); - r.future.setException(e); + } + catch( NetconfDocumentedException e ) { + logger.warn( "{}: Error reply from remote device, request: {}, response: {}", id, + msgToS( request.request ), msgToS( message ), e ); + + request.future.set( new FailedRpcResult( + NetconfMessageTransformUtil.toRpcError( e ) ) ); return; } - r.future.set(Rpcs.getRpcResult(true, message, Collections.emptySet())); - } else { - logger.warn("{}: Ignoring unsolicited message {}", id, msgToS(message)); + request.future.set(Rpcs.getRpcResult( true, message, Collections.emptySet() ) ); } } - @Override - public void close() { - tearDown(new RuntimeException("Closed")); - } - private static String msgToS(final NetconfMessage msg) { return XmlUtil.toString(msg.getDocument()); } @Override - public synchronized ListenableFuture> sendRequest(final NetconfMessage message, final QName rpc) { + public ListenableFuture> sendRequest( + final NetconfMessage message, final QName rpc) { + sessionLock.lock(); + try { + return sendRequestWithLock( message, rpc ); + } + finally { + sessionLock.unlock(); + } + } + + private ListenableFuture> sendRequestWithLock( + final NetconfMessage message, final QName rpc) { if(logger.isTraceEnabled()) { logger.trace("{}: Sending message {}", id, msgToS(message)); } if (session == null) { logger.warn("{}: Session is disconnected, failing RPC request {}", id, message); - return Futures.immediateFuture(FAILED_RPC_RESULT); + return Futures.immediateFuture( createSessionDownRpcResult() ); } - final Request req = new Request(new UncancellableFuture>(true), message, rpc); + final Request req = new Request( new UncancellableFuture>(true), + message ); requests.add(req); session.sendMessage(req.request).addListener(new FutureListener() { @Override public void operationComplete(final Future future) throws Exception { - if (!future.isSuccess()) { + if( !future.isSuccess() ) { // We expect that a session down will occur at this point - logger.debug("{}: Failed to send request {}", id, XmlUtil.toString(req.request.getDocument()), future.cause()); - req.future.setException(future.cause()); - } else { - logger.trace("{}: Finished sending request {}", id, req.request); + logger.debug( "{}: Failed to send request {}", id, + XmlUtil.toString(req.request.getDocument()), future.cause() ); + + if( future.cause() != null ) { + req.future.set( createErrorRpcResult( RpcError.ErrorType.TRANSPORT, + future.cause().getLocalizedMessage() ) ); + } else { + req.future.set( createSessionDownRpcResult() ); // assume session is down + } + req.future.setException( future.cause() ); + } + else { + logger.trace( "Finished sending request {}", req.request ); } } }); @@ -215,12 +298,11 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener, private static final class Request { final UncancellableFuture> future; final NetconfMessage request; - final QName rpc; - private Request(final UncancellableFuture> future, final NetconfMessage request, final QName rpc) { + private Request(final UncancellableFuture> future, + final NetconfMessage request) { this.future = future; this.request = request; - this.rpc = rpc; } } } 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 1284d6d1ce..08a5822d36 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 @@ -12,14 +12,17 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; 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.netconf.util.xml.XmlUtil; +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.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.Node; @@ -36,6 +39,7 @@ import org.w3c.dom.Element; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -99,20 +103,68 @@ public class NetconfMessageTransformUtil { return new CompositeNodeTOImpl(argument.getNodeType(), null, list); } - public static void checkValidReply(final NetconfMessage input, final NetconfMessage output) { + public static void checkValidReply(final NetconfMessage input, final NetconfMessage output) + throws NetconfDocumentedException { final String inputMsgId = input.getDocument().getDocumentElement().getAttribute("message-id"); final String outputMsgId = output.getDocument().getDocumentElement().getAttribute("message-id"); if(inputMsgId.equals(outputMsgId) == false) { - final String requestXml = XmlUtil.toString(input.getDocument()); - final String responseXml = XmlUtil.toString(output.getDocument()); - throw new IllegalStateException(String.format("Rpc request and reply message IDs must be same. Request: %s, response: %s", requestXml, responseXml)); + Map errorInfo = ImmutableMap.builder() + .put( "actual-message-id", outputMsgId ) + .put( "expected-message-id", inputMsgId ) + .build(); + + throw new NetconfDocumentedException( "Response message contained unknown \"message-id\"", + null, NetconfDocumentedException.ErrorType.protocol, + NetconfDocumentedException.ErrorTag.bad_attribute, + NetconfDocumentedException.ErrorSeverity.error, errorInfo ); } } public static void checkSuccessReply(final NetconfMessage output) throws NetconfDocumentedException { if(NetconfMessageUtil.isErrorMessage(output)) { - throw new IllegalStateException(String.format("Response contains error: %s", XmlUtil.toString(output.getDocument()))); + throw NetconfDocumentedException.fromXMLDocument( output.getDocument() ); + } + } + + public static RpcError toRpcError( NetconfDocumentedException ex ) + { + StringBuilder infoBuilder = new StringBuilder(); + Map errorInfo = ex.getErrorInfo(); + if( errorInfo != null ) + { + for( Entry e: errorInfo.entrySet() ) { + infoBuilder.append( '<' ).append( e.getKey() ).append( '>' ).append( e.getValue() ) + .append( "' ); + + } + } + + return RpcErrors.getRpcError( null, ex.getErrorTag().getTagValue(), infoBuilder.toString(), + toRpcErrorSeverity( ex.getErrorSeverity() ), ex.getLocalizedMessage(), + toRpcErrorType( ex.getErrorType() ), ex.getCause() ); + } + + private static ErrorSeverity toRpcErrorSeverity( NetconfDocumentedException.ErrorSeverity severity ) { + switch( severity ) { + case warning: + return RpcError.ErrorSeverity.WARNING; + default: + return RpcError.ErrorSeverity.ERROR; + } + } + + private static RpcError.ErrorType toRpcErrorType( NetconfDocumentedException.ErrorType type ) + { + switch( type ) { + case protocol: + return RpcError.ErrorType.PROTOCOL; + case rpc: + return RpcError.ErrorType.RPC; + case transport: + return RpcError.ErrorType.TRANSPORT; + default: + return RpcError.ErrorType.APPLICATION; } } 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 5ac32b5b3c..c1b9f7b47b 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 @@ -26,7 +26,7 @@ import java.util.concurrent.Executors; import org.junit.Test; import org.mockito.Mockito; import org.opendaylight.controller.netconf.api.NetconfMessage; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; +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; diff --git a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicatorTest.java b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicatorTest.java new file mode 100644 index 0000000000..391bf9c6a4 --- /dev/null +++ b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/listener/NetconfDeviceCommunicatorTest.java @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2014 Brocade Communications 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.netconf.listener; + +import io.netty.channel.ChannelFuture; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener; + +import java.io.ByteArrayInputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.same; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.RPC_REPLY_KEY; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.NetconfTerminationReason; +import org.opendaylight.controller.netconf.client.NetconfClientSession; +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.RemoteDeviceId; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import com.google.common.base.Strings; +import com.google.common.collect.Sets; +import com.google.common.util.concurrent.ListenableFuture; + +public class NetconfDeviceCommunicatorTest { + + @Mock + NetconfClientSession mockSession; + + @Mock + RemoteDevice mockDevice; + + NetconfDeviceCommunicator communicator; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks( this ); + + communicator = new NetconfDeviceCommunicator( new RemoteDeviceId( "test" ), mockDevice ); + } + + @SuppressWarnings("unchecked") + void setupSession() + { + doReturn( Collections.emptySet() ).when( mockSession ).getServerCapabilities(); + doNothing().when( mockDevice ).onRemoteSessionUp( any( NetconfSessionCapabilities.class ), + any( RemoteDeviceCommunicator.class ) ); + communicator.onSessionUp( mockSession ); + } + + private ListenableFuture> sendRequest() throws Exception { + return sendRequest( UUID.randomUUID().toString() ); + } + + @SuppressWarnings("unchecked") + private ListenableFuture> sendRequest( String messageID ) throws Exception { + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + Element element = doc.createElement( "request" ); + element.setAttribute( "message-id", messageID ); + doc.appendChild( element ); + NetconfMessage message = new NetconfMessage( doc ); + + ChannelFuture mockChannelFuture = mock( ChannelFuture.class ); + doReturn( mockChannelFuture ).when( mockChannelFuture ) + .addListener( any( (GenericFutureListener.class ) ) ); + doReturn( mockChannelFuture ).when( mockSession ).sendMessage( same( message ) ); + + ListenableFuture> resultFuture = + communicator.sendRequest( message, QName.create( "mock rpc" ) ); + + assertNotNull( "ListenableFuture is null", resultFuture ); + return resultFuture; + } + + @Test + public void testOnSessionUp() { + String testCapability = "urn:opendaylight:params:xml:ns:test?module=test-module&revision=2014-06-02"; + Collection serverCapabilities = + Sets.newHashSet( NetconfMessageTransformUtil.NETCONF_ROLLBACK_ON_ERROR_URI.toString(), + NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString(), + testCapability ); + doReturn( serverCapabilities ).when( mockSession ).getServerCapabilities(); + + ArgumentCaptor netconfSessionCapabilities = + ArgumentCaptor.forClass( NetconfSessionCapabilities.class ); + doNothing().when( mockDevice ).onRemoteSessionUp( netconfSessionCapabilities.capture(), eq( communicator ) ); + + communicator.onSessionUp( mockSession ); + + verify( mockSession ).getServerCapabilities(); + verify( mockDevice ).onRemoteSessionUp( netconfSessionCapabilities.capture(), eq( communicator ) ); + + NetconfSessionCapabilities actualCapabilites = netconfSessionCapabilities.getValue(); + assertEquals( "containsCapability", true, actualCapabilites.containsCapability( + NetconfMessageTransformUtil.NETCONF_ROLLBACK_ON_ERROR_URI.toString() ) ); + assertEquals( "containsCapability", true, actualCapabilites.containsCapability( testCapability ) ); + assertEquals( "getModuleBasedCaps", Sets.newHashSet( + QName.create( "urn:opendaylight:params:xml:ns:test", "2014-06-02", "test-module" )), + actualCapabilites.getModuleBasedCaps() ); + assertEquals( "isRollbackSupported", true, actualCapabilites.isRollbackSupported() ); + assertEquals( "isMonitoringSupported", true, actualCapabilites.isMonitoringSupported() ); + } + + @SuppressWarnings("unchecked") + @Test(timeout=5000) + public void testOnSessionDown() throws Exception { + setupSession(); + + ListenableFuture> resultFuture1 = sendRequest(); + ListenableFuture> resultFuture2 = sendRequest(); + + doNothing().when( mockDevice ).onRemoteSessionDown(); + + communicator.onSessionDown( mockSession, new Exception( "mock ex" ) ); + + verifyErrorRpcResult( resultFuture1.get(), RpcError.ErrorType.TRANSPORT, "operation-failed" ); + verifyErrorRpcResult( resultFuture2.get(), RpcError.ErrorType.TRANSPORT, "operation-failed" ); + + verify( mockDevice ).onRemoteSessionDown(); + + reset( mockDevice ); + + communicator.onSessionDown( mockSession, new Exception( "mock ex" ) ); + + verify( mockDevice, never() ).onRemoteSessionDown(); + } + + @Test + public void testOnSessionTerminated() throws Exception { + setupSession(); + + ListenableFuture> resultFuture = sendRequest(); + + doNothing().when( mockDevice ).onRemoteSessionDown(); + + String reasonText = "testing terminate"; + NetconfTerminationReason reason = new NetconfTerminationReason( reasonText ); + communicator.onSessionTerminated( mockSession, reason ); + + RpcError rpcError = verifyErrorRpcResult( resultFuture.get(), RpcError.ErrorType.TRANSPORT, + "operation-failed" ); + assertEquals( "RpcError message", reasonText, rpcError.getMessage() ); + + verify( mockDevice ).onRemoteSessionDown(); + } + + @Test + public void testClose() throws Exception { + communicator.close(); + verify( mockDevice, never() ).onRemoteSessionDown(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void testSendRequest() throws Exception { + setupSession(); + + NetconfMessage message = new NetconfMessage( + DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() ); + QName rpc = QName.create( "mock rpc" ); + + ArgumentCaptor futureListener = + ArgumentCaptor.forClass( GenericFutureListener.class ); + + ChannelFuture mockChannelFuture = mock( ChannelFuture.class ); + doReturn( mockChannelFuture ).when( mockChannelFuture ).addListener( futureListener.capture() ); + doReturn( mockChannelFuture ).when( mockSession ).sendMessage( same( message ) ); + + ListenableFuture> resultFuture = communicator.sendRequest( message, rpc ); + + verify( mockSession ).sendMessage( same( message ) ); + + assertNotNull( "ListenableFuture is null", resultFuture ); + + verify( mockChannelFuture ).addListener( futureListener.capture() ); + Future operationFuture = mock( Future.class ); + doReturn( true ).when( operationFuture ).isSuccess(); + doReturn( true ).when( operationFuture ).isDone(); + futureListener.getValue().operationComplete( operationFuture ); + + try { + resultFuture.get( 1, TimeUnit.MILLISECONDS ); // verify it's not cancelled or has an error set + } + catch( TimeoutException e ) {} // expected + } + + @Test + public void testSendRequestWithNoSession() throws Exception { + NetconfMessage message = new NetconfMessage( + DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() ); + QName rpc = QName.create( "mock rpc" ); + + ListenableFuture> resultFuture = communicator.sendRequest( message, rpc ); + + assertNotNull( "ListenableFuture is null", resultFuture ); + + // Should have an immediate result + RpcResult rpcResult = resultFuture.get( 3, TimeUnit.MILLISECONDS ); + + verifyErrorRpcResult( rpcResult, RpcError.ErrorType.TRANSPORT, "operation-failed" ); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void testSendRequestWithWithSendFailure() throws Exception { + setupSession(); + + NetconfMessage message = new NetconfMessage( + DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() ); + QName rpc = QName.create( "mock rpc" ); + + ArgumentCaptor futureListener = + ArgumentCaptor.forClass( GenericFutureListener.class ); + + ChannelFuture mockChannelFuture = mock( ChannelFuture.class ); + doReturn( mockChannelFuture ).when( mockChannelFuture ).addListener( futureListener.capture() ); + doReturn( mockChannelFuture ).when( mockSession ).sendMessage( same( message ) ); + + ListenableFuture> resultFuture = communicator.sendRequest( message, rpc ); + + assertNotNull( "ListenableFuture is null", resultFuture ); + + verify( mockChannelFuture ).addListener( futureListener.capture() ); + + Future operationFuture = mock( Future.class ); + doReturn( false ).when( operationFuture ).isSuccess(); + doReturn( true ).when( operationFuture ).isDone(); + doReturn( new Exception( "mock error" ) ).when( operationFuture ).cause(); + futureListener.getValue().operationComplete( operationFuture ); + + // Should have an immediate result + RpcResult rpcResult = resultFuture.get( 3, TimeUnit.MILLISECONDS ); + + RpcError rpcError = verifyErrorRpcResult( rpcResult, RpcError.ErrorType.TRANSPORT, "operation-failed" ); + assertEquals( "RpcError message contains \"mock error\"", true, + rpcError.getMessage().contains( "mock error" ) ); + } + + private NetconfMessage createSuccessResponseMessage( String messageID ) throws ParserConfigurationException { + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + Element rpcReply = doc.createElementNS( URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, RPC_REPLY_KEY ); + rpcReply.setAttribute( "message-id", messageID ); + Element element = doc.createElementNS( "ns", "data" ); + element.setTextContent( messageID ); + rpcReply.appendChild( element ); + doc.appendChild( rpcReply ); + + return new NetconfMessage( doc ); + } + + @Test + public void testOnSuccessfulResponseMessage() throws Exception { + setupSession(); + + String messageID1 = UUID.randomUUID().toString(); + ListenableFuture> resultFuture1 = sendRequest( messageID1 ); + + String messageID2 = UUID.randomUUID().toString(); + ListenableFuture> resultFuture2 = sendRequest( messageID2 ); + + communicator.onMessage( mockSession, createSuccessResponseMessage( messageID1 ) ); + communicator.onMessage( mockSession, createSuccessResponseMessage( messageID2 ) ); + + verifyResponseMessage( resultFuture1.get(), messageID1 ); + verifyResponseMessage( resultFuture2.get(), messageID2 ); + } + + @Test + public void testOnResponseMessageWithError() throws Exception { + setupSession(); + + String messageID = UUID.randomUUID().toString(); + ListenableFuture> resultFuture = sendRequest( messageID ); + + communicator.onMessage( mockSession, createErrorResponseMessage( messageID ) ); + + RpcError rpcError = verifyErrorRpcResult( resultFuture.get(), RpcError.ErrorType.RPC, + "missing-attribute" ); + assertEquals( "RpcError message", "Missing attribute", rpcError.getMessage() ); + + String errorInfo = rpcError.getInfo(); + assertNotNull( "RpcError info is null", errorInfo ); + assertEquals( "Error info contains \"foo\"", true, + errorInfo.contains( "foo" ) ); + assertEquals( "Error info contains \"bar\"", true, + errorInfo.contains( "bar" ) ); + } + + @Test + public void testOnResponseMessageWithWrongMessageID() throws Exception { + setupSession(); + + String messageID = UUID.randomUUID().toString(); + ListenableFuture> resultFuture = sendRequest( messageID ); + + communicator.onMessage( mockSession, createSuccessResponseMessage( UUID.randomUUID().toString() ) ); + + RpcError rpcError = verifyErrorRpcResult( resultFuture.get(), RpcError.ErrorType.PROTOCOL, + "bad-attribute" ); + assertEquals( "RpcError message non-empty", true, + !Strings.isNullOrEmpty( rpcError.getMessage() ) ); + + String errorInfo = rpcError.getInfo(); + assertNotNull( "RpcError info is null", errorInfo ); + assertEquals( "Error info contains \"actual-message-id\"", true, + errorInfo.contains( "actual-message-id" ) ); + assertEquals( "Error info contains \"expected-message-id\"", true, + errorInfo.contains( "expected-message-id" ) ); + } + + private NetconfMessage createErrorResponseMessage( String messageID ) throws Exception { + String xmlStr = + "" + + " " + + " rpc" + + " missing-attribute" + + " error" + + " Missing attribute" + + " " + + " foo" + + " bar" + + " " + + " " + + ""; + + ByteArrayInputStream bis = new ByteArrayInputStream( xmlStr.getBytes() ); + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( bis ); + return new NetconfMessage( doc ); + } + + private void verifyResponseMessage( RpcResult rpcResult, String dataText ) { + assertNotNull( "RpcResult is null", rpcResult ); + assertEquals( "isSuccessful", true, rpcResult.isSuccessful() ); + NetconfMessage messageResult = rpcResult.getResult(); + assertNotNull( "getResult", messageResult ); +// List> nodes = messageResult.getSimpleNodesByName( +// QName.create( URI.create( "ns" ), null, "data" ) ); +// assertNotNull( "getSimpleNodesByName", nodes ); +// assertEquals( "List> size", 1, nodes.size() ); +// assertEquals( "SimpleNode value", dataText, nodes.iterator().next().getValue() ); + } + + private RpcError verifyErrorRpcResult( RpcResult rpcResult, + RpcError.ErrorType expErrorType, String expErrorTag ) { + assertNotNull( "RpcResult is null", rpcResult ); + assertEquals( "isSuccessful", false, rpcResult.isSuccessful() ); + assertNotNull( "RpcResult errors is null", rpcResult.getErrors() ); + assertEquals( "Errors size", 1, rpcResult.getErrors().size() ); + RpcError rpcError = rpcResult.getErrors().iterator().next(); + assertEquals( "getErrorSeverity", RpcError.ErrorSeverity.ERROR, rpcError.getSeverity() ); + assertEquals( "getErrorType", expErrorType, rpcError.getErrorType() ); + assertEquals( "getErrorTag", expErrorTag, rpcError.getTag() ); + assertTrue( "getMessage is empty", StringUtils.isNotEmpty( rpcError.getMessage() ) ); + return rpcError; + } +} diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/README-FIRST b/opendaylight/md-sal/sal-protocolbuffer-encoding/README-FIRST new file mode 100644 index 0000000000..778d8c6162 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/README-FIRST @@ -0,0 +1,23 @@ +Instructions on generating the protocol buffer Java source files + +These instructions are developers who are planning to generate the protocolbuffer java source files. + +1. We are using protocol buffer version 2.5.0 - you need to install the exact same version on your box. +The download link is https://code.google.com/p/protobuf/downloads/list. Download .tar/zip based on +your OS. + +2. Once downloaded the tar/zip and extracted follow the README instructions to compile protoc on your +machine + +3. Create your .proto (IDL) file in resources folder. Give appropriate package name so that the source + get generation in proper packages. For more information check + https://developers.google.com/protocol-buffers/docs/javatutorial + + For detailed information https://developers.google.com/protocol-buffers/docs/reference/java-generated + +4. To generate the java source files execute in sal-protocolbuffer-encoding directory + just run.sh in sal-protocolbuffer-encoding or execute the following command + + protoc --proto_path=src/main/resources --java_out=src/main/java src/main/resources/*.proto + +5. Run mvn clean install and resolve any trailing spaces issues & build the .jar diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/pom.xml b/opendaylight/md-sal/sal-protocolbuffer-encoding/pom.xml new file mode 100644 index 0000000000..671a9441d8 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + + org.opendaylight.controller + sal-parent + 1.1-SNAPSHOT + + + sal-protocolbuffer-encoding + + bundle + + + + com.google.protobuf + protobuf-java + 2.5.0 + + + junit + junit + test + + + + diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/run.sh b/opendaylight/md-sal/sal-protocolbuffer-encoding/run.sh new file mode 100755 index 0000000000..72e2c87ecb --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/run.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +##################################################################################################### +#Instructions on generating the protocol buffer Java source files +# +#These instructions are developers who are planning to generate the protocolbuffer java source files. +# +#1. We are using protocol buffer version 2.5.0 - you need to install the exact same version on your box. +#The download link is https://code.google.com/p/protobuf/downloads/list. Download .tar/zip based on +#your OS. +# +#2. Once downloaded the tar/zip and extracted follow the README instructions to compile protoc on your +#machine +# +#3. Create your .proto (IDL) file in resources folder. Give appropriate package name so that the source +# get generation in proper packages. For more information check +# https://developers.google.com/protocol-buffers/docs/javatutorial +# +# For detailed information https://developers.google.com/protocol-buffers/docs/reference/java-generated +# +#4. To generate the java source files execute in sal-protocolbuffer-encoding execute ./run.sh i.e. this script +# or run command +# protoc --proto_path=src/main/resources --java_out=src/main/java src/main/resources/*.proto +# +#5. Run mvn clean install and resolve any trailing spaces issues & build the .jar +######################################################################################################## + +protoc --proto_path=src/main/resources --java_out=src/main/java src/main/resources/*.proto + +echo "Done generating Java source files." \ No newline at end of file diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/registration/ListenerRegistrationMessages.java b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/registration/ListenerRegistrationMessages.java new file mode 100644 index 0000000000..afcb455c97 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/registration/ListenerRegistrationMessages.java @@ -0,0 +1,681 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ListenerRegistration.proto + +package org.opendaylight.controller.cluster.datastore.registration; + +public final class ListenerRegistrationMessages { + private ListenerRegistrationMessages() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface CloseOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.Close} + */ + public static final class Close extends + com.google.protobuf.GeneratedMessage + implements CloseOrBuilder { + // Use Close.newBuilder() to construct. + private Close(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Close(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Close defaultInstance; + public static Close getDefaultInstance() { + return defaultInstance; + } + + public Close getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Close( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_Close_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.class, org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Close parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Close(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.Close} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_Close_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.class, org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_Close_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close build() { + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close buildPartial() { + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close result = new org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close other) { + if (other == org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.Close) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.Close) + } + + static { + defaultInstance = new Close(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.Close) + } + + public interface CloseReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseReply} + */ + public static final class CloseReply extends + com.google.protobuf.GeneratedMessage + implements CloseReplyOrBuilder { + // Use CloseReply.newBuilder() to construct. + private CloseReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CloseReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CloseReply defaultInstance; + public static CloseReply getDefaultInstance() { + return defaultInstance; + } + + public CloseReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CloseReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_CloseReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_CloseReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.class, org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CloseReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CloseReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_CloseReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_CloseReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.class, org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.internal_static_org_opendaylight_controller_mdsal_CloseReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply build() { + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply buildPartial() { + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply result = new org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply other) { + if (other == org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.registration.ListenerRegistrationMessages.CloseReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CloseReply) + } + + static { + defaultInstance = new CloseReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CloseReply) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_Close_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_Close_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CloseReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CloseReply_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\032ListenerRegistration.proto\022!org.openda" + + "ylight.controller.mdsal\"\007\n\005Close\"\014\n\nClos" + + "eReplyBZ\n:org.opendaylight.controller.cl" + + "uster.datastore.registrationB\034ListenerRe" + + "gistrationMessages" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_org_opendaylight_controller_mdsal_Close_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_org_opendaylight_controller_mdsal_Close_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_Close_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CloseReply_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_org_opendaylight_controller_mdsal_CloseReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CloseReply_descriptor, + new java.lang.String[] { }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/shard/ShardManagerMessages.java b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/shard/ShardManagerMessages.java new file mode 100644 index 0000000000..a8f1bf0373 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/shard/ShardManagerMessages.java @@ -0,0 +1,1172 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ShardManager.proto + +package org.opendaylight.controller.cluster.datastore.shard; + +public final class ShardManagerMessages { + private ShardManagerMessages() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface FindPrimaryOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string shardName = 1; + /** + * required string shardName = 1; + */ + boolean hasShardName(); + /** + * required string shardName = 1; + */ + java.lang.String getShardName(); + /** + * required string shardName = 1; + */ + com.google.protobuf.ByteString + getShardNameBytes(); + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.FindPrimary} + */ + public static final class FindPrimary extends + com.google.protobuf.GeneratedMessage + implements FindPrimaryOrBuilder { + // Use FindPrimary.newBuilder() to construct. + private FindPrimary(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private FindPrimary(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final FindPrimary defaultInstance; + public static FindPrimary getDefaultInstance() { + return defaultInstance; + } + + public FindPrimary getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FindPrimary( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + shardName_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_FindPrimary_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_FindPrimary_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.class, org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public FindPrimary parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FindPrimary(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string shardName = 1; + public static final int SHARDNAME_FIELD_NUMBER = 1; + private java.lang.Object shardName_; + /** + * required string shardName = 1; + */ + public boolean hasShardName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string shardName = 1; + */ + public java.lang.String getShardName() { + java.lang.Object ref = shardName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + shardName_ = s; + } + return s; + } + } + /** + * required string shardName = 1; + */ + public com.google.protobuf.ByteString + getShardNameBytes() { + java.lang.Object ref = shardName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + shardName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + shardName_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasShardName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getShardNameBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getShardNameBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.FindPrimary} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimaryOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_FindPrimary_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_FindPrimary_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.class, org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + shardName_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_FindPrimary_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary build() { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary buildPartial() { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary result = new org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.shardName_ = shardName_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary other) { + if (other == org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary.getDefaultInstance()) return this; + if (other.hasShardName()) { + bitField0_ |= 0x00000001; + shardName_ = other.shardName_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasShardName()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.FindPrimary) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string shardName = 1; + private java.lang.Object shardName_ = ""; + /** + * required string shardName = 1; + */ + public boolean hasShardName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string shardName = 1; + */ + public java.lang.String getShardName() { + java.lang.Object ref = shardName_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + shardName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string shardName = 1; + */ + public com.google.protobuf.ByteString + getShardNameBytes() { + java.lang.Object ref = shardName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + shardName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string shardName = 1; + */ + public Builder setShardName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + shardName_ = value; + onChanged(); + return this; + } + /** + * required string shardName = 1; + */ + public Builder clearShardName() { + bitField0_ = (bitField0_ & ~0x00000001); + shardName_ = getDefaultInstance().getShardName(); + onChanged(); + return this; + } + /** + * required string shardName = 1; + */ + public Builder setShardNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + shardName_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.FindPrimary) + } + + static { + defaultInstance = new FindPrimary(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.FindPrimary) + } + + public interface PrimaryFoundOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.PrimaryFound} + */ + public static final class PrimaryFound extends + com.google.protobuf.GeneratedMessage + implements PrimaryFoundOrBuilder { + // Use PrimaryFound.newBuilder() to construct. + private PrimaryFound(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PrimaryFound(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PrimaryFound defaultInstance; + public static PrimaryFound getDefaultInstance() { + return defaultInstance; + } + + public PrimaryFound getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PrimaryFound( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryFound_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryFound_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.class, org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PrimaryFound parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PrimaryFound(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.PrimaryFound} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFoundOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryFound_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryFound_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.class, org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryFound_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound build() { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound buildPartial() { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound result = new org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound other) { + if (other == org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryFound) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.PrimaryFound) + } + + static { + defaultInstance = new PrimaryFound(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.PrimaryFound) + } + + public interface PrimaryNotFoundOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.PrimaryNotFound} + */ + public static final class PrimaryNotFound extends + com.google.protobuf.GeneratedMessage + implements PrimaryNotFoundOrBuilder { + // Use PrimaryNotFound.newBuilder() to construct. + private PrimaryNotFound(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PrimaryNotFound(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PrimaryNotFound defaultInstance; + public static PrimaryNotFound getDefaultInstance() { + return defaultInstance; + } + + public PrimaryNotFound getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PrimaryNotFound( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.class, org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PrimaryNotFound parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PrimaryNotFound(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.PrimaryNotFound} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFoundOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.class, org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound build() { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound buildPartial() { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound result = new org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound other) { + if (other == org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages.PrimaryNotFound) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.PrimaryNotFound) + } + + static { + defaultInstance = new PrimaryNotFound(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.PrimaryNotFound) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_FindPrimary_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_FindPrimary_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_PrimaryFound_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_PrimaryFound_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\022ShardManager.proto\022!org.opendaylight.c" + + "ontroller.mdsal\" \n\013FindPrimary\022\021\n\tshardN" + + "ame\030\001 \002(\t\"\016\n\014PrimaryFound\"\021\n\017PrimaryNotF" + + "oundBK\n3org.opendaylight.controller.clus" + + "ter.datastore.shardB\024ShardManagerMessage" + + "s" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_org_opendaylight_controller_mdsal_FindPrimary_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_org_opendaylight_controller_mdsal_FindPrimary_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_FindPrimary_descriptor, + new java.lang.String[] { "ShardName", }); + internal_static_org_opendaylight_controller_mdsal_PrimaryFound_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_org_opendaylight_controller_mdsal_PrimaryFound_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_PrimaryFound_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_PrimaryNotFound_descriptor, + new java.lang.String[] { }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/transaction/ShardTransactionChainMessages.java b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/transaction/ShardTransactionChainMessages.java new file mode 100644 index 0000000000..5de32c8a66 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/transaction/ShardTransactionChainMessages.java @@ -0,0 +1,1493 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ShardTransactionChainMessages.proto + +package org.opendaylight.controller.cluster.datastore.transaction; + +public final class ShardTransactionChainMessages { + private ShardTransactionChainMessages() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface CloseTransactionChainOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransactionChain} + */ + public static final class CloseTransactionChain extends + com.google.protobuf.GeneratedMessage + implements CloseTransactionChainOrBuilder { + // Use CloseTransactionChain.newBuilder() to construct. + private CloseTransactionChain(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CloseTransactionChain(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CloseTransactionChain defaultInstance; + public static CloseTransactionChain getDefaultInstance() { + return defaultInstance; + } + + public CloseTransactionChain getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CloseTransactionChain( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CloseTransactionChain parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CloseTransactionChain(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransactionChain} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChain) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CloseTransactionChain) + } + + static { + defaultInstance = new CloseTransactionChain(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CloseTransactionChain) + } + + public interface CloseTransactionChainReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransactionChainReply} + */ + public static final class CloseTransactionChainReply extends + com.google.protobuf.GeneratedMessage + implements CloseTransactionChainReplyOrBuilder { + // Use CloseTransactionChainReply.newBuilder() to construct. + private CloseTransactionChainReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CloseTransactionChainReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CloseTransactionChainReply defaultInstance; + public static CloseTransactionChainReply getDefaultInstance() { + return defaultInstance; + } + + public CloseTransactionChainReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CloseTransactionChainReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CloseTransactionChainReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CloseTransactionChainReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransactionChainReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CloseTransactionChainReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CloseTransactionChainReply) + } + + static { + defaultInstance = new CloseTransactionChainReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CloseTransactionChainReply) + } + + public interface CreateTransactionChainOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransactionChain} + */ + public static final class CreateTransactionChain extends + com.google.protobuf.GeneratedMessage + implements CreateTransactionChainOrBuilder { + // Use CreateTransactionChain.newBuilder() to construct. + private CreateTransactionChain(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CreateTransactionChain(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CreateTransactionChain defaultInstance; + public static CreateTransactionChain getDefaultInstance() { + return defaultInstance; + } + + public CreateTransactionChain getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CreateTransactionChain( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CreateTransactionChain parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CreateTransactionChain(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransactionChain} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChain) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CreateTransactionChain) + } + + static { + defaultInstance = new CreateTransactionChain(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CreateTransactionChain) + } + + public interface CreateTransactionChainReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string transactionChainPath = 1; + /** + * required string transactionChainPath = 1; + */ + boolean hasTransactionChainPath(); + /** + * required string transactionChainPath = 1; + */ + java.lang.String getTransactionChainPath(); + /** + * required string transactionChainPath = 1; + */ + com.google.protobuf.ByteString + getTransactionChainPathBytes(); + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransactionChainReply} + */ + public static final class CreateTransactionChainReply extends + com.google.protobuf.GeneratedMessage + implements CreateTransactionChainReplyOrBuilder { + // Use CreateTransactionChainReply.newBuilder() to construct. + private CreateTransactionChainReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CreateTransactionChainReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CreateTransactionChainReply defaultInstance; + public static CreateTransactionChainReply getDefaultInstance() { + return defaultInstance; + } + + public CreateTransactionChainReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CreateTransactionChainReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + transactionChainPath_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CreateTransactionChainReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CreateTransactionChainReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string transactionChainPath = 1; + public static final int TRANSACTIONCHAINPATH_FIELD_NUMBER = 1; + private java.lang.Object transactionChainPath_; + /** + * required string transactionChainPath = 1; + */ + public boolean hasTransactionChainPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string transactionChainPath = 1; + */ + public java.lang.String getTransactionChainPath() { + java.lang.Object ref = transactionChainPath_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + transactionChainPath_ = s; + } + return s; + } + } + /** + * required string transactionChainPath = 1; + */ + public com.google.protobuf.ByteString + getTransactionChainPathBytes() { + java.lang.Object ref = transactionChainPath_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + transactionChainPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + transactionChainPath_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasTransactionChainPath()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getTransactionChainPathBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getTransactionChainPathBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransactionChainReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + transactionChainPath_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.transactionChainPath_ = transactionChainPath_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply.getDefaultInstance()) return this; + if (other.hasTransactionChainPath()) { + bitField0_ |= 0x00000001; + transactionChainPath_ = other.transactionChainPath_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasTransactionChainPath()){ + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionChainMessages.CreateTransactionChainReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string transactionChainPath = 1; + private java.lang.Object transactionChainPath_ = ""; + /** + * required string transactionChainPath = 1; + */ + public boolean hasTransactionChainPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string transactionChainPath = 1; + */ + public java.lang.String getTransactionChainPath() { + java.lang.Object ref = transactionChainPath_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + transactionChainPath_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string transactionChainPath = 1; + */ + public com.google.protobuf.ByteString + getTransactionChainPathBytes() { + java.lang.Object ref = transactionChainPath_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + transactionChainPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string transactionChainPath = 1; + */ + public Builder setTransactionChainPath( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + transactionChainPath_ = value; + onChanged(); + return this; + } + /** + * required string transactionChainPath = 1; + */ + public Builder clearTransactionChainPath() { + bitField0_ = (bitField0_ & ~0x00000001); + transactionChainPath_ = getDefaultInstance().getTransactionChainPath(); + onChanged(); + return this; + } + /** + * required string transactionChainPath = 1; + */ + public Builder setTransactionChainPathBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + transactionChainPath_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CreateTransactionChainReply) + } + + static { + defaultInstance = new CreateTransactionChainReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CreateTransactionChainReply) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n#ShardTransactionChainMessages.proto\022!o" + + "rg.opendaylight.controller.mdsal\"\027\n\025Clos" + + "eTransactionChain\"\034\n\032CloseTransactionCha" + + "inReply\"\030\n\026CreateTransactionChain\";\n\033Cre" + + "ateTransactionChainReply\022\034\n\024transactionC" + + "hainPath\030\001 \002(\tBZ\n9org.opendaylight.contr" + + "oller.cluster.datastore.transactionB\035Sha" + + "rdTransactionChainMessages" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChain_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CloseTransactionChainReply_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChain_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CreateTransactionChainReply_descriptor, + new java.lang.String[] { "TransactionChainPath", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/transaction/ShardTransactionMessages.java b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/transaction/ShardTransactionMessages.java new file mode 100644 index 0000000000..3a226db3bc --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/java/org/opendaylight/controller/cluster/datastore/transaction/ShardTransactionMessages.java @@ -0,0 +1,3606 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ShardTransactionMessages.proto + +package org.opendaylight.controller.cluster.datastore.transaction; + +public final class ShardTransactionMessages { + private ShardTransactionMessages() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface CloseTransactionOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransaction} + */ + public static final class CloseTransaction extends + com.google.protobuf.GeneratedMessage + implements CloseTransactionOrBuilder { + // Use CloseTransaction.newBuilder() to construct. + private CloseTransaction(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CloseTransaction(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CloseTransaction defaultInstance; + public static CloseTransaction getDefaultInstance() { + return defaultInstance; + } + + public CloseTransaction getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CloseTransaction( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransaction_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransaction_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CloseTransaction parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CloseTransaction(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransaction} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransaction_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransaction_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransaction_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransaction) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CloseTransaction) + } + + static { + defaultInstance = new CloseTransaction(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CloseTransaction) + } + + public interface CloseTransactionReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransactionReply} + */ + public static final class CloseTransactionReply extends + com.google.protobuf.GeneratedMessage + implements CloseTransactionReplyOrBuilder { + // Use CloseTransactionReply.newBuilder() to construct. + private CloseTransactionReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CloseTransactionReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CloseTransactionReply defaultInstance; + public static CloseTransactionReply getDefaultInstance() { + return defaultInstance; + } + + public CloseTransactionReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CloseTransactionReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CloseTransactionReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CloseTransactionReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CloseTransactionReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CloseTransactionReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CloseTransactionReply) + } + + static { + defaultInstance = new CloseTransactionReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CloseTransactionReply) + } + + public interface CreateTransactionOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransaction} + */ + public static final class CreateTransaction extends + com.google.protobuf.GeneratedMessage + implements CreateTransactionOrBuilder { + // Use CreateTransaction.newBuilder() to construct. + private CreateTransaction(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CreateTransaction(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CreateTransaction defaultInstance; + public static CreateTransaction getDefaultInstance() { + return defaultInstance; + } + + public CreateTransaction getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CreateTransaction( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransaction_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransaction_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CreateTransaction parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CreateTransaction(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransaction} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransaction_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransaction_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransaction_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransaction) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CreateTransaction) + } + + static { + defaultInstance = new CreateTransaction(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CreateTransaction) + } + + public interface CreateTransactionReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string transactionPath = 1; + /** + * required string transactionPath = 1; + */ + boolean hasTransactionPath(); + /** + * required string transactionPath = 1; + */ + java.lang.String getTransactionPath(); + /** + * required string transactionPath = 1; + */ + com.google.protobuf.ByteString + getTransactionPathBytes(); + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransactionReply} + */ + public static final class CreateTransactionReply extends + com.google.protobuf.GeneratedMessage + implements CreateTransactionReplyOrBuilder { + // Use CreateTransactionReply.newBuilder() to construct. + private CreateTransactionReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CreateTransactionReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CreateTransactionReply defaultInstance; + public static CreateTransactionReply getDefaultInstance() { + return defaultInstance; + } + + public CreateTransactionReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CreateTransactionReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + transactionPath_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CreateTransactionReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CreateTransactionReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string transactionPath = 1; + public static final int TRANSACTIONPATH_FIELD_NUMBER = 1; + private java.lang.Object transactionPath_; + /** + * required string transactionPath = 1; + */ + public boolean hasTransactionPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string transactionPath = 1; + */ + public java.lang.String getTransactionPath() { + java.lang.Object ref = transactionPath_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + transactionPath_ = s; + } + return s; + } + } + /** + * required string transactionPath = 1; + */ + public com.google.protobuf.ByteString + getTransactionPathBytes() { + java.lang.Object ref = transactionPath_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + transactionPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + transactionPath_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasTransactionPath()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getTransactionPathBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getTransactionPathBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.CreateTransactionReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + transactionPath_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.transactionPath_ = transactionPath_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply.getDefaultInstance()) return this; + if (other.hasTransactionPath()) { + bitField0_ |= 0x00000001; + transactionPath_ = other.transactionPath_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasTransactionPath()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.CreateTransactionReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string transactionPath = 1; + private java.lang.Object transactionPath_ = ""; + /** + * required string transactionPath = 1; + */ + public boolean hasTransactionPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string transactionPath = 1; + */ + public java.lang.String getTransactionPath() { + java.lang.Object ref = transactionPath_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + transactionPath_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string transactionPath = 1; + */ + public com.google.protobuf.ByteString + getTransactionPathBytes() { + java.lang.Object ref = transactionPath_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + transactionPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string transactionPath = 1; + */ + public Builder setTransactionPath( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + transactionPath_ = value; + onChanged(); + return this; + } + /** + * required string transactionPath = 1; + */ + public Builder clearTransactionPath() { + bitField0_ = (bitField0_ & ~0x00000001); + transactionPath_ = getDefaultInstance().getTransactionPath(); + onChanged(); + return this; + } + /** + * required string transactionPath = 1; + */ + public Builder setTransactionPathBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + transactionPath_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.CreateTransactionReply) + } + + static { + defaultInstance = new CreateTransactionReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.CreateTransactionReply) + } + + public interface ReadyTransactionOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.ReadyTransaction} + */ + public static final class ReadyTransaction extends + com.google.protobuf.GeneratedMessage + implements ReadyTransactionOrBuilder { + // Use ReadyTransaction.newBuilder() to construct. + private ReadyTransaction(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ReadyTransaction(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ReadyTransaction defaultInstance; + public static ReadyTransaction getDefaultInstance() { + return defaultInstance; + } + + public ReadyTransaction getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ReadyTransaction( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ReadyTransaction parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ReadyTransaction(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.ReadyTransaction} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransaction) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.ReadyTransaction) + } + + static { + defaultInstance = new ReadyTransaction(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.ReadyTransaction) + } + + public interface ReadyTransactionReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string actorPath = 1; + /** + * required string actorPath = 1; + */ + boolean hasActorPath(); + /** + * required string actorPath = 1; + */ + java.lang.String getActorPath(); + /** + * required string actorPath = 1; + */ + com.google.protobuf.ByteString + getActorPathBytes(); + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.ReadyTransactionReply} + */ + public static final class ReadyTransactionReply extends + com.google.protobuf.GeneratedMessage + implements ReadyTransactionReplyOrBuilder { + // Use ReadyTransactionReply.newBuilder() to construct. + private ReadyTransactionReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ReadyTransactionReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ReadyTransactionReply defaultInstance; + public static ReadyTransactionReply getDefaultInstance() { + return defaultInstance; + } + + public ReadyTransactionReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ReadyTransactionReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + actorPath_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ReadyTransactionReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ReadyTransactionReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string actorPath = 1; + public static final int ACTORPATH_FIELD_NUMBER = 1; + private java.lang.Object actorPath_; + /** + * required string actorPath = 1; + */ + public boolean hasActorPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string actorPath = 1; + */ + public java.lang.String getActorPath() { + java.lang.Object ref = actorPath_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + actorPath_ = s; + } + return s; + } + } + /** + * required string actorPath = 1; + */ + public com.google.protobuf.ByteString + getActorPathBytes() { + java.lang.Object ref = actorPath_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + actorPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + actorPath_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasActorPath()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getActorPathBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getActorPathBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.ReadyTransactionReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + actorPath_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.actorPath_ = actorPath_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply.getDefaultInstance()) return this; + if (other.hasActorPath()) { + bitField0_ |= 0x00000001; + actorPath_ = other.actorPath_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasActorPath()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadyTransactionReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string actorPath = 1; + private java.lang.Object actorPath_ = ""; + /** + * required string actorPath = 1; + */ + public boolean hasActorPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string actorPath = 1; + */ + public java.lang.String getActorPath() { + java.lang.Object ref = actorPath_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + actorPath_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string actorPath = 1; + */ + public com.google.protobuf.ByteString + getActorPathBytes() { + java.lang.Object ref = actorPath_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + actorPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string actorPath = 1; + */ + public Builder setActorPath( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + actorPath_ = value; + onChanged(); + return this; + } + /** + * required string actorPath = 1; + */ + public Builder clearActorPath() { + bitField0_ = (bitField0_ & ~0x00000001); + actorPath_ = getDefaultInstance().getActorPath(); + onChanged(); + return this; + } + /** + * required string actorPath = 1; + */ + public Builder setActorPathBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + actorPath_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.ReadyTransactionReply) + } + + static { + defaultInstance = new ReadyTransactionReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.ReadyTransactionReply) + } + + public interface DeleteDataOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string instanceIdentifierPath = 1; + /** + * required string instanceIdentifierPath = 1; + */ + boolean hasInstanceIdentifierPath(); + /** + * required string instanceIdentifierPath = 1; + */ + java.lang.String getInstanceIdentifierPath(); + /** + * required string instanceIdentifierPath = 1; + */ + com.google.protobuf.ByteString + getInstanceIdentifierPathBytes(); + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.DeleteData} + */ + public static final class DeleteData extends + com.google.protobuf.GeneratedMessage + implements DeleteDataOrBuilder { + // Use DeleteData.newBuilder() to construct. + private DeleteData(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private DeleteData(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final DeleteData defaultInstance; + public static DeleteData getDefaultInstance() { + return defaultInstance; + } + + public DeleteData getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DeleteData( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + instanceIdentifierPath_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteData_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public DeleteData parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DeleteData(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string instanceIdentifierPath = 1; + public static final int INSTANCEIDENTIFIERPATH_FIELD_NUMBER = 1; + private java.lang.Object instanceIdentifierPath_; + /** + * required string instanceIdentifierPath = 1; + */ + public boolean hasInstanceIdentifierPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string instanceIdentifierPath = 1; + */ + public java.lang.String getInstanceIdentifierPath() { + java.lang.Object ref = instanceIdentifierPath_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + instanceIdentifierPath_ = s; + } + return s; + } + } + /** + * required string instanceIdentifierPath = 1; + */ + public com.google.protobuf.ByteString + getInstanceIdentifierPathBytes() { + java.lang.Object ref = instanceIdentifierPath_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + instanceIdentifierPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + instanceIdentifierPath_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasInstanceIdentifierPath()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getInstanceIdentifierPathBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getInstanceIdentifierPathBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.DeleteData} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteData_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + instanceIdentifierPath_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteData_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.instanceIdentifierPath_ = instanceIdentifierPath_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData.getDefaultInstance()) return this; + if (other.hasInstanceIdentifierPath()) { + bitField0_ |= 0x00000001; + instanceIdentifierPath_ = other.instanceIdentifierPath_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasInstanceIdentifierPath()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteData) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string instanceIdentifierPath = 1; + private java.lang.Object instanceIdentifierPath_ = ""; + /** + * required string instanceIdentifierPath = 1; + */ + public boolean hasInstanceIdentifierPath() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string instanceIdentifierPath = 1; + */ + public java.lang.String getInstanceIdentifierPath() { + java.lang.Object ref = instanceIdentifierPath_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + instanceIdentifierPath_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string instanceIdentifierPath = 1; + */ + public com.google.protobuf.ByteString + getInstanceIdentifierPathBytes() { + java.lang.Object ref = instanceIdentifierPath_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + instanceIdentifierPath_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string instanceIdentifierPath = 1; + */ + public Builder setInstanceIdentifierPath( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + instanceIdentifierPath_ = value; + onChanged(); + return this; + } + /** + * required string instanceIdentifierPath = 1; + */ + public Builder clearInstanceIdentifierPath() { + bitField0_ = (bitField0_ & ~0x00000001); + instanceIdentifierPath_ = getDefaultInstance().getInstanceIdentifierPath(); + onChanged(); + return this; + } + /** + * required string instanceIdentifierPath = 1; + */ + public Builder setInstanceIdentifierPathBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + instanceIdentifierPath_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.DeleteData) + } + + static { + defaultInstance = new DeleteData(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.DeleteData) + } + + public interface DeleteDataReplyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.DeleteDataReply} + */ + public static final class DeleteDataReply extends + com.google.protobuf.GeneratedMessage + implements DeleteDataReplyOrBuilder { + // Use DeleteDataReply.newBuilder() to construct. + private DeleteDataReply(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private DeleteDataReply(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final DeleteDataReply defaultInstance; + public static DeleteDataReply getDefaultInstance() { + return defaultInstance; + } + + public DeleteDataReply getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DeleteDataReply( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public DeleteDataReply parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DeleteDataReply(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.DeleteDataReply} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReplyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.DeleteDataReply) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.DeleteDataReply) + } + + static { + defaultInstance = new DeleteDataReply(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.DeleteDataReply) + } + + public interface ReadDataOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string intanceIdentifier = 1; + /** + * required string intanceIdentifier = 1; + */ + boolean hasIntanceIdentifier(); + /** + * required string intanceIdentifier = 1; + */ + java.lang.String getIntanceIdentifier(); + /** + * required string intanceIdentifier = 1; + */ + com.google.protobuf.ByteString + getIntanceIdentifierBytes(); + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.ReadData} + */ + public static final class ReadData extends + com.google.protobuf.GeneratedMessage + implements ReadDataOrBuilder { + // Use ReadData.newBuilder() to construct. + private ReadData(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ReadData(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ReadData defaultInstance; + public static ReadData getDefaultInstance() { + return defaultInstance; + } + + public ReadData getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ReadData( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + intanceIdentifier_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadData_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ReadData parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ReadData(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string intanceIdentifier = 1; + public static final int INTANCEIDENTIFIER_FIELD_NUMBER = 1; + private java.lang.Object intanceIdentifier_; + /** + * required string intanceIdentifier = 1; + */ + public boolean hasIntanceIdentifier() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string intanceIdentifier = 1; + */ + public java.lang.String getIntanceIdentifier() { + java.lang.Object ref = intanceIdentifier_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + intanceIdentifier_ = s; + } + return s; + } + } + /** + * required string intanceIdentifier = 1; + */ + public com.google.protobuf.ByteString + getIntanceIdentifierBytes() { + java.lang.Object ref = intanceIdentifier_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + intanceIdentifier_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + intanceIdentifier_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasIntanceIdentifier()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getIntanceIdentifierBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getIntanceIdentifierBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.opendaylight.controller.mdsal.ReadData} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadDataOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadData_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.class, org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.Builder.class); + } + + // Construct using org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + intanceIdentifier_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.internal_static_org_opendaylight_controller_mdsal_ReadData_descriptor; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData getDefaultInstanceForType() { + return org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.getDefaultInstance(); + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData build() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData buildPartial() { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData result = new org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.intanceIdentifier_ = intanceIdentifier_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData) { + return mergeFrom((org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData other) { + if (other == org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData.getDefaultInstance()) return this; + if (other.hasIntanceIdentifier()) { + bitField0_ |= 0x00000001; + intanceIdentifier_ = other.intanceIdentifier_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasIntanceIdentifier()) { + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.opendaylight.controller.cluster.datastore.transaction.ShardTransactionMessages.ReadData) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string intanceIdentifier = 1; + private java.lang.Object intanceIdentifier_ = ""; + /** + * required string intanceIdentifier = 1; + */ + public boolean hasIntanceIdentifier() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string intanceIdentifier = 1; + */ + public java.lang.String getIntanceIdentifier() { + java.lang.Object ref = intanceIdentifier_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + intanceIdentifier_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string intanceIdentifier = 1; + */ + public com.google.protobuf.ByteString + getIntanceIdentifierBytes() { + java.lang.Object ref = intanceIdentifier_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + intanceIdentifier_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string intanceIdentifier = 1; + */ + public Builder setIntanceIdentifier( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + intanceIdentifier_ = value; + onChanged(); + return this; + } + /** + * required string intanceIdentifier = 1; + */ + public Builder clearIntanceIdentifier() { + bitField0_ = (bitField0_ & ~0x00000001); + intanceIdentifier_ = getDefaultInstance().getIntanceIdentifier(); + onChanged(); + return this; + } + /** + * required string intanceIdentifier = 1; + */ + public Builder setIntanceIdentifierBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + intanceIdentifier_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:org.opendaylight.controller.mdsal.ReadData) + } + + static { + defaultInstance = new ReadData(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.opendaylight.controller.mdsal.ReadData) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CloseTransaction_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CloseTransaction_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CreateTransaction_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CreateTransaction_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_DeleteData_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_DeleteData_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_org_opendaylight_controller_mdsal_ReadData_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_opendaylight_controller_mdsal_ReadData_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\036ShardTransactionMessages.proto\022!org.op" + + "endaylight.controller.mdsal\"\022\n\020CloseTran" + + "saction\"\027\n\025CloseTransactionReply\"\023\n\021Crea" + + "teTransaction\"1\n\026CreateTransactionReply\022" + + "\027\n\017transactionPath\030\001 \002(\t\"\022\n\020ReadyTransac" + + "tion\"*\n\025ReadyTransactionReply\022\021\n\tactorPa" + + "th\030\001 \002(\t\",\n\nDeleteData\022\036\n\026instanceIdenti" + + "fierPath\030\001 \002(\t\"\021\n\017DeleteDataReply\"%\n\010Rea" + + "dData\022\031\n\021intanceIdentifier\030\001 \002(\tBU\n9org." + + "opendaylight.controller.cluster.datastor", + "e.transactionB\030ShardTransactionMessages" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_org_opendaylight_controller_mdsal_CloseTransaction_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_org_opendaylight_controller_mdsal_CloseTransaction_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CloseTransaction_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CloseTransactionReply_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CreateTransaction_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_org_opendaylight_controller_mdsal_CreateTransaction_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CreateTransaction_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_CreateTransactionReply_descriptor, + new java.lang.String[] { "TransactionPath", }); + internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_ReadyTransaction_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_ReadyTransactionReply_descriptor, + new java.lang.String[] { "ActorPath", }); + internal_static_org_opendaylight_controller_mdsal_DeleteData_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_org_opendaylight_controller_mdsal_DeleteData_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_DeleteData_descriptor, + new java.lang.String[] { "InstanceIdentifierPath", }); + internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_DeleteDataReply_descriptor, + new java.lang.String[] { }); + internal_static_org_opendaylight_controller_mdsal_ReadData_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_org_opendaylight_controller_mdsal_ReadData_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_opendaylight_controller_mdsal_ReadData_descriptor, + new java.lang.String[] { "IntanceIdentifier", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ListenerRegistration.proto b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ListenerRegistration.proto new file mode 100644 index 0000000000..ec8046f557 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ListenerRegistration.proto @@ -0,0 +1,13 @@ +package org.opendaylight.controller.mdsal; + +option java_package = "org.opendaylight.controller.cluster.datastore.registration"; +option java_outer_classname = "ListenerRegistrationMessages"; + +message Close { + +} + +message CloseReply{ + +} + diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardManager.proto b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardManager.proto new file mode 100644 index 0000000000..31e8c58b13 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardManager.proto @@ -0,0 +1,14 @@ +package org.opendaylight.controller.mdsal; + +option java_package = "org.opendaylight.controller.cluster.datastore.shard"; +option java_outer_classname = "ShardManagerMessages"; + +message FindPrimary { + required string shardName = 1; +} + +message PrimaryFound { +} + +message PrimaryNotFound { +} diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardTransaction.proto b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardTransaction.proto new file mode 100644 index 0000000000..0b260c8071 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardTransaction.proto @@ -0,0 +1,39 @@ +package org.opendaylight.controller.mdsal; + +option java_package = "org.opendaylight.controller.cluster.datastore.transaction"; +option java_outer_classname = "ShardTransactionMessages"; + +message CloseTransaction{ +} + +message CloseTransactionReply{ + +} + +message CreateTransaction{ + +} + +message CreateTransactionReply{ +required string transactionPath = 1; + +} + +message ReadyTransaction{ + +} + +message ReadyTransactionReply{ +required string actorPath = 1; +} + +message DeleteData { +required string instanceIdentifierPath = 1; +} + +message DeleteDataReply{ + +} +message ReadData { +required string intanceIdentifier=1; +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardTransactionChain.proto b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardTransactionChain.proto new file mode 100644 index 0000000000..73a9aa11c8 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/main/resources/ShardTransactionChain.proto @@ -0,0 +1,23 @@ +package org.opendaylight.controller.mdsal; + +option java_package = "org.opendaylight.controller.cluster.datastore.transaction"; +option java_outer_classname = "ShardTransactionChainMessages"; + +message CloseTransactionChain { + +} + +message CloseTransactionChainReply{ + + +} + +message CreateTransactionChain { + +} + +message CreateTransactionChainReply{ +required string transactionChainPath = 1; + +} + diff --git a/opendaylight/md-sal/sal-protocolbuffer-encoding/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ShardManagerMessagesTest.java b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ShardManagerMessagesTest.java new file mode 100644 index 0000000000..f57cfc9f10 --- /dev/null +++ b/opendaylight/md-sal/sal-protocolbuffer-encoding/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ShardManagerMessagesTest.java @@ -0,0 +1,43 @@ +package org.opendaylight.controller.cluster.datastore.messages; + +/** + * This test case is present to ensure that if others have + * used proper version of protocol buffer. + * + * If a different version of protocol buffer is used then it would + * generate different java sources and would result in + * breaking of this test case. + * + * @author: syedbahm + * Date: 6/20/14 + * + */ + +import org.junit.Assert; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.shard.ShardManagerMessages; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +public class ShardManagerMessagesTest { + + @Test + public void verifySerialization()throws Exception{ + ShardManagerMessages.FindPrimary.Builder builder = ShardManagerMessages.FindPrimary.newBuilder(); + builder.setShardName("Inventory"); + File testFile = new File("./test"); + FileOutputStream output = new FileOutputStream(testFile); + builder.build().writeTo(output); + output.close(); + + //Here we will read the same and check we got back what we had saved + ShardManagerMessages.FindPrimary findPrimary + = ShardManagerMessages.FindPrimary.parseFrom(new FileInputStream(testFile)); + Assert.assertEquals("Inventory", findPrimary.getShardName()); + + testFile.delete(); + + } +} diff --git a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/consumer-service/pom.xml b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/consumer-service/pom.xml index 89695c124a..8435884e7b 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/consumer-service/pom.xml +++ b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/consumer-service/pom.xml @@ -14,34 +14,28 @@ org.opendaylight.controller containermanager - 0.5.2-SNAPSHOT org.opendaylight.controller sal - 0.8.1-SNAPSHOT org.opendaylight.controller sal-binding-api - 1.1-SNAPSHOT org.opendaylight.controller sal-common-util - 1.1-SNAPSHOT org.opendaylight.controller sal-common-util - 1.1-SNAPSHOT org.opendaylight.controller sal-core-api - 1.1-SNAPSHOT org.opendaylight.yangtools diff --git a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/provider-service/pom.xml b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/provider-service/pom.xml index bd0e43bada..2b9dc0cf25 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/provider-service/pom.xml +++ b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/provider-service/pom.xml @@ -33,30 +33,25 @@ org.opendaylight.controller sal-binding-api - 1.1-SNAPSHOT org.opendaylight.controller sal-common-util - 1.1-SNAPSHOT org.opendaylight.controller sal-core-api - 1.1-SNAPSHOT org.opendaylight.controller containermanager - 0.5.2-SNAPSHOT org.opendaylight.controller sal - 0.8.1-SNAPSHOT org.opendaylight.yangtools @@ -77,12 +72,10 @@ org.opendaylight.controller sal-common-util - 1.1-SNAPSHOT org.opendaylight.controller sal-remoterpc-connector - 1.1-SNAPSHOT diff --git a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-it/pom.xml b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-it/pom.xml index 84e9d29c72..0ffc330f90 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-it/pom.xml +++ b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-it/pom.xml @@ -13,29 +13,12 @@ https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL - - 2.3.0 - 3.0.0 - 1.5.0 - - - - - - commons-codec - commons-codec - 1.7 - - - - org.ops4j.pax.exam maven-paxexam-plugin - 1.2.4 generate-config @@ -53,7 +36,7 @@ org.eclipse.m2e lifecycle-mapping - 1.0.0 + ${lifecycle.mapping.version} @@ -90,22 +73,18 @@ org.opendaylight.yangtools.thirdparty xtend-lib-osgi - 2.4.3 org.opendaylight.controller.tests sal-remoterpc-connector-test-provider - 1.1-SNAPSHOT org.opendaylight.controller.tests sal-remoterpc-connector-test-consumer - 1.1-SNAPSHOT org.opendaylight.controller sal-broker-impl - 1.1-SNAPSHOT org.ops4j.pax.exam @@ -128,55 +107,45 @@ org.ops4j.pax.url pax-url-aether - 1.5.2 test equinoxSDK381 org.eclipse.osgi - 3.8.1.v20120830-144521 test org.slf4j log4j-over-slf4j - 1.7.2 ch.qos.logback logback-core - 1.0.9 ch.qos.logback logback-classic - 1.0.9 org.opendaylight.controller sal-binding-api - 1.0-SNAPSHOT org.opendaylight.controller sal-common-util - 1.0-SNAPSHOT org.opendaylight.controller sal-core-api - 1.0-SNAPSHOT org.opendaylight.controller sal-remoterpc-connector - 1.0-SNAPSHOT org.opendaylight.controller containermanager - 0.5.1-SNAPSHOT org.osgi @@ -211,29 +180,24 @@ org.opendaylight.controller sal-common-util - 1.0-SNAPSHOT org.opendaylight.yangtools.thirdparty antlr4-runtime-osgi-nohead - 4.0 org.opendaylight.controller zeromq-routingtable.implementation - 0.4.1-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT org.osgi @@ -244,7 +208,6 @@ org.opendaylight.controller sal.implementation - 0.4.0-SNAPSHOT commons-io @@ -255,7 +218,6 @@ org.opendaylight.controller containermanager - 0.5.0-SNAPSHOT org.osgi @@ -270,7 +232,6 @@ org.opendaylight.controller containermanager.it.implementation - 0.5.0-SNAPSHOT commons-io @@ -281,7 +242,6 @@ org.opendaylight.controller clustering.stub - 0.4.0-SNAPSHOT commons-io @@ -293,7 +253,6 @@ org.apache.felix org.apache.felix.dependencymanager.shell - 3.0.1 org.osgi @@ -304,7 +263,6 @@ eclipselink javax.resource - 1.5.0.v200906010428 com.google.guava @@ -313,12 +271,10 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT org.opendaylight.controller ietf-netconf-monitoring - 0.2.5-SNAPSHOT org.opendaylight.yangtools @@ -327,38 +283,31 @@ org.opendaylight.yangtools.model yang-ext - 2013.09.07.3 org.opendaylight.yangtools.model opendaylight-l2-types - 2013.08.27.3 org.opendaylight.controller sal-binding-it - 1.0-SNAPSHOT org.opendaylight.controller sal-binding-config - 1.0-SNAPSHOT org.opendaylight.controller sal-binding-broker-impl - 1.0-SNAPSHOT org.opendaylight.controller sal-broker-impl - 1.0-SNAPSHOT org.opendaylight.controller.model model-inventory - 1.0-SNAPSHOT org.opendaylight.yangtools @@ -367,24 +316,20 @@ org.opendaylight.controller sal-connector-api - 1.0-SNAPSHOT org.opendaylight.controller sal-common-util - 1.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT equinoxSDK381 org.eclipse.osgi - 3.8.1.v20120830-144521 @@ -408,19 +353,16 @@ org.zeromq jeromq - 0.3.1 org.opendaylight.yangtools.thirdparty xtend-lib-osgi - 2.4.3 test org.opendaylight.controller sal-binding-broker-impl - 1.0-SNAPSHOT provided @@ -478,23 +420,19 @@ equinoxSDK381 org.eclipse.osgi - 3.8.1.v20120830-144521 test org.slf4j log4j-over-slf4j - 1.7.2 ch.qos.logback logback-core - 1.0.9 ch.qos.logback logback-classic - 1.0.9 org.mockito @@ -504,13 +442,11 @@ org.opendaylight.controller.model model-flow-service - 1.0-SNAPSHOT provided org.opendaylight.controller config-manager - 0.2.3-SNAPSHOT commons-io @@ -521,13 +457,11 @@ org.opendaylight.controller.model model-flow-management - 1.0-SNAPSHOT provided org.opendaylight.yangtools.thirdparty antlr4-runtime-osgi-nohead - 4.0 diff --git a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-nb/pom.xml b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-nb/pom.xml index b041cb430a..b681db27fb 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-nb/pom.xml +++ b/opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-nb/pom.xml @@ -59,37 +59,30 @@ org.opendaylight.controller containermanager - 0.5.1-SNAPSHOT org.opendaylight.controller commons.northbound - 0.4.1-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT org.opendaylight.controller.tests sal-remoterpc-connector-test-provider - 1.0-SNAPSHOT org.opendaylight.controller.tests sal-remoterpc-connector-test-consumer - 1.0-SNAPSHOT org.opendaylight.controller sal-remoterpc-connector - 1.0-SNAPSHOT org.osgi org.osgi.core - 5.0.0 junit @@ -98,7 +91,6 @@ org.opendaylight.controller remoterpc-routingtable.implementation - 0.4.1-SNAPSHOT com.google.guava diff --git a/opendaylight/md-sal/sal-rest-connector/pom.xml b/opendaylight/md-sal/sal-rest-connector/pom.xml index c2d245badb..46f4a2366a 100644 --- a/opendaylight/md-sal/sal-rest-connector/pom.xml +++ b/opendaylight/md-sal/sal-rest-connector/pom.xml @@ -17,7 +17,6 @@ ${project.groupId} sal-core-api - 1.1-SNAPSHOT com.google.code.gson @@ -62,7 +61,6 @@ org.jboss.resteasy jaxrs-api - 3.0.4.Final provided @@ -80,7 +78,6 @@ org.glassfish.jersey.test-framework.providers jersey-test-framework-provider-grizzly2 - 2.4 test diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java index 171805a179..1d6ca15f3c 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java @@ -14,14 +14,13 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.Stack; - import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; - import org.opendaylight.controller.sal.restconf.impl.CompositeNodeWrapper; import org.opendaylight.controller.sal.restconf.impl.EmptyNodeWrapper; import org.opendaylight.controller.sal.restconf.impl.IdentityValuesDTO; @@ -131,17 +130,9 @@ public class XmlReader { private boolean isSimpleNodeEvent(final XMLEvent event) throws XMLStreamException { checkArgument(event != null, "XML Event cannot be NULL!"); if (event.isStartElement()) { - if (eventReader.hasNext()) { - final XMLEvent innerEvent; - innerEvent = eventReader.peek(); - if (innerEvent.isCharacters()) { - final Characters chars = innerEvent.asCharacters(); - if (!chars.isWhiteSpace()) { - return true; - } - } else if (innerEvent.isEndElement()) { - return true; - } + XMLEvent innerEvent = skipCommentsAndWhitespace(); + if ( innerEvent != null && (innerEvent.isCharacters() || innerEvent.isEndElement())) { + return true; } } return false; @@ -150,16 +141,8 @@ public class XmlReader { private boolean isCompositeNodeEvent(final XMLEvent event) throws XMLStreamException { checkArgument(event != null, "XML Event cannot be NULL!"); if (event.isStartElement()) { - if (eventReader.hasNext()) { - XMLEvent innerEvent; - innerEvent = eventReader.peek(); - if (innerEvent.isCharacters()) { - Characters chars = innerEvent.asCharacters(); - if (chars.isWhiteSpace()) { - eventReader.nextEvent(); - innerEvent = eventReader.peek(); - } - } + XMLEvent innerEvent = skipCommentsAndWhitespace(); + if( innerEvent != null ) { if (innerEvent.isStartElement()) { return true; } @@ -168,6 +151,26 @@ public class XmlReader { return false; } + private XMLEvent skipCommentsAndWhitespace() throws XMLStreamException { + while( eventReader.hasNext() ) { + XMLEvent event = eventReader.peek(); + if( event.getEventType() == XMLStreamConstants.COMMENT ) { + eventReader.nextEvent(); + continue; + } + + if( event.isCharacters() ) { + Characters chars = event.asCharacters(); + if( chars.isWhiteSpace() ) { + eventReader.nextEvent(); + continue; + } + } + return event; + } + return null; + } + private CompositeNodeWrapper resolveCompositeNodeFromStartElement(final StartElement startElement) { checkArgument(startElement != null, "Start Element cannot be NULL!"); return new CompositeNodeWrapper(getNamespaceFor(startElement), getLocalNameFor(startElement)); diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java index 7b6dcd57db..9700d48bc2 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java @@ -8,6 +8,13 @@ */ package org.opendaylight.controller.sal.restconf.impl; +import com.google.common.base.Objects; +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import java.net.URI; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -20,12 +27,10 @@ import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.concurrent.Future; - import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; - import org.apache.commons.lang3.StringUtils; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.sal.core.api.mount.MountInstance; @@ -68,14 +73,6 @@ import org.opendaylight.yangtools.yang.model.util.EmptyType; import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder; -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; -import com.google.common.base.Splitter; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - public class RestconfImpl implements RestconfService { private final static RestconfImpl INSTANCE = new RestconfImpl(); @@ -254,7 +251,8 @@ public class RestconfImpl implements RestconfService { operationsAsData.add(immutableSimpleNode); String name = module.getName(); - LeafSchemaNodeBuilder leafSchemaNodeBuilder = new LeafSchemaNodeBuilder(name, 0, rpcQName, null); + LeafSchemaNodeBuilder leafSchemaNodeBuilder = new LeafSchemaNodeBuilder(name, 0, rpcQName, + SchemaPath.create(true, QName.create("dummy"))); final LeafSchemaNodeBuilder fakeRpcSchemaNode = leafSchemaNodeBuilder; fakeRpcSchemaNode.setAugmenting(true); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonNotExistingLeafTypeTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonNotExistingLeafTypeTest.java index 42e1e3f739..24dba17c90 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonNotExistingLeafTypeTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonNotExistingLeafTypeTest.java @@ -12,15 +12,14 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Collections; - import javax.ws.rs.WebApplicationException; - import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.controller.sal.rest.impl.StructuredDataToJsonProvider; import org.opendaylight.controller.sal.restconf.impl.test.DummyType; import org.opendaylight.controller.sal.restconf.impl.test.TestUtils; import org.opendaylight.controller.sal.restconf.impl.test.YangAndXmlAndDataSchemaLoader; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.ModifyAction; import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode; @@ -28,6 +27,7 @@ import org.opendaylight.yangtools.yang.data.api.MutableSimpleNode; import org.opendaylight.yangtools.yang.data.impl.NodeFactory; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder; import org.slf4j.Logger; @@ -65,9 +65,9 @@ public class CnSnToJsonNotExistingLeafTypeTest extends YangAndXmlAndDataSchemaLo private DataSchemaNode prepareDataSchemaNode() { ContainerSchemaNodeBuilder contBuild = new ContainerSchemaNodeBuilder("module", 1, TestUtils.buildQName("cont", - "simple:uri", "2012-12-17"), null); + "simple:uri", "2012-12-17"), SchemaPath.create(true, QName.create("dummy"))); LeafSchemaNodeBuilder leafBuild = new LeafSchemaNodeBuilder("module", 2, TestUtils.buildQName("lf1", - "simple:uri", "2012-12-17"), null); + "simple:uri", "2012-12-17"), SchemaPath.create(true, QName.create("dummy"))); leafBuild.setType(new DummyType()); leafBuild.setConfiguration(true); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/DummyFuture.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/DummyFuture.java index 22b34a4420..19a7eff480 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/DummyFuture.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/DummyFuture.java @@ -11,16 +11,14 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; - -import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.yangtools.yang.common.RpcResult; -public class DummyFuture implements Future> { +public class DummyFuture implements Future> { private final boolean cancel; private final boolean isCancelled; private final boolean isDone; - private final RpcResult result; + private final RpcResult result; public DummyFuture() { cancel = false; @@ -29,16 +27,13 @@ public class DummyFuture implements Future> { result = null; } - private DummyFuture(final Builder builder) { + private DummyFuture(final Builder builder) { cancel = builder.cancel; isCancelled = builder.isCancelled; isDone = builder.isDone; result = builder.result; } - public static Builder builder() { - return new DummyFuture.Builder(); - } @Override public boolean cancel(final boolean mayInterruptIfRunning) { @@ -56,45 +51,45 @@ public class DummyFuture implements Future> { } @Override - public RpcResult get() throws InterruptedException, ExecutionException { + public RpcResult get() throws InterruptedException, ExecutionException { return result; } @Override - public RpcResult get(final long timeout, final TimeUnit unit) throws InterruptedException, + public RpcResult get(final long timeout, final TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return result; } - public static class Builder { + public static class Builder { private boolean cancel; private boolean isCancelled; private boolean isDone; - private RpcResult result; + private RpcResult result; - public Builder cancel(final boolean cancel) { + public Builder cancel(final boolean cancel) { this.cancel = cancel; return this; } - public Builder isCancelled(final boolean isCancelled) { + public Builder isCancelled(final boolean isCancelled) { this.isCancelled = isCancelled; return this; } - public Builder isDone(final boolean isDone) { + public Builder isDone(final boolean isDone) { this.isDone = isDone; return this; } - public Builder rpcResult(final RpcResult result) { + public Builder rpcResult(final RpcResult result) { this.result = result; return this; } - public Future> build() { - return new DummyFuture(this); + public Future> build() { + return new DummyFuture(this); } } } diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestDeleteOperationTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestDeleteOperationTest.java index 56a58eeadd..e8cbf3140f 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestDeleteOperationTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestDeleteOperationTest.java @@ -17,11 +17,9 @@ import java.io.FileNotFoundException; import java.io.UnsupportedEncodingException; import java.util.Set; import java.util.concurrent.Future; - import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; - import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.BeforeClass; @@ -85,7 +83,7 @@ public class RestDeleteOperationTest extends JerseyTest { private Future> createFuture(TransactionStatus statusName) { RpcResult rpcResult = new DummyRpcResult.Builder().result(statusName).build(); - return DummyFuture.builder().rpcResult(rpcResult).build(); + return new DummyFuture.Builder().rpcResult(rpcResult).build(); } } 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 cfbc9fdb76..5b36fd52f7 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 @@ -15,25 +15,29 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.opendaylight.controller.sal.restconf.impl.test.RestOperationUtils.XML; +import com.google.common.util.concurrent.Futures; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Set; import java.util.concurrent.Future; - import javax.ws.rs.client.Entity; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; - import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; 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; @@ -47,14 +51,15 @@ import org.opendaylight.controller.sal.restconf.impl.CompositeNodeWrapper; 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.RpcError.ErrorType; 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.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import com.google.common.util.concurrent.Futures; - public class RestPostOperationTest extends JerseyTest { private static String xmlDataAbsolutePath; @@ -102,12 +107,12 @@ public class RestPostOperationTest extends JerseyTest { resourceConfig = resourceConfig.registerInstances(restconfImpl, StructuredDataToXmlProvider.INSTANCE, StructuredDataToJsonProvider.INSTANCE, XmlToCompositeNodeProvider.INSTANCE, JsonToCompositeNodeProvider.INSTANCE); - resourceConfig.registerClasses( RestconfDocumentedExceptionMapper.class ); + resourceConfig.registerClasses(RestconfDocumentedExceptionMapper.class); return resourceConfig; } @Test - public void postOperationsStatusCodes() throws UnsupportedEncodingException { + public void postOperationsStatusCodes() throws IOException { controllerContext.setSchemas(schemaContextTestModule); mockInvokeRpc(cnSnDataOutput, true); String uri = "/operations/test-module:rpc-test"; @@ -119,6 +124,12 @@ public class RestPostOperationTest extends JerseyTest { mockInvokeRpc(null, false); 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)); + mockInvokeRpc(null, false, rpcErrors); + assertEquals(500,post(uri, MediaType.APPLICATION_XML, xmlDataRpcInput)); + uri = "/operations/test-module:rpc-wrongtest"; assertEquals(400, post(uri, MediaType.APPLICATION_XML, xmlDataRpcInput)); } @@ -150,7 +161,7 @@ public class RestPostOperationTest extends JerseyTest { mockCommitConfigurationDataPostMethod(TransactionStatus.FAILED); assertEquals(500, post(uri, MediaType.APPLICATION_XML, xmlDataInterfaceAbsolutePath)); - assertEquals( 400, post(uri, MediaType.APPLICATION_JSON, "" )); + assertEquals(400, post(uri, MediaType.APPLICATION_JSON, "")); } @Test @@ -158,7 +169,8 @@ public class RestPostOperationTest extends JerseyTest { controllerContext.setSchemas(schemaContextYangsIetf); RpcResult rpcResult = new DummyRpcResult.Builder().result( TransactionStatus.COMMITED).build(); - Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + Future> dummyFuture = new DummyFuture.Builder().rpcResult( + rpcResult).build(); when( brokerFacade.commitConfigurationDataPostBehindMountPoint(any(MountInstance.class), any(InstanceIdentifier.class), any(CompositeNode.class))).thenReturn(dummyFuture); @@ -175,14 +187,23 @@ public class RestPostOperationTest extends JerseyTest { uri = "/config/ietf-interfaces:interfaces/interface/0/yang-ext:mount/test-module:cont"; assertEquals(204, post(uri, Draft02.MediaTypes.DATA + XML, xmlData3)); - assertEquals( 400, post(uri, MediaType.APPLICATION_JSON, "" )); + assertEquals(400, post(uri, MediaType.APPLICATION_JSON, "")); } - private void mockInvokeRpc(CompositeNode result, boolean sucessful) { - RpcResult rpcResult = new DummyRpcResult.Builder().result(result) - .isSuccessful(sucessful).build(); + private void mockInvokeRpc(CompositeNode result, boolean sucessful, Collection errors) { + + DummyRpcResult.Builder builder = new DummyRpcResult.Builder().result(result) + .isSuccessful(sucessful); + if (!errors.isEmpty()) { + builder.errors(errors); + } + RpcResult rpcResult = builder.build(); when(brokerFacade.invokeRpc(any(QName.class), any(CompositeNode.class))) - .thenReturn(Futures.>immediateFuture( rpcResult )); + .thenReturn(Futures.> immediateFuture(rpcResult)); + } + + private void mockInvokeRpc(CompositeNode result, boolean sucessful) { + mockInvokeRpc(result, sucessful, Collections. emptyList()); } private void mockCommitConfigurationDataPostMethod(TransactionStatus statusName) { @@ -190,9 +211,9 @@ public class RestPostOperationTest extends JerseyTest { .build(); Future> dummyFuture = null; if (statusName != null) { - dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + dummyFuture = new DummyFuture.Builder().rpcResult(rpcResult).build(); } else { - dummyFuture = DummyFuture.builder().build(); + dummyFuture = new DummyFuture.Builder().build(); } when(brokerFacade.commitConfigurationDataPost(any(InstanceIdentifier.class), any(CompositeNode.class))) @@ -204,7 +225,8 @@ public class RestPostOperationTest extends JerseyTest { initMocking(); RpcResult rpcResult = new DummyRpcResult.Builder().result( TransactionStatus.COMMITED).build(); - Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + Future> dummyFuture = new DummyFuture.Builder().rpcResult( + rpcResult).build(); when(brokerFacade.commitConfigurationDataPost(any(InstanceIdentifier.class), any(CompositeNode.class))) .thenReturn(dummyFuture); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutOperationTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutOperationTest.java index 77b39b7352..44b5f491d6 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutOperationTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutOperationTest.java @@ -18,12 +18,10 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; import java.util.concurrent.Future; - import javax.ws.rs.client.Entity; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; - import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.BeforeClass; @@ -88,7 +86,7 @@ public class RestPutOperationTest extends JerseyTest { resourceConfig = resourceConfig.registerInstances(restconfImpl, StructuredDataToXmlProvider.INSTANCE, StructuredDataToJsonProvider.INSTANCE, XmlToCompositeNodeProvider.INSTANCE, JsonToCompositeNodeProvider.INSTANCE); - resourceConfig.registerClasses( RestconfDocumentedExceptionMapper.class ); + resourceConfig.registerClasses(RestconfDocumentedExceptionMapper.class); return resourceConfig; } @@ -104,14 +102,15 @@ public class RestPutOperationTest extends JerseyTest { mockCommitConfigurationDataPutMethod(TransactionStatus.FAILED); assertEquals(500, put(uri, MediaType.APPLICATION_XML, xmlData)); - assertEquals( 400, put(uri, MediaType.APPLICATION_JSON, "" )); + assertEquals(400, put(uri, MediaType.APPLICATION_JSON, "")); } @Test public void putConfigStatusCodesEmptyBody() throws UnsupportedEncodingException { String uri = "/config/ietf-interfaces:interfaces/interface/eth0"; - Response resp = target(uri).request( MediaType.APPLICATION_JSON).put(Entity.entity( "", MediaType.APPLICATION_JSON)); - assertEquals( 400, put(uri, MediaType.APPLICATION_JSON, "" )); + Response resp = target(uri).request(MediaType.APPLICATION_JSON).put( + Entity.entity("", MediaType.APPLICATION_JSON)); + assertEquals(400, put(uri, MediaType.APPLICATION_JSON, "")); } @Test @@ -120,7 +119,8 @@ public class RestPutOperationTest extends JerseyTest { RpcResult rpcResult = new DummyRpcResult.Builder().result( TransactionStatus.COMMITED).build(); - Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + Future> dummyFuture = new DummyFuture.Builder().rpcResult( + rpcResult).build(); when( brokerFacade.commitConfigurationDataPutBehindMountPoint(any(MountInstance.class), any(InstanceIdentifier.class), any(CompositeNode.class))).thenReturn(dummyFuture); @@ -143,7 +143,8 @@ public class RestPutOperationTest extends JerseyTest { public void putDataMountPointIntoHighestElement() throws UnsupportedEncodingException, URISyntaxException { RpcResult rpcResult = new DummyRpcResult.Builder().result( TransactionStatus.COMMITED).build(); - Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + Future> dummyFuture = new DummyFuture.Builder().rpcResult( + rpcResult).build(); when( brokerFacade.commitConfigurationDataPutBehindMountPoint(any(MountInstance.class), any(InstanceIdentifier.class), any(CompositeNode.class))).thenReturn(dummyFuture); @@ -166,7 +167,8 @@ public class RestPutOperationTest extends JerseyTest { private void mockCommitConfigurationDataPutMethod(TransactionStatus statusName) { RpcResult rpcResult = new DummyRpcResult.Builder().result(statusName) .build(); - Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + Future> dummyFuture = new DummyFuture.Builder().rpcResult( + rpcResult).build(); when(brokerFacade.commitConfigurationDataPut(any(InstanceIdentifier.class), any(CompositeNode.class))) .thenReturn(dummyFuture); } diff --git a/opendaylight/md-sal/sal-rest-docgen/pom.xml b/opendaylight/md-sal/sal-rest-docgen/pom.xml index 79a3434c49..0c8b4d5a2a 100644 --- a/opendaylight/md-sal/sal-rest-docgen/pom.xml +++ b/opendaylight/md-sal/sal-rest-docgen/pom.xml @@ -36,8 +36,6 @@ org.apache.commons commons-lang3 - 3.3.2 - diff --git a/opendaylight/md-sal/samples/l2switch/implementation/pom.xml b/opendaylight/md-sal/samples/l2switch/implementation/pom.xml index 10a9d6ddad..8824284785 100644 --- a/opendaylight/md-sal/samples/l2switch/implementation/pom.xml +++ b/opendaylight/md-sal/samples/l2switch/implementation/pom.xml @@ -32,7 +32,6 @@ org.opendaylight.controller.model model-topology - 1.1-SNAPSHOT org.opendaylight.controller.samples.l2switch.md diff --git a/opendaylight/md-sal/samples/toaster-it/pom.xml b/opendaylight/md-sal/samples/toaster-it/pom.xml index 2fcb2f6d63..56ed9a07a6 100644 --- a/opendaylight/md-sal/samples/toaster-it/pom.xml +++ b/opendaylight/md-sal/samples/toaster-it/pom.xml @@ -21,18 +21,15 @@ org.opendaylight.controller.samples sample-toaster - 1.1-SNAPSHOT org.opendaylight.controller.samples sample-toaster-consumer - 1.1-SNAPSHOT org.opendaylight.controller.samples sample-toaster-provider - 1.1-SNAPSHOT org.openexi @@ -50,7 +47,6 @@ equinoxSDK381 org.eclipse.osgi - 3.8.1.v20120830-144521 test @@ -72,7 +68,6 @@ org.ops4j.pax.exam maven-paxexam-plugin - 1.2.4 generate-config diff --git a/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml b/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml index 61c24c6b64..57581d100d 100644 --- a/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml +++ b/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml @@ -1,45 +1,92 @@ + + + - - - - urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 - - 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:config?module=config&revision=2013-04-05 - - urn:ietf:params:netconf:capability:candidate:1.0 - urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04 - urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17 - - - urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28 - - urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24 - - urn:ietf:params:netconf:capability:rollback-on-error:1.0 - urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 - - - 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:logback:config?module=config-logging&revision=2013-07-16 - - - urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 - - http://netconfcentral.org/ns/toaster?module=toaster&revision=2009-11-20 - urn:opendaylight:params:xml:ns:yang:controller:config:kitchen-service:impl?module=kitchen-service-impl&revision=2014-01-31 - urn:opendaylight:params:xml:ns:yang:controller:config:toaster-provider:impl?module=toaster-provider-impl&revision=2014-01-31 - - - + + prefix:schema-service-singleton + yang-schema-service + + + prefix:runtime-generated-mapping + runtime-mapping-singleton + + + prefix:binding-notification-broker + binding-notification-broker + + + prefix:binding-broker-impl + binding-broker-impl + + binding:binding-notification-service + binding-notification-broker + + + binding:binding-data-broker + binding-data-broker + + + + + + prefix:dom-inmemory-data-broker + inmemory-data-broker + + dom:schema-service + yang-schema-service + + + + prefix:dom-broker-impl + inmemory-dom-broker + + dom:dom-async-data-broker + inmemory-data-broker + + + + prefix:binding-data-compatible-broker + inmemory-binding-data-broker + + dom:dom-broker-osgi-registry + dom-broker + + + binding:binding-dom-mapping-service + runtime-mapping-singleton + + + + prefix:binding-forwarded-data-broker + binding-async-data-broker + + + dom:dom-broker-osgi-registry + dom-broker + + + binding:binding-dom-mapping-service + runtime-mapping-singleton + + + + + prefix:toaster-provider-impl @@ -53,17 +100,18 @@ binding:binding-data-broker - ref_binding-data-broker + binding-data-broker binding:binding-notification-service - ref_binding-notification-broker + binding-notification-broker + prefix:kitchen-service-impl @@ -79,126 +127,37 @@ binding:binding-notification-service - ref_binding-notification-broker - - - - - - prefix:schema-service-singleton - - yang-schema-service - - - - prefix:hash-map-data-store - - hash-map-data-store - - - - prefix:dom-broker-impl - - dom-broker - - - dom:dom-data-store - - ref_hash-map-data-store - - - - - prefix:binding-broker-impl - - binding-broker-impl - - - binding:binding-notification-service - - ref_binding-notification-broker + binding-notification-broker - - - binding:binding-data-broker - - ref_binding-data-broker - - - - - prefix:runtime-generated-mapping - - runtime-mapping-singleton - - - - prefix:binding-notification-broker - - binding-notification-broker - - - - prefix:binding-data-broker - - binding-data-broker - - - dom:dom-broker-osgi-registry - - ref_dom-broker - - - - binding:binding-dom-mapping-service - - ref_runtime-mapping-singleton - - - - kitchen:kitchen-service - - - kitchen-service - /modules/module[type='kitchen-service-impl'][name='kitchen-service-impl'] - + dom:schema-service + + yang-schema-service + /modules/module[type='schema-service-singleton'][name='yang-schema-service'] + - - dom:schema-service - + binding-impl:binding-dom-mapping-service - ref_yang-schema-service - - /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service'] - + runtime-mapping-singleton + /modules/module[type='runtime-generated-mapping'][name='runtime-mapping-singleton'] - - binding:binding-notification-service - + binding:binding-notification-service - ref_binding-notification-broker - - /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker'] - + binding-notification-broker + /modules/module[type='binding-notification-broker'][name='binding-notification-broker'] - - dom:dom-data-store - + binding:binding-broker-osgi-registry - ref_hash-map-data-store - - /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store'] - + binding-osgi-broker + /modules/module[type='binding-broker-impl'][name='binding-broker-impl'] @@ -208,54 +167,65 @@ /modules/module[type='binding-broker-impl'][name='binding-broker-impl'] + - - binding:binding-broker-osgi-registry - + dom:dom-broker-osgi-registry - ref_binding-broker-impl - - /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl'] - + dom-broker + /modules/module[type='dom-broker-impl'][name='inmemory-dom-broker'] + - - binding-impl:binding-dom-mapping-service - + binding:binding-data-broker - ref_runtime-mapping-singleton - - /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton'] - + binding-data-broker + /modules/module[type='binding-data-compatible-broker'][name='inmemory-binding-data-broker'] + - - dom:dom-broker-osgi-registry - + binding:binding-async-data-broker - ref_dom-broker - /config/modules/module[name='dom-broker-impl']/instance[name='dom-broker'] - + binding-data-broker + /modules/module[type='binding-forwarded-data-broker'][name='binding-async-data-broker'] + - - binding:binding-data-broker - + dom:dom-async-data-broker - ref_binding-data-broker - - /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] - + inmemory-data-broker + /modules/module[type='dom-inmemory-data-broker'][name='inmemory-data-broker'] + + + + + kitchen:kitchen-service + + + kitchen-service + /modules/module[type='kitchen-service-impl'][name='kitchen-service-impl'] + + - - + + urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 + 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:binding:impl?module=opendaylight-sal-binding-broker-impl&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 + + http://netconfcentral.org/ns/toaster?module=toaster&revision=2009-11-20 + urn:opendaylight:params:xml:ns:yang:controller:config:kitchen-service:impl?module=kitchen-service-impl&revision=2014-01-31 + urn:opendaylight:params:xml:ns:yang:controller:config:toaster-provider:impl?module=toaster-provider-impl&revision=2014-01-31 + + + diff --git a/opendaylight/md-sal/topology-lldp-discovery/pom.xml b/opendaylight/md-sal/topology-lldp-discovery/pom.xml index a51f6c2f9f..2c8571ca64 100644 --- a/opendaylight/md-sal/topology-lldp-discovery/pom.xml +++ b/opendaylight/md-sal/topology-lldp-discovery/pom.xml @@ -28,7 +28,6 @@ commons-lang commons-lang - 2.4 equinoxSDK381 diff --git a/opendaylight/md-sal/topology-manager/pom.xml b/opendaylight/md-sal/topology-manager/pom.xml index 55244d3c90..fe1813a199 100644 --- a/opendaylight/md-sal/topology-manager/pom.xml +++ b/opendaylight/md-sal/topology-manager/pom.xml @@ -34,7 +34,6 @@ org.opendaylight.controller.model model-topology - 1.1-SNAPSHOT org.osgi diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java index 08f3c73ac2..8720c654c6 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java @@ -8,12 +8,14 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml; import com.google.common.base.Preconditions; + import java.util.List; import java.util.Map; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.mapping.ObjectNameAttributeMappingStrategy; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; public class ObjectNameAttributeReadingStrategy extends AbstractAttributeReadingStrategy { diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectNameAttributeWritingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectNameAttributeWritingStrategy.java index 68c8c6fce3..5d5721a6f8 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectNameAttributeWritingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectNameAttributeWritingStrategy.java @@ -8,9 +8,9 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.toxml; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.mapping.ObjectNameAttributeMappingStrategy; import org.opendaylight.controller.netconf.confignetconfconnector.util.Util; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java index 1492066289..5d41b784f5 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java @@ -16,6 +16,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; + import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -23,13 +24,15 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; + import javax.management.ObjectName; + import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditStrategyType; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java index ff1d719c57..0b33b55320 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java @@ -11,16 +11,20 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.confi import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; + import javax.management.ObjectName; import javax.management.openmbean.OpenType; + import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeConfigElement; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeReadingStrategy; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.ObjectXmlReader; @@ -33,7 +37,6 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attrib import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditStrategyType; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/ModuleConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/ModuleConfig.java index 0c2b0e228e..eaab30b53b 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/ModuleConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/ModuleConfig.java @@ -9,15 +9,18 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.config; import com.google.common.base.Optional; + import java.util.Date; import java.util.Map; + import javax.management.ObjectName; + import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditStrategyType; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java index 559de7a756..37ad2bb222 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java @@ -11,16 +11,18 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.confi import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; + import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.ObjectNameAttributeReadingStrategy; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.management.ObjectName; + import java.util.List; import java.util.Map; import java.util.Map.Entry; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/runtime/Runtime.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/runtime/Runtime.java index b9518dc4d8..b1df316b1a 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/runtime/Runtime.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/runtime/Runtime.java @@ -12,14 +12,17 @@ import com.google.common.base.Optional; import com.google.common.collect.HashMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; + import java.util.Collection; import java.util.Map; import java.util.Set; + import javax.management.ObjectName; + import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Config; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleConfig; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java index d49fe1a116..8eaaecfbb4 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java @@ -13,9 +13,9 @@ import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java index 96a43b104d..3cf702ed7f 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java @@ -9,14 +9,15 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations; import com.google.common.base.Optional; + import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorType; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java index 1a7d50e5fa..f443111525 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java @@ -9,15 +9,16 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations; import com.google.common.base.Optional; + import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorType; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java index 319f539c25..543a2c4a63 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java @@ -13,12 +13,15 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; + import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; + import javax.management.InstanceNotFoundException; import javax.management.ObjectName; + import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.util.ConfigTransactionClient; @@ -27,6 +30,7 @@ import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorType; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Config; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfig; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfigElementResolved; @@ -39,7 +43,6 @@ import org.opendaylight.controller.netconf.confignetconfconnector.operations.edi import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigXmlParser.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigXmlParser.java index 47220f1857..a3d97b1b39 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigXmlParser.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigXmlParser.java @@ -11,10 +11,13 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations.ed import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.Multimap; + import java.util.Arrays; import java.util.Map; + import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Config; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementDefinition; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementResolved; @@ -24,7 +27,6 @@ import org.opendaylight.controller.netconf.confignetconfconnector.operations.Dat import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceException; import org.opendaylight.controller.netconf.util.exception.UnexpectedNamespaceException; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/get/Get.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/get/Get.java index 867ad60362..fc95046dfd 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/get/Get.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/get/Get.java @@ -9,14 +9,18 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations.get; import com.google.common.collect.Maps; + import java.util.List; import java.util.Map; import java.util.Set; + import javax.management.ObjectName; + import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfig; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleConfig; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.runtime.InstanceRuntime; @@ -30,7 +34,6 @@ import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceExcept import org.opendaylight.controller.netconf.util.exception.UnexpectedElementException; import org.opendaylight.controller.netconf.util.exception.UnexpectedNamespaceException; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/getconfig/GetConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/getconfig/GetConfig.java index bc059d345c..fee3036214 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/getconfig/GetConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/getconfig/GetConfig.java @@ -14,6 +14,7 @@ import javax.management.ObjectName; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.util.ConfigTransactionClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Config; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ServiceRegistryWrapper; import org.opendaylight.controller.netconf.confignetconfconnector.operations.AbstractConfigNetconfOperation; @@ -25,7 +26,6 @@ import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceExcept import org.opendaylight.controller.netconf.util.exception.UnexpectedElementException; import org.opendaylight.controller.netconf.util.exception.UnexpectedNamespaceException; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpc.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpc.java index 98eb176999..21021fec55 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpc.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpc.java @@ -11,6 +11,7 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations.ru import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; + import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; @@ -18,6 +19,7 @@ import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry.Rpc; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; import org.opendaylight.controller.config.yangjmxgenerator.attribute.VoidAttribute; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeConfigElement; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.mapping.AttributeMappingStrategy; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.mapping.ObjectMapper; @@ -31,7 +33,6 @@ import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStore import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceException; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,6 +41,7 @@ import org.w3c.dom.Element; import javax.management.ObjectName; import javax.management.openmbean.OpenType; + import java.util.Map; public class RuntimeRpc extends AbstractConfigNetconfOperation { diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpcElementResolved.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpcElementResolved.java index 5cf7f30abc..7fd8928928 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpcElementResolved.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/runtimerpc/RuntimeRpcElementResolved.java @@ -11,11 +11,13 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations.ru import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.Maps; + import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.rpc.ModuleRpcs; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import javax.management.ObjectName; + import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java index 41301543a3..e41b174b66 100644 --- a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; + import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -42,10 +43,12 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; + import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.ObjectName; import javax.xml.parsers.ParserConfigurationException; + import org.custommonkey.xmlunit.AbstractNodeTester; import org.custommonkey.xmlunit.NodeTest; import org.custommonkey.xmlunit.NodeTestException; @@ -80,6 +83,7 @@ import org.opendaylight.controller.config.yang.test.impl.Peers; import org.opendaylight.controller.config.yang.test.impl.TestImplModuleFactory; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.operations.Commit; import org.opendaylight.controller.netconf.confignetconfconnector.operations.DiscardChanges; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; @@ -96,7 +100,6 @@ import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperation; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.util.test.XmlFileLoader; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity2; diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/ValidateTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/ValidateTest.java index d393121a26..b5c5dd3544 100644 --- a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/ValidateTest.java +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/ValidateTest.java @@ -11,9 +11,9 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations; import org.junit.Test; import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java index 957db50c61..8d85a35bc7 100644 --- a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java +++ b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java @@ -25,6 +25,7 @@ import org.opendaylight.controller.config.api.ConflictingVersionException; import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.mapping.api.Capability; import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperation; @@ -33,7 +34,6 @@ import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.controller.netconf.util.NetconfUtil; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-api/pom.xml b/opendaylight/netconf/netconf-api/pom.xml index 061fbd7c8c..a15047224b 100644 --- a/opendaylight/netconf/netconf-api/pom.xml +++ b/opendaylight/netconf/netconf-api/pom.xml @@ -19,7 +19,6 @@ ${project.groupId} ietf-netconf-monitoring-extension - ${project.version} org.opendaylight.controller @@ -48,6 +47,7 @@ javax.management, + javax.xml.parsers, org.opendaylight.controller.config.api, org.opendaylight.controller.config.api.jmx, org.opendaylight.protocol.framework, @@ -62,6 +62,7 @@ com.google.common.base, org.opendaylight.controller.netconf.api, org.opendaylight.controller.netconf.api.jmx, + org.opendaylight.controller.netconf.api.xml, org.opendaylight.controller.netconf.api.monitoring, diff --git a/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java b/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java index 1ecbc55b2a..0c365b9d30 100644 --- a/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java +++ b/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java @@ -8,12 +8,30 @@ package org.opendaylight.controller.netconf.api; -import org.opendaylight.controller.config.api.ConflictingVersionException; -import org.opendaylight.controller.config.api.ValidationException; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.ERROR_INFO; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.ERROR_MESSAGE; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.ERROR_SEVERITY; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.ERROR_TAG; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.ERROR_TYPE; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.RPC_ERROR; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.RPC_REPLY_KEY; +import static org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * Checked exception to communicate an error that needs to be sent to the @@ -23,7 +41,17 @@ public class NetconfDocumentedException extends Exception { private static final long serialVersionUID = 1L; + private final static Logger LOG = LoggerFactory.getLogger( NetconfDocumentedException.class ); + private static final DocumentBuilderFactory BUILDER_FACTORY; + + static { + BUILDER_FACTORY = DocumentBuilderFactory.newInstance(); + BUILDER_FACTORY.setNamespaceAware(true); + BUILDER_FACTORY.setCoalescing(true); + BUILDER_FACTORY.setIgnoringElementContentWhitespace(true); + BUILDER_FACTORY.setIgnoringComments(true); + } public enum ErrorType { transport, rpc, protocol, application; @@ -31,12 +59,37 @@ public class NetconfDocumentedException extends Exception { public String getTagValue() { return name(); } + + public static ErrorType from( String text ) { + try { + return valueOf( text ); + } + catch( Exception e ) { + return application; + } + } } public enum ErrorTag { - missing_attribute("missing-attribute"), unknown_element("unknown-element"), operation_not_supported( - "operation-not-supported"), bad_attribute("bad-attribute"), data_missing("data-missing"), operation_failed( - "operation-failed"), invalid_value("invalid-value"), malformed_message("malformed-message"); + access_denied("access-denied"), + bad_attribute("bad-attribute"), + bad_element("bad-element"), + data_exists("data-exists"), + data_missing("data-missing"), + in_use("in-use"), + invalid_value("invalid-value"), + lock_denied("lock-denied"), + malformed_message("malformed-message"), + missing_attribute("missing-attribute"), + missing_element("missing-element"), + operation_failed("operation-failed"), + operation_not_supported("operation-not-supported"), + resource_denied("resource-denied"), + rollback_failed("rollback-failed"), + too_big("too-big"), + unknown_attribute("unknown-attribute"), + unknown_element("unknown-element"), + unknown_namespace("unknown-namespace"); private final String tagValue; @@ -47,6 +100,17 @@ public class NetconfDocumentedException extends Exception { public String getTagValue() { return this.tagValue; } + + public static ErrorTag from( String text ) { + for( ErrorTag e: values() ) + { + if( e.getTagValue().equals( text ) ) { + return e; + } + } + + return operation_failed; + } } public enum ErrorSeverity { @@ -55,6 +119,15 @@ public class NetconfDocumentedException extends Exception { public String getTagValue() { return name(); } + + public static ErrorSeverity from( String text ) { + try { + return valueOf( text ); + } + catch( Exception e ) { + return error; + } + } } private final ErrorType errorType; @@ -118,6 +191,64 @@ public class NetconfDocumentedException extends Exception { ErrorSeverity.error, errorInfo); } + public static NetconfDocumentedException fromXMLDocument( Document fromDoc ) { + + ErrorType errorType = ErrorType.application; + ErrorTag errorTag = ErrorTag.operation_failed; + ErrorSeverity errorSeverity = ErrorSeverity.error; + Map errorInfo = null; + String errorMessage = ""; + + Node rpcReply = fromDoc.getDocumentElement(); + + // FIXME: BUG? - we only handle one rpc-error. + + NodeList replyChildren = rpcReply.getChildNodes(); + for( int i = 0; i < replyChildren.getLength(); i++ ) { + Node replyChild = replyChildren.item( i ); + if( RPC_ERROR.equals( replyChild.getNodeName() ) ) + { + NodeList rpcErrorChildren = replyChild.getChildNodes(); + for( int j = 0; j < rpcErrorChildren.getLength(); j++ ) + { + Node rpcErrorChild = rpcErrorChildren.item( j ); + if( ERROR_TYPE.equals( rpcErrorChild.getNodeName() ) ) { + errorType = ErrorType.from( rpcErrorChild.getTextContent() ); + } + else if( ERROR_TAG.equals( rpcErrorChild.getNodeName() ) ) { + errorTag = ErrorTag.from( rpcErrorChild.getTextContent() ); + } + else if( ERROR_SEVERITY.equals( rpcErrorChild.getNodeName() ) ) { + errorSeverity = ErrorSeverity.from( rpcErrorChild.getTextContent() ); + } + else if( ERROR_MESSAGE.equals( rpcErrorChild.getNodeName() ) ) { + errorMessage = rpcErrorChild.getTextContent(); + } + else if( ERROR_INFO.equals( rpcErrorChild.getNodeName() ) ) { + errorInfo = parseErrorInfo( rpcErrorChild ); + } + } + + break; + } + } + + return new NetconfDocumentedException( errorMessage, errorType, errorTag, errorSeverity, errorInfo ); + } + + private static Map parseErrorInfo( Node node ) { + Map infoMap = new HashMap<>(); + NodeList children = node.getChildNodes(); + for( int i = 0; i < children.getLength(); i++ ) { + Node child = children.item( i ); + if( child.getNodeType() == Node.ELEMENT_NODE ) { + infoMap.put( child.getNodeName(), child.getTextContent() ); + } + } + + return infoMap; + } + public ErrorType getErrorType() { return this.errorType; } @@ -134,6 +265,53 @@ public class NetconfDocumentedException extends Exception { return this.errorInfo; } + public Document toXMLDocument() { + Document doc = null; + try { + doc = BUILDER_FACTORY.newDocumentBuilder().newDocument(); + + Node rpcReply = doc.createElementNS( URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, RPC_REPLY_KEY ); + doc.appendChild( rpcReply ); + + Node rpcError = doc.createElementNS( URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, RPC_ERROR ); + rpcReply.appendChild( rpcError ); + + rpcError.appendChild( createTextNode( doc, ERROR_TYPE, getErrorType().getTagValue() ) ); + rpcError.appendChild( createTextNode( doc, ERROR_TAG, getErrorTag().getTagValue() ) ); + rpcError.appendChild( createTextNode( doc, ERROR_SEVERITY, getErrorSeverity().getTagValue() ) ); + rpcError.appendChild( createTextNode( doc, ERROR_MESSAGE, getLocalizedMessage() ) ); + + Map errorInfoMap = getErrorInfo(); + if( errorInfoMap != null && !errorInfoMap.isEmpty() ) { + /* + * + * message-id + * rpc + * + */ + + Node errorInfoNode = doc.createElementNS( URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, ERROR_INFO ); + errorInfoNode.setPrefix( rpcReply.getPrefix() ); + rpcError.appendChild( errorInfoNode ); + + for ( Entry entry : errorInfoMap.entrySet() ) { + errorInfoNode.appendChild( createTextNode( doc, entry.getKey(), entry.getValue() ) ); + } + } + } + catch( ParserConfigurationException e ) { + LOG.error( "Error outputting to XML document", e ); // this shouldn't happen + } + + return doc; + } + + private Node createTextNode( Document doc, String tag, String textContent ) { + Node node = doc.createElementNS( URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, tag ); + node.setTextContent( textContent ); + return node; + } + @Override public String toString() { return "NetconfDocumentedException{" + "message=" + getMessage() + ", errorType=" + this.errorType diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlNetconfConstants.java b/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/xml/XmlNetconfConstants.java similarity index 86% rename from opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlNetconfConstants.java rename to opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/xml/XmlNetconfConstants.java index fa72284b98..1bcae151d7 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlNetconfConstants.java +++ b/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/xml/XmlNetconfConstants.java @@ -5,7 +5,7 @@ * 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.netconf.util.xml; +package org.opendaylight.controller.netconf.api.xml; public final class XmlNetconfConstants { @@ -34,6 +34,13 @@ public final class XmlNetconfConstants { public static final String RPC_KEY = "rpc"; public static final String RPC_REPLY_KEY = "rpc-reply"; public static final String RPC_ERROR = "rpc-error"; + public static final String ERROR_TYPE = "error-type"; + public static final String ERROR_TAG = "error-tag"; + public static final String ERROR_SEVERITY = "error-severity"; + public static final String ERROR_APP_TAG = "error-app-tag"; + public static final String ERROR_PATH = "error-path"; + public static final String ERROR_MESSAGE = "error-message"; + public static final String ERROR_INFO = "error-info"; public static final String NAME_KEY = "name"; public static final String NOTIFICATION_ELEMENT_NAME = "notification"; diff --git a/opendaylight/netconf/netconf-api/src/test/java/org/opendaylight/controller/netconf/api/NetconfDocumentedExceptionTest.java b/opendaylight/netconf/netconf-api/src/test/java/org/opendaylight/controller/netconf/api/NetconfDocumentedExceptionTest.java new file mode 100644 index 0000000000..cdf8b913ec --- /dev/null +++ b/opendaylight/netconf/netconf-api/src/test/java/org/opendaylight/controller/netconf/api/NetconfDocumentedExceptionTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2014 Brocade Communications 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.netconf.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.Collections; +import java.util.Iterator; + +import javax.xml.namespace.NamespaceContext; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; +import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag; +import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorType; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import com.google.common.collect.ImmutableMap; + + +/** + * Unit tests for NetconfDocumentedException. + * + * @author Thomas Pantelis + */ +public class NetconfDocumentedExceptionTest { + + private XPath xpath; + + @Before + public void setUp() throws Exception { + XPathFactory xPathfactory = XPathFactory.newInstance(); + xpath = xPathfactory.newXPath(); + xpath.setNamespaceContext( new NamespaceContext() { + @Override + public Iterator getPrefixes( String namespaceURI ) { + return Collections.singletonList( "netconf" ).iterator(); + } + + @Override + public String getPrefix( String namespaceURI ) { + return "netconf"; + } + + @Override + public String getNamespaceURI( String prefix ) { + return XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0; + } + } ); + } + + @Test + public void testToAndFromXMLDocument() throws XPathExpressionException { + String errorMessage = "mock error message"; + NetconfDocumentedException ex = new NetconfDocumentedException( errorMessage, null, + ErrorType.protocol, + ErrorTag.data_exists, + ErrorSeverity.warning, + ImmutableMap.of( "foo", "bar" ) ); + + Document doc = ex.toXMLDocument(); + assertNotNull( "Document is null", doc ); + + Node rootNode = doc.getDocumentElement(); + + assertEquals( "getNamespaceURI", "urn:ietf:params:xml:ns:netconf:base:1.0", rootNode.getNamespaceURI() ); + assertEquals( "getLocalName", "rpc-reply", rootNode.getLocalName() ); + + Node rpcErrorNode = getNode( "/netconf:rpc-reply/netconf:rpc-error", rootNode ); + assertNotNull( "rpc-error not found", rpcErrorNode ); + + Node errorTypeNode = getNode( "netconf:error-type", rpcErrorNode ); + assertNotNull( "error-type not found", errorTypeNode ); + assertEquals( "error-type", ErrorType.protocol.getTagValue(), + errorTypeNode.getTextContent() ); + + Node errorTagNode = getNode( "netconf:error-tag", rpcErrorNode ); + assertNotNull( "error-tag not found", errorTagNode ); + assertEquals( "error-tag", ErrorTag.data_exists.getTagValue(), + errorTagNode.getTextContent() ); + + Node errorSeverityNode = getNode( "netconf:error-severity", rpcErrorNode ); + assertNotNull( "error-severity not found", errorSeverityNode ); + assertEquals( "error-severity", ErrorSeverity.warning.getTagValue(), + errorSeverityNode.getTextContent() ); + + Node errorInfoNode = getNode( "netconf:error-info/netconf:foo", rpcErrorNode ); + assertNotNull( "foo not found", errorInfoNode ); + assertEquals( "foo", "bar", errorInfoNode.getTextContent() ); + + Node errorMsgNode = getNode( "netconf:error-message", rpcErrorNode ); + assertNotNull( "error-message not found", errorMsgNode ); + assertEquals( "error-message", errorMessage, errorMsgNode.getTextContent() ); + + // Test fromXMLDocument + + ex = NetconfDocumentedException.fromXMLDocument( doc ); + + assertNotNull( "NetconfDocumentedException is null", ex ); + assertEquals( "getErrorSeverity", ErrorSeverity.warning, ex.getErrorSeverity() ); + assertEquals( "getErrorTag", ErrorTag.data_exists, ex.getErrorTag() ); + assertEquals( "getErrorType", ErrorType.protocol, ex.getErrorType() ); + assertEquals( "getLocalizedMessage", errorMessage, ex.getLocalizedMessage() ); + assertEquals( "getErrorInfo", ImmutableMap.of( "foo", "bar" ), ex.getErrorInfo() ); + } + + @SuppressWarnings("unchecked") + T getNode( String xpathExp, Node node ) throws XPathExpressionException { + return (T)xpath.compile( xpathExp ).evaluate( node, XPathConstants.NODE ); + } +} + diff --git a/opendaylight/netconf/netconf-client/pom.xml b/opendaylight/netconf/netconf-client/pom.xml index f46d149033..bf27ed6f4d 100644 --- a/opendaylight/netconf/netconf-client/pom.xml +++ b/opendaylight/netconf/netconf-client/pom.xml @@ -72,7 +72,6 @@ org.apache.maven.plugins maven-jar-plugin - 2.4 diff --git a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSession.java b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSession.java index eaa3589e66..004a22f694 100644 --- a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSession.java +++ b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSession.java @@ -19,7 +19,7 @@ import org.opendaylight.controller.netconf.nettyutil.handler.NetconfXMLToMessage import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class NetconfClientSession extends AbstractNetconfSession { +public class NetconfClientSession extends AbstractNetconfSession { private static final Logger logger = LoggerFactory.getLogger(NetconfClientSession.class); private final Collection capabilities; diff --git a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java index bb6ea61a25..971ea39ade 100644 --- a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java +++ b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java @@ -15,19 +15,22 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; + import java.util.Collection; + import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; + import org.opendaylight.controller.netconf.api.NetconfClientSessionPreferences; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.nettyutil.AbstractChannelInitializer; import org.opendaylight.controller.netconf.nettyutil.AbstractNetconfSessionNegotiator; import org.opendaylight.controller.netconf.nettyutil.handler.exi.NetconfStartExiMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; import org.opendaylight.controller.netconf.util.messages.NetconfMessageUtil; import org.opendaylight.controller.netconf.util.xml.XMLNetconfUtil; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiatorFactory.java b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiatorFactory.java index 4c993acf58..3b1de348ff 100644 --- a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiatorFactory.java +++ b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiatorFactory.java @@ -11,16 +11,18 @@ package org.opendaylight.controller.netconf.client; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; + import io.netty.channel.Channel; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; + import org.opendaylight.controller.netconf.api.NetconfClientSessionPreferences; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.nettyutil.handler.exi.NetconfStartExiMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.protocol.framework.SessionListenerFactory; import org.opendaylight.protocol.framework.SessionNegotiator; import org.opendaylight.protocol.framework.SessionNegotiatorFactory; diff --git a/opendaylight/netconf/netconf-impl/pom.xml b/opendaylight/netconf/netconf-impl/pom.xml index c60506ef44..c6544466d4 100644 --- a/opendaylight/netconf/netconf-impl/pom.xml +++ b/opendaylight/netconf/netconf-impl/pom.xml @@ -19,7 +19,6 @@ ${project.groupId} ietf-netconf-monitoring-extension - ${project.version} @@ -81,7 +80,6 @@ ${project.groupId} netconf-client - ${project.version} test-jar test @@ -109,7 +107,6 @@ org.apache.felix maven-bundle-plugin - 2.3.7 org.opendaylight.controller.netconf.impl.osgi.NetconfImplActivator @@ -156,7 +153,6 @@ org.apache.maven.plugins maven-jar-plugin - 2.4 diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionListener.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionListener.java index 54ad18a1de..4f2f65c1a0 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionListener.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionListener.java @@ -11,16 +11,17 @@ package org.opendaylight.controller.netconf.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.api.NetconfSessionListener; import org.opendaylight.controller.netconf.api.NetconfTerminationReason; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.impl.mapping.operations.DefaultCloseSession; import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationRouter; import org.opendaylight.controller.netconf.impl.osgi.SessionMonitoringService; import org.opendaylight.controller.netconf.util.messages.SendErrorExceptionUtil; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java index d5a34d11b2..487ffd6e5d 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java @@ -12,16 +12,17 @@ import static org.opendaylight.controller.netconf.mapping.api.NetconfOperationPr import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; + import java.util.Set; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfServerSessionPreferences; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.impl.mapping.CapabilityProvider; import org.opendaylight.controller.netconf.impl.osgi.SessionMonitoringService; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationProvider; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceSnapshot; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.protocol.framework.SessionListenerFactory; import org.opendaylight.protocol.framework.SessionNegotiator; import org.opendaylight.protocol.framework.SessionNegotiatorFactory; @@ -31,6 +32,7 @@ import com.google.common.collect.Sets; import io.netty.channel.Channel; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/SubtreeFilter.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/SubtreeFilter.java index bfc7df5926..6e81584133 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/SubtreeFilter.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/SubtreeFilter.java @@ -11,9 +11,9 @@ package org.opendaylight.controller.netconf.impl; import com.google.common.base.Optional; import java.io.IOException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.mapping.AbstractNetconfOperation.OperationNameAndNamespace; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCloseSession.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCloseSession.java index f31233987e..b7a98bae83 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCloseSession.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCloseSession.java @@ -9,9 +9,9 @@ package org.opendaylight.controller.netconf.impl.mapping.operations; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCommit.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCommit.java index d4545430b4..67b782c7c1 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCommit.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCommit.java @@ -9,7 +9,9 @@ package org.opendaylight.controller.netconf.impl.mapping.operations; import com.google.common.base.Preconditions; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationRouter; import org.opendaylight.controller.netconf.impl.DefaultCommitNotificationProducer; import org.opendaylight.controller.netconf.impl.mapping.CapabilityProvider; @@ -17,7 +19,6 @@ import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.util.mapping.AbstractNetconfOperation; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultGetSchema.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultGetSchema.java index beceb8d008..6db74eaba2 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultGetSchema.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultGetSchema.java @@ -10,12 +10,13 @@ package org.opendaylight.controller.netconf.impl.mapping.operations; import com.google.common.base.Optional; import com.google.common.collect.Maps; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.impl.mapping.CapabilityProvider; import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceException; import org.opendaylight.controller.netconf.util.mapping.AbstractLastNetconfOperation; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStartExi.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStartExi.java index b9b30a5eaa..cccb1a3ac3 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStartExi.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStartExi.java @@ -11,12 +11,12 @@ import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorType; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.impl.NetconfServerSession; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStopExi.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStopExi.java index 22caeff071..2a24ae32fa 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStopExi.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultStopExi.java @@ -8,10 +8,10 @@ package org.opendaylight.controller.netconf.impl.mapping.operations; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.impl.NetconfServerSession; import org.opendaylight.controller.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/ConcurrentClientsTest.java b/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/ConcurrentClientsTest.java index ea2bb9c34e..c5281d01f8 100644 --- a/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/ConcurrentClientsTest.java +++ b/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/ConcurrentClientsTest.java @@ -18,11 +18,13 @@ import static org.mockito.Mockito.mock; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Sets; + import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.util.HashedWheelTimer; import io.netty.util.concurrent.GlobalEventExecutor; + import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; @@ -40,6 +42,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicLong; + import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.AfterClass; @@ -50,6 +53,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.client.NetconfClientDispatcher; import org.opendaylight.controller.netconf.client.NetconfClientDispatcherImpl; import org.opendaylight.controller.netconf.client.SimpleNetconfClientSessionListener; @@ -68,7 +72,6 @@ import org.opendaylight.controller.netconf.nettyutil.handler.exi.NetconfStartExi import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader; import org.opendaylight.controller.netconf.util.messages.NetconfMessageUtil; import org.opendaylight.controller.netconf.util.test.XmlFileLoader; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.opendaylight.protocol.framework.NeverReconnectStrategy; import org.slf4j.Logger; diff --git a/opendaylight/netconf/netconf-it/pom.xml b/opendaylight/netconf/netconf-it/pom.xml index c40dfe7fc3..0e9589d2d2 100644 --- a/opendaylight/netconf/netconf-it/pom.xml +++ b/opendaylight/netconf/netconf-it/pom.xml @@ -10,9 +10,6 @@ netconf-it ${project.artifactId} - - 2.0.0 - @@ -177,7 +174,6 @@ org.ops4j.pax.exam maven-paxexam-plugin - 1.2.4 generate-config diff --git a/opendaylight/netconf/netconf-monitoring/src/main/java/org/opendaylight/controller/netconf/monitoring/Get.java b/opendaylight/netconf/netconf-monitoring/src/main/java/org/opendaylight/controller/netconf/monitoring/Get.java index c277e20553..fa78fa4bd3 100644 --- a/opendaylight/netconf/netconf-monitoring/src/main/java/org/opendaylight/controller/netconf/monitoring/Get.java +++ b/opendaylight/netconf/netconf-monitoring/src/main/java/org/opendaylight/controller/netconf/monitoring/Get.java @@ -8,15 +8,16 @@ package org.opendaylight.controller.netconf.monitoring; import com.google.common.collect.Maps; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.monitoring.NetconfMonitoringService; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.monitoring.xml.JaxBSerializer; import org.opendaylight.controller.netconf.monitoring.xml.model.NetconfState; import org.opendaylight.controller.netconf.util.mapping.AbstractNetconfOperation; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java index 9e287f9921..1b0a34d7e0 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java @@ -11,7 +11,7 @@ package org.opendaylight.controller.netconf.nettyutil.handler.exi; import java.util.List; import org.opendaylight.controller.netconf.api.NetconfMessage; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.openexi.proc.common.EXIOptions; import org.w3c.dom.Document; diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/SshClientAdapter.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/SshClientAdapter.java index 87056db06c..ad8b25ff21 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/SshClientAdapter.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/SshClientAdapter.java @@ -12,7 +12,6 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -20,6 +19,8 @@ import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.atomic.AtomicBoolean; import org.opendaylight.controller.netconf.nettyutil.handler.ssh.virtualsocket.VirtualSocketException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -27,6 +28,8 @@ import org.opendaylight.controller.netconf.nettyutil.handler.ssh.virtualsocket.V * pipeline. */ public class SshClientAdapter implements Runnable { + private static final Logger logger = LoggerFactory.getLogger(SshClientAdapter.class); + private static final int BUFFER_SIZE = 1024; private final SshClient sshClient; @@ -80,9 +83,11 @@ public class SshClientAdapter implements Runnable { } catch (VirtualSocketException e) { // Netty closed connection prematurely. + // Or maybe tried to open ganymed connection without having initialized session + // (ctx.channel().remoteAddress() is null) // Just pass and move on. } catch (Exception e) { - throw new IllegalStateException(e); + logger.error("Unexpected exception", e); } finally { sshClient.close(); @@ -107,6 +112,7 @@ public class SshClientAdapter implements Runnable { private void writeImpl(ByteBuf message) throws IOException { message.getBytes(0, stdIn, message.readableBytes()); + message.release(); stdIn.flush(); } diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/ChannelInputStream.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/ChannelInputStream.java index 2a3eeb21a8..ba65b9ef34 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/ChannelInputStream.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/ChannelInputStream.java @@ -93,6 +93,7 @@ public class ChannelInputStream extends InputStream implements ChannelInboundHan synchronized(lock) { this.bb.discardReadBytes(); this.bb.writeBytes((ByteBuf) o); + ((ByteBuf) o).release(); lock.notifyAll(); } } diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/VirtualSocketException.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/VirtualSocketException.java index d97990a5e6..626ebe937e 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/VirtualSocketException.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/virtualsocket/VirtualSocketException.java @@ -11,6 +11,7 @@ package org.opendaylight.controller.netconf.nettyutil.handler.ssh.virtualsocket; /** * Exception class which provides notification about exceptional situations at the virtual socket layer. */ +// FIXME: Switch to checked exception, create a runtime exception to workaround Socket API public class VirtualSocketException extends RuntimeException { private static final long serialVersionUID = 1L; } diff --git a/opendaylight/netconf/netconf-ssh/pom.xml b/opendaylight/netconf/netconf-ssh/pom.xml index cbd3efc57f..8a2387d2c1 100644 --- a/opendaylight/netconf/netconf-ssh/pom.xml +++ b/opendaylight/netconf/netconf-ssh/pom.xml @@ -56,7 +56,6 @@ org.apache.felix maven-bundle-plugin - 2.3.7 org.opendaylight.controller.netconf.ssh.osgi.NetconfSSHActivator @@ -81,7 +80,6 @@ org.apache.maven.plugins maven-jar-plugin - 2.4 diff --git a/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/ssh/threads/Handshaker.java b/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/ssh/threads/Handshaker.java index d999d378d9..8045d32a50 100644 --- a/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/ssh/threads/Handshaker.java +++ b/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/ssh/threads/Handshaker.java @@ -100,14 +100,14 @@ public class Handshaker implements Runnable { @Override public void run() { // let ganymed process handshake - logger.trace("{} SocketThread is started", session); + logger.trace("{} is started", session); try { // TODO this should be guarded with a timer to prevent resource exhaustion ganymedConnection.connect(); } catch (IOException e) { - logger.warn("{} SocketThread error ", session, e); + logger.debug("{} connection error", session, e); } - logger.trace("{} SocketThread is exiting", session); + logger.trace("{} is exiting", session); } } diff --git a/opendaylight/netconf/netconf-tcp/pom.xml b/opendaylight/netconf/netconf-tcp/pom.xml index 65da6e987e..3c4ee4728d 100644 --- a/opendaylight/netconf/netconf-tcp/pom.xml +++ b/opendaylight/netconf/netconf-tcp/pom.xml @@ -47,7 +47,6 @@ org.apache.felix maven-bundle-plugin - 2.3.7 org.opendaylight.controller.netconf.tcp.osgi.NetconfTCPActivator diff --git a/opendaylight/netconf/netconf-util/pom.xml b/opendaylight/netconf/netconf-util/pom.xml index d9d957c663..df4d389705 100644 --- a/opendaylight/netconf/netconf-util/pom.xml +++ b/opendaylight/netconf/netconf-util/pom.xml @@ -53,13 +53,13 @@ org.apache.felix maven-bundle-plugin - 2.3.7 com.google.common.base, com.google.common.collect, io.netty.channel, io.netty.util.concurrent, javax.annotation, javax.xml.namespace, javax.xml.parsers, javax.xml.transform, javax.xml.transform.dom, javax.xml.transform.stream, javax.xml.validation, javax.xml.xpath, - org.opendaylight.controller.netconf.api, org.opendaylight.controller.netconf.mapping.api, + org.opendaylight.controller.netconf.api, org.opendaylight.controller.netconf.api.xml, + org.opendaylight.controller.netconf.mapping.api, org.osgi.framework, org.slf4j, org.w3c.dom, org.xml.sax,io.netty.channel.local org.opendaylight.controller.netconf.util.* @@ -68,7 +68,6 @@ org.apache.maven.plugins maven-jar-plugin - 2.4 diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/NetconfUtil.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/NetconfUtil.java index 640596d930..0269bcccb9 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/NetconfUtil.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/NetconfUtil.java @@ -8,9 +8,10 @@ package org.opendaylight.controller.netconf.util; import com.google.common.base.Preconditions; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java index 8837c74ff5..25e0f79265 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java @@ -11,11 +11,11 @@ package org.opendaylight.controller.netconf.util.mapping; import java.util.Map; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperation; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessage.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessage.java index 86b2ba1671..33934d10ba 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessage.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessage.java @@ -13,9 +13,9 @@ import org.opendaylight.controller.netconf.api.NetconfMessage; import java.util.Set; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceException; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageUtil.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageUtil.java index 49395d53d2..3e8040ad8a 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageUtil.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageUtil.java @@ -10,15 +10,17 @@ package org.opendaylight.controller.netconf.util.messages; import com.google.common.base.Function; import com.google.common.collect.Collections2; + import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import javax.annotation.Nullable; + import java.util.Collection; import java.util.List; diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/SendErrorExceptionUtil.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/SendErrorExceptionUtil.java index fdcaa2a5b8..4c4ff2fc58 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/SendErrorExceptionUtil.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/SendErrorExceptionUtil.java @@ -9,14 +9,15 @@ package org.opendaylight.controller.netconf.util.messages; import com.google.common.base.Preconditions; + import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; + import org.opendaylight.controller.netconf.api.NetconfSession; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; -import org.opendaylight.controller.netconf.util.xml.XMLNetconfUtil; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,12 +25,6 @@ import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; - -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import java.io.InputStream; -import java.util.Map.Entry; public final class SendErrorExceptionUtil { private static final Logger logger = LoggerFactory.getLogger(SendErrorExceptionUtil.class); @@ -86,56 +81,8 @@ public final class SendErrorExceptionUtil { } } - private static XPathExpression rpcErrorExpression = XMLNetconfUtil - .compileXPath("/netconf:rpc-reply/netconf:rpc-error"); - private static XPathExpression errorTypeExpression = XMLNetconfUtil.compileXPath("netconf:error-type"); - private static XPathExpression errorTagExpression = XMLNetconfUtil.compileXPath("netconf:error-tag"); - private static XPathExpression errorSeverityExpression = XMLNetconfUtil.compileXPath("netconf:error-severity"); - private static Document createDocument(final NetconfDocumentedException sendErrorException) { - - final InputStream errIS = SendErrorExceptionUtil.class.getResourceAsStream("server_error.xml"); - Document originalErrorDocument; - try { - originalErrorDocument = XmlUtil.readXmlToDocument(errIS); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - - final Document errorDocument = XmlUtil.createDocumentCopy(originalErrorDocument); - final Node rootNode = errorDocument.getFirstChild(); - - final Node rpcErrorNode = (Node) XmlUtil.evaluateXPath(rpcErrorExpression, rootNode, XPathConstants.NODE); - - final Node errorTypeNode = (Node) XmlUtil.evaluateXPath(errorTypeExpression, rpcErrorNode, XPathConstants.NODE); - errorTypeNode.setTextContent(sendErrorException.getErrorType().getTagValue()); - - final Node errorTagNode = (Node) XmlUtil.evaluateXPath(errorTagExpression, rpcErrorNode, XPathConstants.NODE); - errorTagNode.setTextContent(sendErrorException.getErrorTag().getTagValue()); - - final Node errorSeverityNode = (Node) XmlUtil.evaluateXPath(errorSeverityExpression, rpcErrorNode, - XPathConstants.NODE); - errorSeverityNode.setTextContent(sendErrorException.getErrorSeverity().getTagValue()); - - if (sendErrorException.getErrorInfo() != null && !sendErrorException.getErrorInfo().isEmpty()) { - /* - * message-id - * rpc - */ - final Node errorInfoNode = errorDocument.createElementNS( - XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, "error-info"); - - errorInfoNode.setPrefix(rootNode.getPrefix()); - rpcErrorNode.appendChild(errorInfoNode); - for (final Entry errorInfoEntry : sendErrorException.getErrorInfo().entrySet()) { - final Node node = errorDocument.createElementNS( - XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, errorInfoEntry.getKey()); - node.setTextContent(errorInfoEntry.getValue()); - errorInfoNode.appendChild(node); - } - - } - return errorDocument; + return sendErrorException.toXMLDocument(); } /** diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XMLNetconfUtil.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XMLNetconfUtil.java index 02ced96bf3..e7ce454155 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XMLNetconfUtil.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XMLNetconfUtil.java @@ -13,6 +13,8 @@ import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; + public final class XMLNetconfUtil { private XMLNetconfUtil() {} diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlUtil.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlUtil.java index b2b202b69e..01b1c8d564 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlUtil.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/xml/XmlUtil.java @@ -10,12 +10,14 @@ package org.opendaylight.controller.netconf.util.xml; import com.google.common.base.Charsets; import com.google.common.base.Optional; + import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; + import javax.xml.XMLConstants; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; @@ -33,6 +35,8 @@ import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; + +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; diff --git a/opendaylight/northbound/commons/pom.xml b/opendaylight/northbound/commons/pom.xml index 09c075735a..a2d2dac112 100644 --- a/opendaylight/northbound/commons/pom.xml +++ b/opendaylight/northbound/commons/pom.xml @@ -12,7 +12,6 @@ 0.4.2-SNAPSHOT bundle - com.fasterxml.jackson.core jackson-databind @@ -65,6 +64,13 @@ org.opendaylight.controller usermanager + + + ch.qos.logback + logback-classic + test + + @@ -78,6 +84,7 @@ org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.types, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.northbound.commons javax.ws.rs, javax.ws.rs.ext, @@ -105,6 +112,40 @@ ${project.basedir}/META-INF + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + + add-source + + generate-sources + + + ${project.build.directory}/generated-sources/javacc + + + + + + + + org.codehaus.mojo + javacc-maven-plugin + 2.6 + + + javacc + + javacc + + + + + diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/NorthboundApplication.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/NorthboundApplication.java index 4393b79f64..87f51364ba 100644 --- a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/NorthboundApplication.java +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/NorthboundApplication.java @@ -20,6 +20,7 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.annotation.XmlRootElement; import org.opendaylight.controller.northbound.bundlescanner.IBundleScanService; +import org.opendaylight.controller.northbound.commons.query.QueryContextProvider; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleReference; @@ -58,6 +59,7 @@ public class NorthboundApplication extends Application { } ); _singletons.add(getJsonProvider()); _singletons.add(new JacksonJsonProcessingExceptionMapper()); + _singletons.add(new QueryContextProvider()); } //////////////////////////////////////////////////////////////// diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Accessor.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Accessor.java new file mode 100644 index 0000000000..2d910edc6d --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Accessor.java @@ -0,0 +1,55 @@ +package org.opendaylight.controller.northbound.commons.query; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Type; + +/*package*/ class Accessor { + protected final AccessibleObject _accessorObj; + + public Accessor(AccessibleObject accessor) { + _accessorObj = accessor; + _accessorObj.setAccessible(true); + } + + public AccessibleObject getAccessibleObject() { + return _accessorObj; + } + + public Annotation[] getAnnotations() { + return _accessorObj.getAnnotations(); + } + + public Object getValue(Object parent) throws QueryException { + try { + if (_accessorObj instanceof Field) { + return ((Field)_accessorObj).get(parent); + } else { + // assume method + return ((Method)_accessorObj).invoke(parent); + } + } catch (Exception e) { + throw new QueryException("Failure in retrieving value", e); + } + } + public Type getGenericType() { + if (_accessorObj instanceof Field) { + return ((Field)_accessorObj).getGenericType(); + } else { + // assume method + return ((Method)_accessorObj).getGenericReturnType(); + } + } + public Class getType() { + + if (_accessorObj instanceof Field) { + return ((Field)_accessorObj).getType(); + } else { + // assume method + return ((Method)_accessorObj).getReturnType(); + } + } + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/CompareExpression.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/CompareExpression.java new file mode 100644 index 0000000000..6b972e641c --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/CompareExpression.java @@ -0,0 +1,56 @@ +/** + * 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.northbound.commons.query; + +/*package*/ class CompareExpression implements Expression { + + public static enum OP { RE, EQ, NE, GT, GE, LT, LE }; + + private final OP _operation; + private final String _selector; + private final String _arg; + + public CompareExpression(OP op, String selector, String arg) { + _operation = op; + _selector = selector; + _arg = unQuote(arg); + } + + + public OP getOperator() { + return _operation; + } + + public String getSelector() { + return _selector; + } + + public String getArgument() { + return _arg; + } + + @Override + public boolean accept(Visitor visitor) throws QueryException { + return visitor.visit(this); + } + + @Override + public String toString() { + return "[" + _selector + " " + _operation + " " + _arg + "]"; + } + + private static String unQuote(String s) { + if (s.startsWith("\"") && s.endsWith("\"")) { + s = s.substring(1, s.length()-1); + } else if (s.startsWith("\'") && s.endsWith("\'")) { + s = s.substring(1, s.length()-1); + } + return s; + } + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Expression.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Expression.java new file mode 100644 index 0000000000..fbc22a016d --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Expression.java @@ -0,0 +1,12 @@ +/** + * 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.northbound.commons.query; + +/*package*/ interface Expression { + boolean accept(Visitor visitor) throws QueryException; +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/ExpressionBuilder.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/ExpressionBuilder.java new file mode 100644 index 0000000000..f1b2999b77 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/ExpressionBuilder.java @@ -0,0 +1,41 @@ +/** + * 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.northbound.commons.query; + +import java.util.Stack; + +/*package*/ class ExpressionBuilder { + private final Stack _stack = new Stack(); + private LogicalExpression.OP _lastOp = null; + + public ExpressionBuilder() {} + + public ExpressionBuilder withAnd() { + _lastOp = LogicalExpression.OP.AND; + return this; + } + + public ExpressionBuilder withOr() { + _lastOp = LogicalExpression.OP.OR; + return this; + } + + public ExpressionBuilder withTerm(Expression exp) { + if (_lastOp != null) { + exp = new LogicalExpression(_lastOp, _stack.pop(), exp); + _lastOp = null; + } + _stack.push(exp); + return this; + } + + public Expression build() { + return _stack.pop(); + } + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/IteratableTypeInfo.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/IteratableTypeInfo.java new file mode 100644 index 0000000000..3977837c7f --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/IteratableTypeInfo.java @@ -0,0 +1,67 @@ +package org.opendaylight.controller.northbound.commons.query; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + */ +/*package*/ class IteratableTypeInfo extends TypeInfo { + + public IteratableTypeInfo(String name, Accessor accessor) { + super(name, accessor.getType(), accessor); + } + + @Override + public Object retrieve(Object target, String[] query, int index) throws QueryException { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("retrieve collection: {}/{} type:{}", index, query.length, + target.getClass()); + } + explore(); + Collection c = (Collection) target; + Iterator it = c.iterator(); + List objects = new ArrayList(); + while (it.hasNext()) { + Object item = it.next(); + for (TypeInfo child : _types.values()) { + Object val = child.retrieve(item, query, index); + if (val != null) objects.add(val); + } + } + return objects; + + } + + @Override + public synchronized void explore() { + if (_explored) return; + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("exploring iteratable type: {} gtype: {}", _class, + _accessor.getGenericType()); + } + Type t = _accessor.getGenericType(); + if (t instanceof ParameterizedType) { + Type[] pt = ((ParameterizedType) t).getActualTypeArguments(); + // First type is a child, ignore rest + if (pt.length > 0) { + _types.put(_name, new TypeInfo(_name, (Class)pt[0], null)); + } + } + _explored = true; + } + + @Override + public TypeInfo getCollectionChild(Class childType) { + explore(); + for (TypeInfo ti : _types.values()) { + if (ti.getType().equals(childType)) { + return ti; + } + } + return null; + } +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/LogicalExpression.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/LogicalExpression.java new file mode 100644 index 0000000000..4e99820983 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/LogicalExpression.java @@ -0,0 +1,50 @@ +/** + * 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.northbound.commons.query; + +/*package*/ class LogicalExpression implements Expression { + + public static enum OP { AND, OR } + + private final OP _op; + private final Expression _arg1; + private final Expression _arg2; + + public LogicalExpression(OP op, Expression first, Expression second) { + _op = op; + _arg1 = first; + _arg2 = second; + } + + public OP getOperator() { + return _op; + } + + public Expression getFirst() { + return _arg1; + } + + public Expression getSecond() { + return _arg2; + } + + @Override + public boolean accept(Visitor visitor) throws QueryException { + return visitor.visit(this); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(_arg1.toString()) + .append(_op.toString()) + .append(_arg2.toString()); + return sb.toString(); + } + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Query.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Query.java new file mode 100644 index 0000000000..15dcaebe27 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Query.java @@ -0,0 +1,52 @@ +/** + * 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.northbound.commons.query; + +import java.util.Collection; +import java.util.List; + + +/** + * Represents a parsed query used in filtering of collections. + */ +public interface Query { + + /** + * Find items in the given collection and return them as a new list. The + * original collection is not changed. + * + * @param collection to search in. + * @return list of items which match the query. + * @throws QueryException + */ + public List find(Collection collection) throws QueryException; + + /** + * Apply the query on the given collection. Note that this method will modify + * the given object by removing any items which don't match the query criteria. + * If the collection is 'singleton' or unmodifiable, invocation will result in + * an exception. + * + * @param collection + * @return the number matched items + * @throws QueryException + */ + public int filter(Collection collection) throws QueryException; + + /** + * Search the given root for a child collection and them apply the query on. + * Note that this method will modify the given object by removing any items + * which don't match the query criteria. + * + * @param root - top level object to search in + * @param childType - the child type which represents the collection. + * @return the number of matched items + * @throws QueryException + */ + public int filter(T root, Class childType) throws QueryException; +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContext.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContext.java new file mode 100644 index 0000000000..59a78ac113 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContext.java @@ -0,0 +1,25 @@ +/** + * 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.northbound.commons.query; + +/** + * Query context + */ +public interface QueryContext { + + /** + * Create a Query + * @param queryString - query string to parse + * @param clazz - The class which represents the top level jaxb object + * @return a query object + * @throws QueryException if the query cannot be parsed. + */ + Query createQuery(String queryString, Class clazz) + throws QueryException; + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContextImpl.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContextImpl.java new file mode 100644 index 0000000000..13d70b1cb0 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContextImpl.java @@ -0,0 +1,33 @@ +/** + * 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.northbound.commons.query; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/*package*/ class QueryContextImpl implements QueryContext { + + private static final Logger LOGGER = LoggerFactory.getLogger(QueryContext.class); + + @Override + public Query createQuery(String queryString, Class type) throws QueryException { + if (queryString == null || queryString.trim().length() == 0) return null; + try { + if (LOGGER.isDebugEnabled()) LOGGER.debug("Processing query: {}", queryString); + // FiqlParser is a parser generated by javacc + Expression expression = FiqlParser.parse(queryString); + if (LOGGER.isDebugEnabled()) LOGGER.debug("Query expression: {}", expression); + // create Query and return; + return new QueryImpl(type, expression); + } catch (Exception ex) { + if (LOGGER.isDebugEnabled()) LOGGER.error("Query processing failed = {}", + queryString, ex); + throw new QueryException("Unable to parse query.", ex); + } + } +} \ No newline at end of file diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContextProvider.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContextProvider.java new file mode 100644 index 0000000000..65a232c245 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryContextProvider.java @@ -0,0 +1,27 @@ +/** + * 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.northbound.commons.query; + +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Provider; + +/** + * A provider for getting hold of the QueryContext. + */ +@Provider +public class QueryContextProvider implements ContextResolver { + + // Singleton Query Context instance + private static final QueryContext queryContext = new QueryContextImpl(); + + @Override + public QueryContext getContext(Class type) { + return queryContext; + } + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryException.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryException.java new file mode 100644 index 0000000000..9ff78eddfc --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryException.java @@ -0,0 +1,30 @@ +/** + * 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.northbound.commons.query; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * Signals that an error happened during the parsing or processing of a query. + */ +public class QueryException extends WebApplicationException { + + private static final long serialVersionUID = 1L; + + public QueryException(String msg) { + super(Response.status(Response.Status.BAD_REQUEST) + .entity(msg).type(MediaType.TEXT_PLAIN).build()); + } + + public QueryException(String msg, Throwable cause) { + super(cause, Response.status(Response.Status.BAD_REQUEST) + .entity(msg).type(MediaType.TEXT_PLAIN).build()); + } +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryImpl.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryImpl.java new file mode 100644 index 0000000000..a520f98fc0 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/QueryImpl.java @@ -0,0 +1,237 @@ +/** + * 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.northbound.commons.query; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Pattern; + +import org.opendaylight.controller.northbound.commons.query.CompareExpression.OP; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +/*package*/ class QueryImpl implements Query { + public static final Logger LOGGER = LoggerFactory.getLogger(QueryImpl.class); + private static final boolean ALLOW_OBJECT_STRING_COMPARE = true; + + private final Expression expression; + private final TypeInfo rootType ; + /** + * Set the expression and cache + * @param type + * @param expression + */ + public QueryImpl(Class type, Expression expression) { + this.expression = expression; + this.rootType = TypeInfo.createRoot(null, type); + } + + @Override + public List find(Collection collection) throws QueryException { + // new arraylist for result + List result = new ArrayList(); + for (T item : collection) { + if (match(item, rootType)) { + result.add(item); + } + } + return result; + } + + @Override + public int filter(Collection collection) throws QueryException { + // find items + List matched = new ArrayList(); + for (T item : collection) { + if (match(item, rootType)) { + matched.add(item); + } + } + collection.clear(); + collection.addAll(matched); + return matched.size(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public int filter(T rootObject, Class childClass) throws QueryException { + // retrieve underlying collection + TypeInfo childType = rootType.getCollectionChild(childClass); + if (childType == null || !(childType instanceof IteratableTypeInfo)) { + return 0; + } + Collection collection = (Collection) + childType.getAccessor().getValue(rootObject); + // get the child type of the collection type + TypeInfo ti = childType.getCollectionChild(childClass); + List matched = new ArrayList(); + for (Object item : collection) { + if (match(item, ti)) { + matched.add(item); + } + } + collection.clear(); + collection.addAll(matched); + return matched.size(); + } + + private boolean match(final Object object, final TypeInfo rootType) + throws QueryException { + return expression.accept(new Visitor () { + @Override + public boolean visit(LogicalExpression le) throws QueryException { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Logical exp {}|{}|{}", le.getOperator(), le.getFirst(), + le.getSecond()); + } + return (le.getOperator() == LogicalExpression.OP.AND) ? + le.getFirst().accept(this) && le.getSecond().accept(this) : + le.getFirst().accept(this) || le.getSecond().accept(this); + } + + @Override + public boolean visit(CompareExpression ce) throws QueryException { + boolean result = visitInternal(ce); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("=== Compare exp {}|{}|{} == {}", ce.getOperator(), + ce.getSelector(), ce.getArgument(), result); + } + return result; + } + + public boolean visitInternal(CompareExpression ce) throws QueryException { + String[] selector = ce.getSelector().split("\\."); + if (!rootType.getName().equals(selector[0])) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Root name mismatch: {} != {}", + rootType.getName(), selector[0]); + } + return false; + } + Object value = rootType.retrieve(object, selector, 1); + if(value == null){ // nothing to compare against + return false; + } + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Comparing [{}] {} [{}]", ce.getArgument(), + ce.getOperator(), value.toString()); + } + if (value instanceof Collection) { + Collection collection = (Collection) value; + if(collection.size() == 0 && ce.getOperator() == OP.NE) { + // collection doesn't contain query string + return true; + } + // If there are elements iterate + Iterator it = collection.iterator(); + OP operator = ce.getOperator(); + if (operator == OP.NE) { + // negate the operator + operator = OP.EQ; + } + while (it.hasNext()) { + Object item = it.next(); + if (compare(parse(ce.getArgument(), item), item, operator)) { + // if match found check the operator and return false for NE + return (ce.getOperator() != OP.NE); + } + } + // return true for NE and false for rest + return (ce.getOperator() == OP.NE); + } else { + return compare(parse(ce.getArgument(), value), value, + ce.getOperator()); + } + } + + }); + } + + private boolean compare(Object valueToMatch, Object actualValue, OP operator) { + if (valueToMatch == null || actualValue == null) return false; + if (ALLOW_OBJECT_STRING_COMPARE && (valueToMatch instanceof String) + && !(actualValue instanceof String)) { + actualValue = actualValue.toString(); + } + + int compareResult = -1; + if (valueToMatch instanceof Comparable) { + compareResult = ((Comparable)actualValue).compareTo(valueToMatch); + } else { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Not a comparable type: {} {}", + valueToMatch.getClass().getName(), + actualValue.getClass().getName()); + } + return false; + } + switch(operator) { + case EQ : + return compareResult == 0; + case RE : + // Regex match, + if (valueToMatch instanceof String) { + return Pattern.matches((String)valueToMatch, actualValue.toString()); + } else { + return compareResult == 0; + } + case NE: + return compareResult != 0; + case GT : + return compareResult > 0; + case GE : + return compareResult >= 0; + case LT : + return compareResult < 0; + case LE : + return compareResult <= 0; + default: + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Unrecognized comparator - {}", operator); + } + return false; + } + } + private Object parse(String arg, Object value) { + if (value == null) return null; + + try { + if (value instanceof String) { + return arg; + } else if (value instanceof Byte) { + return Byte.decode(arg); + } else if (value instanceof Double) { + return Double.parseDouble(arg); + } else if (value instanceof Float) { + return Float.parseFloat(arg); + } else if (value instanceof Integer) { + return Integer.parseInt(arg); + } else if (value instanceof Long) { + return Long.parseLong(arg); + } else if (value instanceof Short) { + return Short.parseShort(arg); + } + } catch (NumberFormatException ignore) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Exception parsing {}", arg, value); + } + } + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Using string comparision for type - {}", + value.getClass().getName()); + } + // Not a number or string. Convert to a string and compare as last resort + return ALLOW_OBJECT_STRING_COMPARE ? arg.toString() : null; + } + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/TypeInfo.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/TypeInfo.java new file mode 100644 index 0000000000..91f01d8ad7 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/TypeInfo.java @@ -0,0 +1,294 @@ +package org.opendaylight.controller.northbound.commons.query; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A wrapper over a JAXB type to allow traversal of the object graph and + * search for specific values in the object tree. + */ +/*package*/ class TypeInfo { + + public static final Logger LOGGER = LoggerFactory.getLogger(TypeInfo.class); + public static final String DEFAULT_NAME = "##default"; + + protected final String _name; // the jaxb name + protected Class _class; // jaxb type class + protected final XmlAccessType _accessType; // jaxb access type + protected final Accessor _accessor; // accessor to access object value + protected Map _types = new HashMap(); + protected volatile boolean _explored = false; + /** + * Create a TypeInfo with a name and a class type. The accessor will be null + * for a root node. + */ + protected TypeInfo(String name, Class clz, Accessor accessor) { + _name = name; + _class = clz; + _accessor = accessor; + XmlAccessorType accessorType = null; + if(clz == null) { + throw new NullPointerException("Type class can not be null"); + } + accessorType = clz.getAnnotation(XmlAccessorType.class); + _accessType = (accessorType == null ? + XmlAccessType.PUBLIC_MEMBER : accessorType.value()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Created type info name:{} type:{}", _name, _class); + } + } + + /** + * @return the Accessor to access the value + */ + public final Accessor getAccessor() { + return _accessor; + } + + /** + * @return get the child by name + */ + public final TypeInfo getChild(String name) { + return _types.get(name); + } + + public TypeInfo getCollectionChild(Class childType) { + explore(); + for (TypeInfo ti : _types.values()) { + if (Collection.class.isAssignableFrom(ti.getType())) { + ParameterizedType p = (ParameterizedType) + ti.getAccessor().getGenericType(); + Type[] pts = p.getActualTypeArguments(); + if (pts.length == 1 && pts[0].equals(childType)) { + return ti; + } + } + } + return null; + } + + public Class getType() { + return _class; + } + + public String getName() { + return _name; + } + + /** + * @return the object value by a selector query + */ + public Object retrieve(Object target, String[] query, int index) + throws QueryException { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("retrieve: {}/{} type:{}", index, query.length, target.getClass()); + } + if (index >= query.length) return null; + explore(); + if (!target.getClass().equals(_class)) { + if (_class.isAssignableFrom(target.getClass())) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Handling subtype {} of {} ", target.getClass(), _class); + } + // explore the subtype + TypeInfo subTypeInfo = new TypeInfo(getRootName(target.getClass()), + target.getClass(), _accessor); + return subTypeInfo.retrieve(target, query, index); + } else { + // non compatible object; bail out + return null; + } + } + TypeInfo child = getChild(query[index]); + if (child == null) return null; + target = child.getAccessor().getValue(target); + if (index+1 == query.length) { + // match found + return target; + } + return child.retrieve(target, query, index+1); + } + + /** + * Explore the type info for children. + */ + public synchronized void explore() { + if (_explored) return; + for (Class c = _class; c != null; c = c.getSuperclass()) { + if (c.equals(Object.class)) break; + // Currently only fields and methods annotated with JAXB annotations are + // considered as valid for search purposes. + //check methods first + for (Method m : c.getDeclaredMethods()) { + String tn = getTypeName(m, _accessType); + if (tn != null) { + if (LOGGER.isDebugEnabled()) LOGGER.debug( + "exploring type: {} name: {} method: {}", + _class.getSimpleName(), tn, m); + _types.put(tn, createTypeInfo(tn, new Accessor(m))); + } + } + for (Field f : c.getDeclaredFields()) { + String tn = getTypeName(f, _accessType); + if (tn != null) { + if (LOGGER.isDebugEnabled()) LOGGER.debug( + "exploring type: {} name: {} field: {}", + _class.getSimpleName(), tn, f); + _types.put(tn, createTypeInfo(tn, new Accessor(f))); + } + } + } + _explored = true; + } + + public static final String getTypeName(Field f, XmlAccessType access) { + // ignore static, transient and xmltransient fields + if (Modifier.isTransient(f.getModifiers()) || + Modifier.isStatic(f.getModifiers()) || + f.getAnnotation(XmlTransient.class) != null ) { + return null; + } + // try to read annotation + String name = getTypeName(f.getAnnotations(), f.getName()); + if (name != null) return name; + // no annotation present check accesstype + else if (access == XmlAccessType.NONE) { // none return name + return name; + } else if (access == XmlAccessType.FIELD) { + // return field name if no annotation present + return f.getName(); + } else if (access == XmlAccessType.PUBLIC_MEMBER + && Modifier.isPublic(f.getModifiers())) { // look for public access + return f.getName(); + } + // return annotated name ( if any ) + return null; + } + + public static final String getTypeName(Method m, XmlAccessType access) { + // ignore static, transient and xmltransient fields + if (Modifier.isStatic(m.getModifiers()) || + m.getAnnotation(XmlTransient.class) != null ) { + return null; + } + // try to read annotation + String name = getTypeName(m.getAnnotations(), m.getName()); + if (name != null) return name; + //check acces type + else if (access == XmlAccessType.NONE) { // none return name + return name; + } else if (access == XmlAccessType.PROPERTY) { + // return bean property name if no annotation present + return getBeanPropertyName(m); + } else if (access == XmlAccessType.PUBLIC_MEMBER + && Modifier.isPublic(m.getModifiers())) { // look for public access + return getBeanPropertyName(m); + } + return null; + } + + private static String getBeanPropertyName(Method m){ + try + { + Class clazz=m.getDeclaringClass(); + BeanInfo info = Introspector.getBeanInfo(clazz); + PropertyDescriptor[] props = info.getPropertyDescriptors(); + for (PropertyDescriptor pd : props) + { + if (m.equals(pd.getReadMethod())) return pd.getName(); + } + } + catch (IntrospectionException e) + { + LOGGER.error("Could not read bean property name for method = {}", + m.getName(), e); + } + return null; + } + + public static TypeInfo createRoot(String name, Class clz) { + // root is always a composite type + // FIXME assert its a JAXB type + XmlRootElement root = clz.getAnnotation(XmlRootElement.class); + if (root == null) throw new IllegalArgumentException("Not a JAXB type: " + clz); + if (name == null) name = getRootName(clz); + return new TypeInfo(name, clz, null); + } + + public static TypeInfo createTypeInfo(String name, Accessor accessor) { + if (accessor.getAccessibleObject().getAnnotation(XmlElementWrapper.class) != null) { + //XmlElementWrapperType + return new WrapperTypeInfo(name, accessor); + } else if (Collection.class.isAssignableFrom(accessor.getType())) { + // collection type + return new IteratableTypeInfo(name, accessor); + } + return new TypeInfo(name, accessor.getType(), accessor); + } + + public static String getRootName(Class cls) { + XmlRootElement root = cls.getAnnotation(XmlRootElement.class); + if (root == null) return null; + String rootName = root.name(); + if (DEFAULT_NAME.equals(rootName)) { + String clsName = cls.getSimpleName(); + rootName = Character.toLowerCase(clsName.charAt(0)) + clsName.substring(1); + } + return rootName; + } + + protected static String getTypeName(Annotation[] annotations, String dflt) { + String name = null; + for (Annotation a : annotations) { + if (a.annotationType() == XmlAttribute.class) { + name = ((XmlAttribute)a).name(); + } else if (a.annotationType() == XmlElement.class) { + name = ((XmlElement)a).name(); + } else if (a.annotationType() == XmlElementRef.class) { + name = ((XmlElementRef)a).name(); + } else if (a.annotationType() == XmlElementWrapper.class) { + name = ((XmlElementWrapper)a).name(); + // break the loop as we don't want name to be overwritten by XmlElement + break; + } else if (a.annotationType() == XmlType.class) { + name = ((XmlType)a).name(); + } else if (a.annotationType() == XmlTransient.class) { + // transient type + return null; + } + } + if (DEFAULT_NAME.equals(name)) return dflt; + return name; + } + + @Override + public String toString() { + return " TypeInfo [_name=" + _name + ", _class=" + _class + + ", _accessType=" + _accessType + ", _accessor=" + _accessor + + ", _types=" + _types + ", _explored=" + _explored + " ] "; + } +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Visitor.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Visitor.java new file mode 100644 index 0000000000..0c1d2be236 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/Visitor.java @@ -0,0 +1,16 @@ +/** + * 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.northbound.commons.query; + +/*package*/ interface Visitor { + + boolean visit(LogicalExpression exp) throws QueryException; + + boolean visit(CompareExpression exp) throws QueryException; + +} diff --git a/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/WrapperTypeInfo.java b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/WrapperTypeInfo.java new file mode 100644 index 0000000000..a8172f2add --- /dev/null +++ b/opendaylight/northbound/commons/src/main/java/org/opendaylight/controller/northbound/commons/query/WrapperTypeInfo.java @@ -0,0 +1,59 @@ +/** + * 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.northbound.commons.query; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import javax.xml.bind.annotation.XmlElement; + +public class WrapperTypeInfo extends TypeInfo { + + protected WrapperTypeInfo(String name, Accessor accessor) { + super(name, accessor.getType(), accessor); + } + + @Override + public Object retrieve(Object target, String[] query, int index) throws QueryException { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("retrieve collection: {}/{}", index, query.length); + } + if (index >= query.length) return null; + explore(); + TypeInfo child = getChild(query[index]); + if (child == null) return null; + if (query.length == index+1) { // skipping this node + return target; + }else { // if list of list go to next node to get value + return child.retrieve(target, query, index+1); + } + } + + @Override + public synchronized void explore() { + if (_explored) return; + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("exploring wrapper type: {} gtype: {}", _class, + _accessor.getGenericType()); + } + String tn = null; + AccessibleObject accessibleObject = _accessor.getAccessibleObject(); + XmlElement xmlElement = accessibleObject.getAnnotation(XmlElement.class); + if (accessibleObject instanceof Field) { + Field f = (Field) accessibleObject; + tn = DEFAULT_NAME.equals(xmlElement.name())?f.getName() : xmlElement.name(); + }else if (accessibleObject instanceof Method) { + Method m = (Method) accessibleObject; + tn = DEFAULT_NAME.equals(xmlElement.name())?m.getName() : xmlElement.name(); + } + this._types.put(tn, new IteratableTypeInfo(tn, this._accessor)); + _explored = true; + } + +} diff --git a/opendaylight/northbound/commons/src/main/javacc/fiql.jj b/opendaylight/northbound/commons/src/main/javacc/fiql.jj new file mode 100644 index 0000000000..b447a32a54 --- /dev/null +++ b/opendaylight/northbound/commons/src/main/javacc/fiql.jj @@ -0,0 +1,124 @@ + +options { + STATIC = false; +} + +PARSER_BEGIN(FiqlParser) +package org.opendaylight.controller.northbound.commons.query; + +import java.util.regex.*; + +/*package*/ class FiqlParser { + public static Expression parse(String query) throws ParseException { + FiqlParser parser = new FiqlParser(new java.io.StringReader(query)); + return parser.START(); + } +} + +PARSER_END(FiqlParser) + +/* whitespace */ +SKIP : +{ + " " | "\t" +} + +TOKEN : { + <#ALPHA : ( ["a"-"z", "A"-"Z", "0"-"9"] )+ > +} + +TOKEN : { + + | + + | + +} + +/* comparision ops */ +TOKEN : { + + | + ") > + | + =") > +} + +/* ops */ +TOKEN : { + + | + +} + +/* strings */ +TOKEN : { + ", "!", "~", " "] )+ > + | + + | + +} + +/* Root production */ +Expression START() : +{ + Expression e; +} +{ + e = EXPR() + + { + return e; + } +} + +Expression EXPR(): +{ + ExpressionBuilder builder = new ExpressionBuilder(); + Expression t; +} +{ + t = TERM() { builder.withTerm(t); } + ( + ( t = TERM()) { builder.withAnd().withTerm(t); } + | + ( t = TERM() ) { builder.withOr().withTerm(t); } + )* + { + return builder.build(); + } +} + +Expression TERM() : +{ + Token selector, arg; + Expression exp; + CompareExpression.OP op; +} +{ + selector = + ( + ( {op=CompareExpression.OP.EQ;} | + {op=CompareExpression.OP.RE;} | + {op=CompareExpression.OP.NE;} | + {op=CompareExpression.OP.LT;} | + {op=CompareExpression.OP.LE;} | + {op=CompareExpression.OP.GT;} | + {op=CompareExpression.OP.GE;} + ) + ( arg = | arg = | arg = | arg = ) + ) { return new CompareExpression(op, selector.image, arg.image); } + | + ( + exp = EXPR() + ) { return exp; } +} diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/BookBean.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/BookBean.java new file mode 100644 index 0000000000..5d518f684d --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/BookBean.java @@ -0,0 +1,92 @@ +package org.opendaylight.controller.northbound.commons.query; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opendaylight.controller.northbound.commons.types.StringList; + +/** + */ + +@XmlRootElement(name="book") +public class BookBean { + + @XmlElement(name="name") + private String _name; // simple type + + private String _isbn; // method annotation + + @XmlElement(name="author") + private PersonBean _author; // composite type + + @XmlElementWrapper//for XMLWrapper iterative composite types + @XmlElement(name="review") + private final List reviews = new ArrayList(); + + @XmlElement + private List soldBy; //Iterative Type + + @XmlElementWrapper(name="test") + @XmlElement + private final List testList = new ArrayList(); //XMLWrapper list of list + + @XmlElementWrapper(name="parent") + @XmlElement(name="child") + private final List wrapperList = new ArrayList(); // XMLWrapper of XMLWrapper + + public BookBean(){} + + public BookBean(String name, String id, PersonBean person) { + _name = name; + _isbn = id; + _author = person; + soldBy = new ArrayList(); + } + + public BookBean addReview(ReviewBean review) { + reviews.add(review); + return this; + } + + public void setSellerInfo(List sellers) { + soldBy = new ArrayList(sellers); + } + + public void addWrapperList(WrapperList list){ + wrapperList.add(list); + } + + public void addToTestList(StringList testList){ + this.testList.add(testList); + } + public String getName() { + return "1"+_name; + } + + @XmlElement(name="isbn") + public String get_isbn() { + return "pre"+_isbn; + } + + public PersonBean getauthor() { + return _author; + } + + @Override + public String toString() { + return "BookBean [_name=" + _name + ", _isbn=" + _isbn + ", _author=" + + _author + ", reviews=" + reviews + ", soldBy=" + soldBy + + ", testList=" + testList + ", wrapperList=" + wrapperList + "]"; + } + +} + +class WrapperList { + @XmlElementWrapper(name="items") + @XmlElement + public List item = new ArrayList(); +} diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/ExpresssionTest.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/ExpresssionTest.java new file mode 100644 index 0000000000..3e2e1538e2 --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/ExpresssionTest.java @@ -0,0 +1,207 @@ +/** + * 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.northbound.commons.query; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.regex.Pattern; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opendaylight.controller.northbound.commons.query.CompareExpression.OP; + +public class ExpresssionTest { + + private static final List people = new ArrayList(); + private static final ArrayList books = new ArrayList(); + + public static void p(String msg) { + //System.out.println("======= " + msg); + } + + public static boolean matches(Expression exp, final PersonBean person) throws Exception { + + boolean result = exp.accept(new Visitor() { + @Override + public boolean visit(LogicalExpression le) throws QueryException { + p("=== LE " + le.getOperator() + "|" + le.getFirst() + "|" + le.getSecond()); + return (le.getOperator() == LogicalExpression.OP.AND) ? + le.getFirst().accept(this) && le.getSecond().accept(this) : + le.getFirst().accept(this) || le.getSecond().accept(this); + } + + @Override + public boolean visit(CompareExpression ce) { + p("=== CE " + ce.getOperator() + "|" + ce.getSelector() + "|" + ce.getArgument()); + if (person == null) { + return false; + } + try { + // check if the selector matches any of the fields + Field field = PersonBean.class.getDeclaredField(ce.getSelector()); + if (field == null) { + p("No field found by name : " + ce.getSelector()); + return false; + } + Object value = field.get(person); + if (value instanceof String) { + p("Comparing [" + ce.getArgument() + "] "+ ce.getOperator() + " [" + value.toString() + "]"); + if (ce.getOperator() == OP.EQ) { + return ce.getArgument().equals(value.toString()); + } else if (ce.getOperator() == OP.RE) { + return Pattern.matches(ce.getArgument(), value.toString()); + } else if (ce.getOperator() == OP.NE) { + return !ce.getArgument().equals(value.toString()); + } else { + p("Comparator : " + ce.getOperator() + " cannot apply to Strings"); + return false; + } + } else { + // assume its a # + int valToMatch = Integer.parseInt(ce.getArgument()); + int actualValue = (Integer)value; + p("Comparing: " + valToMatch + " " + ce.getOperator() + " " + actualValue); + switch(ce.getOperator()) { + case EQ : + case RE : + return actualValue == valToMatch; + case NE : + return actualValue != valToMatch; + case GT : + return actualValue > valToMatch; + case GE : + return actualValue >= valToMatch; + case LT : + return actualValue < valToMatch; + case LE : + return actualValue <= valToMatch; + default: + p("Unrecognized compare operator: " + ce.getOperator()); + return false; + } + } + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + }); + p("RESULT: " + result); + return result; + } + + @BeforeClass + public static void load() { + System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug"); + + people.add(new PersonBean(100, "John", "Doe", "San Jose")); + people.add(new PersonBean(200, "Foo", "Bar", "San Francisco")); + people.add(new PersonBean(300, "A", "B", "San Francisco")); + people.add(new PersonBean(400, "X", "Y", "New York")); + + books.add(new BookBean("Book1", "A001", people.get(0))); + books.add(new BookBean("Book2", "A002", people.get(1))); + books.add(new BookBean("Book3", "A003", people.get(2))); + + ReviewBean review1 = new ReviewBean("cool", people.get(2)); + ReviewBean review2 = new ReviewBean("kewl", people.get(3)); + ReviewBean review3 = new ReviewBean("+++", people.get(0)); + ReviewBean review4 = new ReviewBean("---", people.get(1)); + + books.get(0).addReview(review1).addReview(review2).addReview(review3).addReview(review4); + books.get(1).addReview(review1).addReview(review2).addReview(review3).addReview(review4); + books.get(2).addReview(review1).addReview(review2).addReview(review3).addReview(review4); + } + + @Test + public void testCXFQueries() throws Exception { + // following queries copied from apache cxf + Assert.assertFalse(matches(parseQuery("id=gt=100;name=Fred"), null)); + Assert.assertFalse(matches(parseQuery("id=gt=100;name==Fred"), null)); + Assert.assertFalse(matches(parseQuery("id=lt=123"), null)); + Assert.assertFalse(matches(parseQuery("date=le=2010-03-11"), null)); + Assert.assertFalse(matches(parseQuery("time=le=2010-03-11T18:00:00"), null)); + Assert.assertFalse(matches(parseQuery("name==CXF;version=ge=2.2"), null)); + Assert.assertFalse(matches(parseQuery("(age=lt=25,age=gt=35);city==London"), null)); + Assert.assertFalse(matches(parseQuery("date=lt=2000-01-01;date=gt=1999-01-01;(sub==math,sub==physics)"), null)); + } + + public Expression parseQuery(String query) throws Exception { + p("PARSING query: " + query); + // FiqlParser is a parser generated by javacc + Expression exp = FiqlParser.parse(query); + p(exp.toString()); + return exp; + } + + public int find(String query) throws Exception { + int found = 0; + Expression exp = parseQuery(query); + TypeInfo.createRoot("person", PersonBean.class); + for (PersonBean person : people) { + if (matches(exp, person)) found++; + } + return found; + } + + @Test + public void testPeopleQueries() throws Exception { + Assert.assertTrue(find("id==200") == 1); + Assert.assertTrue(find("id!=100;(city='San.*')") == 2); + Assert.assertTrue(find("id>200;(city='San.*')") == 1); + Assert.assertTrue(find("city='San.*'") == 3); + } + + @Test + public void testTypeTree() throws Exception { + TypeInfo bookType = TypeInfo.createRoot("book", BookBean.class); + Assert.assertEquals("John", bookType.retrieve(books.get(0), + "book.author.firstName".split("\\."), 1)); + Object result = bookType.retrieve(books.get(0), + "book.reviews.review.comment".split("\\."), 1); + Assert.assertTrue( result instanceof List); + List commentList = (List) result; + Assert.assertTrue(commentList.contains("cool")); + } + + @Test + public void testQueryAPI() throws Exception { + QueryContext qc = new QueryContextImpl(); + + // find all books written by author with firstName "John" + Query q1 = qc.createQuery("book.author.firstName==John", BookBean.class); + Collection r1 = q1.find(books); + p("Filtered books: " + r1.size()); + Assert.assertEquals(1, r1.size()); + + // find all books reviewed by people in a city "San*" + Query q2 = qc.createQuery("book.reviews.review.reviewer.city=San.*", BookBean.class); + Collection r2 = q2.find(books); + + p("Filtered books: " + r2.size()); + Assert.assertEquals(3, r2.size()); + + // find all books reviewed by people in a city "San*" + Query q3 = qc.createQuery("book==foo", BookBean.class); + Collection r3 = q3.find(books); + Assert.assertEquals(0, r3.size()); + } + + @Test + public void testFilter() throws Exception { + Library library = new Library((List)books.clone()); + QueryContext qc = new QueryContextImpl(); + // find all books written by author with firstName "John" + Query q1 = qc.createQuery("book.author.firstName==John", Library.class); + int sizeBefore = library.getList().size(); + System.out.println(q1.filter(library, BookBean.class)); + Assert.assertEquals(1, library.getList().size()); + } +} diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/Library.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/Library.java new file mode 100644 index 0000000000..c54b0e719e --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/Library.java @@ -0,0 +1,29 @@ +/** + * 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.northbound.commons.query; + +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name="library") +public class Library { + + @XmlElement(name="book") + private final List _list; + + public Library(List list) { + _list = list; + } + + public List getList() { + return _list; + } + +} diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/PersonBean.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/PersonBean.java new file mode 100644 index 0000000000..b4b9ed5599 --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/PersonBean.java @@ -0,0 +1,50 @@ +/** + * 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.northbound.commons.query; + +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name="person") + +public class PersonBean { + + @XmlElement + public String firstName; + @XmlElement + public String lastName; + @XmlElement + public String city; + @XmlElement + public int id; + + @XmlElementWrapper(name="emails") // ElementWrapper iteratable type + @XmlElement + public List email; + + public PersonBean(){} + public PersonBean(int n, String f, String l, String c) { + firstName = f; + lastName = l; + city = c; + id = n; + } + + public void setEmail(List emails){ + email = emails; + } + @Override + public String toString() { + return "PersonBean [firstName=" + firstName + ", lastName=" + lastName + + ", city=" + city + ", id=" + id + "]"; + } + +} diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/QueryContextTest.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/QueryContextTest.java new file mode 100644 index 0000000000..b6e582ba50 --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/QueryContextTest.java @@ -0,0 +1,269 @@ +/** + * 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.northbound.commons.query; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Marshaller; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opendaylight.controller.northbound.commons.types.StringList; + +public class QueryContextTest { + + protected static final List people = new ArrayList(); + protected static final List books = new ArrayList(); + + public static void p(String msg) { + System.out.println("=== " + msg); + } + + @BeforeClass + public static void load() { + people.add(new PersonBean(100, "John", "Doe", "San Jose")); + people.add(new PersonBean(200, "Foo", "Bar", "San Francisco")); + people.add(new PersonBean(300, "A", "B", "San Francisco")); + people.add(new PersonBean(400, "X", "Y", "New York")); + + books.add(new BookBean("Book1", "A001", people.get(0))); + books.add(new BookBean("Book2", "A002", people.get(1))); + books.add(new BookBean("Book3", "A003", people.get(2))); + + ReviewBean review1 = new ReviewBean("cool", people.get(2)); + ReviewBean review2 = new ReviewBean("kewl", people.get(3)); + + books.get(0).addReview(review1).addReview(review2); + books.get(1).addReview(review1); + books.get(2).addReview(review2).addReview(review1); + + } + + @Test + public void testQueryContext() { + QueryContext queryContext = new QueryContextImpl(); + Assert.assertNotNull(queryContext); + } + + @Test + public void testSimpleQuery() throws QueryException { + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "person.id==200", PersonBean.class); + Assert.assertNotNull(query); + + List found = query.find(people); + Assert.assertNotNull(found); + Assert.assertTrue(found.size() == 1); + Assert.assertEquals("Foo", found.get(0).firstName); + } + + @Test + public void testAndQuery() throws QueryException { + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "person.id!=200;(person.city='San.*')", PersonBean.class); + Assert.assertNotNull(query); + + List found = query.find(people); + Assert.assertNotNull(found); + Assert.assertTrue(found.size() == 2); + Assert.assertEquals("John", found.get(0).firstName); + Assert.assertEquals("A", found.get(1).firstName); + } + + @Test + public void testOrQuery() throws QueryException { + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "person.id==200,(person.city='San.*')", PersonBean.class); + Assert.assertNotNull(query); + + List found = query.find(people); + Assert.assertNotNull(found); + Assert.assertTrue(found.size() == 3); + Assert.assertEquals("John", found.get(0).firstName); + Assert.assertEquals("Foo", found.get(1).firstName); + Assert.assertEquals("A", found.get(2).firstName); + } + + @Test + public void testXmlElementWrapper() throws QueryException { + List emails = new ArrayList(); + emails.add("john@cisco.com"); + emails.add("john@gmail.com"); + people.get(0).setEmail(emails); + + p(toXml(people.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "person.emails.email==john@cisco.com", PersonBean.class); + Assert.assertNotNull(query); + + List found = query.find(people); + Assert.assertNotNull(found); + Assert.assertEquals(1,found.size()); + Assert.assertEquals("John", found.get(0).firstName); + } + + @Test + public void testXmlWrapperOfWrapper() throws QueryException{ + WrapperList wrapper = new WrapperList(); + wrapper.item.add("Test1"); + wrapper.item.add("Test2"); + + books.get(0).addWrapperList(wrapper); + books.get(1).addWrapperList(wrapper); + + System.out.println(toXml(books.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "book.parent.child.items.item==Test1", BookBean.class); + Assert.assertNotNull(query); + } + + @Test + public void testXmlElementWrapperListofList() throws QueryException { + // create Stringlist + List testList = new ArrayList(); + testList.add("A"); + testList.add("B"); + StringList itemList = new StringList(testList); + books.get(0).addToTestList(itemList); + + System.out.println(toXml(books.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "book.test.testList.item==A", BookBean.class); + Assert.assertNotNull(query); + } + + @Test + public void testPrimitiveIteratableTypes() throws QueryException { + // Load data for this test + List sellers = new ArrayList(); + sellers.add("Amazon"); + + books.get(0).setSellerInfo(sellers); + sellers.add("Barners & Nobles"); + books.get(1).setSellerInfo(sellers); + sellers.add("Borders"); + sellers.remove("Amazon"); + sellers.add("BookShop"); + books.get(2).setSellerInfo(sellers); + + System.out.println(toXml(books.get(0))); + + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "book.soldBy==Amazon", BookBean.class); + Assert.assertNotNull(query); + + List found = query.find(books); + Assert.assertNotNull(found); + Assert.assertEquals(2,found.size()); + Assert.assertEquals("John", found.get(0).getauthor().firstName); + + query = queryContext.createQuery( + "book.soldBy!=Amazon", BookBean.class); + Assert.assertNotNull(query); + + found = query.find(books); + System.out.println("books" +found); + Assert.assertNotNull(found); + Assert.assertEquals(1,found.size()); + Assert.assertEquals("A", found.get(0).getauthor().firstName); + } + + @Test + public void testCompositeIteratableTypes() throws QueryException { + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery("book.reviews.review.reviewer.firstName==X", + BookBean.class); + Assert.assertNotNull(query); + + List found = query.find(books); + Assert.assertNotNull(found); + Assert.assertEquals(2, found.size()); + Assert.assertEquals("John", found.get(0).getauthor().firstName); + + query = queryContext.createQuery("book.reviews.review.comment==kewl", + BookBean.class); + Assert.assertNotNull(query); + + found = query.find(books); + Assert.assertNotNull(found); + Assert.assertEquals(2, found.size()); + p("Book 0" + found.get(0)); + Assert.assertEquals("John", found.get(0).getauthor().firstName); + + query = queryContext.createQuery("book.reviews.review.reviewer.id>300", + BookBean.class); + Assert.assertNotNull(query); + + found = query.find(books); + Assert.assertNotNull(found); + Assert.assertEquals(2, found.size()); + p("Book 0" + found.get(0)); + Assert.assertEquals("John", found.get(0).getauthor().firstName); + + query = queryContext.createQuery("book.reviews.review.reviewer.firstName!=X", + BookBean.class); + Assert.assertNotNull(query); + + found = query.find(books); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + p("Book 0" + found.get(0)); + Assert.assertEquals("Foo", found.get(0).getauthor().firstName); + } + + @Test + public void testXMLAccessorType() { + //Assert.fail("implement"); + } + + @Test + public void testMethodAnnotation() throws QueryException { + System.out.println(toXml(books.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Query query = queryContext.createQuery( + "book.isbn==preA003", BookBean.class); + Assert.assertNotNull(query); + + List found = query.find(books); + Assert.assertNotNull(found); + Assert.assertEquals(1,found.size()); + Assert.assertEquals("A", found.get(0).getauthor().firstName); + } + + public static String toXml(Object element) { + try { + JAXBContext jc = JAXBContext.newInstance(element.getClass()); + Marshaller marshaller = jc.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + marshaller.marshal(element, baos); + return baos.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + @Test + public void testXMLElementWrapperForCompositeTypes(){ + //Assert.fail("implement"); + } + +} \ No newline at end of file diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/ReviewBean.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/ReviewBean.java new file mode 100644 index 0000000000..ea2f873ff6 --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/ReviewBean.java @@ -0,0 +1,41 @@ +package org.opendaylight.controller.northbound.commons.query; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + */ +@XmlRootElement(name="review") +public class ReviewBean { + @XmlElement(name="date") + private Date _publishedDate; + @XmlElement(name="comment") + private String _comment; + @XmlElement(name="reviewer") + private PersonBean _reviewer; + @XmlElement + private int _upVotes; + @XmlElement + private int _downVotes; + public ReviewBean(){} + + public ReviewBean(String comment, PersonBean user) { + _comment = comment; + _reviewer = user; + _publishedDate = new Date(); + } + + public void vote(int up, int down) { + _upVotes += up; + _downVotes += down; + } + + @Override + public String toString() { + return "ReviewBean " + _publishedDate + " " + + _comment + " " + _reviewer + " " + _upVotes + + " " + _downVotes + ""; + } +} diff --git a/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/XMLAccessorTypeTest.java b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/XMLAccessorTypeTest.java new file mode 100644 index 0000000000..25cb69214e --- /dev/null +++ b/opendaylight/northbound/commons/src/test/java/org/opendaylight/controller/northbound/commons/query/XMLAccessorTypeTest.java @@ -0,0 +1,374 @@ +package org.opendaylight.controller.northbound.commons.query; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +import org.junit.Assert; +import org.junit.Test; + +public class XMLAccessorTypeTest { + + @Test + public void testPublicAccessType() throws Exception { + // create bean + List testList = new ArrayList(); + testList.add(new PublicAccessBean("John", "Scott", "private", 1, + "transient", "elem1")); + testList.add(new PublicAccessBean("Foo", "Bar", "private1", 2, + "transient1", "elem2")); + QueryContextTest.p(QueryContextTest.toXml(testList.get(0))); + + QueryContext queryContext = new QueryContextImpl(); + Assert.assertNotNull(queryContext); + // search for public field + Query query = queryContext.createQuery( + "publicbean.firstName==Foo", PublicAccessBean.class); + Assert.assertNotNull(query); + + List found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("Foo", found.get(0).firstName); + + // search for public getter + query = queryContext.createQuery("publicbean.privateGetterField<2", + PublicAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).firstName); + + // test for transient field + query = queryContext.createQuery("publicbean.transientField='trans*'", + PublicAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(0, found.size()); + + // test for private field + query = queryContext.createQuery("publicbean.privateField==private", + PublicAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(0, found.size()); + + // test for XML Element + query = queryContext.createQuery("publicbean.element==elem1", + PublicAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).firstName); + } + + @Test + public void testFieldAccessType() throws QueryException { + // create bean + List testList = new ArrayList(); + testList.add(new FieldAccessBean("John", "Scott", "private", 1, "elem1")); + testList.add(new FieldAccessBean("Foo", "Bar", "private1", 2, "elem2")); + + QueryContextTest.p(QueryContextTest.toXml(testList.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Assert.assertNotNull(queryContext); + // test private field + Query query = queryContext.createQuery( + "field.privateField==private", FieldAccessBean.class); + Assert.assertNotNull(query); + + List found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).firstName); + + // test public field + query = queryContext.createQuery("field.firstName==Foo", + FieldAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("Foo", found.get(0).firstName); + + // test annotated field + query = queryContext.createQuery("field.element==elem2", + FieldAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("Foo", found.get(0).firstName); + + // test annotated method + query = queryContext.createQuery("field.privateGetterField==11", + FieldAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).firstName); + } + + @Test + public void testPropertyAccessType() throws QueryException { + // create bean + List testList = new ArrayList(); + testList.add(new PropertyAccessBean("John", "Scott", "private", 1, "elem1", + "transient1")); + testList.add(new PropertyAccessBean("Foo", "Bar", "private1", 2, "elem2", + "transient2")); + + QueryContextTest.p(QueryContextTest.toXml(testList.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Assert.assertNotNull(queryContext); + // test public getter public field + Query query = queryContext.createQuery( + "property.firstName==John", PropertyAccessBean.class); + Assert.assertNotNull(query); + + List found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).firstName); + + // test public field no getter + query = queryContext.createQuery("property.lastName==Bar", + PropertyAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(0, found.size()); + + // test annotated field + query = queryContext.createQuery("property.element==elem2", + PropertyAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("Foo", found.get(0).firstName); + + // test annotated method + query = queryContext.createQuery("property.field==private", + PropertyAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).firstName); + + // test transient method + query = queryContext.createQuery("property.transientField==transient1", + PropertyAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(0, found.size()); + } + + @Test + public void testNoneAccessType() throws QueryException { + // create bean + List testList = new ArrayList(); + testList.add(new NoneAccessBean("John", "Scott", "private")); + testList.add(new NoneAccessBean("Foo", "Bar", "private1")); + + QueryContextTest.p(QueryContextTest.toXml(testList.get(0))); + QueryContext queryContext = new QueryContextImpl(); + Assert.assertNotNull(queryContext); + // test annotated field + Query query = queryContext.createQuery( + "test.firstName==John", NoneAccessBean.class); + Assert.assertNotNull(query); + + List found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).getFirstName()); + // test unannotated field + query = queryContext + .createQuery("test.lastName==Bar", NoneAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(0, found.size()); + // test annotated method + query = queryContext.createQuery("test.testField==private", + NoneAccessBean.class); + Assert.assertNotNull(query); + + found = query.find(testList); + Assert.assertNotNull(found); + Assert.assertEquals(1, found.size()); + Assert.assertEquals("John", found.get(0).getFirstName()); + + } + +} + +// default ( public memeber ) +@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) +@XmlRootElement(name = "publicbean") +class PublicAccessBean { + + public String firstName; + public String lastName; + private String privateField; + private int privateGetterField; + @XmlTransient + public String transientField; + @XmlElement(name = "element") + private String xmlElem; + + public PublicAccessBean() { + } + + public PublicAccessBean(String firstName, String lastName, + String privateField, int privateGetterField, String transientField, + String xmlElem) { + this.firstName = firstName; + this.lastName = lastName; + this.privateField = privateField; + this.privateGetterField = privateGetterField; + this.transientField = transientField; + this.xmlElem = xmlElem; + } + + public int getPrivateGetterField() { + return privateGetterField; + } + + public void setPrivateGetterField(int field) { + this.privateGetterField = field; + } +} + +// default ( public memeber ) +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "field") +class FieldAccessBean { + + public String firstName; + public String lastName; + private String privateField; + private int test; + @XmlElement(name = "element") + private String xmlElem; + + public FieldAccessBean() { + } + + public FieldAccessBean(String firstName, String lastName, + String privateField, int privateGetterField, String xmlElem) { + this.firstName = firstName; + this.lastName = lastName; + this.privateField = privateField; + this.xmlElem = xmlElem; + this.test = privateGetterField; + } + + public String getPrivateField() { + return privateField; + } + + @XmlElement(name = "privateGetterField") + public int getPrivateGetterField() { + return test + 10; + } +} + +// default ( public memeber ) +@XmlAccessorType(XmlAccessType.PROPERTY) +@XmlRootElement(name = "property") +class PropertyAccessBean { + + public String firstName; + public String lastName; + private String privateField; + private int privateGetterField; + @XmlElement(name = "element") + private String xmlElem; + private String transientField; + + public PropertyAccessBean() { + } + + public PropertyAccessBean(String firstName, String lastName, + String privateField, int privateGetterField, String xmlElem, + String transientField) { + this.firstName = firstName; + this.lastName = lastName; + this.privateField = privateField; + this.privateGetterField = privateGetterField; + this.xmlElem = xmlElem; + this.transientField = transientField; + } + + public int getPrivateGetterField() { + return privateGetterField; + } + + @XmlElement(name = "field") + public String getPrivateField() { + return privateField; + } + + public String getFirstName() { + return firstName; + } + + @XmlTransient + public String getTransientField() { + return transientField; + } +} + +// default ( public memeber ) +@XmlAccessorType(XmlAccessType.NONE) +@XmlRootElement(name = "test") +class NoneAccessBean { + @XmlElement + private String firstName; + public String lastName; + private String testField; + + public NoneAccessBean() { + } + + public NoneAccessBean(String firstName, String lastName, String testField) { + this.firstName = firstName; + this.lastName = lastName; + this.testField = testField; + } + + @XmlElement(name = "testField") + public String getTestField() { + return testField; + } + + public String getFirstName() { + return firstName; + } +} diff --git a/opendaylight/northbound/commons/src/test/resources/logback.xml b/opendaylight/northbound/commons/src/test/resources/logback.xml new file mode 100644 index 0000000000..97e15deb94 --- /dev/null +++ b/opendaylight/northbound/commons/src/test/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + %d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n + + + + + + + + + + + diff --git a/opendaylight/northbound/connectionmanager/pom.xml b/opendaylight/northbound/connectionmanager/pom.xml index a0940e3428..ad315ac008 100644 --- a/opendaylight/northbound/connectionmanager/pom.xml +++ b/opendaylight/northbound/connectionmanager/pom.xml @@ -54,11 +54,13 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.sal.authorization, org.opendaylight.controller.connectionmanager, org.opendaylight.controller.sal.connection, org.slf4j, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/connectionmanager/src/main/java/org/opendaylight/controller/connectionmanager/northbound/ConnectionManagerNorthbound.java b/opendaylight/northbound/connectionmanager/src/main/java/org/opendaylight/controller/connectionmanager/northbound/ConnectionManagerNorthbound.java index e2c1b32c4b..dde3210928 100644 --- a/opendaylight/northbound/connectionmanager/src/main/java/org/opendaylight/controller/connectionmanager/northbound/ConnectionManagerNorthbound.java +++ b/opendaylight/northbound/connectionmanager/src/main/java/org/opendaylight/controller/connectionmanager/northbound/ConnectionManagerNorthbound.java @@ -27,6 +27,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -36,6 +37,7 @@ import org.opendaylight.controller.northbound.commons.exception.NotAcceptableExc import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.connection.ConnectionConstants; @@ -50,7 +52,14 @@ import org.opendaylight.controller.sal.utils.Status; @Path("/") public class ConnectionManagerNorthbound { private String username; + private QueryContext queryContext; + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName(); @@ -115,7 +124,8 @@ public class ConnectionManagerNorthbound { @ResponseCode(code = 406, condition = "Invalid Controller IP Address passed."), @ResponseCode(code = 503, condition = "Connection Manager Service not available")}) - public Nodes getNodes(@DefaultValue("") @QueryParam("controller") String controllerAddress) { + public Nodes getNodes(@DefaultValue("") @QueryParam("controller") String controllerAddress, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container"); } @@ -140,7 +150,12 @@ public class ConnectionManagerNorthbound { } else { nodeSet = connectionManager.getLocalNodes(); } - return new Nodes(nodeSet); + Nodes nodes = new Nodes(nodeSet); + if (queryString != null) { + queryContext.createQuery(queryString, Nodes.class) + .filter(nodes, Node.class); + } + return nodes; } /** diff --git a/opendaylight/northbound/containermanager/pom.xml b/opendaylight/northbound/containermanager/pom.xml index 457b1bd6a4..2e6bb7d40c 100644 --- a/opendaylight/northbound/containermanager/pom.xml +++ b/opendaylight/northbound/containermanager/pom.xml @@ -56,8 +56,10 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, com.sun.jersey.spi.container.servlet, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthbound.java b/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthbound.java index fe38361cca..754167814d 100644 --- a/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthbound.java +++ b/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthbound.java @@ -21,11 +21,13 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -41,6 +43,7 @@ import org.opendaylight.controller.northbound.commons.exception.ResourceConflict import org.opendaylight.controller.northbound.commons.exception.ResourceForbiddenException; import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.authorization.UserLevel; @@ -68,6 +71,14 @@ import org.opendaylight.controller.usermanager.IUserManager; @Path("/") public class ContainerManagerNorthbound { private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -172,13 +183,18 @@ public class ContainerManagerNorthbound { @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 401, condition = "User is not authorized to perform this operation"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) - public ContainerConfigs viewAllContainers() { + public ContainerConfigs viewAllContainers(@QueryParam("_q") String queryString) { handleNetworkAuthorization(getUserName()); IContainerManager containerManager = getContainerManager(); - - return new ContainerConfigs(containerManager.getContainerConfigList()); + ContainerConfigs result = new ContainerConfigs( + containerManager.getContainerConfigList()); + if (queryString != null) { + queryContext.createQuery(queryString, ContainerConfigs.class) + .filter(result, ContainerConfig.class); + } + return result; } /** @@ -481,7 +497,8 @@ public class ContainerManagerNorthbound { @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 404, condition = "The container is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) - public FlowSpecConfigs viewContainerFlowSpecs(@PathParam(value = "container") String container) { + public FlowSpecConfigs viewContainerFlowSpecs(@PathParam(value = "container") String container, + @QueryParam("_q") String queryString) { handleContainerAuthorization(container, getUserName()); handleForbiddenOnDefault(container); @@ -489,8 +506,13 @@ public class ContainerManagerNorthbound { handleContainerNotExists(container); IContainerManager containerManager = getContainerManager(); - - return new FlowSpecConfigs(containerManager.getContainerFlows(container)); + FlowSpecConfigs result = new FlowSpecConfigs( + containerManager.getContainerFlows(container)); + if (queryString != null) { + queryContext.createQuery(queryString, FlowSpecConfigs.class) + .filter(result, ContainerFlowConfig.class); + } + return result; } /** diff --git a/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthboundRSApplication.java b/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthboundRSApplication.java index b9d2200180..db3d543a69 100644 --- a/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthboundRSApplication.java +++ b/opendaylight/northbound/containermanager/src/main/java/org/opendaylight/controller/containermanager/northbound/ContainerManagerNorthboundRSApplication.java @@ -11,8 +11,11 @@ package org.opendaylight.controller.containermanager.northbound; import java.util.HashSet; import java.util.Set; + import javax.ws.rs.core.Application; +import org.opendaylight.controller.northbound.commons.query.QueryContextProvider; + import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; /** @@ -28,6 +31,7 @@ public class ContainerManagerNorthboundRSApplication extends Application { Set> classes = new HashSet>(); classes.add(ContainerManagerNorthbound.class); classes.add(JacksonJaxbJsonProvider.class); + classes.add(QueryContextProvider.class); return classes; } } diff --git a/opendaylight/northbound/controllermanager/pom.xml b/opendaylight/northbound/controllermanager/pom.xml index 07d34cb6d4..89d2b99cad 100644 --- a/opendaylight/northbound/controllermanager/pom.xml +++ b/opendaylight/northbound/controllermanager/pom.xml @@ -67,8 +67,10 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.sal.authorization, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/controllermanager/src/main/java/org/opendaylight/controller/controllermanager/northbound/ControllerManagerNorthbound.java b/opendaylight/northbound/controllermanager/src/main/java/org/opendaylight/controller/controllermanager/northbound/ControllerManagerNorthbound.java index 003f8b3b95..aaf93d1f4b 100644 --- a/opendaylight/northbound/controllermanager/src/main/java/org/opendaylight/controller/controllermanager/northbound/ControllerManagerNorthbound.java +++ b/opendaylight/northbound/controllermanager/src/main/java/org/opendaylight/controller/controllermanager/northbound/ControllerManagerNorthbound.java @@ -25,6 +25,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -36,6 +37,7 @@ import org.opendaylight.controller.northbound.commons.exception.BadRequestExcept import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Property; @@ -55,6 +57,14 @@ import org.opendaylight.controller.switchmanager.ISwitchManager; public class ControllerManagerNorthbound { private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -122,7 +132,8 @@ public class ControllerManagerNorthbound { @ResponseCode(code = 404, condition = "The containerName or property is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public ControllerProperties getControllerProperties(@PathParam("containerName") String containerName, - @QueryParam("propertyName") String propertyName) { + @QueryParam("propertyName") String propertyName, + @QueryParam("_q") String queryString) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -147,8 +158,12 @@ public class ControllerManagerNorthbound { throw new ResourceNotFoundException("Unable to find property with name: " + propertyName); } properties.add(property); - - return new ControllerProperties(properties); + ControllerProperties result = new ControllerProperties(properties); + if (queryString != null) { + queryContext.createQuery(queryString, ControllerProperties.class) + .filter(result, Property.class); + } + return result; } diff --git a/opendaylight/northbound/flowprogrammer/pom.xml b/opendaylight/northbound/flowprogrammer/pom.xml index 205b68a91c..43797f5c65 100644 --- a/opendaylight/northbound/flowprogrammer/pom.xml +++ b/opendaylight/northbound/flowprogrammer/pom.xml @@ -57,11 +57,13 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.sal.authorization, org.opendaylight.controller.usermanager, com.sun.jersey.spi.container.servlet, org.apache.catalina.filters, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/flowprogrammer/src/main/java/org/opendaylight/controller/flowprogrammer/northbound/FlowProgrammerNorthbound.java b/opendaylight/northbound/flowprogrammer/src/main/java/org/opendaylight/controller/flowprogrammer/northbound/FlowProgrammerNorthbound.java index 4928ddef3b..42bd59ea45 100644 --- a/opendaylight/northbound/flowprogrammer/src/main/java/org/opendaylight/controller/flowprogrammer/northbound/FlowProgrammerNorthbound.java +++ b/opendaylight/northbound/flowprogrammer/src/main/java/org/opendaylight/controller/flowprogrammer/northbound/FlowProgrammerNorthbound.java @@ -19,10 +19,12 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -37,6 +39,7 @@ import org.opendaylight.controller.northbound.commons.exception.NotAcceptableExc import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Node; @@ -62,6 +65,14 @@ public class FlowProgrammerNorthbound { private String username; + private QueryContext queryContext; + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } + @Context public void setSecurityContext(SecurityContext context) { if (context != null && context.getUserPrincipal() != null) { @@ -194,15 +205,21 @@ public class FlowProgrammerNorthbound { @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName is not found"), - @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) - public FlowConfigs getStaticFlows(@PathParam("containerName") String containerName) { + @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable"), + @ResponseCode(code = 400, condition = "Incorrect query syntex")}) + public FlowConfigs getStaticFlows(@PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " + containerName); } - List flowConfigs = getStaticFlowsInternal(containerName, null); - return new FlowConfigs(flowConfigs); + FlowConfigs result = new FlowConfigs(getStaticFlowsInternal(containerName, null)); + if (queryString != null) { + queryContext.createQuery(queryString, FlowConfigs.class) + .filter(result, FlowConfig.class); + } + return result; } /** @@ -272,7 +289,8 @@ public class FlowProgrammerNorthbound { @ResponseCode(code = 404, condition = "The containerName or nodeId is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public FlowConfigs getStaticFlows(@PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId) { + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " + containerName); @@ -281,8 +299,12 @@ public class FlowProgrammerNorthbound { if (node == null) { throw new ResourceNotFoundException(nodeId + " : " + RestMessages.NONODE.toString()); } - List flows = getStaticFlowsInternal(containerName, node); - return new FlowConfigs(flows); + FlowConfigs flows = new FlowConfigs(getStaticFlowsInternal(containerName, node)); + if (queryString != null) { + queryContext.createQuery(queryString, FlowConfigs.class) + .filter(flows, FlowConfig.class); + } + return flows; } /** diff --git a/opendaylight/northbound/hosttracker/pom.xml b/opendaylight/northbound/hosttracker/pom.xml index bf1b082cfe..c8415f8b4f 100644 --- a/opendaylight/northbound/hosttracker/pom.xml +++ b/opendaylight/northbound/hosttracker/pom.xml @@ -60,11 +60,13 @@ com.sun.jersey.spi.container.servlet, org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.northbound.commons.utils, org.opendaylight.controller.sal.authorization, org.opendaylight.controller.sal.packet.address, javax.ws.rs, javax.ws.rs.core, + javax.ws.rs.ext, javax.xml.bind.annotation, javax.xml.bind, org.slf4j, diff --git a/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java b/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java index 74c13d11f1..d7579c82e1 100644 --- a/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java +++ b/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java @@ -21,11 +21,13 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -39,6 +41,7 @@ import org.opendaylight.controller.northbound.commons.exception.ResourceConflict import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Node; @@ -69,6 +72,14 @@ import org.opendaylight.controller.switchmanager.ISwitchManager; public class HostTrackerNorthbound { private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -107,7 +118,7 @@ public class HostTrackerNorthbound { return hostTracker; } - private Hosts convertHosts(Set hostNodeConnectors) { + private Set convertHosts(Set hostNodeConnectors) { if(hostNodeConnectors == null) { return null; } @@ -115,7 +126,7 @@ public class HostTrackerNorthbound { for(HostNodeConnector hnc : hostNodeConnectors) { hosts.add(HostConfig.convert(hnc)); } - return new Hosts(hosts); + return hosts; } /** @@ -194,14 +205,20 @@ public class HostTrackerNorthbound { @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) - public Hosts getActiveHosts(@PathParam("containerName") String containerName) { + public Hosts getActiveHosts(@PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " + containerName); } IfIptoHost hostTracker = getIfIpToHostService(containerName); - return convertHosts(hostTracker.getAllHosts()); + Hosts hosts = new Hosts(convertHosts(hostTracker.getAllHosts())); + if (queryString != null) { + queryContext.createQuery(queryString, Hosts.class) + .filter(hosts, HostConfig.class); + } + return hosts; } /** @@ -281,13 +298,19 @@ public class HostTrackerNorthbound { @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public Hosts getInactiveHosts( - @PathParam("containerName") String containerName) { + @PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " + containerName); } IfIptoHost hostTracker = getIfIpToHostService(containerName); - return convertHosts(hostTracker.getInactiveStaticHosts()); + Hosts hosts = new Hosts(convertHosts(hostTracker.getInactiveStaticHosts())); + if (queryString != null) { + queryContext.createQuery(queryString, Hosts.class) + .filter(hosts, HostConfig.class); + } + return hosts; } /** diff --git a/opendaylight/northbound/staticrouting/pom.xml b/opendaylight/northbound/staticrouting/pom.xml index dd2a2e6223..83f8191e02 100644 --- a/opendaylight/northbound/staticrouting/pom.xml +++ b/opendaylight/northbound/staticrouting/pom.xml @@ -55,9 +55,11 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.sal.authorization, org.slf4j, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java b/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java index e765af524d..20f6cb40a5 100644 --- a/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java +++ b/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java @@ -19,11 +19,13 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -37,6 +39,7 @@ import org.opendaylight.controller.northbound.commons.exception.NotAcceptableExc import org.opendaylight.controller.northbound.commons.exception.ResourceConflictException; import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.utils.GlobalConstants; @@ -74,6 +77,14 @@ import org.opendaylight.controller.sal.utils.Status; public class StaticRoutingNorthbound { private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -148,7 +159,8 @@ public class StaticRoutingNorthbound { @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 404, condition = "The containerName passed was not found") }) public StaticRoutes getStaticRoutes( - @PathParam("containerName") String containerName) { + @PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if(!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)){ @@ -156,7 +168,12 @@ public class StaticRoutingNorthbound { UnauthorizedException("User is not authorized to perform this operation on container " + containerName); } - return new StaticRoutes(getStaticRoutesInternal(containerName)); + StaticRoutes result = new StaticRoutes(getStaticRoutesInternal(containerName)); + if (queryString != null) { + queryContext.createQuery(queryString, StaticRoutes.class) + .filter(result, StaticRoute.class); + } + return result; } /** diff --git a/opendaylight/northbound/statistics/pom.xml b/opendaylight/northbound/statistics/pom.xml index 76ce062424..7e2919bc44 100644 --- a/opendaylight/northbound/statistics/pom.xml +++ b/opendaylight/northbound/statistics/pom.xml @@ -64,7 +64,9 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/statistics/src/main/java/org/opendaylight/controller/statistics/northbound/StatisticsNorthbound.java b/opendaylight/northbound/statistics/src/main/java/org/opendaylight/controller/statistics/northbound/StatisticsNorthbound.java index 5338849a62..4175f1e3c4 100644 --- a/opendaylight/northbound/statistics/src/main/java/org/opendaylight/controller/statistics/northbound/StatisticsNorthbound.java +++ b/opendaylight/northbound/statistics/src/main/java/org/opendaylight/controller/statistics/northbound/StatisticsNorthbound.java @@ -15,9 +15,11 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -29,6 +31,7 @@ import org.opendaylight.controller.northbound.commons.exception.ResourceConflict import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Node; @@ -57,7 +60,14 @@ import org.opendaylight.controller.switchmanager.ISwitchManager; public class StatisticsNorthbound { private String username; + private QueryContext queryContext; + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName(); @@ -234,7 +244,8 @@ public class StatisticsNorthbound { @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public AllFlowStatistics getFlowStatistics( - @PathParam("containerName") String containerName) { + @PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized( getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException( @@ -265,7 +276,12 @@ public class StatisticsNorthbound { FlowStatistics stat = new FlowStatistics(node, flowStats); statistics.add(stat); } - return new AllFlowStatistics(statistics); + AllFlowStatistics result = new AllFlowStatistics(statistics); + if (queryString != null) { + queryContext.createQuery(queryString, AllFlowStatistics.class) + .filter(result, FlowStatistics.class); + } + return result; } /** @@ -610,7 +626,8 @@ public class StatisticsNorthbound { @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public AllPortStatistics getPortStatistics( - @PathParam("containerName") String containerName) { + @PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized( getUserName(), containerName, Privilege.READ, this)) { @@ -638,7 +655,13 @@ public class StatisticsNorthbound { PortStatistics portStat = new PortStatistics(node, stat); statistics.add(portStat); } - return new AllPortStatistics(statistics); + + AllPortStatistics result = new AllPortStatistics(statistics); + if (queryString != null) { + queryContext.createQuery(queryString, AllPortStatistics.class) + .filter(result, PortStatistics.class); + } + return result; } /** @@ -924,7 +947,8 @@ public class StatisticsNorthbound { @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public AllTableStatistics getTableStatistics( - @PathParam("containerName") String containerName) { + @PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " @@ -952,7 +976,12 @@ public class StatisticsNorthbound { TableStatistics tableStat = new TableStatistics(node, stat); statistics.add(tableStat); } - return new AllTableStatistics(statistics); + AllTableStatistics allstats = new AllTableStatistics(statistics); + if (queryString != null) { + queryContext.createQuery(queryString, AllTableStatistics.class) + .filter(allstats, TableStatistics.class); + } + return allstats; } /** diff --git a/opendaylight/northbound/subnets/pom.xml b/opendaylight/northbound/subnets/pom.xml index 5aa2f7f202..630221fcc2 100644 --- a/opendaylight/northbound/subnets/pom.xml +++ b/opendaylight/northbound/subnets/pom.xml @@ -53,12 +53,14 @@ org.opendaylight.controller.switchmanager, org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.northbound.commons.utils, com.sun.jersey.spi.container.servlet, org.opendaylight.controller.sal.authorization, org.opendaylight.controller.usermanager, javax.ws.rs, javax.ws.rs.core, + javax.ws.rs.ext, javax.xml.bind, javax.xml.bind.annotation, org.slf4j, diff --git a/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthbound.java b/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthbound.java index 3465dc95ad..b6274795df 100644 --- a/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthbound.java +++ b/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthbound.java @@ -19,11 +19,13 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -35,6 +37,7 @@ import org.opendaylight.controller.northbound.commons.exception.ResourceConflict import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.NodeConnector; @@ -63,6 +66,14 @@ public class SubnetsNorthbound { protected static final Logger logger = LoggerFactory.getLogger(SubnetsNorthbound.class); private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -160,9 +171,11 @@ public class SubnetsNorthbound { @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName passed was not found"), - @ResponseCode(code = 503, condition = "Service unavailable") }) + @ResponseCode(code = 503, condition = "Service unavailable"), + @ResponseCode(code = 400, condition = "Incorrect query syntex") }) @TypeHint(SubnetConfigs.class) - public SubnetConfigs listSubnets(@PathParam("containerName") String containerName) { + public SubnetConfigs listSubnets(@PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { handleContainerDoesNotExist(containerName); if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { @@ -174,7 +187,13 @@ public class SubnetsNorthbound { if (switchManager == null) { throw new ServiceUnavailableException("SwitchManager " + RestMessages.SERVICEUNAVAILABLE.toString()); } - return new SubnetConfigs(switchManager.getSubnetsConfigList()); + List subnets = switchManager.getSubnetsConfigList(); + if (queryString != null) { + subnets = queryContext.createQuery(queryString, SubnetConfig.class) + .find(subnets); + + } + return new SubnetConfigs(subnets); } /** diff --git a/opendaylight/northbound/swagger-ui/pom.xml b/opendaylight/northbound/swagger-ui/pom.xml new file mode 100644 index 0000000000..18eaed98ec --- /dev/null +++ b/opendaylight/northbound/swagger-ui/pom.xml @@ -0,0 +1,230 @@ + + + 4.0.0 + + org.opendaylight.controller + commons.opendaylight + 1.4.2-SNAPSHOT + ../../commons/opendaylight + + + swagger-ui + 0.0.1-SNAPSHOT + bundle + + + ${resource.dir}/apis + ${project.build.directory}/classes + + + + + com.google.code.gson + gson + + + equinoxSDK381 + javax.servlet + + + + org.opendaylight.controller + connectionmanager.northbound + + + org.opendaylight.controller + controllermanager.northbound + + + org.opendaylight.controller + flowprogrammer.northbound + + + org.opendaylight.controller + forwarding.staticrouting.northbound + + + org.opendaylight.controller + hosttracker.northbound + + + org.opendaylight.controller + networkconfig.bridgedomain.northbound + + + org.opendaylight.controller + statistics.northbound + + + org.opendaylight.controller + subnets.northbound + + + org.opendaylight.controller + switchmanager.northbound + + + org.opendaylight.controller + topology.northbound + + + org.opendaylight.controller + usermanager.northbound + + + org.slf4j + slf4j-api + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + + org.slf4j, + javax.annotation, + javax.naming, + javax.servlet, + javax.servlet.annotation, + javax.servlet.http, + com.google.gson, + + apis=target/classes/apis, + index.html=target/classes/index.html, + apilist.json=target/classes/apilist.json, + css=target/classes/css, + lib=target/classes/lib, + swagger-ui.min.js=target/classes/swagger-ui.min.js, + swagger-ui.js=target/classes/swagger-ui.js, + images=target/classes/images, + WEB-INF/web.xml=target/classes/WEB-INF/web.xml + /swagger + + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.7 + + + ant-contrib + ant-contrib + 1.0b3 + + + ant + ant + + + + + + + + run + + generate-sources + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "swaggerVersion": "1.1", + "basePath": "http://localhost:8080/swagger/apis", + "apis": [ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { } + ] +} + + + + + + + + + + + + + + + + + + + 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:Main + + diff --git a/opendaylight/northbound/swagger-ui/src/main/java/org/opendaylight/controller/swaggerui/BasePathModifierServlet.java b/opendaylight/northbound/swagger-ui/src/main/java/org/opendaylight/controller/swaggerui/BasePathModifierServlet.java new file mode 100644 index 0000000000..083a50c81e --- /dev/null +++ b/opendaylight/northbound/swagger-ui/src/main/java/org/opendaylight/controller/swaggerui/BasePathModifierServlet.java @@ -0,0 +1,101 @@ +package org.opendaylight.controller.swaggerui; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +/** + * Servlet implementation class BasePathModifierServlet + */ +public class BasePathModifierServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + private static final Logger logger = LoggerFactory + .getLogger(BasePathModifierServlet.class); + + private static final String API_BASE_PATH_SUFFIX = "/swagger/apis"; + private static final String BASE_PATH_KEY = "basePath"; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doGet(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + String resourcePath = request.getRequestURI().substring( + request.getContextPath().length()); + logger.debug("Locating resource : {}.", resourcePath); + JsonObject jsonObject = null; + try { + + InputStream stream = this.getServletContext().getResourceAsStream( + resourcePath); + if (stream == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, + "API / API Listing not found"); + return; + } + BufferedReader streamReader = new BufferedReader( + new InputStreamReader(stream, "UTF-8")); + StringBuilder responseStrBuilder = new StringBuilder(); + + String inputStr; + while ((inputStr = streamReader.readLine()) != null) + responseStrBuilder.append(inputStr); + + JsonElement jelement = new JsonParser().parse(responseStrBuilder + .toString()); + jsonObject = jelement.getAsJsonObject(); + + String basePath = jsonObject.get(BASE_PATH_KEY).getAsString(); + + // construct base path + StringBuilder requestURL = new StringBuilder(); + + requestURL.append(request.isSecure() ? "https://" : "http://") + .append(request.getServerName()).append(":") + .append(request.getServerPort()); + if (!basePath.contains(requestURL)) { + String endPath = ""; + if (basePath.contains(API_BASE_PATH_SUFFIX)) { + endPath = basePath.substring(basePath + .indexOf(API_BASE_PATH_SUFFIX)); + } + basePath = requestURL + endPath; + logger.debug("Modified Base Path is {}", basePath); + jsonObject.addProperty(BASE_PATH_KEY, basePath); + } + } catch (Exception ex) { + logger.error("Error processing JSON data", ex); + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "Could not read API Listing or APIs"); + return; + } + + try { + response.setContentType("application/json"); + PrintWriter out = response.getWriter(); + out.print(jsonObject); + out.flush(); + } catch (Exception ex) { + logger.error("Error while writing response", ex); + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "Internal Error while writing resposne"); + } + } + +} diff --git a/opendaylight/northbound/swagger-ui/src/main/resources/WEB-INF/web.xml b/opendaylight/northbound/swagger-ui/src/main/resources/WEB-INF/web.xml new file mode 100644 index 0000000000..6d0239019c --- /dev/null +++ b/opendaylight/northbound/swagger-ui/src/main/resources/WEB-INF/web.xml @@ -0,0 +1,23 @@ + + + + BasePathModifierServlet + org.opendaylight.controller.swaggerui.BasePathModifierServlet + + + + BasePathModifierServlet + /apis/* + + + + BasePathModifierServlet + /apilist.json + + + index.html + + diff --git a/opendaylight/northbound/swagger-ui/src/main/resources/css/custom.css b/opendaylight/northbound/swagger-ui/src/main/resources/css/custom.css new file mode 100644 index 0000000000..e39394375f --- /dev/null +++ b/opendaylight/northbound/swagger-ui/src/main/resources/css/custom.css @@ -0,0 +1,12 @@ +body #header a#logo { + font-size: 1.5em; + font-weight: bold; + text-decoration: none; + background: transparent url(../images/logo.png) no-repeat left center; + padding: 20px 0 20px 70px; + color: white; +} + +div.footer { + display: none; +} diff --git a/opendaylight/northbound/swagger-ui/src/main/resources/images/logo.png b/opendaylight/northbound/swagger-ui/src/main/resources/images/logo.png new file mode 100644 index 0000000000..d49fb86ed5 Binary files /dev/null and b/opendaylight/northbound/swagger-ui/src/main/resources/images/logo.png differ diff --git a/opendaylight/northbound/swagger-ui/src/main/resources/index.html b/opendaylight/northbound/swagger-ui/src/main/resources/index.html new file mode 100644 index 0000000000..bb5126ce2b --- /dev/null +++ b/opendaylight/northbound/swagger-ui/src/main/resources/index.html @@ -0,0 +1,77 @@ + + + + Swagger UI + + + + + + + + + + + + + + + + + + + + + +
    +   +
    + +
    + +
    + + + + diff --git a/opendaylight/northbound/switchmanager/pom.xml b/opendaylight/northbound/switchmanager/pom.xml index 590f0bb533..614ec88476 100644 --- a/opendaylight/northbound/switchmanager/pom.xml +++ b/opendaylight/northbound/switchmanager/pom.xml @@ -58,7 +58,9 @@ org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, org.opendaylight.controller.sal.authorization, + org.opendaylight.controller.northbound.commons.query, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind.annotation, javax.xml.bind, diff --git a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java index e30dad24ab..dab5d7d1b2 100644 --- a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java +++ b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java @@ -23,11 +23,13 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -38,6 +40,7 @@ import org.opendaylight.controller.northbound.commons.exception.InternalServerEr import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Node; @@ -60,6 +63,14 @@ import org.opendaylight.controller.switchmanager.SwitchConfig; public class SwitchNorthbound { private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -200,8 +211,9 @@ public class SwitchNorthbound { @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName is not found"), - @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) - public Nodes getNodes(@PathParam("containerName") String containerName) { + @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable"), + @ResponseCode(code = 400, condition = "Incorrect query syntex") }) + public Nodes getNodes(@PathParam("containerName") String containerName, @QueryParam("_q") String queryString) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -233,8 +245,12 @@ public class SwitchNorthbound { NodeProperties nodeProps = new NodeProperties(node, props); res.add(nodeProps); } - - return new Nodes(res); + Nodes result = new Nodes(res); + if (queryString != null) { + queryContext.createQuery(queryString, Nodes.class) + .filter(result, NodeProperties.class); + } + return result; } /** @@ -564,9 +580,11 @@ public class SwitchNorthbound { @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName is not found"), - @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) + @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable"), + @ResponseCode(code = 400, condition = "Incorrect query syntex") }) public NodeConnectors getNodeConnectors(@PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId) { + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, + @QueryParam("_q") String queryString) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -598,8 +616,12 @@ public class SwitchNorthbound { NodeConnectorProperties ncProps = new NodeConnectorProperties(nc, props); res.add(ncProps); } - - return new NodeConnectors(res); + NodeConnectors result = new NodeConnectors(res); + if (queryString != null) { + queryContext.createQuery(queryString, NodeConnectors.class) + .filter(result, NodeConnectorProperties.class); + } + return result; } /** diff --git a/opendaylight/northbound/topology/pom.xml b/opendaylight/northbound/topology/pom.xml index 4a1142bb18..3f1a770110 100644 --- a/opendaylight/northbound/topology/pom.xml +++ b/opendaylight/northbound/topology/pom.xml @@ -51,6 +51,7 @@ org.opendaylight.controller.northbound.commons, org.opendaylight.controller.northbound.commons.exception, org.opendaylight.controller.northbound.commons.utils, + org.opendaylight.controller.northbound.commons.query, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.packet, org.opendaylight.controller.sal.authorization, @@ -62,6 +63,7 @@ com.sun.jersey.spi.container.servlet, com.fasterxml.jackson.annotation, javax.ws.rs, + javax.ws.rs.ext, javax.ws.rs.core, javax.xml.bind, javax.xml.bind.annotation, diff --git a/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java b/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java index 427aa1c1de..3773070504 100644 --- a/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java +++ b/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java @@ -21,10 +21,12 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -33,6 +35,7 @@ import org.opendaylight.controller.northbound.commons.RestMessages; import org.opendaylight.controller.northbound.commons.exception.InternalServerErrorException; import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; +import org.opendaylight.controller.northbound.commons.query.QueryContext; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Edge; @@ -59,7 +62,14 @@ import org.opendaylight.controller.topologymanager.TopologyUserLinkConfig; public class TopologyNorthboundJAXRS { private String username; + private QueryContext queryContext; + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { if (context != null && context.getUserPrincipal() != null) { @@ -240,7 +250,8 @@ public class TopologyNorthboundJAXRS { @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(Topology.class) @StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name was not found") }) - public Topology getTopology(@PathParam("containerName") String containerName) { + public Topology getTopology(@PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " @@ -253,16 +264,21 @@ public class TopologyNorthboundJAXRS { } Map> topo = topologyManager.getEdges(); - if (topo != null) { - List res = new ArrayList(); - for (Map.Entry> entry : topo.entrySet()) { - EdgeProperties el = new EdgeProperties(entry.getKey(), entry.getValue()); - res.add(el); - } - return new Topology(res); + if (topo == null) { + return null; + } + List res = new ArrayList(); + for (Map.Entry> entry : topo.entrySet()) { + EdgeProperties el = new EdgeProperties(entry.getKey(), entry.getValue()); + res.add(el); } + Topology result = new Topology(res); - return null; + if (queryString != null) { + queryContext.createQuery(queryString, Topology.class) + .filter(result, EdgeProperties.class); + } + return result; } /** @@ -311,7 +327,8 @@ public class TopologyNorthboundJAXRS { @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(TopologyUserLinks.class) @StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name was not found") }) - public TopologyUserLinks getUserLinks(@PathParam("containerName") String containerName) { + public TopologyUserLinks getUserLinks(@PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation on container " @@ -324,12 +341,16 @@ public class TopologyNorthboundJAXRS { } ConcurrentMap userLinks = topologyManager.getUserLinks(); - if ((userLinks != null) && (userLinks.values() != null)) { - List res = new ArrayList(userLinks.values()); - return new TopologyUserLinks(res); + if ((userLinks == null) || (userLinks.values() == null)) { + return null; } - - return null; + TopologyUserLinks result = new TopologyUserLinks( + new ArrayList(userLinks.values())); + if (queryString != null) { + queryContext.createQuery(queryString, TopologyUserLinks.class) + .filter(result, TopologyUserLinkConfig.class); + } + return result; } /** diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6Match.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6Match.java index cfe20a1fa2..4b8966c546 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6Match.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6Match.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013-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, @@ -69,6 +69,16 @@ public class V6Match extends OFMatch implements Cloneable { private static int IPV6_EXT_MIN_HDR_LEN = 36; + /** + * CFI bit in VLAN TCI field. + */ + private static final int VLAN_TCI_CFI = 1 << 12; + + /** + * Value of OFP_VLAN_NONE defined by OpenFlow 1.0. + */ + private static final short OFP_VLAN_NONE = (short) 0xffff; + private enum MatchFieldState { MATCH_ABSENT, MATCH_FIELD_ONLY, MATCH_FIELD_WITH_MASK } @@ -334,11 +344,15 @@ public class V6Match extends OFMatch implements Cloneable { private byte[] getVlanTCI(short dataLayerVirtualLanID, byte dataLayerVirtualLanPriorityCodePoint) { ByteBuffer vlan_tci = ByteBuffer.allocate(2); - int cfi = 1 << 12; // the cfi bit is in position 12 - int pcp = dataLayerVirtualLanPriorityCodePoint << 13; // the pcp fields - // have to move by - // 13 - int vlan_tci_int = pcp + cfi + dataLayerVirtualLanID; + int vlan_tci_int; + if (dataLayerVirtualLanID == OFP_VLAN_NONE) { + // Match only packets without VLAN tag. + vlan_tci_int = 0; + } else { + // the pcp fields have to move by 13 + int pcp = dataLayerVirtualLanPriorityCodePoint << 13; + vlan_tci_int = pcp + VLAN_TCI_CFI + dataLayerVirtualLanID; + } vlan_tci.put((byte) (vlan_tci_int >> 8)); // bits 8 to 15 vlan_tci.put((byte) vlan_tci_int); // bits 0 to 7 return vlan_tci.array(); @@ -542,7 +556,12 @@ public class V6Match extends OFMatch implements Cloneable { ethTypeState = MatchFieldState.MATCH_FIELD_ONLY; match_len += 6; } else if (values[0].equals(STR_DL_VLAN)) { - this.dataLayerVirtualLan = U16.t(Integer.valueOf(values[1])); + short vlan = U16.t(Integer.valueOf(values[1])); + if (this.dlVlanPCPState != MatchFieldState.MATCH_ABSENT && + vlan == OFP_VLAN_NONE) { + throw new IllegalArgumentException("DL_VLAN_PCP is set."); + } + this.dataLayerVirtualLan = vlan; this.dlVlanIDState = MatchFieldState.MATCH_FIELD_ONLY; // the variable dlVlanIDState is not really used as a flag // for serializing and deserializing. Rather it is used as a @@ -552,6 +571,9 @@ public class V6Match extends OFMatch implements Cloneable { if (this.dlVlanPCPState != MatchFieldState.MATCH_ABSENT) { this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_ONLY; match_len -= 2; + } else if (this.dataLayerVirtualLan == OFP_VLAN_NONE) { + this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_ONLY; + match_len += 6; } else { this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_WITH_MASK; this.dataLayerVirtualLanTCIMask = 0x1fff; @@ -559,6 +581,11 @@ public class V6Match extends OFMatch implements Cloneable { } this.wildcards &= ~OFPFW_DL_VLAN; } else if (values[0].equals(STR_DL_VLAN_PCP)) { + if (this.dlVlanIDState != MatchFieldState.MATCH_ABSENT && + this.dataLayerVirtualLan == OFP_VLAN_NONE) { + throw new IllegalArgumentException + ("OFP_VLAN_NONE is specified to DL_VLAN."); + } this.dataLayerVirtualLanPriorityCodePoint = U8.t(Short .valueOf(values[1])); this.dlVlanPCPState = MatchFieldState.MATCH_FIELD_ONLY; @@ -858,12 +885,20 @@ public class V6Match extends OFMatch implements Cloneable { // get the vlan pcp byte firstByte = data.get(); byte secondByte = data.get(); - super.setDataLayerVirtualLanPriorityCodePoint(getVlanPCP(firstByte)); - super.setDataLayerVirtualLan(getVlanID(firstByte, secondByte)); + if (firstByte == 0 && secondByte == 0) { + // Match only packets without VLAN tag. + setDataLayerVirtualLan(OFP_VLAN_NONE); + } else if (((firstByte << 8) & VLAN_TCI_CFI) == 0) { + // Ignore invalid TCI field. + return; + } else { + super.setDataLayerVirtualLanPriorityCodePoint(getVlanPCP(firstByte)); + super.setDataLayerVirtualLan(getVlanID(firstByte, secondByte)); + this.wildcards ^= (1 << 20); + } this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_ONLY; this.match_len += 6; this.wildcards ^= (1 << 1); // Sync with 0F 1.0 Match - this.wildcards ^= (1 << 20); } } } @@ -1241,7 +1276,6 @@ public class V6Match extends OFMatch implements Cloneable { * * @return */ - public Inet6Address getNetworkDest() { return this.nwDst; } @@ -1251,7 +1285,6 @@ public class V6Match extends OFMatch implements Cloneable { * * @return */ - public Inet6Address getNetworkSrc() { return this.nwSrc; } @@ -1316,7 +1349,19 @@ public class V6Match extends OFMatch implements Cloneable { } } + /** + * Set a value to VLAN ID match field. + * + * @param vlan A value to match for VLAN ID. + * @param mask A bitmask for VLAN ID. + */ public void setDataLayerVirtualLan(short vlan, short mask) { + if (vlan == OFP_VLAN_NONE + && this.dlVlanIDState != MatchFieldState.MATCH_ABSENT) { + throw new IllegalStateException + ("DL_VLAN_PCP is set."); + } + // mask is ignored as the code sets the appropriate mask super.dataLayerVirtualLan = vlan; this.dlVlanIDState = MatchFieldState.MATCH_FIELD_ONLY; @@ -1327,6 +1372,9 @@ public class V6Match extends OFMatch implements Cloneable { if (this.dlVlanPCPState != MatchFieldState.MATCH_ABSENT) { this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_ONLY; match_len -= 2; + } else if (this.dataLayerVirtualLan == OFP_VLAN_NONE) { + this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_ONLY; + match_len += 6; } else { this.dlVlanTCIState = MatchFieldState.MATCH_FIELD_WITH_MASK; this.dataLayerVirtualLanTCIMask = 0x1fff; @@ -1334,7 +1382,19 @@ public class V6Match extends OFMatch implements Cloneable { } } + /** + * Set a value to VLAN PCP match field. + * + * @param pcp A value to match for VLAN PCP. + * @param mask A bitmask for VLAN PCP. + */ public void setDataLayerVirtualLanPriorityCodePoint(byte pcp, byte mask) { + if (this.dlVlanIDState != MatchFieldState.MATCH_ABSENT + && this.dataLayerVirtualLan == OFP_VLAN_NONE) { + throw new IllegalStateException + ("OFP_VLAN_NONE is specified to DL_VLAN."); + } + // mask is ignored as the code sets the appropriate mask super.dataLayerVirtualLanPriorityCodePoint = pcp; this.dlVlanPCPState = MatchFieldState.MATCH_FIELD_ONLY; diff --git a/opendaylight/protocol_plugins/openflow/src/test/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6MatchTest.java b/opendaylight/protocol_plugins/openflow/src/test/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6MatchTest.java new file mode 100644 index 0000000000..fceaaf46c9 --- /dev/null +++ b/opendaylight/protocol_plugins/openflow/src/test/java/org/opendaylight/controller/protocol_plugin/openflow/vendorextension/v6extension/V6MatchTest.java @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2014 NEC Corporation + * 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.protocol_plugin.openflow.vendorextension.v6extension; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.openflow.protocol.OFMatch.OFPFW_ALL; +import static org.openflow.protocol.OFMatch.OFPFW_DL_VLAN; +import static org.openflow.protocol.OFMatch.OFPFW_DL_VLAN_PCP; +import static org.openflow.protocol.OFMatch.OFPFW_IN_PORT; + +import java.nio.ByteBuffer; +import org.junit.Test; + +/** + * JUnit test for {@link V6Match}. + */ +public class V6MatchTest { + /** + * Header of a match entry for input port field without a mask. + * The vendor-specific value is 0, and the length of value is 2. + */ + private static int HEADER_INPUT_PORT = (0 << 9) | 2; + + /** + * Header of a match entry for VLAN TCI field without a mask. + * The vendor-specific value is 4, and the length of value is 2. + */ + private static int HEADER_VLAN_TCI= (4 << 9) | 2; + + /** + * Header of a match entry for VLAN TCI field with a mask. + * The vendor-specific value is 4, and the length of value is 4. + */ + private static int HEADER_VLAN_TCI_W = (4 << 9) | (1 << 8) | 4; + + /** + * Length of a match entry for input port field. + * Header (4 bytes) + value (2 bytes) = 6 bytes. + */ + private static short MATCH_LEN_INPUT_PORT = 6; + + /** + * Length of a match entry for VLAN TCI field without a mask. + * Header (4 bytes) + value (2 bytes) = 6 bytes. + */ + private static short MATCH_LEN_VLAN_TCI = 6; + + /** + * Length of a match entry for VLAN TCI field with a mask. + * Header (4 bytes) + value (2 bytes) + bitmask (2 bytes) = 8 bytes. + */ + private static short MATCH_LEN_VLAN_TCI_WITH_MASK = 8; + + /** + * Value of OFP_VLAN_NONE defined by OpenFlow 1.0. + */ + private static final short OFP_VLAN_NONE = (short)0xffff; + + /** + * CFI bit in VLAN TCI field. + */ + private static final int VLAN_TCI_CFI = 1 << 12; + + /** + * Test case for {@link V6Match#fromString(String)} about VLAN TCI field. + * This test passes values to "dl_vlan" and "dl_vpcp". + */ + @Test + public void testFromStringVlanTci() { + // Test for "dl_vlan" using non OFP_VLAN_NONE values. + short vlans[] = {1, 10, 1000, 4095}; + short mask = 0; + for (short vlan: vlans) { + V6Match match = new V6Match(); + match.fromString("dl_vlan=" + vlan); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + int wildcards = OFPFW_ALL & ~OFPFW_DL_VLAN; + assertEquals(wildcards, match.getWildcards()); + } + + // Test for "dl_vpcp". + byte pcps[] = {1, 3, 7}; + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.fromString("dl_vpcp=" + pcp); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, match.getIPv6MatchLen()); + assertEquals(pcp, match.getDataLayerVirtualLanPriorityCodePoint()); + int wildcards = OFPFW_ALL & ~OFPFW_DL_VLAN_PCP; + assertEquals(wildcards, match.getWildcards()); + } + + // Set "dl_vlan" field firstly, "dl_vpcp" field secondly. + for (short vlan: vlans) { + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.fromString("dl_vlan=" + vlan); + match.fromString("dl_vpcp=" + pcp); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + assertEquals(pcp, + match.getDataLayerVirtualLanPriorityCodePoint()); + } + } + + // Set "dl_vpcp" field firstly, "dl_vlan" field secondly. + for (short vlan: vlans) { + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.fromString("dl_vpcp=" + pcp); + match.fromString("dl_vlan=" + vlan); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + assertEquals(pcp, + match.getDataLayerVirtualLanPriorityCodePoint()); + } + } + + // Test for OFP_VLAN_NONE when VLAN PCP is not set. + V6Match match = new V6Match(); + match.fromString("dl_vlan=" + OFP_VLAN_NONE); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(OFP_VLAN_NONE, match.getDataLayerVirtualLan()); + + // Test for OFP_VLAN_NONE when VLAN PCP is set. + match = new V6Match(); + match.fromString("dl_vpcp=" + 1); + try { + match.fromString("dl_vlan=" + OFP_VLAN_NONE); + fail("Throwing exception was expected."); + } catch (IllegalArgumentException e) { + // Throwing exception was expected. + } + } + + /** + * Test case for {@link V6Match#writeTo(ByteBuffer)} for VLAN TCI field. + */ + @Test + public void testWriteToVlanTci() { + byte mask = 0; + + // Set only VLAN ID. + short vlans[] = {1, 10, 1000, 4095}; + for (short vlan: vlans) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(vlan, mask); + ByteBuffer data = ByteBuffer.allocate(10); + match.writeTo(data); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, data.position()); + data.flip(); + // Header + assertEquals(HEADER_VLAN_TCI_W, data.getInt()); + // Value + short expectedTci = (short) (VLAN_TCI_CFI | vlan); + assertEquals(expectedTci, data.getShort()); + // Mask + short expectedMask = 0x1fff; + assertEquals(expectedMask, data.getShort()); + } + + // Set only VLAN PCP. + byte pcps[] = {1, 3, 7}; + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + ByteBuffer data = ByteBuffer.allocate(10); + match.writeTo(data); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, data.position()); + data.flip(); + // Header + assertEquals(HEADER_VLAN_TCI_W, data.getInt()); + // Value + short expectedTci = (short) (pcp << 13 | VLAN_TCI_CFI); + assertEquals(expectedTci, data.getShort()); + // Mask + short expectedMask = (short) 0xf000; + assertEquals(expectedMask, data.getShort()); + } + + // Set both VLAN ID and PCP. + for (short vlan: vlans) { + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(vlan, mask); + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + ByteBuffer data = ByteBuffer.allocate(10); + match.writeTo(data); + assertEquals(MATCH_LEN_VLAN_TCI, data.position()); + data.flip(); + // Header + assertEquals(HEADER_VLAN_TCI, data.getInt()); + // Value + short expectedTci = (short) (pcp << 13 | VLAN_TCI_CFI | vlan); + assertEquals(expectedTci, data.getShort()); + } + } + + // Set OFP_VLAN_NONE. + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(OFP_VLAN_NONE, mask); + ByteBuffer data = ByteBuffer.allocate(10); + match.writeTo(data); + assertEquals(MATCH_LEN_VLAN_TCI, data.position()); + data.flip(); + // Header + assertEquals(HEADER_VLAN_TCI, data.getInt()); + // Value + assertEquals(0, data.getShort()); + } + + /** + * Test case for {@link V6Match#writeTo(ByteBuffer)} for input port field. + */ + @Test + public void testWriteToInputPort() { + // Set input port. + short ports[] = {1, 10, 100, 1000}; + for (short port: ports) { + V6Match match = new V6Match(); + match.setInputPort(port, (short) 0); + ByteBuffer data = ByteBuffer.allocate(10); + match.writeTo(data); + assertEquals(MATCH_LEN_INPUT_PORT, data.position()); + data.flip(); + // Header + assertEquals(HEADER_INPUT_PORT, data.getInt()); + // Value + assertEquals(port, data.getShort()); + } + } + + /** + * Test case for {@link V6Match#readFrom(ByteBuffer)} for VLAN TCI field. + */ + @Test + public void testReadFromVlanTci() { + // Test for an exact match a TCI value with CFI=1. + // It matches packets that have an 802.1Q header with a specified + // VID and PCP. + short vlans[] = {1, 10, 1000, 4095}; + byte pcps[] = {1, 3, 7}; + for (short vlan: vlans) { + for (byte pcp: pcps) { + ByteBuffer data = ByteBuffer.allocate(MATCH_LEN_VLAN_TCI); + data.putInt(HEADER_VLAN_TCI); + short tci = (short) (pcp << 13 | VLAN_TCI_CFI | vlan); + data.putShort(tci); + data.flip(); + + V6Match match = new V6Match(); + match.readFrom(data); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(pcp, + match.getDataLayerVirtualLanPriorityCodePoint()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + int wildcards = OFPFW_ALL & ~OFPFW_DL_VLAN_PCP & ~OFPFW_DL_VLAN; + assertEquals(wildcards, match.getWildcards()); + } + } + + // Test with a specific VID and CFI=1 with mask=0x1fff. + // It matches packets that have an 802.1Q header with that VID + // and any PCP. + for (short vlan: vlans) { + ByteBuffer data = ByteBuffer.allocate(MATCH_LEN_VLAN_TCI_WITH_MASK); + data.putInt(HEADER_VLAN_TCI_W); + short tci = (short) (VLAN_TCI_CFI | vlan); + data.putShort(tci); + short mask = (short) 0x1fff; + data.putShort(mask); + data.flip(); + + V6Match match = new V6Match(); + match.readFrom(data); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + int wildcards = OFPFW_ALL & ~OFPFW_DL_VLAN; + assertEquals(wildcards, match.getWildcards()); + } + + // Test with a specific PCP and CFI=1 with mask=0xf000. + // It matches packets that have an 802.1Q header with that PCP + // and any VID. + for (byte pcp: pcps) { + ByteBuffer data = ByteBuffer.allocate(MATCH_LEN_VLAN_TCI_WITH_MASK); + data.putInt(HEADER_VLAN_TCI_W); + short tci = (short) (pcp << 13| VLAN_TCI_CFI); + data.putShort(tci); + short mask = (short) 0xf000; + data.putShort(mask); + data.flip(); + + V6Match match = new V6Match(); + match.readFrom(data); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, match.getIPv6MatchLen()); + assertEquals(pcp, match.getDataLayerVirtualLanPriorityCodePoint()); + int wildcards = OFPFW_ALL & ~OFPFW_DL_VLAN_PCP; + assertEquals(wildcards, match.getWildcards()); + } + + // Test for an exact match with 0. + // It matches only packets without an 802.1Q header. + ByteBuffer data = ByteBuffer.allocate(MATCH_LEN_VLAN_TCI); + data.putInt(HEADER_VLAN_TCI); + short tci = 0; + data.putShort(tci); + data.flip(); + + V6Match match = new V6Match(); + match.readFrom(data); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(OFP_VLAN_NONE, match.getDataLayerVirtualLan()); + int wildcards = OFPFW_ALL & ~OFPFW_DL_VLAN; + assertEquals(wildcards, match.getWildcards()); + } + + /** + * Test case for {@link V6Match#readFrom(ByteBuffer)} for input port field. + */ + @Test + public void testReadFromInputPort() { + // Set input port. + short ports[] = {1, 10, 100, 1000}; + for (short port: ports) { + ByteBuffer data = ByteBuffer.allocate(MATCH_LEN_INPUT_PORT); + data.putInt(HEADER_INPUT_PORT); + data.putShort(port); + data.flip(); + + V6Match match = new V6Match(); + match.readFrom(data); + assertEquals(MATCH_LEN_INPUT_PORT, match.getIPv6MatchLen()); + assertEquals(port, match.getInputPort()); + int wildcards = OFPFW_ALL & ~OFPFW_IN_PORT; + assertEquals(wildcards, match.getWildcards()); + } + } + + /** + * Test case for {@link V6Match#setDataLayerVirtualLan(short, short)}. + */ + @Test + public void testSetDataLayerVirtualLan() { + short vlans[] = {1, 10, 1000, 4095}; + short mask = 0; + for (short vlan: vlans) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(vlan, mask); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + } + + // Test for OFP_VLAN_NONE. + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(OFP_VLAN_NONE, mask); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(OFP_VLAN_NONE, match.getDataLayerVirtualLan()); + } + + /** + * Test case for + * {@link V6Match#setDataLayerVirtualLanPriorityCodePoint(byte, byte)}. + */ + @Test + public void testSetDataLayerVirtualLanPriorityCodePoint() { + byte pcps[] = {1, 3, 7}; + byte mask = 0; + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + assertEquals(MATCH_LEN_VLAN_TCI_WITH_MASK, match.getIPv6MatchLen()); + assertEquals(pcp, match.getDataLayerVirtualLanPriorityCodePoint()); + } + } + + /** + * Test case for setter methods for VLAN TCI field. + * + * This test case calls {@link V6Match#setDataLayerVirtualLan(short, short)} + * and {@link V6Match#setDataLayerVirtualLanPriorityCodePoint(byte, byte)}. + */ + @Test + public void testSetVlanTCI() { + short vlans[] = {1, 10, 1000, 4095}; + byte pcps[] = {1, 3, 7}; + byte mask = 0; + + // Call setDataLayerVirtualLan(short, short) firstly, + // and setDataLayerVirtualLanPriorityCodePoint(byte, byte) secondly, + for (short vlan: vlans) { + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(vlan, mask); + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + assertEquals(pcp, + match.getDataLayerVirtualLanPriorityCodePoint()); + } + } + + // Call setDataLayerVirtualLanPriorityCodePoint(byte, byte) firstly, + // and setDataLayerVirtualLan(short, short) secondly. + for (short vlan: vlans) { + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + match.setDataLayerVirtualLan(vlan, mask); + assertEquals(MATCH_LEN_VLAN_TCI, match.getIPv6MatchLen()); + assertEquals(vlan, match.getDataLayerVirtualLan()); + assertEquals(pcp, + match.getDataLayerVirtualLanPriorityCodePoint()); + } + } + + // Test for setting OFP_VLAN_NONE when VLAN PCP is set. + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + try { + match.setDataLayerVirtualLan(OFP_VLAN_NONE, mask); + } catch (IllegalStateException e) { + // Throwing exception was expected. + } + } + + // Test for set VLAN PCP when OFP_VLAN_NONE is set to VLAN match. + for (byte pcp: pcps) { + V6Match match = new V6Match(); + match.setDataLayerVirtualLan(OFP_VLAN_NONE, mask); + try { + match.setDataLayerVirtualLanPriorityCodePoint(pcp, mask); + } catch (IllegalStateException e) { + // Throwing exception was expected. + } + } + } + + /** + * Test case for {@link V6Match#setInputPort(short, short)}. + */ + @Test + public void testSetInputPort() { + short ports[] = {1, 10, 100, 1000}; + for (short port: ports) { + V6Match match = new V6Match(); + match.setInputPort(port, (short) 0); + assertEquals(MATCH_LEN_INPUT_PORT, match.getIPv6MatchLen()); + assertEquals(port, match.getInputPort()); + } + } +} diff --git a/pom.xml b/pom.xml index a26533819c..c54d9a930f 100644 --- a/pom.xml +++ b/pom.xml @@ -167,6 +167,7 @@ opendaylight/northbound/java-client + opendaylight/northbound/swagger-ui