Merge "Revert "Replace tabs with spaces in config yang files""
authorEd Warnicke <eaw@cisco.com>
Mon, 2 Dec 2013 11:38:47 +0000 (11:38 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 2 Dec 2013 11:38:47 +0000 (11:38 +0000)
106 files changed:
opendaylight/config/config-api/pom.xml
opendaylight/config/config-api/src/main/yang/config.yang [moved from opendaylight/config/config-api/src/main/resources/META-INF/yang/config.yang with 100% similarity]
opendaylight/config/config-api/src/main/yang/rpc-context.yang [moved from opendaylight/config/config-api/src/main/resources/META-INF/yang/rpc-context.yang with 100% similarity]
opendaylight/config/config-manager/pom.xml
opendaylight/config/config-persister-api/pom.xml
opendaylight/config/config-persister-file-adapter/pom.xml
opendaylight/config/config-plugin-parent/pom.xml [new file with mode: 0644]
opendaylight/config/logback-config/pom.xml
opendaylight/config/netty-config-api/pom.xml
opendaylight/config/netty-event-executor-config/pom.xml
opendaylight/config/netty-threadgroup-config/pom.xml
opendaylight/config/netty-timer-config/pom.xml
opendaylight/config/pom.xml
opendaylight/config/threadpool-config-api/pom.xml
opendaylight/config/threadpool-config-impl/pom.xml
opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java
opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_abs_template_new.ftl
opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_stub_template.ftl
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java
opendaylight/config/yang-jmx-generator/pom.xml
opendaylight/config/yang-store-api/pom.xml
opendaylight/config/yang-store-impl/pom.xml
opendaylight/config/yang-test/pom.xml
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModule.java
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleFactory.java
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleStub.txt [new file with mode: 0644]
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModule.java
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleFactory.java
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleStub.txt [new file with mode: 0644]
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleUtil.java [new file with mode: 0644]
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModule.java
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleFactory.java
opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleStub.txt [new file with mode: 0644]
opendaylight/distribution/opendaylight/pom.xml
opendaylight/md-sal/clustered-data-store/implementation/pom.xml
opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/cluster/store/ClusteredDataStoreImplModule.java [new file with mode: 0644]
opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/cluster/store/ClusteredDataStoreImplModuleFactory.java [new file with mode: 0644]
opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/datastore/ClusteredDataStore.java
opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/datastore/internal/Activator.java [deleted file]
opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/datastore/internal/ClusteredDataStoreImpl.java
opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/datastore/internal/ClusteredDataStoreManager.java
opendaylight/md-sal/clustered-data-store/implementation/src/main/yang/odl-sal-dom-clustered-store-cfg.yang [new file with mode: 0644]
opendaylight/md-sal/clustered-data-store/implementation/src/test/java/org/opendaylight/controller/datastore/internal/ActivatorTest.java [deleted file]
opendaylight/md-sal/clustered-data-store/implementation/src/test/java/org/opendaylight/controller/datastore/internal/ClusteredDataStoreImplTest.java
opendaylight/md-sal/clustered-data-store/implementation/src/test/java/org/opendaylight/controller/datastore/internal/ClusteredDataStoreManagerTest.java
opendaylight/md-sal/clustered-data-store/integrationtest/pom.xml
opendaylight/md-sal/clustered-data-store/integrationtest/src/test/java/org/opendaylight/controller/datastore/ClusteredDataStoreIT.java
opendaylight/md-sal/clustered-data-store/integrationtest/src/test/resources/controller.config [new file with mode: 0644]
opendaylight/md-sal/clustered-data-store/integrationtest/src/test/resources/logback.xml
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/FlowConsumerImpl.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/GroupConsumerImpl.java
opendaylight/md-sal/model/model-flow-base/src/main/yang/group-types.yang
opendaylight/md-sal/model/model-flow-base/src/main/yang/meter-types.yang
opendaylight/md-sal/model/model-flow-statistics/src/main/yang/group-statistics.yang
opendaylight/md-sal/sal-binding-broker/pom.xml
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModuleFactory.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModuleFactory.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModuleFactory.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModule.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModuleFactory.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModule.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModuleFactory.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/CodecMapping.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/CodecTypeUtils.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/LazyGeneratedCodecRegistry.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/RuntimeGeneratedMappingServiceImpl.xtend
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentDataServiceConnector.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/CommitHandlersTransactions.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/ClassLoaderUtils.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/YangSchemaUtils.java [new file with mode: 0644]
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/AbstractDataServiceTest.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug01Test.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug02Test.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug03Test.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/ChangeOriginatedInDomBrokerTest.java
opendaylight/md-sal/sal-common-impl/pom.xml
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/routing/AbstractDataReadRouter.java
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.xtend
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/DataChangeEventImpl.java
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/InitialDataChangeEventImpl.java
opendaylight/md-sal/sal-dom-broker/pom.xml
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/SchemaServiceImpl.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/DataStoreStatsWrapper.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/RpcRouterImpl.xtend
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataMerger.xtend [deleted file]
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataStoreAdapter.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangDataOperations.xtend [new file with mode: 0644]
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangDataUtils.java [new file with mode: 0644]
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangSchemaUtils.java [new file with mode: 0644]
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatistics.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateCommiter.java
opendaylight/netconf/config-persister-impl/configuration/current/controller.config.2.txt [new file with mode: 0644]
opendaylight/netconf/config-persister-impl/pom.xml
opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPersisterNotificationHandler.java
opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/PersisterAggregator.java
opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/DummyAdapter.java [new file with mode: 0644]
opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/PersisterAggregatorTest.java
opendaylight/netconf/config-persister-impl/src/test/resources/test1.properties [new file with mode: 0644]
opendaylight/netconf/config-persister-impl/src/test/resources/test2.properties [new file with mode: 0644]
opendaylight/netconf/config-persister-impl/src/test/resources/test3.properties [new file with mode: 0644]

index d733834b438aee738b234d93b7814999c5817d8c..38fb8ed66be0424afe14ecd57f1e3f0693e683c4 100644 (file)
@@ -1,4 +1,5 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         </dependency>
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>concepts</artifactId>
-            <version>${opendaylight.yangtools.version}</version>
+            <artifactId>yang-binding</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-common</artifactId>
         </dependency>
     </dependencies>
 
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
                     <instructions>
-                        <Import-Package>
-                            javax.management,
-                            org.opendaylight.yangtools.concepts,
-                            org.osgi.framework,
-                        </Import-Package>
                         <Export-Package>
                             org.opendaylight.controller.config.api,
                             org.opendaylight.controller.config.api.annotations,
                             org.opendaylight.controller.config.api.jmx,
                             org.opendaylight.controller.config.api.jmx.constants,
                             org.opendaylight.controller.config.api.runtime,
+                            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.*,
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.*,
                         </Export-Package>
                     </instructions>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+            </plugin>
         </plugins>
     </build>
 </project>
index b55b5da8a20735364c0d647aa0955ec52775a6b4..32f14daaede35d534d758958767bcd47e05f8bc8 100644 (file)
                             org.opendaylight.controller.config.manager.*,
                             javax.annotation.*,
                         </Private-Package>
-                        <Import-Package>
-                            org.opendaylight.controller.config.api.*,
-                            org.opendaylight.controller.config.spi.*,
-                            org.slf4j,
-                            javax.management,
-                            org.osgi.framework,
-                            org.opendaylight.yangtools.concepts.*,
-                            org.apache.commons.io,
-                            org.osgi.util.tracker,
-                        </Import-Package>
                         <Export-Package>
                         </Export-Package>
                     </instructions>
index 51f8c0b8257255d73b5e6d73643a99588a90fdce..80016a804beca18cff5f3e1f9aabd45234a67d50 100644 (file)
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
                     <instructions>
-                        <Import-Package>
-                            com.google.common.base,
-                            org.w3c.dom,
-                            org.osgi.framework,
-                        </Import-Package>
                         <Export-Package>
                             org.opendaylight.controller.config.persist.api,
                             org.opendaylight.controller.config.persist.api.storage,
index d34dc3770714d1141e315fdb49d8eacff04ee9d8..b16cb2b6f366070b95a12ec7b61af3e36e343714 100644 (file)
                         </Fragment-Host>
                         <Provide-Capability>org.opendaylight.controller.config.persister.storage.adapter
                         </Provide-Capability>
-                        <Import-Package>
-                            org.osgi.framework,
-                            com.google.common.base,
-                            com.google.common.collect,
-                            com.google.common.io,
-                            javax.xml.parsers,
-                            javax.xml.transform,
-                            javax.xml.transform.dom,
-                            javax.xml.transform.stream,
-                            org.apache.commons.lang3,
-                            org.opendaylight.controller.config.persist.api,
-                            org.slf4j,
-                            org.w3c.dom,
-                            org.xml.sax,
-                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/opendaylight/config/config-plugin-parent/pom.xml b/opendaylight/config/config-plugin-parent/pom.xml
new file mode 100644 (file)
index 0000000..7696ae5
--- /dev/null
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.opendaylight.controller</groupId>
+        <artifactId>config-subsystem</artifactId>
+        <version>0.2.3-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>config-plugin-parent</artifactId>
+    <name>${project.artifactId}</name>
+    <packaging>pom</packaging>
+    <prerequisites>
+        <maven>3.0.4</maven>
+    </prerequisites>
+
+    <properties>
+        <jmxGeneratorPath>${project.build.directory}/generated-sources/config</jmxGeneratorPath>
+    </properties>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.opendaylight.yangtools</groupId>
+                    <artifactId>yang-maven-plugin</artifactId>
+                    <executions>
+                        <execution>
+                            <id>config</id>
+                            <goals>
+                                <goal>generate-sources</goal>
+                            </goals>
+                            <configuration>
+                                <codeGenerators>
+                                    <generator>
+                                        <codeGeneratorClass>
+                                            org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+                                        </codeGeneratorClass>
+                                        <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
+                                        <additionalConfiguration>
+                                            <namespaceToPackage1>
+                                                urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
+                                            </namespaceToPackage1>
+                                        </additionalConfiguration>
+                                    </generator>
+                                </codeGenerators>
+                                <inspectDependencies>true</inspectDependencies>
+                            </configuration>
+                        </execution>
+                    </executions>
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.opendaylight.controller</groupId>
+                            <artifactId>yang-jmx-generator-plugin</artifactId>
+                            <version>${config.version}</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!-- tell eclipse about generated source folders -->
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>build-helper-maven-plugin</artifactId>
+                    <version>1.8</version>
+                    <executions>
+                        <execution>
+                            <id>add-source</id>
+                            <phase>generate-sources</phase>
+                            <goals>
+                                <goal>add-source</goal>
+                            </goals>
+                            <configuration>
+                                <sources>
+                                    <source>${jmxGeneratorPath}</source>
+                                </sources>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>
index b63f3298c1af9602674894915664499bcb9d038f..7d01d288ed6a58b6bd1f18b31320a4ff0046ed74 100644 (file)
@@ -1,12 +1,14 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.opendaylight.controller</groupId>
-        <artifactId>config-subsystem</artifactId>
+        <artifactId>config-plugin-parent</artifactId>
         <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
     </parent>
     <artifactId>logback-config</artifactId>
     <name>${project.artifactId}</name>
                     <instructions>
                         <Private-Package>
                         </Private-Package>
-                        <Import-Package>
-                            ch.qos.logback.classic,
-                            ch.qos.logback.classic.encoder,
-                            ch.qos.logback.classic.filter,
-                            ch.qos.logback.classic.spi,
-                            ch.qos.logback.core,
-                            ch.qos.logback.core.status,
-                            ch.qos.logback.core.encoder,
-                            ch.qos.logback.core.rolling,
-                            org.opendaylight.controller.config.api,
-                            org.opendaylight.controller.config.api.runtime,
-                            org.opendaylight.controller.config.api.annotations,
-                            org.opendaylight.controller.config.spi,
-                            com.google.common.base,
-                            com.google.common.collect,
-                            org.apache.commons.lang3,
-                            org.slf4j,
-                            org.osgi.framework
-                        </Import-Package>
                         <Export-Package>
                             org.opendaylight.controller.config.yang.logback.config,
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.logback.config.rev130716.*,
                         </Export-Package>
                     </instructions>
                 </configuration>
index 9a2fe372581647169a360cc2c157b2bdfe4ad5ea..19c926a2fbc36e25c0d407144745ce8a5f22a82a 100644 (file)
@@ -1,8 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
     <groupId>org.opendaylight.controller</groupId>
-    <artifactId>config-subsystem</artifactId>
-    <version>0.2.3-SNAPSHOT</version>
+        <artifactId>config-plugin-parent</artifactId>
+        <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>netty-config-api</artifactId>
             <artifactId>maven-bundle-plugin</artifactId>
             <configuration>
                <instructions>
-                  <Import-Package>
-                     org.opendaylight.controller.config.api.*,
-                     io.netty.channel,
-                     io.netty.util,
-                     io.netty.util.concurrent
-                  </Import-Package>
                   <Export-Package>
-                     org.opendaylight.controller.config.yang.netty
+                      org.opendaylight.controller.config.yang.netty,
+                      org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.rev131119.*,
                   </Export-Package>
                </instructions>
             </configuration>
@@ -51,4 +49,4 @@
          </plugin>
       </plugins>
    </build>
-</project>
\ No newline at end of file
+</project>
index 3d5384d171774d053ca01ee39ca1a9e3c784401f..2fce3596d4ad6d082b94d2a04c7f6960339da23c 100644 (file)
@@ -1,9 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
       <groupId>org.opendaylight.controller</groupId>
-      <artifactId>config-subsystem</artifactId>
-      <version>0.2.3-SNAPSHOT</version>
+        <artifactId>config-plugin-parent</artifactId>
+        <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>netty-event-executor-config</artifactId>
                <instructions>
                   <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
                   <Export-Package>
+                      org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.eventexecutor.rev131112.*,
                   </Export-Package>
-                  <Import-Package>
-                     com.google.common.base,
-                     org.opendaylight.controller.config.yang.netty,
-                     io.netty.util.concurrent,
-                     org.opendaylight.controller.config.api,
-                     org.opendaylight.controller.config.api.annotations,
-                     org.opendaylight.controller.config.api.runtime,
-                     org.opendaylight.controller.config.spi,
-                     org.slf4j,
-                     org.osgi.framework
-                  </Import-Package>
                </instructions>
             </configuration>
          </plugin>
@@ -99,4 +92,4 @@
       </site>
    </distributionManagement>
 
-</project>
\ No newline at end of file
+</project>
index 8dc989e7283751c1a91b4e57d789046724b1f5b3..d35067af093fcba04d22ef13c831bc63e4cb300d 100644 (file)
@@ -5,8 +5,9 @@
 
     <parent>
         <groupId>org.opendaylight.controller</groupId>
-        <artifactId>config-subsystem</artifactId>
+        <artifactId>config-plugin-parent</artifactId>
         <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
                     <instructions>
                         <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
                         <Export-Package>
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.threadgroup.rev131107.*,
                         </Export-Package>
-                        <Import-Package>
-                            com.google.common.base,
-                            io.netty.channel.nio,
-                            org.opendaylight.controller.config.yang.netty,
-                            io.netty.util.concurrent,
-                            org.opendaylight.controller.config.api,
-                            org.opendaylight.controller.config.api.annotations,
-                            org.opendaylight.controller.config.api.runtime,
-                            org.opendaylight.controller.config.spi,
-                            org.slf4j,
-                            org.osgi.framework
-                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
index 095e71fcf50dcd4770081ddd6feeb55a1ed8ebe8..161d39278aef9e1a112b3227499fd8b5d431424a 100644 (file)
@@ -1,9 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
       <groupId>org.opendaylight.controller</groupId>
-      <artifactId>config-subsystem</artifactId>
-      <version>0.2.3-SNAPSHOT</version>
+        <artifactId>config-plugin-parent</artifactId>
+        <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>netty-timer-config</artifactId>
                <instructions>
                   <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
                   <Export-Package>
+                      org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.timer.rev131119.*,
                   </Export-Package>
-                  <Import-Package>
-                     javax.management,
-                     com.google.common.base,
-                     org.opendaylight.controller.config.yang.netty,
-                     org.opendaylight.controller.config.yang.threadpool,
-                     io.netty.util,
-                     org.opendaylight.controller.config.api,
-                     org.opendaylight.controller.config.api.annotations,
-                     org.opendaylight.controller.config.api.runtime,
-                     org.opendaylight.controller.config.spi,
-                     org.slf4j,
-                     org.osgi.framework
-                  </Import-Package>
                </instructions>
             </configuration>
          </plugin>
          <url>${basedir}/target/site/${project.artifactId}</url>
       </site>
    </distributionManagement>
-</project>
\ No newline at end of file
+</project>
index c1eef701da271014a5777f098926562a54a45074..c9ed19dacb2c0256f811025e2be01409b09e5bbc 100644 (file)
@@ -1,3 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
@@ -20,6 +22,7 @@
     <modules>
         <module>config-api</module>
         <module>config-manager</module>
+        <module>config-plugin-parent</module>
         <module>config-util</module>
         <module>config-persister-api</module>
         <module>config-persister-file-adapter</module>
@@ -63,7 +66,6 @@
         <opendaylight.yang.version>0.5.9-SNAPSHOT</opendaylight.yang.version>
         <opendaylight.binding.version>0.6.0-SNAPSHOT</opendaylight.binding.version>
         <opendaylight.yangtools.version>0.1.1-SNAPSHOT</opendaylight.yangtools.version>
-        <jmxGeneratorPath>${project.build.directory}/generated-sources/config</jmxGeneratorPath>
     </properties>
 
     <dependencies>
                 <artifactId>yang-store-api</artifactId>
                 <version>${config.version}</version>
             </dependency>
+
+            <!-- MD-SAL -->
+            <dependency>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-binding</artifactId>
+                <version>${opendaylight.binding.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-common</artifactId>
+                <version>${opendaylight.yang.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>concepts</artifactId>
+                <version>${opendaylight.yangtools.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
             </plugin>
         </plugins>
 
-
-
         <pluginManagement>
             <plugins>
                 <plugin>
                     <version>${opendaylight.yang.version}</version>
                     <executions>
                         <execution>
+                            <id>sal</id>
                             <goals>
                                 <goal>generate-sources</goal>
                             </goals>
                             <configuration>
+                                <yangFilesRootDir>src/main/yang</yangFilesRootDir>
                                 <codeGenerators>
                                     <generator>
                                         <codeGeneratorClass>
-                                            org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+                                            org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
                                         </codeGeneratorClass>
-                                        <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
-                                        <additionalConfiguration>
-                                            <namespaceToPackage1>
-                                                urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
-                                            </namespaceToPackage1>
-                                        </additionalConfiguration>
+                                        <outputBaseDir>
+                                            target/generated-sources/sal
+                                        </outputBaseDir>
+                                    </generator>
+                                    <generator>
+                                        <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+                                        <outputBaseDir>target/site</outputBaseDir>
                                     </generator>
                                 </codeGenerators>
                                 <inspectDependencies>true</inspectDependencies>
                     </executions>
                     <dependencies>
                         <dependency>
-                            <groupId>org.opendaylight.controller</groupId>
-                            <artifactId>yang-jmx-generator-plugin</artifactId>
-                            <version>${config.version}</version>
+                            <groupId>org.opendaylight.yangtools</groupId>
+                            <artifactId>maven-sal-api-gen-plugin</artifactId>
+                            <version>${opendaylight.binding.version}</version>
+                            <type>jar</type>
                         </dependency>
                     </dependencies>
                 </plugin>
-                <!-- tell eclipse about generated source folders -->
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>build-helper-maven-plugin</artifactId>
-                    <version>1.8</version>
-                    <executions>
-                        <execution>
-                            <id>add-source</id>
-                            <phase>generate-sources</phase>
-                            <goals>
-                                <goal>add-source</goal>
-                            </goals>
-                            <configuration>
-                                <sources>
-                                    <source>${jmxGeneratorPath}</source>
-                                </sources>
-                            </configuration>
-                        </execution>
-                    </executions>
-                </plugin>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-jar-plugin</artifactId>
index 5c70ac7958fdd4a9af2803879bb598c2d2bee11f..49e9f0da9ac4f2c4e3981f80a45360172b995dd3 100644 (file)
@@ -1,9 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
       <groupId>org.opendaylight.controller</groupId>
-      <artifactId>config-subsystem</artifactId>
-      <version>0.2.3-SNAPSHOT</version>
+        <artifactId>config-plugin-parent</artifactId>
+        <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>threadpool-config-api</artifactId>
             <artifactId>maven-bundle-plugin</artifactId>
             <configuration>
                <instructions>
-                  <Import-Package>
-                     org.opendaylight.controller.config.api.*,
-                     com.google.common.eventbus,
-                  </Import-Package>
                   <Export-Package>
                      org.opendaylight.controller.config.threadpool,
-                     org.opendaylight.controller.config.yang.threadpool
+                     org.opendaylight.controller.config.yang.threadpool,
+                     org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.threadpool.rev130409.*,
                   </Export-Package>
                </instructions>
             </configuration>
@@ -48,4 +48,4 @@
          </plugin>
       </plugins>
    </build>
-</project>
\ No newline at end of file
+</project>
index cde64363cfe4454c1ca6184ff6e3c81efef520e4..4cbe3976933afc070b3b0d81578bfe3f68e7033b 100644 (file)
@@ -1,9 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
       <groupId>org.opendaylight.controller</groupId>
-      <artifactId>config-subsystem</artifactId>
-      <version>0.2.3-SNAPSHOT</version>
+        <artifactId>config-plugin-parent</artifactId>
+        <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>threadpool-config-impl</artifactId>
                      javax.annotation.*,
                      org.opendaylight.controller.config.yang.threadpool.impl,
                   </Private-Package>
-                  <Import-Package>
-                     org.opendaylight.controller.config.api.*,
-                     org.opendaylight.controller.config.spi.*,
-                     org.opendaylight.controller.config.threadpool,
-                     org.opendaylight.controller.config.yang.threadpool,
-                     javax.management,
-                     org.osgi.framework,
-                     org.slf4j,
-                     com.google.common.*
-                  </Import-Package>
                   <Export-Package>
-                     org.opendaylight.controller.config.threadpool.util
+                      org.opendaylight.controller.config.threadpool.util,
+                      org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.threadpool.impl.rev130405.*,
                   </Export-Package>
                </instructions>
             </configuration>
index 7351822db9d8096f46dbce588872c34a6c744448..d0646f467a50416a71bb7d5f5c0c42cdfd343abf 100644 (file)
@@ -55,6 +55,11 @@ package ${packageName};
         dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, ${field.name}, ${field.name}JmxAttribute);
         </#if>
     </#list>
+        customValidation();
+    }
+
+    protected void customValidation(){
+
     }
 
     // caches of resolved dependencies
@@ -110,7 +115,7 @@ package ${packageName};
 
     public boolean canReuseInstance(${typeDeclaration.name} oldModule){
         // allow reusing of old instance if no parameters was changed
-        return equals(oldModule);
+        return isSame(oldModule);
     }
 
     public ${instanceType} reuseInstance(${instanceType} oldInstance){
@@ -120,34 +125,50 @@ package ${packageName};
 
     public abstract ${instanceType} createInstance();
 
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ${typeDeclaration.name} other = (${typeDeclaration.name}) obj;
-
-
+    public boolean isSame(${typeDeclaration.name} other) {
+        if (other == null) {
+            throw new IllegalArgumentException("Parameter 'other' is null");
+        }
         <#list moduleFields as field>
         <#if field.dependent==true>
         if (${field.name}Dependency == null) {
             if (other.${field.name}Dependency != null)
                 return false;
-        } else if (!${field.name}Dependency.equals(other.${field.name}Dependency))
+        } else if (!${field.name}Dependency.equals(other.${field.name}Dependency)) {
             return false;
+        }
         <#else>
         if (${field.name} == null) {
-            if (other.${field.name} != null)
+            if (other.${field.name} != null) {
                 return false;
-        } else if (!${field.name}.equals(other.${field.name}))
+            }
+        } else if
+            <#if field.array == false>
+                (${field.name}.equals(other.${field.name}) == false)
+            <#else>
+                (java.util.Arrays.equals(${field.name},other.${field.name}) == false)
+            </#if>
+                 {
             return false;
+        }
         </#if>
         </#list>
 
         return true;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        ${typeDeclaration.name} that = (${typeDeclaration.name}) o;
+
+        return identifier.equals(that.identifier);
+    }
+
+    @Override
+    public int hashCode() {
+        return identifier.hashCode();
+    }
 }
index 23dce9321e3e10ca8d3ba4015e0c3fc2244233b2..2db505e54effb00cc9df5381e2ad95bf5e155312 100644 (file)
@@ -2,20 +2,20 @@
 package ${packageName};
 
 <@javadocD object=javadoc/>
-<@typeDeclarationD object=typeDeclaration/>
-{
+<@typeDeclarationD object=typeDeclaration/> {
 
     public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver) {
         super(identifier, dependencyResolver);
     }
 
-    public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver, ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) {
+    public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver,
+            ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) {
+
         super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate(){
-        super.validate();
+    protected void customValidation(){
         // Add custom validation for module attributes here.
     }
 
index 556abad7af2b9b80f4623cca42c4411f7191e974..0d6ec3cccbeedf872bbd61c8649f6c66cf743a63 100644 (file)
@@ -584,7 +584,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest {
         assertContains(reqIfc, PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX
                 + ".threads.ThreadFactoryServiceInterface");
 
-        assertEquals("Incorrenct number of generated methods", 24,
+        assertEquals("Incorrenct number of generated methods", 27,
                 visitor.methods.size());
         assertEquals("Incorrenct number of generated method descriptions", 3,
                 visitor.methodDescriptions.size());
index cd985714d46804ecf84d713a0882811d9177aa38..c312cc849351587096c871c5edefe9bd25954efd 100644 (file)
                         <Private-Package>
                             org.opendaylight.controller.config.yangjmxgenerator.plugin.util,
                         </Private-Package>
-                        <Import-Package>
-                            org.slf4j,
-                            com.google.common.base,
-                            com.google.common.collect,
-                            javax.management.*,
-                            <!-- YANGTOOLS -->
-                            org.opendaylight.yangtools.binding.generator.util,
-                            org.opendaylight.yangtools.sal.binding.generator.spi,
-                            org.opendaylight.yangtools.sal.binding.model.api,
-                            org.opendaylight.yangtools.yang.common,
-                            org.opendaylight.yangtools.yang.model.api
-                        </Import-Package>
                         <Export-Package>
                             org.opendaylight.controller.config.yangjmxgenerator,
                             org.opendaylight.controller.config.yangjmxgenerator.attribute,
index 382dced3e754b08e8f4c593b3fca2ae9bcb11eaf..c97eade26ca5d9dad3087b71252dc85cacfa213d 100644 (file)
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
                     <instructions>
-                        <Import-Package>
-                            org.opendaylight.controller.config.yangjmxgenerator,
-                            org.opendaylight.yangtools.yang.model.api
-                        </Import-Package>
                         <Export-Package>
                             org.opendaylight.controller.config.yang.store.api,
                         </Export-Package>
index 7b79c831f84477253bdcf647303631ebdc8e2f13..3b0d58a32f28cb329b35e4ea33816d7624076082 100644 (file)
                 <configuration>
                     <instructions>
                         <Bundle-Activator>org.opendaylight.controller.config.yang.store.impl.YangStoreActivator</Bundle-Activator>
-                        <Import-Package>
-                            org.opendaylight.controller.config.yang.store.api,
-                            org.opendaylight.controller.config.yangjmxgenerator,
-                            com.google.common.base,
-                            com.google.common.collect,
-                            com.google.common.primitives,
-                            org.apache.commons.io,
-                            org.osgi.framework,
-                            org.osgi.util.tracker,
-                            org.slf4j,
-                            <!-- YANGTOOLS -->
-                            org.opendaylight.yangtools.sal.binding.yang.types,
-                            org.opendaylight.yangtools.yang.common,
-                            org.opendaylight.yangtools.yang.model.api,
-                            org.opendaylight.yangtools.sal.binding.generator.spi,
-                            org.opendaylight.yangtools.yang.parser.impl,
-                        </Import-Package>
                         <Export-Package>
                         </Export-Package>
                     </instructions>
index f8d86b28bb2033f25874754acbfff2fdde4080b5..e3737c78f34d584e4771dc8df99b466d1897a828 100644 (file)
@@ -1,11 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <project
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.opendaylight.controller</groupId>
-        <artifactId>config-subsystem</artifactId>
+        <artifactId>config-plugin-parent</artifactId>
         <version>0.2.3-SNAPSHOT</version>
+        <relativePath>../config-plugin-parent</relativePath>
     </parent>
 
     <artifactId>yang-test</artifactId>
index 76df839665558ebc7a937d8d59f456f7c509d138..1122c1ffa46a16078623850314bb4cee3fd4aef0 100644 (file)
@@ -1,38 +1,23 @@
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl  yang module local name: impl-dep
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
 package org.opendaylight.controller.config.yang.test.impl;
 
-
 /**
 *
 */
-public final class DepTestImplModule
-        extends
-        org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModule {
+public final class DepTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModule
+ {
 
-    public DepTestImplModule(
-            org.opendaylight.controller.config.api.ModuleIdentifier name,
-            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-        super(name, dependencyResolver);
+    public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
     }
 
-    public DepTestImplModule(
-            org.opendaylight.controller.config.api.ModuleIdentifier name,
-            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+    public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
             DepTestImplModule oldModule, java.lang.AutoCloseable oldInstance) {
-        super(name, dependencyResolver, oldModule, oldInstance);
+
+        super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate() {
-        super.validate();
+    protected void customValidation(){
         // Add custom validation for module attributes here.
     }
 
@@ -44,5 +29,4 @@ public final class DepTestImplModule
             }
         };
     }
-
 }
index b07cf40f821a5131a6f2a70bcdbddce6f93c2451..4152736768ca9ce12d089cb1fb039a536b712c47 100644 (file)
@@ -1,19 +1,10 @@
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl  yang module local name: impl-dep
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
 package org.opendaylight.controller.config.yang.test.impl;
 
 /**
 *
 */
-public class DepTestImplModuleFactory
-        extends
-        org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModuleFactory {
+public class DepTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModuleFactory
+{
+
 
 }
diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleStub.txt b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleStub.txt
new file mode 100644 (file)
index 0000000..80c1e54
--- /dev/null
@@ -0,0 +1,5 @@
+        return new AutoCloseable() {
+            @Override
+            public void close() throws Exception {
+            }
+        };
index ae86d42d8ebd18458aa69f80d47024bbbdd4c131..7e1848dd6a7f20f6692d5dc5f5cfefd49b587190 100644 (file)
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl  yang module local name: impl-netconf
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
 package org.opendaylight.controller.config.yang.test.impl;
 
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
 /**
 *
 */
-public final class NetconfTestImplModule
-        extends
-        org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModule {
+public final class NetconfTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModule
+ {
 
-    public NetconfTestImplModule(
-            org.opendaylight.controller.config.api.ModuleIdentifier name,
-            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-        super(name, dependencyResolver);
+    public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
     }
 
-    public NetconfTestImplModule(
-            org.opendaylight.controller.config.api.ModuleIdentifier name,
-            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+    public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
             NetconfTestImplModule oldModule, java.lang.AutoCloseable oldInstance) {
-        super(name, dependencyResolver, oldModule, oldInstance);
+
+        super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate() {
-        super.validate();
+    protected void customValidation(){
         // Add custom validation for module attributes here.
     }
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        return registerRuntimeBeans();
+        return NetconfTestImplModuleUtil.registerRuntimeBeans(this);
     }
-
-    private NetconfTestImplRuntimeRegistration registerRuntimeBeans() {
-        NetconfTestImplRuntimeRegistration reg = getRootRuntimeBeanRegistratorWrapper().register(new NetconfTestImplRuntimeMXBean() {
-
-            @Override
-            public Long getCreatedSessions() {
-                return getSimpleLong();
-            }
-
-            @Override
-            public Asdf getAsdf() {
-                final Asdf asdf = new Asdf();
-                asdf.setSimpleString("asdf");
-                return asdf;
-            }
-
-            @Override
-            public String noArg(final String arg1) {
-                return arg1.toUpperCase();
-            }
-
-        });
-
-        for (int i = 0; i < getSimpleShort(); i++) {
-            final int finalI = i;
-
-            reg.register(new InnerRunningDataAdditionalRuntimeMXBean() {
-                @Override
-                public Integer getSimpleInt3() {
-                    return getSimpleTest();
-                }
-
-                @Override
-                public Deep4 getDeep4() {
-                    final Deep4 d = new Deep4();
-                    d.setBoool(false);
-                    return d;
-                }
-
-                @Override
-                public String getSimpleString() {
-                    return Integer.toString(finalI);
-                }
-
-                @Override
-                public void noArgInner() {
-                }
-            });
-
-            InnerRunningDataRuntimeRegistration innerReg = reg.register(new InnerRunningDataRuntimeMXBean() {
-                @Override
-                public Integer getSimpleInt3() {
-                    return finalI;
-                }
-
-                @Override
-                public Deep2 getDeep2() {
-                    return new Deep2();
-                }
-            });
-
-            for (int j = 0; j < getSimpleShort(); j++) {
-                final int finalJ = j;
-                innerReg.register(new InnerInnerRunningDataRuntimeMXBean() {
-                    @Override
-                    public List<NotStateBean> getNotStateBean() {
-                        NotStateBean b1 = new NotStateBean();
-                        b1.setElement("not state");
-                        return Lists.newArrayList(b1);
-                    }
-
-                    @Override
-                    public Integer getSimpleInt3() {
-                        return finalJ;
-                    }
-
-                    @Override
-                    public Deep3 getDeep3() {
-                        return new Deep3();
-                    }
-
-                    @Override
-                    public List<String> getListOfStrings() {
-                        return Lists.newArrayList("l1", "l2");
-                    }
-
-                    @Override
-                    public List<RetValList> listOutput() {
-                        return Lists.newArrayList(new RetValList());
-                    }
-
-                    @Override
-                    public Boolean noArgInnerInner(Integer integer, Boolean aBoolean) {
-                        return aBoolean;
-                    }
-
-                    @Override
-                    public RetValContainer containerOutput() {
-                        return new RetValContainer();
-                    }
-
-                    @Override
-                    public List<String> leafListOutput() {
-                        return Lists.newArrayList("1", "2");
-                    }
-                });
-            }
-        }
-
-        return reg;
-    }
-
 }
index e99c64dd3b473674b62e619eaba59d704cf80ffa..7cab5288680b9f2cfe454d3630c1e92f3b29d3bc 100644 (file)
@@ -1,19 +1,10 @@
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl  yang module local name: impl-netconf
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
 package org.opendaylight.controller.config.yang.test.impl;
 
 /**
 *
 */
-public class NetconfTestImplModuleFactory
-        extends
-        org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModuleFactory {
+public class NetconfTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModuleFactory
+{
+
 
 }
diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleStub.txt b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleStub.txt
new file mode 100644 (file)
index 0000000..6515412
--- /dev/null
@@ -0,0 +1 @@
+return NetconfTestImplModuleUtil.registerRuntimeBeans(this);
diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleUtil.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleUtil.java
new file mode 100644 (file)
index 0000000..58943c9
--- /dev/null
@@ -0,0 +1,126 @@
+/**
+ * @author Tomas Olvecky
+ *
+ * 11 2013
+ *
+ * Copyright (c) 2013 by Cisco Systems, Inc.
+ * All rights reserved.
+ */
+package org.opendaylight.controller.config.yang.test.impl;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+public class NetconfTestImplModuleUtil {
+    static NetconfTestImplRuntimeRegistration registerRuntimeBeans(final NetconfTestImplModule module) {
+        NetconfTestImplRuntimeRegistration reg = module.getRootRuntimeBeanRegistratorWrapper().register(new NetconfTestImplRuntimeMXBean() {
+
+            @Override
+            public Long getCreatedSessions() {
+                return module.getSimpleLong();
+            }
+
+            @Override
+            public Asdf getAsdf() {
+                final Asdf asdf = new Asdf();
+                asdf.setSimpleString("asdf");
+                return asdf;
+            }
+
+            @Override
+            public String noArg(final String arg1) {
+                return arg1.toUpperCase();
+            }
+
+        });
+
+        for (int i = 0; i < module.getSimpleShort(); i++) {
+            final int finalI = i;
+
+            reg.register(new InnerRunningDataAdditionalRuntimeMXBean() {
+                @Override
+                public Integer getSimpleInt3() {
+                    return module.getSimpleTest();
+                }
+
+                @Override
+                public Deep4 getDeep4() {
+                    final Deep4 d = new Deep4();
+                    d.setBoool(false);
+                    return d;
+                }
+
+                @Override
+                public String getSimpleString() {
+                    return Integer.toString(finalI);
+                }
+
+                @Override
+                public void noArgInner() {
+                }
+            });
+
+            InnerRunningDataRuntimeRegistration innerReg = reg.register(new InnerRunningDataRuntimeMXBean() {
+                @Override
+                public Integer getSimpleInt3() {
+                    return finalI;
+                }
+
+                @Override
+                public Deep2 getDeep2() {
+                    return new Deep2();
+                }
+            });
+
+            for (int j = 0; j < module.getSimpleShort(); j++) {
+                final int finalJ = j;
+                innerReg.register(new InnerInnerRunningDataRuntimeMXBean() {
+                    @Override
+                    public List<NotStateBean> getNotStateBean() {
+                        NotStateBean b1 = new NotStateBean();
+                        b1.setElement("not state");
+                        return Lists.newArrayList(b1);
+                    }
+
+                    @Override
+                    public Integer getSimpleInt3() {
+                        return finalJ;
+                    }
+
+                    @Override
+                    public Deep3 getDeep3() {
+                        return new Deep3();
+                    }
+
+                    @Override
+                    public List<String> getListOfStrings() {
+                        return Lists.newArrayList("l1", "l2");
+                    }
+
+                    @Override
+                    public List<RetValList> listOutput() {
+                        return Lists.newArrayList(new RetValList());
+                    }
+
+                    @Override
+                    public Boolean noArgInnerInner(Integer integer, Boolean aBoolean) {
+                        return aBoolean;
+                    }
+
+                    @Override
+                    public RetValContainer containerOutput() {
+                        return new RetValContainer();
+                    }
+
+                    @Override
+                    public List<String> leafListOutput() {
+                        return Lists.newArrayList("1", "2");
+                    }
+                });
+            }
+        }
+
+        return reg;
+    }
+}
index dfd9ebc021bfa62fef45dc4fb28e5dfc5678b2b3..52a71620bf0062f929e2496dac32d094f66d7157 100644 (file)
@@ -1,38 +1,23 @@
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl  yang module local name: impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
 package org.opendaylight.controller.config.yang.test.impl;
 
-
 /**
 *
 */
-public final class TestImplModule
-        extends
-        org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModule {
+public final class TestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModule
+ {
 
-    public TestImplModule(
-            org.opendaylight.controller.config.api.ModuleIdentifier name,
-            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-        super(name, dependencyResolver);
+    public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
     }
 
-    public TestImplModule(
-            org.opendaylight.controller.config.api.ModuleIdentifier name,
-            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+    public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
             TestImplModule oldModule, java.lang.AutoCloseable oldInstance) {
-        super(name, dependencyResolver, oldModule, oldInstance);
+
+        super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate() {
-        super.validate();
+    protected void customValidation(){
         // Add custom validation for module attributes here.
     }
 
@@ -44,5 +29,4 @@ public final class TestImplModule
             }
         };
     }
-
 }
index 1e86c83655eda9ab864b8892f512fdf66030bb69..ce9aa92b64ea0f4c61911b0f969c71ed048bac21 100644 (file)
@@ -1,19 +1,10 @@
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl  yang module local name: impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
 package org.opendaylight.controller.config.yang.test.impl;
 
 /**
 *
 */
-public class TestImplModuleFactory
-        extends
-        org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModuleFactory {
+public class TestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModuleFactory
+{
+
 
 }
diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleStub.txt b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleStub.txt
new file mode 100644 (file)
index 0000000..80c1e54
--- /dev/null
@@ -0,0 +1,5 @@
+        return new AutoCloseable() {
+            @Override
+            public void close() throws Exception {
+            }
+        };
index d1b1e736365aaff9ed9aad9ebcafee77083b58a4..9ce668da85a63dd0145daac62a34574a4a8d4054 100644 (file)
           <version>0.1.1-SNAPSHOT</version>
         </dependency>
 
+        <dependency>
+          <groupId>org.opendaylight.controller</groupId>
+          <artifactId>clustered-datastore-implementation</artifactId>
+          <version>0.4.1-SNAPSHOT</version>
+        </dependency>
+
+
         <!-- config-->
         <dependency>
           <groupId>org.opendaylight.controller</groupId>
index a3d11d0374cade2eec78f10440700d3b262754dd..07ff98b9c521324536efdb292d425d933de8332e 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal-parent</artifactId>
-      <version>1.0-SNAPSHOT</version>
-      <relativePath>../..</relativePath>
-  </parent>
-  <scm>
-    <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
-    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
-    <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
-    <tag>HEAD</tag>
-  </scm>
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.opendaylight.controller</groupId>
+        <artifactId>sal-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../..</relativePath>
+    </parent>
+    <scm>
+        <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+        <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+        <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
+        <tag>HEAD</tag>
+    </scm>
 
-  <artifactId>clustered-datastore-implementation</artifactId>
-  <version>0.4.1-SNAPSHOT</version>
-  <packaging>bundle</packaging>
+    <artifactId>clustered-datastore-implementation</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>${bundle.plugin.version}</version>
-        <extensions>true</extensions>
-        <configuration>
-          <instructions>
-            <Export-Package>
-              org.opendaylight.controller.datastore
-            </Export-Package>
-            <Import-Package>
-              javax.xml.bind.annotation,
-              org.opendaylight.controller.sal.core,
-              org.opendaylight.controller.sal.utils,
-              org.opendaylight.controller.sal.packet,
-              org.opendaylight.controller.sal.topology,
-              org.opendaylight.controller.clustering.services,
-              org.opendaylight.controller.md.sal.common.api.data,
-              org.opendaylight.controller.sal.common.util,
-              org.opendaylight.yangtools.yang.binding,
-              org.osgi.service.component,
-              org.slf4j,
-              org.apache.felix.dm,
-              org.apache.commons.lang3.builder,
-              org.apache.commons.lang3.tuple,
-              org.eclipse.osgi.framework.console,
-              org.osgi.framework,
-              com.google.common.base
-            </Import-Package>
-            <Bundle-Activator>
-              org.opendaylight.controller.datastore.internal.Activator
-            </Bundle-Activator>
-          </instructions>
-          <manifestLocation>${project.basedir}/META-INF</manifestLocation>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>${bundle.plugin.version}</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                    </instructions>
+                    <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-maven-plugin</artifactId>
+                <version>0.5.9-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>generate-sources</goal>
+                        </goals>
+                        <configuration>
+                            <codeGenerators>
+                                <generator>
+                                    <codeGeneratorClass>
+                                        org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+                                    </codeGeneratorClass>
+                                    <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+                                    <additionalConfiguration>
+                                        <namespaceToPackage1>
+                                            urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
+                                        </namespaceToPackage1>
+                                    </additionalConfiguration>
+                                </generator>
+                            </codeGenerators>
+                            <inspectDependencies>true</inspectDependencies>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.opendaylight.controller</groupId>
+                        <artifactId>yang-jmx-generator-plugin</artifactId>
+                        <version>0.2.3-SNAPSHOT</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
 
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-    <dependency>
-        <groupId>org.opendaylight.controller</groupId>
-        <artifactId>sal-common-api</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal-common-util</artifactId>
-      <version>1.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal</artifactId>
-      <version>0.5.1-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>clustering.services</artifactId>
-      <version>0.4.1-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-       <groupId>org.mockito</groupId>
-       <artifactId>mockito-all</artifactId>
-       <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>equinoxSDK381</groupId>
-      <artifactId>org.eclipse.osgi</artifactId>
-      <version>3.8.1.v20120830-144521</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-binding</artifactId>
-    </dependency>
-  </dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-core-api</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common-util</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-api</artifactId>
+            <version>0.2.3-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal</artifactId>
+            <version>0.5.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>clustering.services</artifactId>
+            <version>0.4.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-binding</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-api</artifactId>
+        </dependency>
+
+    </dependencies>
 </project>
diff --git a/opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/cluster/store/ClusteredDataStoreImplModule.java b/opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/cluster/store/ClusteredDataStoreImplModule.java
new file mode 100644 (file)
index 0000000..5038cae
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+* Generated file
+
+* Generated from: yang module name: odl-sal-dom-clustered-store-cfg  yang module local name: dom-clustered-store-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Wed Nov 27 17:09:17 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.md.sal.dom.cluster.store;
+
+import org.opendaylight.controller.datastore.internal.ClusteredDataStoreManager;
+import org.osgi.framework.BundleContext;
+
+/**
+*
+*/
+public final class ClusteredDataStoreImplModule extends org.opendaylight.controller.config.yang.md.sal.dom.cluster.store.AbstractClusteredDataStoreImplModule
+{
+
+    private BundleContext bundleContext;
+
+    public ClusteredDataStoreImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public ClusteredDataStoreImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, ClusteredDataStoreImplModule oldModule, java.lang.AutoCloseable oldInstance) {
+        super(identifier, dependencyResolver, oldModule, oldInstance);
+    }
+
+    @Override
+    public void validate(){
+        super.validate();
+        // Add custom validation for module attributes here.
+    }
+
+    @Override
+    public java.lang.AutoCloseable createInstance() {
+        ClusteredDataStoreManager manager = new ClusteredDataStoreManager();
+        manager.setContext(bundleContext);
+        manager.start();
+        return manager;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+}
diff --git a/opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/cluster/store/ClusteredDataStoreImplModuleFactory.java b/opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/cluster/store/ClusteredDataStoreImplModuleFactory.java
new file mode 100644 (file)
index 0000000..8a926eb
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+* Generated file
+
+* Generated from: yang module name: odl-sal-dom-clustered-store-cfg  yang module local name: dom-clustered-store-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Wed Nov 27 17:09:17 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.md.sal.dom.cluster.store;
+
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.opendaylight.controller.config.api.DynamicMBeanWithInstance;
+import org.opendaylight.controller.config.spi.Module;
+import org.osgi.framework.BundleContext;
+
+/**
+*
+*/
+public class ClusteredDataStoreImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.dom.cluster.store.AbstractClusteredDataStoreImplModuleFactory
+{
+
+    @Override
+    public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) {
+        ClusteredDataStoreImplModule module = 
+        (ClusteredDataStoreImplModule) super.createModule(instanceName, dependencyResolver, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+    
+    @Override
+    public Module createModule(String instanceName, DependencyResolver dependencyResolver,
+            DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
+        ClusteredDataStoreImplModule module = 
+                (ClusteredDataStoreImplModule) super.createModule(instanceName, dependencyResolver, old, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+
+}
index 0a577ad999ac2a660da158ddbf78550bc1bdecf5..1aecb967f14fbfb1b0949db83e1a5e7a7676c84b 100644 (file)
@@ -12,7 +12,11 @@ package org.opendaylight.controller.datastore;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.controller.sal.core.api.data.DataStore;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+
+public interface ClusteredDataStore extends DataStore {
+
 
-public interface ClusteredDataStore extends DataReader<InstanceIdentifier<? extends Object>, Object>, DataCommitHandler<InstanceIdentifier<? extends Object>,Object> {
 }
diff --git a/opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/datastore/internal/Activator.java b/opendaylight/md-sal/clustered-data-store/implementation/src/main/java/org/opendaylight/controller/datastore/internal/Activator.java
deleted file mode 100644 (file)
index c94355d..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.datastore.internal;
-
-import org.apache.felix.dm.Component;
-import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
-import org.opendaylight.controller.datastore.ClusteredDataStore;
-import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.Set;
-
-public class Activator extends ComponentActivatorAbstractBase {
-    protected static final Logger logger = LoggerFactory
-            .getLogger(Activator.class);
-
-
-    @Override
-    protected Object[] getGlobalImplementations(){
-       logger.debug("Calling getGlobalImplementations to return:", ClusteredDataStoreManager.class);
-        return new Object[] {
-            ClusteredDataStoreManager.class
-        };
-    }
-
-
-    @Override
-    protected void configureGlobalInstance(Component c, Object imp){
-        if (imp.equals(ClusteredDataStoreManager.class)) {
-            Dictionary<String, Set<String>> props = new Hashtable<String, Set<String>>();
-
-            c.setInterface(new String[] { ClusteredDataStore.class.getName() }, props);
-            logger.debug("configureGlobalInstance adding dependency:", IClusterGlobalServices.class);
-            
-            c.add(createServiceDependency().setService(
-                    IClusterGlobalServices.class).setCallbacks(
-                    "setClusterGlobalServices",
-                    "unsetClusterGlobalServices").setRequired(true));
-
-        }
-    }
-
-
-}
index 18b98925637cb1c2d5fc9dbfd39a8c0a72001a48..5449c839f5082e7be1ff6321f886e4965789db68 100644 (file)
@@ -10,6 +10,7 @@
 package org.opendaylight.controller.datastore.internal;
 
 import com.google.common.base.Preconditions;
+
 import org.opendaylight.controller.clustering.services.CacheConfigException;
 import org.opendaylight.controller.clustering.services.CacheExistException;
 import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
@@ -17,9 +18,12 @@ import org.opendaylight.controller.clustering.services.IClusterServices;
 import org.opendaylight.controller.datastore.ClusteredDataStore;
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
 import org.opendaylight.controller.sal.common.util.Rpcs;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Collections;
 import java.util.EnumSet;
@@ -35,54 +39,74 @@ public class ClusteredDataStoreImpl implements ClusteredDataStore {
     public static final String OPERATIONAL_DATA_CACHE = "clustered_data_store.operational_data_cache";
     public static final String CONFIGURATION_DATA_CACHE = "clustered_data_store.configuration_data_cache";
 
-    private final ConcurrentMap operationalDataCache;
-    private final ConcurrentMap configurationDataCache;
+    private final ConcurrentMap<InstanceIdentifier, CompositeNode> operationalDataCache;
+    private final ConcurrentMap<InstanceIdentifier, CompositeNode> configurationDataCache;
+
+    private Logger logger = LoggerFactory.getLogger(ClusteredDataStoreImpl.class);
 
-    public ClusteredDataStoreImpl(IClusterGlobalServices clusterGlobalServices) throws CacheExistException, CacheConfigException {
+    public ClusteredDataStoreImpl(IClusterGlobalServices clusterGlobalServices) throws CacheConfigException {
+        logger.info("Constructing clustered data store");
         Preconditions.checkNotNull(clusterGlobalServices, "clusterGlobalServices cannot be null");
 
         operationalDataCache = getOrCreateCache(clusterGlobalServices, OPERATIONAL_DATA_CACHE);
 
-        if(operationalDataCache == null){
-            Preconditions.checkNotNull(operationalDataCache, "operationalDataCache cannot be null");
-        }
+        Preconditions.checkNotNull(operationalDataCache, "operationalDataCache cannot be null");
 
         configurationDataCache = getOrCreateCache(clusterGlobalServices, CONFIGURATION_DATA_CACHE);
 
-        if(configurationDataCache == null){
-            Preconditions.checkNotNull(configurationDataCache, "configurationDataCache cannot be null");
-        }
-
+        Preconditions.checkNotNull(configurationDataCache, "configurationDataCache cannot be null");
     }
 
     @Override
-    public DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> requestCommit(DataModification<InstanceIdentifier<? extends Object>, Object> modification) {
+    public DataCommitTransaction<InstanceIdentifier, CompositeNode> requestCommit(DataModification<InstanceIdentifier, CompositeNode> modification) {
         return new ClusteredDataStoreTransaction(modification);
     }
 
     @Override
-    public Object readOperationalData(InstanceIdentifier<? extends Object> path) {
+    public CompositeNode readOperationalData(InstanceIdentifier path) {
         Preconditions.checkNotNull(path, "path cannot be null");
         return operationalDataCache.get(path);
     }
 
     @Override
-    public Object readConfigurationData(InstanceIdentifier<? extends Object> path) {
+    public boolean containsConfigurationPath(InstanceIdentifier path) {
+        return configurationDataCache.containsKey(path);
+    }
+    
+    @Override
+    public boolean containsOperationalPath(InstanceIdentifier path) {
+        return operationalDataCache.containsKey(path);
+    }
+    
+    @Override
+    public Iterable<InstanceIdentifier> getStoredConfigurationPaths() {
+        return configurationDataCache.keySet();
+    }
+    
+    @Override
+    public Iterable<InstanceIdentifier> getStoredOperationalPaths() {
+        return operationalDataCache.keySet();
+    }
+    
+    
+    
+    @Override
+    public CompositeNode readConfigurationData(InstanceIdentifier path) {
         Preconditions.checkNotNull(path, "path cannot be null");
         return configurationDataCache.get(path);
     }
 
     private RpcResult<Void> finish(final ClusteredDataStoreTransaction transaction) {
-      final DataModification<InstanceIdentifier<? extends Object>,Object> modification = transaction.getModification();
+      final DataModification<InstanceIdentifier,CompositeNode> modification = transaction.getModification();
 
       this.configurationDataCache.putAll(modification.getUpdatedConfigurationData());
       this.operationalDataCache.putAll(modification.getUpdatedOperationalData());
 
-      for (final InstanceIdentifier<? extends Object> removal : modification.getRemovedConfigurationData()) {
+      for (final InstanceIdentifier removal : modification.getRemovedConfigurationData()) {
         this.configurationDataCache.remove(removal);
       }
 
-      for (final InstanceIdentifier<? extends Object> removal : modification.getRemovedOperationalData()) {
+      for (final InstanceIdentifier removal : modification.getRemovedOperationalData()) {
         this.operationalDataCache.remove(removal  );
       }
 
@@ -109,17 +133,17 @@ public class ClusteredDataStoreImpl implements ClusteredDataStore {
         return cache;
     }
 
-    private class ClusteredDataStoreTransaction implements DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> {
-        private final DataModification<InstanceIdentifier<? extends Object>,Object> modification;
+    private class ClusteredDataStoreTransaction implements DataCommitTransaction<InstanceIdentifier, CompositeNode> {
+        private final DataModification<InstanceIdentifier,CompositeNode> modification;
 
-        public ClusteredDataStoreTransaction(DataModification<InstanceIdentifier<? extends Object>,Object> modification){
+        public ClusteredDataStoreTransaction(DataModification<InstanceIdentifier,CompositeNode> modification){
             Preconditions.checkNotNull(modification, "modification cannot be null");
 
             this.modification = modification;
         }
 
         @Override
-        public DataModification<InstanceIdentifier<? extends Object>, Object> getModification() {
+        public DataModification<InstanceIdentifier, CompositeNode> getModification() {
             return this.modification;
         }
 
index e6acdb0c3be0a0221c63a014bf11d7bcaeeb00ce..b0a099ff90e0e26f1fd408f6574c718529673590 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-
-
 package org.opendaylight.controller.datastore.internal;
 
+import java.util.Hashtable;
+
 import com.google.common.base.Preconditions;
-import org.apache.felix.dm.Component;
+
 import org.opendaylight.controller.clustering.services.CacheConfigException;
-import org.opendaylight.controller.clustering.services.CacheExistException;
 import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
 import org.opendaylight.controller.datastore.ClusteredDataStore;
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
-public class ClusteredDataStoreManager implements ClusteredDataStore {
+public class ClusteredDataStoreManager implements //
+        ClusteredDataStore, //
+        ServiceTrackerCustomizer<IClusterGlobalServices, IClusterGlobalServices>, //
+        AutoCloseable {
 
-    private ClusteredDataStoreImpl clusteredDataStore = null;
+    private ClusteredDataStore clusteredDataStore = null;
     private IClusterGlobalServices clusterGlobalServices = null;
+    private BundleContext context;
+
+    private ServiceReference<IClusterGlobalServices> firstClusterGlobalReference;
+    private ServiceTracker<IClusterGlobalServices, IClusterGlobalServices> clusterTracker;
 
     @Override
-    public DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> requestCommit(DataModification<InstanceIdentifier<? extends Object>, Object> modification) {
+    public DataCommitTransaction<InstanceIdentifier, CompositeNode> requestCommit(
+            DataModification<InstanceIdentifier, CompositeNode> modification) {
         Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
         return clusteredDataStore.requestCommit(modification);
     }
 
     @Override
-    public Object readOperationalData(InstanceIdentifier<? extends Object> path) {
+    public CompositeNode readOperationalData(InstanceIdentifier path) {
         Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
         return clusteredDataStore.readOperationalData(path);
     }
 
     @Override
-    public Object readConfigurationData(InstanceIdentifier<? extends Object> path) {
+    public CompositeNode readConfigurationData(InstanceIdentifier path) {
         Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
         return clusteredDataStore.readConfigurationData(path);
     }
 
+    public Iterable<InstanceIdentifier> getStoredConfigurationPaths() {
+        Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+        return clusteredDataStore.getStoredConfigurationPaths();
+    }
+
+    public Iterable<InstanceIdentifier> getStoredOperationalPaths() {
+        Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+        return clusteredDataStore.getStoredOperationalPaths();
+    }
 
-    public void setClusterGlobalServices(IClusterGlobalServices clusterGlobalServices){
+    public boolean containsConfigurationPath(InstanceIdentifier path) {
+        Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+        return clusteredDataStore.containsConfigurationPath(path);
+    }
+
+    public boolean containsOperationalPath(InstanceIdentifier path) {
+        Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+        return clusteredDataStore.containsOperationalPath(path);
+    }
+
+    public void setClusterGlobalServices(IClusterGlobalServices clusterGlobalServices) {
         this.clusterGlobalServices = clusterGlobalServices;
+        try {
+            // Adding creation of the clustered data store in its own method
+            // to make the method unit testable
+            clusteredDataStore = createClusteredDataStore();
+        } catch (CacheConfigException e) {
+            throw new IllegalStateException("could not construct clusteredDataStore");
+        }
     }
 
-    public void unsetClusterGlobalServices(IClusterGlobalServices clusterGlobalServices){
-        this.clusterGlobalServices = null;
-        this.clusteredDataStore = null;
+    @Override
+    public IClusterGlobalServices addingService(ServiceReference<IClusterGlobalServices> reference) {
+        if (clusterGlobalServices == null) {
+            setClusterGlobalServices(context.getService(reference));
+            return clusterGlobalServices;
+        }
+        return null;
+    }
+
+    @Override
+    public void modifiedService(ServiceReference<IClusterGlobalServices> reference, IClusterGlobalServices service) {
+
+    }
+
+    @Override
+    public void removedService(ServiceReference<IClusterGlobalServices> reference, IClusterGlobalServices service) {
+        if (clusterGlobalServices == service) {
+            clusterGlobalServices = null;
+            clusteredDataStore = null;
+        }
     }
 
+    public BundleContext getContext() {
+        return context;
+    }
 
+    public void setContext(BundleContext context) {
+        this.context = context;
+    }
+    
+    
     /**
      * Function called by the dependency manager when all the required
      * dependencies are satisfied
-     *
+     * 
      */
-    void init(Component c) {
-        try {
-               //Adding creation of the clustered data store in its own method to make the method unit testable
-            clusteredDataStore = createClusteredDataStore(c);
-        } catch (CacheExistException e) {
-            throw new IllegalStateException("could not construct clusteredDataStore");
-        } catch (CacheConfigException e) {
-            throw new IllegalStateException("could not construct clusteredDataStore");
+    public void start() {
+        if (context != null) {
+            clusterTracker = new ServiceTracker<>(context, IClusterGlobalServices.class, this);
+            clusterTracker.open();
+            
+            context.registerService(ClusteredDataStore.class, this, new Hashtable<String,Object>());
         }
     }
-    protected ClusteredDataStoreImpl createClusteredDataStore(Component c) throws CacheExistException,CacheConfigException{
-       return  new ClusteredDataStoreImpl(clusterGlobalServices);
+
+    protected ClusteredDataStore createClusteredDataStore() throws CacheConfigException {
+        return new ClusteredDataStoreImpl(clusterGlobalServices);
+    }
+
+    @Override
+    public void close() throws Exception {
+        clusterTracker.close();
     }
 }
diff --git a/opendaylight/md-sal/clustered-data-store/implementation/src/main/yang/odl-sal-dom-clustered-store-cfg.yang b/opendaylight/md-sal/clustered-data-store/implementation/src/main/yang/odl-sal-dom-clustered-store-cfg.yang
new file mode 100644 (file)
index 0000000..95a26d7
--- /dev/null
@@ -0,0 +1,29 @@
+module odl-sal-dom-clustered-store-cfg {
+       yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store";
+    prefix "binding-impl";
+
+       import config { prefix config; revision-date 2013-04-05; }
+       import opendaylight-md-sal-dom {prefix sal;}
+
+    description
+        "Service definition for MD-SAL Clustered Store.";
+    revision "2013-10-28" {
+        description
+            "Initial revision";
+    }
+
+    identity dom-clustered-store-impl {
+        base config:module-type;
+        config:provided-service sal:dom-data-store;
+        config:java-name-prefix ClusteredDataStoreImpl;
+    }
+
+    augment "/config:modules/config:module/config:state" {
+        case dom-clustered-store-impl {
+            when "/config:modules/config:module/config:type = 'dom-clustered-store-impl'";
+        }
+    }
+    
+}
\ No newline at end of file
diff --git a/opendaylight/md-sal/clustered-data-store/implementation/src/test/java/org/opendaylight/controller/datastore/internal/ActivatorTest.java b/opendaylight/md-sal/clustered-data-store/implementation/src/test/java/org/opendaylight/controller/datastore/internal/ActivatorTest.java
deleted file mode 100644 (file)
index 5ced9d9..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.datastore.internal;
-
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.ServiceDependency;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
-
-import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class ActivatorTest {
-
-       private static  ServiceDependency serviceDependency;
-       
-       @BeforeClass 
-       public static void initialize(){
-               serviceDependency = mock(ServiceDependency.class);
-       }
-       
-       private class ActivatorTestImpl extends Activator{
-                protected ServiceDependency createServiceDependency() {
-                       return ActivatorTest.serviceDependency;
-                   }
-       }
-       
-    @Test
-    public void construct(){
-        assertNotNull(new Activator());
-    }
-    
-    @Test
-    public void construct_OnInvokeOfGlobalImpl_ShouldReturnNotNullObject(){
-        Activator activator = new Activator();
-        
-        assertNotNull(activator.getGlobalImplementations());
-        assertEquals(ClusteredDataStoreManager.class,activator.getGlobalImplementations()[0]);
-    }
-    
-    @Test
-    public void construct_OnInvokeOfConfigGlobalInstance_ShouldNotThrowAnyExceptions(){
-       Activator activator = new ActivatorTestImpl();
-       
-       Component c = mock(Component.class);
-       Object clusterDataStoreMgr = ClusteredDataStoreManager.class;
-       
-       when(serviceDependency.setService(IClusterGlobalServices.class)).thenReturn(serviceDependency);
-       when(serviceDependency.setCallbacks("setClusterGlobalServices",
-                    "unsetClusterGlobalServices")).thenReturn(serviceDependency);
-       when(serviceDependency.setRequired(true)).thenReturn(serviceDependency);
-       
-       
-       activator.configureGlobalInstance(c, clusterDataStoreMgr);
-       
-       
-    }
-    
-}
index d7ae4bf2e5d18797f092acb274dab972bd90bbd1..0323df6e2dca6c4b9f77ed56cb6aa16119b9e00c 100644 (file)
@@ -9,7 +9,8 @@ import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
 import org.opendaylight.controller.clustering.services.IClusterServices;
 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 
 import java.util.EnumSet;
 import java.util.Map;
@@ -127,9 +128,9 @@ public class ClusteredDataStoreImplTest {
 
         IClusterGlobalServices mockClusterGlobalServices = createClusterGlobalServices();
 
-        ConcurrentMap mockOperationalDataCache = mock(ConcurrentMap.class);
+        ConcurrentMap<InstanceIdentifier, CompositeNode> mockOperationalDataCache = mock(ConcurrentMap.class);
 
-        Object valueObject = mock(Object.class);
+        CompositeNode valueObject = mock(CompositeNode.class);
 
         when(mockOperationalDataCache.get(path)).thenReturn(valueObject);
 
@@ -176,9 +177,9 @@ public class ClusteredDataStoreImplTest {
 
         IClusterGlobalServices mockClusterGlobalServices = createClusterGlobalServices();
 
-        ConcurrentMap mockConfigurationDataCache = mock(ConcurrentMap.class);
+        ConcurrentMap<InstanceIdentifier, CompositeNode> mockConfigurationDataCache = mock(ConcurrentMap.class);
 
-        Object valueObject = mock(Object.class);
+        CompositeNode valueObject = mock(CompositeNode.class);
 
         when(mockConfigurationDataCache.get(path)).thenReturn(valueObject);
 
@@ -223,7 +224,7 @@ public class ClusteredDataStoreImplTest {
         when(mockModification.getUpdatedConfigurationData()).thenReturn(configurationData);
         when(mockModification.getUpdatedOperationalData()).thenReturn(operationalData);
 
-        DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> transaction = store.requestCommit(mockModification);
+        DataCommitHandler.DataCommitTransaction<InstanceIdentifier, CompositeNode> transaction = store.requestCommit(mockModification);
 
         transaction.finish();
 
@@ -252,7 +253,7 @@ public class ClusteredDataStoreImplTest {
         when(mockModification.getUpdatedConfigurationData()).thenReturn(configurationData);
         when(mockModification.getUpdatedOperationalData()).thenReturn(operationalData);
 
-        DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> transaction = store.requestCommit(mockModification);
+        DataCommitHandler.DataCommitTransaction<InstanceIdentifier, CompositeNode> transaction = store.requestCommit(mockModification);
 
         transaction.rollback();
 
index 5609134a1a672c4c7eda1e3e3928ab1ca4af75da..10f9622c7ae981ea5e095f59789e2596d20f7cba 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
  *
@@ -9,6 +8,8 @@
 
 package org.opendaylight.controller.datastore.internal;
 
+import java.util.concurrent.ConcurrentHashMap;
+
 import org.apache.felix.dm.Component;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -17,7 +18,8 @@ import org.opendaylight.controller.clustering.services.CacheExistException;
 import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 
 import static junit.framework.Assert.assertNotNull;
 import static org.junit.Assert.assertEquals;
@@ -29,103 +31,78 @@ import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 public class ClusteredDataStoreManagerTest {
-       
-       private  static ClusteredDataStoreManager clusteredDSMgr = null;
-       private IClusterGlobalServices icClusterGlbServices =  mock(IClusterGlobalServices.class);
-        
-       @BeforeClass
-       public static void construct(){
-               clusteredDSMgr = new ClusteredDataStoreManager();
+
+    private static ClusteredDataStoreManager clusteredDSMgr = null;
+    private IClusterGlobalServices icClusterGlbServices = mock(IClusterGlobalServices.class);
+
+    @BeforeClass
+    public static void construct() {
+        clusteredDSMgr = new ClusteredDataStoreManager();
         assertNotNull(clusteredDSMgr);
-       }
-        
-       @Test
-       public void construct_OnSetClusterGlobalServices_AssertNoException(){
-               icClusterGlbServices =  mock(IClusterGlobalServices.class);
-                
-               clusteredDSMgr.setClusterGlobalServices(icClusterGlbServices);
-        }
-        
-        @Test
-        public void construct_OnUnSetClusterGlobalServices_AssertNoException(){
-                IClusterGlobalServices icClusterGlbServices =  mock(IClusterGlobalServices.class);
-                
-                clusteredDSMgr.unsetClusterGlobalServices(icClusterGlbServices);
-        }
-        
-        @Test
-        public void construct_init_AssertNoException() throws CacheExistException,CacheConfigException{
-                ClusteredDataStoreImpl clusteredDSImpl =  mock(ClusteredDataStoreImpl.class);
-                
-                ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
-                doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
-                Component c = mock(Component.class);
-                
-                clusteredDSManager.init(c);
-        }
-        
-        @Test(expected = IllegalStateException.class)
-        public void construct_init_AssertCacheExistException() throws CacheExistException,CacheConfigException{
-                ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
-                doThrow(CacheExistException.class).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
-                Component c = mock(Component.class);
-                
-                clusteredDSManager.init(c);
-        }
-        
-        @Test(expected = IllegalStateException.class)
-        public void construct_init_AssertCacheConfigException() throws CacheExistException,CacheConfigException{
-                ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
-                doThrow(CacheConfigException.class).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
-                Component c = mock(Component.class);
-                
-                clusteredDSManager.init(c);
-        }
-        
-        @Test
-        public void construct_readOperationalData_AssertNoException() throws CacheExistException,CacheConfigException{
-                ClusteredDataStoreImpl clusteredDSImpl =  mock(ClusteredDataStoreImpl.class);
-                
-                ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
-                doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
-                Component c = mock(Component.class);
-                
-                clusteredDSManager.init(c);
-                
-                Object o = mock(Object.class);
-                
-                when(clusteredDSImpl.readOperationalData(any(InstanceIdentifier.class))).thenReturn(o);
-                assertEquals(o,clusteredDSManager.readOperationalData(any(InstanceIdentifier.class)));
-        }
-        
-        
-        @Test
-        public void construct_readConfigurationData_AssertNoException() throws CacheExistException,CacheConfigException{
-                ClusteredDataStoreImpl clusteredDSImpl =  mock(ClusteredDataStoreImpl.class);
-                
-                ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
-                doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
-                Component c = mock(Component.class);
-                
-                clusteredDSManager.init(c);
-                Object o = mock(Object.class);
-                
-                when(clusteredDSImpl.readConfigurationData(any(InstanceIdentifier.class))).thenReturn(o);
-                assertEquals(o,clusteredDSManager.readConfigurationData(any(InstanceIdentifier.class)));
-        }
-        
-        @Test
-        public void construct_requestCommit_AssertNoException() throws CacheExistException,CacheConfigException{
-                ClusteredDataStoreImpl clusteredDSImpl =  mock(ClusteredDataStoreImpl.class);
-                
-                ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
-                doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
-                Component c = mock(Component.class);
-                
-                clusteredDSManager.init(c);
-                DataCommitTransaction dataCommitTransaction = mock(DataCommitTransaction.class);
-                
-                when(clusteredDSImpl.requestCommit(any(DataModification.class))).thenReturn(dataCommitTransaction);
-                assertEquals(dataCommitTransaction,clusteredDSManager.requestCommit(any(DataModification.class)));
-        }
+    }
+
+    @Test
+    public void construct_OnSetClusterGlobalServices_AssertNoException() {
+        doReturn(new ConcurrentHashMap<InstanceIdentifier, CompositeNode>()).when(icClusterGlbServices).getCache(ClusteredDataStoreImpl.CONFIGURATION_DATA_CACHE);
+        doReturn(new ConcurrentHashMap<InstanceIdentifier, CompositeNode>()).when(icClusterGlbServices).getCache(ClusteredDataStoreImpl.OPERATIONAL_DATA_CACHE);
+        clusteredDSMgr.setClusterGlobalServices(icClusterGlbServices);
+    }
+
+    @Test
+    public void construct_init_AssertNoException() throws CacheExistException, CacheConfigException {
+        ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+        ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+        doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+        clusteredDSManager.start();
+    }
+
+
+    @Test
+    public void construct_readOperationalData_AssertNoException() throws CacheExistException, CacheConfigException {
+        ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+        ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+        doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+        Component c = mock(Component.class);
+        
+        clusteredDSManager.start();
+        clusteredDSManager.setClusterGlobalServices(icClusterGlbServices);
+        CompositeNode o = mock(CompositeNode.class);
+
+        when(clusteredDSImpl.readOperationalData(any(InstanceIdentifier.class))).thenReturn(o);
+        assertEquals(o, clusteredDSManager.readOperationalData(any(InstanceIdentifier.class)));
+    }
+
+    @Test
+    public void construct_readConfigurationData_AssertNoException() throws CacheExistException, CacheConfigException {
+        ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+        ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+        doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+        Component c = mock(Component.class);
+
+        clusteredDSManager.start();
+        clusteredDSManager.setClusterGlobalServices(icClusterGlbServices);
+        
+        CompositeNode o = mock(CompositeNode.class);
+
+        when(clusteredDSImpl.readConfigurationData(any(InstanceIdentifier.class))).thenReturn(o);
+        assertEquals(o, clusteredDSManager.readConfigurationData(any(InstanceIdentifier.class)));
+    }
+
+    @Test
+    public void construct_requestCommit_AssertNoException() throws CacheExistException, CacheConfigException {
+        ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+        ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+        doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+        IClusterGlobalServices globalServices = mock(IClusterGlobalServices.class);
+        clusteredDSManager.setClusterGlobalServices(globalServices);
+        clusteredDSManager.start();
+        DataCommitTransaction dataCommitTransaction = mock(DataCommitTransaction.class);
+
+        when(clusteredDSImpl.requestCommit(any(DataModification.class))).thenReturn(dataCommitTransaction);
+        assertEquals(dataCommitTransaction, clusteredDSManager.requestCommit(any(DataModification.class)));
+    }
 }
index 9615decbe9fed710acc0c6674ec0eff3d020ee9d..968f87a40200c1bbf86ef7a196f92b8d96f9e8f4 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
 <project
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.opendaylight.controller</groupId>
-    <artifactId>commons.integrationtest</artifactId>
-    <version>0.5.1-SNAPSHOT</version>
-    <relativePath>../../../commons/integrationtest</relativePath>
-  </parent>
-  <scm>
-    <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
-    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
-    <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
-  </scm>
-
-  <artifactId>clustered-datastore.integrationtest</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
-  <dependencies>
-
-      <dependency>
-        <groupId>com.google.guava</groupId>
-        <artifactId>guava</artifactId>
-      </dependency>
-      <dependency>
-          <groupId>org.opendaylight.controller</groupId>
-          <artifactId>sal-common-api</artifactId>
-          <version>1.0-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.controller</groupId>
-        <artifactId>sal-common-util</artifactId>
-        <version>1.0-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.controller</groupId>
-        <artifactId>sal-common-impl</artifactId>
-        <version>1.0-SNAPSHOT</version>
-      </dependency>
-      <dependency>
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
         <groupId>org.opendaylight.controller</groupId>
-        <artifactId>sal-binding-broker-impl</artifactId>
-        <version>1.0-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.controller</groupId>
-        <artifactId>sal</artifactId>
+        <artifactId>commons.integrationtest</artifactId>
         <version>0.5.1-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.controller</groupId>
-        <artifactId>clustering.services</artifactId>
-        <version>0.4.1-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.yangtools</groupId>
-        <artifactId>yang-binding</artifactId>
-      </dependency>
-
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>protocol_plugins.stub</artifactId>
-      <version>0.4.1-SNAPSHOT</version>
-    </dependency>
-     <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal.implementation</artifactId>
-      <version>0.4.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>containermanager</artifactId>
-      <version>0.5.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>containermanager.it.implementation</artifactId>
-      <version>0.5.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>clustering.stub</artifactId>
-      <version>0.4.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>clustered-datastore-implementation</artifactId>
-      <version>0.4.1-SNAPSHOT</version>
-    </dependency>
+        <relativePath>../../../commons/integrationtest</relativePath>
+    </parent>
+    <scm>
+        <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+        <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+        <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
+    </scm>
 
-      <dependency>
-          <groupId>org.opendaylight.controller</groupId>
-          <artifactId>sal-common</artifactId>
-          <version>1.0-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-          <groupId>org.opendaylight.yangtools</groupId>
-          <artifactId>yang-common</artifactId>
-      </dependency>
-      <dependency>
-          <groupId>org.opendaylight.yangtools</groupId>
-          <artifactId>concepts</artifactId>
-          <version>0.1.1-SNAPSHOT</version>
-      </dependency>
-      <dependency>
-       <groupId>org.mockito</groupId>
-       <artifactId>mockito-all</artifactId>
-       <version>1.9.5</version>
-       <scope>test</scope>
-      </dependency>
-      <dependency>
-          <groupId>org.osgi</groupId>
-          <artifactId>org.osgi.core</artifactId>
-          <version>5.0.0</version>
-      </dependency>
+    <artifactId>clustered-datastore.integrationtest</artifactId>
+    <version>0.4.0-SNAPSHOT</version>
+    <dependencies>
 
-</dependencies>
-  <properties>
-    <!-- Sonar jacoco plugin to get integration test coverage info -->
-    <sonar.jacoco.reportPath>../implementation/target/jacoco.exec</sonar.jacoco.reportPath>
-    <sonar.jacoco.itReportPath>../implementaiton/target/jacoco-it.exec</sonar.jacoco.itReportPath>
-  </properties>
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.jacoco</groupId>
-          <artifactId>jacoco-maven-plugin</artifactId>
-          <version>0.5.3.201107060350</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-    <plugins>
-      <plugin>
-        <groupId>org.jacoco</groupId>
-        <artifactId>jacoco-maven-plugin</artifactId>
-        <version>0.5.3.201107060350</version>
-        <configuration>
-          <destFile>../implementation/target/jacoco-it.exec</destFile>
-          <includes>org.opendaylight.controller.*</includes>
-        </configuration>
-        <executions>
-          <execution>
-            <id>pre-test</id>
-            <goals>
-              <goal>prepare-agent</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>post-test</id>
-            <configuration>
-              <skip>true</skip>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-it</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common-api</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common-util</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common-impl</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-broker-impl</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal</artifactId>
+            <version>0.5.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>clustering.services</artifactId>
+            <version>0.4.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-binding</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+            <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+            <version>4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>protocol_plugins.stub</artifactId>
+            <version>0.4.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal.implementation</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>containermanager</artifactId>
+            <version>0.5.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>containermanager.it.implementation</artifactId>
+            <version>0.5.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>clustering.stub</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>clustered-datastore-implementation</artifactId>
+            <version>0.4.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+            <artifactId>xtend-lib-osgi</artifactId>
+            <version>2.4.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-broker-impl</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-container-native</artifactId>
+            <version>${exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-junit4</artifactId>
+            <version>${exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-netconf-connector</artifactId>
+            <version>${netconf.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-store-impl</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>logback-config</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-impl</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-file-adapter</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>netconf-impl</artifactId>
+            <version>${netconf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>netconf-client</artifactId>
+            <version>${netconf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>concepts</artifactId>
+            <version>0.1.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>1.9.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-manager</artifactId>
+            <version>0.2.3-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-flow-management</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+            <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+            <version>4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+            <artifactId>xtend-lib-osgi</artifactId>
+            <version>2.4.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-broker-impl</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-container-native</artifactId>
+            <version>${exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-junit4</artifactId>
+            <version>${exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-netconf-connector</artifactId>
+            <version>${netconf.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-store-impl</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>logback-config</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-impl</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-file-adapter</artifactId>
+            <version>${config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>netconf-impl</artifactId>
+            <version>${netconf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>netconf-client</artifactId>
+            <version>${netconf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-link-mvn</artifactId>
+            <version>${exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>equinoxSDK381</groupId>
+            <artifactId>org.eclipse.osgi</artifactId>
+            <version>3.8.1.v20120830-144521</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>log4j-over-slf4j</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.0.9</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.0.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-flow-service</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-manager</artifactId>
+            <version>0.2.3-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-flow-management</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+            <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+            <version>4.0</version>
+        </dependency>
+    </dependencies>
+    <properties>
+        <!-- Sonar jacoco plugin to get integration test coverage info -->
+        <sonar.jacoco.reportPath>../implementation/target/jacoco.exec</sonar.jacoco.reportPath>
+        <sonar.jacoco.itReportPath>../implementaiton/target/jacoco-it.exec</sonar.jacoco.itReportPath>
+    </properties>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.jacoco</groupId>
+                    <artifactId>jacoco-maven-plugin</artifactId>
+                    <version>0.5.3.201107060350</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>0.5.3.201107060350</version>
+                <configuration>
+                    <destFile>../implementation/target/jacoco-it.exec</destFile>
+                    <includes>org.opendaylight.controller.*</includes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>pre-test</id>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>post-test</id>
+                        <configuration>
+                            <skip>true</skip>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
index e5861ab3c0af825806bd8951684dcf4f1a7a0250..c2fe5f5da4b5adda673107c5eeea7b5e1605e597 100644 (file)
@@ -8,16 +8,18 @@
 
 package org.opendaylight.controller.datastore;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.junit.Before;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.DataModification;
+import org.opendaylight.controller.test.sal.binding.it.TestHelper;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.util.Filter;
 import org.ops4j.pax.exam.util.PathUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -27,38 +29,37 @@ import org.slf4j.LoggerFactory;
 
 import javax.inject.Inject;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
 import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 import static org.ops4j.pax.exam.CoreOptions.junitBundles;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.systemPackages;
 import static org.ops4j.pax.exam.CoreOptions.systemProperty;
 
-import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import static org.mockito.Mockito.mock;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.when;
-
 @RunWith(PaxExam.class)
 public class ClusteredDataStoreIT {
-    private Logger log = LoggerFactory
-            .getLogger(ClusteredDataStoreIT.class);
+    private Logger log = LoggerFactory.getLogger(ClusteredDataStoreIT.class);
     // get the OSGI bundle context
     @Inject
     private BundleContext bc;
     @Inject
+    @Filter(timeout=60*1000)
     private ClusteredDataStore clusteredDS;
+
     // Configure the OSGi container
     @Configuration
     public Option[] config() {
         return options(
                 //
                 systemProperty("logback.configurationFile").value(
-                        "file:" + PathUtils.getBaseDir()
-                                + "/src/test/resources/logback.xml"),
+                        "file:" + PathUtils.getBaseDir() + "/src/test/resources/logback.xml"),
                 // To start OSGi console for inspection remotely
                 systemProperty("osgi.console").value("2401"),
                 // Set the systemPackages (used by clustering)
@@ -74,66 +75,56 @@ public class ClusteredDataStoreIT {
                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell").versionAsInProject(),
                 // List logger bundles
                 mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(),
-                mavenBundle("org.slf4j", "log4j-over-slf4j")
-                        .versionAsInProject(),
-                mavenBundle("ch.qos.logback", "logback-core")
-                        .versionAsInProject(),
-                mavenBundle("ch.qos.logback", "logback-classic")
-                        .versionAsInProject(),
+                mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(),
+                mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(),
+                mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(),
                 // needed by statisticsmanager
-                mavenBundle("org.opendaylight.controller", "containermanager")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "containermanager.it.implementation")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "clustering.services")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "clustering.stub")
-                    .versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "containermanager").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "containermanager.it.implementation").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "clustering.services").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "clustering.stub").versionAsInProject(),
 
                 // List all the bundles on which the test case depends
-                mavenBundle("org.opendaylight.controller", "sal")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "sal.implementation")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "protocol_plugins.stub")
-                    .versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "sal").versionAsInProject(),
+                TestHelper.baseModelBundles(),
+                TestHelper.configMinumumBundles(),
+                TestHelper.bindingIndependentSalBundles(),
+                TestHelper.bindingAwareSalBundles(),
+                TestHelper.mdSalCoreBundles(),
+                mavenBundle("org.opendaylight.controller", "config-api").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "sal.implementation").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "protocol_plugins.stub").versionAsInProject(),
 
-                //clustered-data-store-implementation dependencies
-                mavenBundle("com.google.guava", "guava")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "sal-common-api")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "sal-common-util")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.controller", "sal-common-impl")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.yangtools", "yang-binding")
-                    .versionAsInProject(),
+                // sal-common-impl
+                mavenBundle("org.eclipse.xtend", "org.eclipse.xtend.lib").versionAsInProject(),
+                mavenBundle("org.eclipse.xtext", "org.eclipse.xtext.xbase.lib").versionAsInProject(),
 
+                // clustered-data-store-implementation dependencies
+                mavenBundle("com.google.guava", "guava").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "sal-core-api").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "sal-common-api").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "sal-common-util").versionAsInProject(),
+                mavenBundle("org.opendaylight.controller", "sal-common-impl").versionAsInProject(),
+                mavenBundle("org.opendaylight.yangtools", "yang-model-api").versionAsInProject(),
+                mavenBundle("org.opendaylight.yangtools", "yang-binding").versionAsInProject(),
 
-                //sal-common-api dependencies
-                mavenBundle("org.opendaylight.controller", "sal-common")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.yangtools", "yang-common")
-                    .versionAsInProject(),
-                mavenBundle("org.opendaylight.yangtools", "concepts")
-                    .versionAsInProject(),
-                mavenBundle("org.osgi", "org.osgi.core")
-                    .versionAsInProject(),
-                //adding new maven bundles
-                mavenBundle("org.mockito", "mockito-all")
-                    .versionAsInProject(),
+                // sal-common-api dependencies
+                mavenBundle("org.opendaylight.controller", "sal-common").versionAsInProject(),
+                mavenBundle("org.opendaylight.yangtools", "yang-common").versionAsInProject(),
+                mavenBundle("org.opendaylight.yangtools", "concepts").versionAsInProject(),
+                mavenBundle("org.osgi", "org.osgi.core").versionAsInProject(),
+                // adding new maven bundles
+                mavenBundle("org.mockito", "mockito-all").versionAsInProject(),
+
+                // yang-data-api
+                mavenBundle("org.opendaylight.yangtools", "yang-data-api").versionAsInProject(),
 
                 // needed by hosttracker
-                mavenBundle("org.opendaylight.controller", "clustered-datastore-implementation")
-                        .versionAsInProject(),
-                mavenBundle("org.jboss.spec.javax.transaction",
-                        "jboss-transaction-api_1.1_spec").versionAsInProject(),
-                mavenBundle("org.apache.commons", "commons-lang3")
-                        .versionAsInProject(),
-                mavenBundle("org.apache.felix",
-                        "org.apache.felix.dependencymanager")
-                        .versionAsInProject(), junitBundles());
+                mavenBundle("org.opendaylight.controller", "clustered-datastore-implementation").versionAsInProject(),
+                mavenBundle("org.jboss.spec.javax.transaction", "jboss-transaction-api_1.1_spec").versionAsInProject(),
+                mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(),
+                mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager").versionAsInProject(),
+                junitBundles());
     }
 
     private String stateToString(int state) {
@@ -151,137 +142,119 @@ public class ClusteredDataStoreIT {
         }
     }
 
-    @Before
-    public void areWeReady() {
-        assertNotNull(bc);
-        boolean debugit = false;
-        Bundle b[] = bc.getBundles();
-        for (int i = 0; i < b.length; i++) {
-            int state = b[i].getState();
-            if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {
-                log.debug("Bundle:" + b[i].getSymbolicName() + " state:"
-                          + stateToString(state));
-                debugit = true;
-            }
-        }
-        if (debugit) {
-            log.debug("Do some debugging because some bundle is "
-                      + "unresolved");
-        }
-    }
-
     @Test
-    public void testBundleContextClusteredDS_NotNull() throws Exception{
+    public void testBundleContextClusteredDS_NotNull() throws Exception {
         ServiceReference serviceReference = bc.getServiceReference(ClusteredDataStore.class);
         ClusteredDataStore store = ClusteredDataStore.class.cast(bc.getService(serviceReference));
         assertNotNull(store);
     }
 
     @Test
-    public void testInjected_ClusteredDS_NotNull(){
+    public void testInjected_ClusteredDS_NotNull() {
         assertNotNull(clusteredDS);
     }
 
     @Test
-    public void requestCommit_readConfigurationData_ShouldVerifyDataAndNoException(){
+    public void requestCommit_readConfigurationData_ShouldVerifyDataAndNoException() {
         DataModification dataModification = mock(DataModification.class);
         HashMap map = new HashMap();
         List list = new ArrayList();
         list.add("key");
-        InstanceIdentifier key = new InstanceIdentifier(list,String.class);
-        map.put(key, "value");
+        InstanceIdentifier key = new InstanceIdentifier(list);
+        map.put(key, mock(CompositeNode.class));
         when(dataModification.getUpdatedConfigurationData()).thenReturn(map);
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
-        String value = (String)clusteredDS.readConfigurationData(key);
-        assertEquals("value",value);
+        Object value = clusteredDS.readConfigurationData(key);
+        Assert.assertNotNull(value);
     }
 
     @Test(expected = NullPointerException.class)
-    public void requestCommit_ShouldThrowException(){
+    public void requestCommit_ShouldThrowException() {
         DataModification dataModification = null;
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
     }
 
     @Test
-    public void requestCommit_readOperationalData_ShouldVerifyDataAndNoException(){
+    public void requestCommit_readOperationalData_ShouldVerifyDataAndNoException() {
         DataModification dataModification = mock(DataModification.class);
         HashMap map = new HashMap();
         List list = new ArrayList();
         list.add("key");
-        InstanceIdentifier key = new InstanceIdentifier(list,String.class);
-        map.put(key, "value");
+        InstanceIdentifier key = new InstanceIdentifier(list);
+        map.put(key, mock(CompositeNode.class));
         when(dataModification.getUpdatedOperationalData()).thenReturn(map);
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
-        String value = (String)clusteredDS.readOperationalData(key);
-        assertEquals("value",value);
+        Object value = clusteredDS.readOperationalData(key);
+        Assert.assertNotNull(value);
     }
 
     @Test
-    public void requestCommit_readConfigurationData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException(){
+    public void requestCommit_readConfigurationData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException() {
         DataModification dataModification = mock(DataModification.class);
         HashMap map = new HashMap();
         List list = new ArrayList();
         list.add("key");
-        InstanceIdentifier key = new InstanceIdentifier(list,String.class);
+        InstanceIdentifier key = new InstanceIdentifier(list);
         map.put(key, "value");
         when(dataModification.getUpdatedConfigurationData()).thenReturn(map);
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
         list = new ArrayList();
         list.add("key1");
-        InstanceIdentifier key1 = new InstanceIdentifier(list,String.class);
+        InstanceIdentifier key1 = new InstanceIdentifier(list);
 
-        String value = (String)clusteredDS.readConfigurationData(key1);
+        Object value = clusteredDS.readConfigurationData(key1);
         assertNull(value);
     }
 
     @Test
-    public void requestCommit_readOperationalData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException(){
+    public void requestCommit_readOperationalData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException() {
         DataModification dataModification = mock(DataModification.class);
         HashMap map = new HashMap();
         List list = new ArrayList();
         list.add("key");
-        InstanceIdentifier key = new InstanceIdentifier(list,String.class);
-        map.put(key, "value");
+        InstanceIdentifier key = new InstanceIdentifier(list);
+        map.put(key, mock(CompositeNode.class));
         when(dataModification.getUpdatedOperationalData()).thenReturn(map);
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
         list = new ArrayList();
         list.add("key1");
-        InstanceIdentifier key1 = new InstanceIdentifier(list,String.class);
+        InstanceIdentifier key1 = new InstanceIdentifier(list);
 
-        String value = (String)clusteredDS.readOperationalData(key1);
+        Object value = clusteredDS.readOperationalData(key1);
         assertNull(value);
     }
 
     @Test(expected = NullPointerException.class)
-    public void requestCommit_readConfigurationData_WithNullPathShouldThrowException(){
+    public void requestCommit_readConfigurationData_WithNullPathShouldThrowException() {
         DataModification dataModification = mock(DataModification.class);
         HashMap map = new HashMap();
         List list = new ArrayList();
         list.add("key");
-        InstanceIdentifier key = new InstanceIdentifier(list,String.class);
+        InstanceIdentifier key = new InstanceIdentifier(list);
         map.put(key, "value");
         when(dataModification.getUpdatedConfigurationData()).thenReturn(map);
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
-        String value = (String)clusteredDS.readConfigurationData(null);
+        Object value = clusteredDS.readConfigurationData(null);
     }
 
     @Test(expected = NullPointerException.class)
-    public void requestCommit_readOperationalData_WithNullPathShouldThrowException(){
+    public void requestCommit_readOperationalData_WithNullPathShouldThrowException() {
         DataModification dataModification = mock(DataModification.class);
         HashMap map = new HashMap();
         List list = new ArrayList();
         list.add("key");
-        InstanceIdentifier key = new InstanceIdentifier(list,String.class);
+        InstanceIdentifier key = new InstanceIdentifier(list);
         map.put(key, "value");
         when(dataModification.getOriginalOperationalData()).thenReturn(map);
         DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
         dataCommitTrans.finish();
-        String value = (String)clusteredDS.readOperationalData(null);
+        Object value = clusteredDS.readOperationalData(null);
     }
+
 }
diff --git a/opendaylight/md-sal/clustered-data-store/integrationtest/src/test/resources/controller.config b/opendaylight/md-sal/clustered-data-store/integrationtest/src/test/resources/controller.config
new file mode 100644 (file)
index 0000000..e49ba67
--- /dev/null
@@ -0,0 +1,23 @@
+//START OF CONFIG-LAST
+<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+<modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+    <module>
+        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store">prefix:dom-clustered-store-impl</type>
+        <name>cluster-data-store</name>
+    </module>
+</modules>
+</data>
+
+
+//END OF SNAPSHOT
+urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store?module=odl-sal-dom-clustered-store-cfg&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: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:common?module=opendaylight-md-sal-common&revision=2013-10-28
+//END OF CONFIG
index 2d63ce57448f88b77a39b1bcb0525b9721c08370..50983e22cfd8885e8e1f6680bbe074c22cd59ec2 100644 (file)
@@ -7,7 +7,7 @@
     </encoder>
   </appender>
 
-  <root level="error">
+  <root level="info">
     <appender-ref ref="STDOUT" />
   </root>
 </configuration>
index 9d2a6a0b110f333be53b6640cb02c83653982e99..6aa0d5fc909508a930dfd8c1d6182964b8ba744a 100644 (file)
@@ -185,6 +185,7 @@ public class FlowConsumerImpl implements IForwardingRulesManager {
     private void addFlow(InstanceIdentifier<?> path, Flow dataObject) {
 
         AddFlowInputBuilder input = new AddFlowInputBuilder();
+        
         List<Instruction> inst = (dataObject).getInstructions().getInstruction();
         input.setNode((dataObject).getNode());
         input.setPriority((dataObject).getPriority());
index b8dac19bf37956262e9b88a35f24b95b719edc5c..381faa41b082ea069df75ca8b5a82736d94fd642 100644 (file)
@@ -35,15 +35,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.Gro
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupRemoved;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.Meter;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -239,8 +237,8 @@ public class GroupConsumerImpl implements IForwardingRulesManager {
                 return new Status(StatusCode.BADREQUEST, "Group record does not exist");
             }*/
 
-            if (!(group.getGroupType().getIntValue() >= GroupType.GroupAll.getIntValue() && group.getGroupType()
-                    .getIntValue() <= GroupType.GroupFf.getIntValue())) {
+            if (!(group.getGroupType().getIntValue() >= GroupTypes.GroupAll.getIntValue() && group.getGroupType()
+                    .getIntValue() <= GroupTypes.GroupFf.getIntValue())) {
                 logger.error("Invalid Group type %d" + group.getGroupType().getIntValue());
                 return new Status(StatusCode.BADREQUEST, "Invalid Group type");
             }
index 25e8e7aa577968ffc20fccaac459c1e958f4d586..aca70a94c720f93608f68e16b77c6ae4b4a6a3d1 100644 (file)
@@ -14,30 +14,77 @@ module opendaylight-group-types {
         type uint32;
     }
     
-    grouping group-types {
-        leaf group-type {
-            type enumeration {
-                enum group-all;
-                enum group-select;
-                enum group-indirect;
-                enum group-ff;
-            }
-        }
+    typedef group-types {        
+        type enumeration {
+            enum group-all;
+            enum group-select;
+            enum group-indirect;
+            enum group-ff;
+        }        
     }
     
     typedef group-capabilities { 
-               type enumeration {
-                enum select-weight;
-                enum select-liveness;
-                enum chaining;
-                enum chaining-checks;
-            }   
-        }
+        type enumeration {
+            enum select-weight;
+            enum select-liveness;
+            enum chaining;
+            enum chaining-checks;
+        }   
+    }
+    
+    identity group-type {
+       description "Base identity for all the available group types"; 
+    }
+    
+    identity group-all {
+       base group-type;
+       description "All (multicast/broadcast) group";
+    }
+    
+    identity group-select {
+       base group-type;
+       description "Select group";
+    }
+    
+    identity group-indirect {
+       base group-type;
+       description "Indirect group";
+    }
+    
+    identity group-ff {
+       base group-type;
+       description "Fast failover group";
+    }
     
+    identity group-capability {
+       description "Base identity for all the supported group capabilities";
+    }
+    
+    identity select-weight{
+       base group-capability;
+       description "Support weight for select groups";
+    }
+
+    identity select-liveness{
+       base group-capability;
+       description "Support liveness for select groups";
+    }
+
+    identity chaining{
+       base group-capability;
+       description "Support chaining groups";
+    }
+
+    identity chaining-checks{
+       base group-capability;
+       description "Check chaining for loops and delete";
+    }
     
     grouping group {
         
-        uses group-types;
+        leaf group-type {
+            type group-types;
+        }
         
         leaf group-id {
             type group-id;
@@ -129,23 +176,18 @@ module opendaylight-group-types {
     }
 
     grouping group-features {
-        leaf types {
-            type bits {
-               bit group-all;
-               bit group-select;
-               bit group-indirect;
-               bit group-ff;
-            }
-        }
+    
+       leaf-list group-types-supported {
+               type identityref {
+                       base group-type;
+               }
+               }
             
-        leaf capabilities { 
-               type bits {
-                bit select-weight;
-                bit select-liveness;
-                bit chaining;
-                bit chaining-checks;
-            }   
-        }
+       leaf-list group-capabilities-supported {
+               type identityref {
+                       base group-capability;
+               }
+               }
 
         leaf-list max-groups {
             type uint32;
index d26ca667996f164f9ca7f8b57c6df25a7c381563..0548890a00bcd87637d564002c7754780fa6821c 100644 (file)
@@ -14,27 +14,59 @@ module opendaylight-meter-types {
             type uint32;
     }
     
-    grouping meter-flags {
-        leaf flags {
-            type bits {
-                bit meter-kbps;
-                bit meter-pktps;
-                bit meter-burst;
-                bit meter-stats;
-            }
-        }
+    typedef meter-flags {        
+        type bits {
+            bit meter-kbps;
+            bit meter-pktps;
+            bit meter-burst;
+            bit meter-stats;
+        }        
     }
     
-    grouping meter-band-type {
-        leaf flags {
-            type bits {
-                bit ofpmbt-drop;
-                bit ofpmbt-dscp-remark;
-                bit ofpmbt-experimenter;               
-            }
+    identity meter-capability {
+       description "Base identity for all the supported meter capabilities/flags";
+    }
+    identity meter-kbps {
+       base meter-capability;
+       description "Rate value in kb/s (kilo-bit per second)";
+    } 
+    identity meter-pktps {
+       base meter-capability;
+       description "Rate value in packet/sec.";
+    } 
+    identity meter-burst {
+       base meter-capability;
+       description "Do burst size.";
+    } 
+    identity meter-stats {
+       base meter-capability;
+       description "Collect statistics.";
+    } 
+    
+    typedef meter-band-type {
+        type bits {
+            bit ofpmbt-drop;
+            bit ofpmbt-dscp-remark;
+            bit ofpmbt-experimenter;               
         }
     }
     
+    identity meter-band {
+       description "Base identity for all the band type available";
+    }
+    identity meter-band-drop {
+       base meter-band;
+       description "Drop packet";
+    }
+    identity meter-band-dscp-remark {
+       base meter-band;
+       description "Remark DSCP in the IP header";
+    }
+    identity meter-band-experimenter {
+       base meter-band;
+       description "Experimenter meter band";
+    }
+
     grouping band-type {
         choice band-type {
             case drop {
@@ -79,7 +111,9 @@ module opendaylight-meter-types {
     
     grouping meter {
         
-        uses meter-flags;        
+        leaf flags {
+           type meter-flags;        
+        }
         
         leaf meter-id {
             type meter-id;
@@ -104,7 +138,9 @@ module opendaylight-meter-types {
                 }
                 
                 container meter-band-types {
-                    uses meter-band-type;
+                    leaf flags {
+                        type meter-band-type;
+                    }
                 }
             
                 leaf rate {
@@ -170,13 +206,17 @@ module opendaylight-meter-types {
             type yang:counter32;
         }
            
-        leaf band_types {
-            type yang:counter32;
-        }
+       leaf-list meter-band-supported {
+               type identityref {
+                       base meter-band;
+               }
+               }
         
-        leaf capabilities {
-            type yang:counter32;
-        }
+       leaf-list meter-capabilities-supported {
+               type identityref {
+                       base meter-capability;
+               }
+               }
         
         leaf max_bands {
             type uint8;
index 1b6a9df9ad514fbccdf4fb0d7de043421e968e4c..ebc6ead25e227cfce37cf6a216304fee3e083504 100644 (file)
@@ -15,29 +15,41 @@ module opendaylight-group-statistics {
         description "Initial revision of group statistics service";
     }
     
-    augment "/inv:nodes/inv:node" {
-        ext:augment-identifier "node-group-statistics";
+       grouping group-statistics {
         container group-statistics {
             //config "false";
             uses group-types:group-statistics-reply;
         }
+       }    
+    
+    augment "/inv:nodes/inv:node" {
+        ext:augment-identifier "node-group-statistics";
+        uses group-statistics;
     }
 
-    augment "/inv:nodes/inv:node" {
-        ext:augment-identifier "node-group-desc-stats";
+       grouping group-desc {
         container group-desc {
             //config "false";
             uses group-types:group-desc-stats-reply;
         }
-    }
+       }
     
     augment "/inv:nodes/inv:node" {
-        ext:augment-identifier "node-group-features";
-        container group-features {
+        ext:augment-identifier "node-group-desc-stats";
+        uses group-desc;
+    }
+
+       grouping group-features {
+               container group-features {
             //config "false";
             uses group-types:group-features-reply;
         }
     }
+           
+    augment "/inv:nodes/inv:node" {
+        ext:augment-identifier "node-group-features";
+        uses group-features;
+    }
 
     // RPC calls
     rpc get-all-group-statistics {
index a5e5c74f4c578a42026b3cda684a0ceae982cd61..51b00845aef17d832e8ec737b965b5f168f06c11 100644 (file)
@@ -51,7 +51,7 @@
                     </dependency>
                 </dependencies>
             </plugin>
-            
+
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>build-helper-maven-plugin</artifactId>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
             <version>${osgi.core.version}</version>
-        <scope>provided</scope>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <groupId>org.eclipse.xtend</groupId>
             <artifactId>org.eclipse.xtend.lib</artifactId>
         </dependency>
-       <dependency>
-       <groupId>org.eclipse.xtend</groupId>
-       <artifactId>org.eclipse.xtend.standalone</artifactId>
-       <version>2.4.3</version>
-       <scope>runtime</scope>
-       </dependency> 
+        <dependency>
+            <groupId>org.eclipse.xtend</groupId>
+            <artifactId>org.eclipse.xtend.standalone</artifactId>
+            <version>2.4.3</version>
+            <scope>runtime</scope>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-config</artifactId>
             <version>${slf4j.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-flow-statistics</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.reflections</groupId>
             <artifactId>reflections</artifactId>
index c3fe5f70f1b4b99ec9a7d14e061579d5b8d04932..bce1f61cf5a20bfa936c0adac55f5c159533eed3 100644 (file)
@@ -15,8 +15,7 @@ import org.osgi.framework.BundleContext;
 /**
 *
 */
-public final class BindingBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule
-{
+public final class BindingBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule {
 
     private BundleContext bundleContext;
 
index 53902510be77bc5f13950bdc2cf3eb7542158395..1c03c3e7b088c611fd41bbcf07d87c6c10ec3c58 100644 (file)
@@ -17,8 +17,7 @@ import org.osgi.framework.BundleContext;
 /**
 *
 */
-public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory
-{
+public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory {
 
     
     @Override
index 4022dd44ef6216738a6f030fa516c39bbac3e345..60c8156a56c11daeb49b119dc3b24cfc6c900830 100644 (file)
@@ -1,12 +1,12 @@
 /**
-* Generated file
+ * Generated file
 
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-data-broker
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 17:33:01 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-data-broker
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 17:33:01 CET 2013
+ *
+ * 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;
@@ -17,20 +17,22 @@ import org.osgi.framework.BundleContext;
 /**
 *
 */
-public class DataBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractDataBrokerImplModuleFactory
-{
+public class DataBrokerImplModuleFactory extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractDataBrokerImplModuleFactory {
 
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) {
-        DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver, bundleContext);
+        DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver,
+                bundleContext);
         module.setBundleContext(bundleContext);
         return module;
     }
-    
+
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver,
             DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
-        DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver, old, bundleContext);
+        DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver, old,
+                bundleContext);
         module.setBundleContext(bundleContext);
         return module;
     }
index 72231d17d1b0b98b77bbdaedfbc8cc33b2cd07b1..e4f74deb4b3487e31f080186315bc14dc4f9d9d5 100644 (file)
@@ -1,12 +1,12 @@
 /**
-* Generated file
-
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-notification-broker
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 17:33:01 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated file
+
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-notification-broker
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 17:33:01 CET 2013
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
 package org.opendaylight.controller.config.yang.md.sal.binding.impl;
 
 import java.util.concurrent.ExecutorService;
@@ -21,19 +21,22 @@ import com.google.common.util.concurrent.MoreExecutors;
 /**
 *
 */
-public final class NotificationBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModule
-{
+public final class NotificationBrokerImplModule extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModule {
 
-    public NotificationBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+    public NotificationBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
     }
 
-    public NotificationBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, NotificationBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) {
+    public NotificationBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+            NotificationBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) {
         super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate(){
+    public void validate() {
         super.validate();
         // Add custom validation for module attributes here.
     }
index 24ca0bbfaac1fecc5e98b2b97f587b06d1cd314f..31613a7433272882349d1308f7b952f0363a7a29 100644 (file)
@@ -1,19 +1,18 @@
 /**
-* Generated file
+ * Generated file
 
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-notification-broker
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 17:33:01 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-notification-broker
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 17:33:01 CET 2013
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
 package org.opendaylight.controller.config.yang.md.sal.binding.impl;
 
 /**
 *
 */
-public class NotificationBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModuleFactory
-{
-
+public class NotificationBrokerImplModuleFactory extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModuleFactory {
 
 }
index 7824da8939576bc9b87e0a11ab1c6c2109bf4624..b0d3f7a73009a16845ec135f097ab2be84e6dcf6 100644 (file)
@@ -1,37 +1,40 @@
 /**
-* Generated file
+ * Generated file
 
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-rpc-broker
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 17:33:01 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-rpc-broker
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 17:33:01 CET 2013
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
 package org.opendaylight.controller.config.yang.md.sal.binding.impl;
 
 /**
 *
 */
-public final class RpcBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModule
-{
+public final class RpcBrokerImplModule extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModule {
 
-    public RpcBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+    public RpcBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
     }
 
-    public RpcBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, RpcBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) {
+    public RpcBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+            RpcBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) {
         super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate(){
+    public void validate() {
         super.validate();
         // Add custom validation for module attributes here.
     }
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        //TODO:implement
+        // TODO:implement
         throw new java.lang.UnsupportedOperationException("Unimplemented stub method");
     }
 }
index 61c7364a435281d54aa25bd113bb8fab870cf120..ed3371a5cce3a15f8ed6483dcab7c3602b02609e 100644 (file)
@@ -1,19 +1,18 @@
 /**
-* Generated file
+ * Generated file
 
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-rpc-broker
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 17:33:01 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: binding-rpc-broker
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 17:33:01 CET 2013
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
 package org.opendaylight.controller.config.yang.md.sal.binding.impl;
 
 /**
 *
 */
-public class RpcBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModuleFactory
-{
-
+public class RpcBrokerImplModuleFactory extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModuleFactory {
 
 }
index 6537b4c64d3a956f13a6dde7e52eb90959dbf6a7..1bf15c182f5f93196fe0c3d27fc0438295df2812 100644 (file)
@@ -1,12 +1,12 @@
 /**
-* Generated file
+ * Generated file
 
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: runtime-generated-mapping
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 18:20:19 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: runtime-generated-mapping
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 18:20:19 CET 2013
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
 package org.opendaylight.controller.config.yang.md.sal.binding.impl;
 
 import javassist.ClassPool;
@@ -19,26 +19,29 @@ import com.google.common.base.Preconditions;
 /**
 *
 */
-public final class RuntimeMappingModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModule
-{
+public final class RuntimeMappingModule extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModule {
 
     private BundleContext bundleContext;
 
-    public RuntimeMappingModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+    public RuntimeMappingModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
     }
 
-    public RuntimeMappingModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, RuntimeMappingModule oldModule, java.lang.AutoCloseable oldInstance) {
+    public RuntimeMappingModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+            RuntimeMappingModule oldModule, java.lang.AutoCloseable oldInstance) {
         super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
-    public void validate(){
+    public void validate() {
         super.validate();
         Preconditions.checkNotNull(bundleContext);
         // Add custom validation for module attributes here.
     }
-    
+
     @Override
     public boolean canReuseInstance(AbstractRuntimeMappingModule oldModule) {
         return true;
index f104c73ba3da10516c61bfe8ff89fd5c9f988921..6344ae981f0215baf8c7895025e07c41f248ca96 100644 (file)
@@ -1,12 +1,12 @@
 /**
-* Generated file
+ * Generated file
 
-* Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: runtime-generated-mapping
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Nov 20 18:20:19 CET 2013
-*
-* Do not modify this file unless it is present under src/main directory
-*/
+ * Generated from: yang module name: opendaylight-sal-binding-broker-impl  yang module local name: runtime-generated-mapping
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Nov 20 18:20:19 CET 2013
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
 package org.opendaylight.controller.config.yang.md.sal.binding.impl;
 
 import java.util.Collections;
@@ -22,36 +22,35 @@ import org.osgi.framework.BundleContext;
 /**
 *
 */
-public class RuntimeMappingModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModuleFactory
-{
+public class RuntimeMappingModuleFactory extends
+        org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModuleFactory {
 
-    
-    private static  RuntimeMappingModule SINGLETON = null;
+    private static RuntimeMappingModule SINGLETON = null;
     private static ModuleIdentifier IDENTIFIER = new ModuleIdentifier(NAME, "runtime-mapping-singleton");
 
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) {
         throw new UnsupportedOperationException("Only default instance supported");
     }
-    
+
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver,
             DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
-        RuntimeMappingModule module = (RuntimeMappingModule) super.createModule(instanceName, dependencyResolver, old, bundleContext);
+        RuntimeMappingModule module = (RuntimeMappingModule) super.createModule(instanceName, dependencyResolver, old,
+                bundleContext);
         module.setBundleContext(bundleContext);
         return module;
     }
-    
+
     @Override
     public Set<RuntimeMappingModule> getDefaultModules(DependencyResolverFactory dependencyResolverFactory,
             BundleContext bundleContext) {
-        if(SINGLETON == null) {
+        if (SINGLETON == null) {
             DependencyResolver dependencyResolver = dependencyResolverFactory.createDependencyResolver(IDENTIFIER);
-            SINGLETON = new RuntimeMappingModule(IDENTIFIER , dependencyResolver);
+            SINGLETON = new RuntimeMappingModule(IDENTIFIER, dependencyResolver);
             SINGLETON.setBundleContext(bundleContext);
         }
-        
-        
+
         return Collections.singleton(SINGLETON);
     }
 
index 35f48745f9fc86a9919c751419fd6254744de2d5..79a11ce278cc057c33b72feadd9272ec74b066b1 100644 (file)
@@ -7,26 +7,29 @@ import org.opendaylight.controller.sal.binding.dom.serializer.api.InstanceIdenti
 import org.opendaylight.yangtools.yang.binding.BindingCodec;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-import org.opendaylight.yangtools.yang.data.api.Node;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class CodecMapping {
 
+    private static final Logger LOG = LoggerFactory.getLogger(CodecMapping.class);
+    
     public static final String INSTANCE_IDENTIFIER_CODEC = "INSTANCE_IDENTIFIER_CODEC";
     public static final String CLASS_TO_CASE_MAP = "CLASS_TO_CASE";
     public static final String COMPOSITE_TO_CASE = "COMPOSITE_TO_CASE";
     public static final String AUGMENTATION_CODEC = "AUGMENTATION_CODEC";
     
-    public static void setIdentifierCodec(Class obj,InstanceIdentifierCodec codec) {
+    public static void setIdentifierCodec(Class<?> obj,InstanceIdentifierCodec codec) {
         Field instanceIdField;
         try {
             instanceIdField = obj.getField(INSTANCE_IDENTIFIER_CODEC);
-            instanceIdField.set(null, codec);
+            if(obj != null) {
+                instanceIdField.set(null, codec);
+            }
         } catch (NoSuchFieldException e) {
-           // NOOP
-        } catch (SecurityException e) {
-            // NOOP
-        } catch (IllegalAccessException e) {
-            // NOOp
+           LOG.debug("Instance identifier codec is not needed for {}",obj.getName(),e);
+        } catch (SecurityException | IllegalAccessException e) {
+            LOG.error("Instance identifier could not be set for {}",obj.getName(),e);
         }
     }
 
@@ -37,14 +40,10 @@ public class CodecMapping {
             instanceIdField = codec.getField(CLASS_TO_CASE_MAP);
             instanceIdField.set(null, classToCaseRawCodec);
         } catch (NoSuchFieldException e) {
-           // NOOP
-        } catch (SecurityException e) {
-            // NOOP
-        } catch (IllegalAccessException e) {
-            // NOOp
+            LOG.debug("BUG: Class to case mappping is not needed for {}",codec.getName(),e);
+        } catch (SecurityException | IllegalAccessException e) {
+            LOG.error("Class to case mappping could not be set for {}",codec.getName(),e);
         }
-        
-        
     }
 
     public static void setCompositeNodeToCaseMap(Class<? extends BindingCodec<?,?>> codec,
@@ -54,11 +53,9 @@ public class CodecMapping {
             instanceIdField = codec.getField(COMPOSITE_TO_CASE);
             instanceIdField.set(null, compositeToCase);
         } catch (NoSuchFieldException e) {
-           // NOOP
-        } catch (SecurityException e) {
-            // NOOP
-        } catch (IllegalAccessException e) {
-            // NOOp
+            LOG.debug("BUG: Class to case mappping is not needed for {}",codec.getName(),e);
+        } catch (SecurityException | IllegalAccessException e) {
+            LOG.error("Composite node to case mappping could not be set for {}",codec.getName(),e);
         }
     }
 
@@ -69,11 +66,9 @@ public class CodecMapping {
                 instanceIdField = dataCodec.getField(AUGMENTATION_CODEC);
                 instanceIdField.set(null, augmentableCodec);
             } catch (NoSuchFieldException e) {
-               // NOOP
-            } catch (SecurityException e) {
-                // NOOP
-            } catch (IllegalAccessException e) {
-                // NOOp
+                LOG.debug("BUG: Augmentation codec is not needed for {}",dataCodec.getName(),e);
+            } catch (SecurityException | IllegalAccessException e) {
+                LOG.error("Augmentation codec could not be set for {}",dataCodec.getName(),e);
             }
     }
 }
index 048dc3ad47e16acedf0145af6f601c94fb4f3fd6..d86d2f461d0cc4e5c9be9318a535aba9d84ee491 100644 (file)
@@ -3,7 +3,6 @@ package org.opendaylight.controller.sal.binding.dom.serializer.impl;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.Identifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 
 public class CodecTypeUtils {
 
@@ -13,5 +12,4 @@ public class CodecTypeUtils {
         Identifier<? extends Identifiable<?>> identifier = (Identifier<? extends Identifiable<?>>) key;
         return new IdentifiableItem(identifiableType,identifier);
     }
-
 }
index b81100836f7a422cdebca5de63010e512e5d7ac0..961cb2eb598bf7f8aaa0c45bbb9dbe2d5d303839 100644 (file)
@@ -2,7 +2,6 @@ package org.opendaylight.controller.sal.binding.dom.serializer.impl;
 
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Field;
-import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -337,15 +336,11 @@ public class LazyGeneratedCodecRegistry implements //
 
     @Override
     public void onValueCodecCreated(Class<?> valueClass, Class<?> valueCodec) {
-        // TODO Auto-generated method stub
-
     }
 
     @Override
     public void onCaseCodecCreated(Class<?> choiceClass,
             Class<? extends BindingCodec<Map<QName, Object>, Object>> choiceCodec) {
-        // TODO Auto-generated method stub
-
     }
 
     @Override
@@ -483,7 +478,7 @@ public class LazyGeneratedCodecRegistry implements //
 
         @Override
         public boolean isAcceptable(Node<?> input) {
-            if (false == (input instanceof CompositeNode)) {
+            if (!(input instanceof CompositeNode)) {
                 if (augmenting) {
                     return checkAugmenting((CompositeNode) input);
                 } else {
@@ -497,10 +492,7 @@ public class LazyGeneratedCodecRegistry implements //
             QName parent = input.getNodeType();
             for (Node<?> childNode : input.getChildren()) {
                 QName child = childNode.getNodeType();
-                if (false == Objects.equals(parent.getNamespace(), child.getNamespace())) {
-                    continue;
-                }
-                if (false == Objects.equals(parent.getRevision(), child.getRevision())) {
+                if (!Objects.equals(parent.getNamespace(), child.getNamespace()) || Objects.equals(parent.getRevision(), child.getRevision())) {
                     continue;
                 }
                 if (validNames.contains(child.getLocalName())) {
@@ -563,7 +555,7 @@ public class LazyGeneratedCodecRegistry implements //
 
         @Override
         public Set<java.util.Map.Entry<Class, BindingCodec<Object, Object>>> entrySet() {
-            return null;
+            return Collections.emptySet();
         }
 
         @Override
@@ -589,7 +581,7 @@ public class LazyGeneratedCodecRegistry implements //
 
         @Override
         public BindingCodec get(Object key) {
-            if (false == (key instanceof CompositeNode)) {
+            if (!(key instanceof CompositeNode)) {
                 return null;
             }
             for (java.util.Map.Entry<Class, ChoiceCaseCodecImpl<?>> entry : choiceCases.entrySet()) {
@@ -641,7 +633,7 @@ public class LazyGeneratedCodecRegistry implements //
 
         @Override
         public Collection<BindingCodec<?, ?>> values() {
-            return null;
+            return Collections.emptySet();
         }
 
         private UnsupportedOperationException notModifiable() {
@@ -665,18 +657,17 @@ public class LazyGeneratedCodecRegistry implements //
 
         @Override
         public boolean isEmpty() {
-            return false;
+            return true;
         }
 
         @Override
         public Set<T> keySet() {
-            return null;
+            return Collections.emptySet();
         }
 
         @Override
         public Set<java.util.Map.Entry<T, BindingCodec<?, ?>>> entrySet() {
-            // TODO Auto-generated method stub
-            return null;
+            return Collections.emptySet();
         }
 
         @Override
@@ -714,15 +705,9 @@ public class LazyGeneratedCodecRegistry implements //
                 augmentationField.setAccessible(true);
                 Map<Class, Augmentation> augMap = (Map<Class, Augmentation>) augmentationField.get(input);
                 return augMap;
-            } catch (NoSuchFieldException e) {
-
-            } catch (SecurityException e) {
-
-            } catch (IllegalArgumentException e) {
-
-            } catch (IllegalAccessException e) {
-
-            }
+            } catch (IllegalArgumentException | IllegalAccessException |NoSuchFieldException | SecurityException e) {
+                LOG.debug("Could not read augmentations for {}",input,e);
+            } 
             return Collections.emptyMap();
         }
 
@@ -747,9 +732,9 @@ public class LazyGeneratedCodecRegistry implements //
                 rawAugmentationCodecs.put(key, ret);
                 return ret;
             } catch (InstantiationException e) {
-
+                LOG.error("Can not instantiate raw augmentation codec {}",key.getSimpleName(),e);
             } catch (IllegalAccessException e) {
-
+                LOG.debug("BUG: Constructor for {} is not accessible.",key.getSimpleName(),e);
             }
             return null;
         }
index ec69fd3b68c8ee84c39edde4e58207adb771b5bd..0da7aec480e2c4f3d470cc9b02ad4c386f8f101f 100644 (file)
@@ -149,6 +149,7 @@ class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingSer
         try {
             deserializationBlock.call()
         } catch (Exception e) {
+
             // FIXME: Make this block providing more information.
             throw new DeserializationException(e);
         }
index 01390d7c41612e819b3cffc9964538f66263bf38..ab2e96f05c09b0e79502547e9502ffc697dd8b2b 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yangtools.yang.binding.Augmentation
 import java.util.Iterator
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema
 import java.util.concurrent.ConcurrentHashMap
+import static extension org.opendaylight.controller.sal.binding.impl.util.YangSchemaUtils.*;
 
 class TransformerGenerator {
 
@@ -214,7 +215,7 @@ class TransformerGenerator {
         if (transformer !== null) {
             return transformer;
         }
-        return withClassLoaderAndLock(cls.classLoader,lock) [|
+        return withClassLoaderAndLock(cls.classLoader, lock) [ |
             val valueTransformer = generateValueTransformer(cls, type);
             return valueTransformer;
         ]
@@ -222,6 +223,7 @@ class TransformerGenerator {
 
     private def generateKeyTransformerFor(Class<? extends Object> inputType, GeneratedType typeSpec, ListSchemaNode node) {
         try {
+
             //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
             val properties = typeSpec.allProperties;
             val ctCls = createClass(inputType.codecClassName) [
@@ -260,13 +262,15 @@ class TransformerGenerator {
                             }
                             Â«QName.name» _localQName = $1;
                             java.util.Map _compositeNode = (java.util.Map) $2;
+                            boolean _is_empty = true;
                             Â«FOR key : node.keyDefinition»
                                 Â«val propertyName = key.getterName»
                                 Â«val keyDef = node.getDataChildByName(key)»
                                 Â«val property = properties.get(propertyName)»
                                 Â«deserializeProperty(keyDef, property, propertyName)»;
                             Â«ENDFOR»
-                            Â«inputType.resolvedName» _value = new Â«inputType.name»(«node.keyDefinition.keyConstructorList»);
+                            Â«inputType.resolvedName» _value = new Â«inputType.name»(«node.keyDefinition.
+                            keyConstructorList»);
                             return _value;
                         }
                     '''
@@ -299,11 +303,12 @@ class TransformerGenerator {
     private def Class<? extends BindingCodec<Object, Object>> generateCaseCodec(Class<?> inputType, GeneratedType type,
         ChoiceCaseNode node) {
         try {
+
             //log.info("Generating DOM Codec for {} with {}, TCCL is: {}", inputType, inputType.classLoader,Thread.currentThread.contextClassLoader)
             val ctCls = createClass(type.codecClassName) [
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
                 implementsType(BINDING_CODEC)
-                staticQNameField(inputType);
+                staticQNameField(node.QName);
                 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
                 staticField(it, AUGMENTATION_CODEC, BindingCodec)
                 method(Object, "toDomStatic", QName, Object) [
@@ -313,7 +318,7 @@ class TransformerGenerator {
                             Â«QName.name» _resultName = Â«QName.name».create($1,QNAME.getLocalName());
                             java.util.List _childNodes = new java.util.ArrayList();
                             Â«type.resolvedName» value = («type.resolvedName») $2;
-                            Â«transformDataContainerBody(type,type.allProperties, node)»
+                            Â«transformDataContainerBody(type, type.allProperties, node)»
                             return ($r) _childNodes;
                         }
                     '''
@@ -356,10 +361,11 @@ class TransformerGenerator {
     private def dispatch  Class<? extends BindingCodec<Map<QName, Object>, Object>> generateTransformerFor(
         Class<?> inputType, GeneratedType typeSpec, SchemaNode node) {
         try {
+
             //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
             val ctCls = createClass(typeSpec.codecClassName) [
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
-                staticQNameField(inputType);
+                staticQNameField(node.QName);
                 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
                 staticField(it, AUGMENTATION_CODEC, BindingCodec)
                 implementsType(BINDING_CODEC)
@@ -403,11 +409,12 @@ class TransformerGenerator {
     private def Class<? extends BindingCodec<Map<QName, Object>, Object>> generateAugmentationTransformerFor(
         Class<?> inputType, GeneratedType type, AugmentationSchema node) {
         try {
+
             //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
             val properties = type.allProperties
             val ctCls = createClass(type.codecClassName) [
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
-                staticQNameField(inputType);
+                staticQNameField(node.augmentationQName);
                 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
                 staticField(it, AUGMENTATION_CODEC, BindingCodec)
                 implementsType(BINDING_CODEC)
@@ -453,12 +460,15 @@ class TransformerGenerator {
                             java.util.Map _compositeNode = (java.util.Map) $2;
                             //System.out.println(_localQName + " " + _compositeNode);
                             Â«type.builderName» _builder = new Â«type.builderName»();
+                            boolean _is_empty = true;
                             Â«FOR child : node.childNodes»
                                 Â«val signature = properties.getFor(child)»
                                 Â«deserializeProperty(child, signature.value, signature.key)»
-                                
                                 _builder.«signature.key.toSetter»(«signature.key»);
                             Â«ENDFOR»
+                            if(_is_empty) {
+                                return null;
+                            }
                             return _builder.build();
                         }
                     '''
@@ -482,6 +492,7 @@ class TransformerGenerator {
     private def dispatch  Class<? extends BindingCodec<Map<QName, Object>, Object>> generateTransformerFor(
         Class<?> inputType, GeneratedType typeSpec, ChoiceNode node) {
         try {
+
             //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
             val ctCls = createClass(typeSpec.codecClassName) [
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
@@ -639,11 +650,13 @@ class TransformerGenerator {
     private def deserializeNodeContainerBodyImpl(GeneratedType type, HashMap<String, Type> properties,
         DataNodeContainer node) {
         val ret = '''
-            Â«FOR child : node.childNodes.filter[!augmenting]»
+            boolean _is_empty = true;
+            Â«FOR child : node.childNodes»
                 Â«val signature = properties.getFor(child)»
-                Â«deserializeProperty(child, signature.value, signature.key)»
-                
-                _builder.«signature.key.toSetter»(«signature.key»);
+                Â«IF signature !== null»
+                    Â«deserializeProperty(child, signature.value, signature.key)»
+                    _builder.«signature.key.toSetter»(«signature.key»);
+                Â«ENDIF»
             Â«ENDFOR»
         '''
         return ret;
@@ -658,7 +671,9 @@ class TransformerGenerator {
                 //System.out.println("Aug. key:" + _entry.getKey());
                 Class _type = (Class) _entry.getKey();
                 Â«Augmentation.resolvedName» _value = («Augmentation.name») _entry.getValue();
-                _builder.addAugmentation(_type,_value);
+                if(_value != null) {
+                    _builder.addAugmentation(_type,_value);
+                }
             }
         }
     '''
@@ -675,6 +690,7 @@ class TransformerGenerator {
             boolean _hasNext = _iterator.hasNext();
             while(_hasNext) {
                 Object _listItem = _iterator.next();
+                _is_empty = false;
                 //System.out.println("  item" + _listItem);
                 Object _value = Â«type.actualTypeArguments.get(0).serializer.resolvedName».fromDomStatic(_localQName,_listItem);
                 //System.out.println("  value" + _value);
@@ -696,6 +712,7 @@ class TransformerGenerator {
             java.util.Iterator _iterator = _dom_«propertyName».iterator();
             boolean _hasNext = _iterator.hasNext();
             while(_hasNext) {
+                _is_empty = false;
                 Object _listItem = _iterator.next();
                 if(_listItem instanceof java.util.Map.Entry) {
                     Object _innerValue = ((java.util.Map.Entry) _listItem).getValue();
@@ -712,6 +729,7 @@ class TransformerGenerator {
             _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»"));
         Â«type.resolvedName» Â«propertyName» = null;
         if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) {
+            _is_empty = false;
             java.util.Map.Entry _dom_«propertyName» = (java.util.Map.Entry) _dom_«propertyName»_list.get(0);
             Object _inner_value = _dom_«propertyName».getValue();
             Â«propertyName» = Â«deserializeValue(type, "_inner_value")»;
@@ -724,7 +742,7 @@ class TransformerGenerator {
             _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»"));
         Â«type.resolvedName» Â«propertyName» = null;
         if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) {
-            
+            _is_empty = false;
             java.util.Map _dom_«propertyName» = (java.util.Map) _dom_«propertyName»_list.get(0);
             Â«propertyName» =  Â«type.serializer.resolvedName».fromDomStatic(_localQName,_dom_«propertyName»);
         }
@@ -732,10 +750,13 @@ class TransformerGenerator {
 
     private def dispatch CharSequence deserializeProperty(ChoiceNode schema, Type type, String propertyName) '''
         Â«type.resolvedName» Â«propertyName» = Â«type.serializer.resolvedName».fromDomStatic(_localQName,_compositeNode);
+        if(«propertyName» != null) {
+            _is_empty = false;
+        }
     '''
 
     private def dispatch String deserializeValue(GeneratedTransferObject type, String domParameter) '''
-        («type.resolvedName») Â«type.valueSerializer.resolvedName».fromDomValue(«domParameter»);
+        («type.resolvedName») Â«type.valueSerializer.resolvedName».fromDomValue(«domParameter»)
     '''
 
     private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateValueTransformer(
@@ -758,7 +779,7 @@ class TransformerGenerator {
             val hasYangBinding = hasBinding
             val ctCls = createClass(typeSpec.codecClassName) [
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
-                if(hasYangBinding) {
+                if (hasYangBinding) {
                     implementsType(BINDING_CODEC)
                     staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
                     implementsType(BindingDeserializer.asCtClass)
@@ -865,14 +886,13 @@ class TransformerGenerator {
         return null;
     }
 
-    private def dispatch Class<?> generateValueTransformer(
-        Class<?> inputType, Enumeration typeSpec) {
+    private def dispatch Class<?> generateValueTransformer(Class<?> inputType, Enumeration typeSpec) {
         try {
+
             //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
             val ctCls = createClass(typeSpec.codecClassName) [
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
                 //implementsType(BINDING_CODEC)
-                
                 method(Object, "toDomValue", Object) [
                     modifiers = PUBLIC + FINAL + STATIC
                     body = '''
@@ -981,12 +1001,6 @@ class TransformerGenerator {
     */
     private def getBuilderName(GeneratedType type) '''«type.resolvedName»Builder'''
 
-    private def staticQNameField(CtClass it, Class<?> node) {
-        val field = new CtField(ctQName, "QNAME", it);
-        field.modifiers = PUBLIC + FINAL + STATIC;
-        addField(field, '''«node.name».QNAME''')
-    }
-
     private def staticQNameField(CtClass it, QName node) {
         val field = new CtField(ctQName, "QNAME", it);
         field.modifiers = PUBLIC + FINAL + STATIC;
@@ -999,7 +1013,7 @@ class TransformerGenerator {
             Â«QName.name» _resultName = Â«QName.name».create($1,QNAME.getLocalName());
             java.util.List _childNodes = new java.util.ArrayList();
             Â«type.resolvedName» value = («type.resolvedName») $2;
-            Â«transformDataContainerBody(type,type.allProperties, node)»
+            Â«transformDataContainerBody(type, type.allProperties, node)»
             Â«serializeAugmentations»
             return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
         }
@@ -1010,7 +1024,7 @@ class TransformerGenerator {
             Â«QName.name» _resultName = Â«QName.name».create($1,QNAME.getLocalName());
             java.util.List _childNodes = new java.util.ArrayList();
             Â«type.resolvedName» value = («type.resolvedName») $2;
-            Â«transformDataContainerBody(type,type.allProperties, node)»
+            Â«transformDataContainerBody(type, type.allProperties, node)»
             Â«serializeAugmentations»
             return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
         }
@@ -1021,7 +1035,7 @@ class TransformerGenerator {
         Â«QName.name» _resultName = Â«QName.name».create($1,QNAME.getLocalName());
             java.util.List _childNodes = new java.util.ArrayList();
             Â«type.resolvedName» value = («type.resolvedName») $2;
-            Â«transformDataContainerBody(type,type.allProperties, node)»
+            Â«transformDataContainerBody(type, type.allProperties, node)»
             Â«serializeAugmentations»
             return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
         }
@@ -1036,18 +1050,20 @@ class TransformerGenerator {
         }
     '''
 
-    private def transformDataContainerBody(Type type,Map<String, Type> properties, DataNodeContainer node) {
+    private def transformDataContainerBody(Type type, Map<String, Type> properties, DataNodeContainer node) {
         val ret = '''
-            Â«FOR child : node.childNodes.filter[!augmenting]»
-                Â«var signature = properties.getFor(child)»
-                //System.out.println("«type.name»#«signature.key»" + value.«signature.key»());
-                Â«serializeProperty(child, signature.value, signature.key)»
+            Â«FOR child : node.childNodes»
+                Â«val signature = properties.getFor(child)»
+                Â«IF signature !== null»
+                    //System.out.println("«type.name»#«signature.key»" + value.«signature.key»());
+                    Â«serializeProperty(child, signature.value, signature.key)»
+                Â«ENDIF»
             Â«ENDFOR»
         '''
         return ret;
     }
 
-    def serializeAugmentations() '''
+    private def serializeAugmentations() '''
         java.util.List _augmentations = (java.util.List) Â«AUGMENTATION_CODEC».serialize(value);
         if(_augmentations != null) {
             _childNodes.addAll(_augmentations);
@@ -1055,12 +1071,15 @@ class TransformerGenerator {
     '''
 
     def Entry<String, Type> getFor(Map<String, Type> map, DataSchemaNode node) {
-        val sig = map.get(node.getterName);
-        if (sig == null) {
-
+        var sig = map.get(node.getterName);
+        if (sig != null) {
+            return new SimpleEntry(node.getterName, sig);
+        }
+        sig = map.get(node.booleanGetterName);
+        if (sig != null) {
             return new SimpleEntry(node.booleanGetterName, map.get(node.booleanGetterName));
         }
-        return new SimpleEntry(node.getterName, sig);
+        return null;
     }
 
     private static def String getBooleanGetterName(DataSchemaNode node) {
@@ -1078,6 +1097,7 @@ class TransformerGenerator {
     private def dispatch CharSequence serializeProperty(ListSchemaNode schema, ParameterizedType type,
         String propertyName) '''
         Â«type.resolvedName» Â«propertyName» = value.«propertyName»();
+        //System.out.println("«propertyName»:" + Â«propertyName»);
         if(«propertyName» != null) {
             java.util.Iterator _iterator = Â«propertyName».iterator();
             boolean _hasNext = _iterator.hasNext();
index 7a72afc88550b3871ea72286f5b791b4a90f568c..864c048a9133a71350d339ff3b62daae109bc44f 100644 (file)
@@ -191,7 +191,6 @@ public class BindingIndependentDataServiceConnector implements //
 
     @Override
     public void close() throws Exception {
-
         if (baCommitHandlerRegistration != null) {
             baCommitHandlerRegistration.close();
         }
index ea4837421dab8923f74c4c6c97e978a3cac229da..254b8725b97b087f6e1a3524a49637d6905f8e57 100644 (file)
@@ -11,7 +11,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public class CommitHandlersTransactions {
 
-    private static class AllwaysSuccessfulTransaction<P,D> implements DataCommitTransaction<P, D> {
+    private static class AllwaysSuccessfulTransaction<P extends Path<P>,D> implements DataCommitTransaction<P, D> {
         
         private final  DataModification<P, D> modification;
 
index 6478a03bbc025f8a7fa1f6ec937270a80d807797..cb3206a3b30f8709fda36137ebd218edb8d4e06e 100644 (file)
@@ -1,7 +1,5 @@
 package org.opendaylight.controller.sal.binding.impl.util;
 
-
-
 import java.util.concurrent.Callable;
 import java.util.concurrent.locks.Lock;
 
@@ -10,50 +8,55 @@ import static com.google.common.base.Preconditions.*;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.List;
 
 import com.google.common.base.Optional;
 
-public class ClassLoaderUtils {
-    
-    public static <V> V withClassLoader(ClassLoader cls,Callable<V> function) throws Exception {
-        return withClassLoaderAndLock(cls, Optional.<Lock>absent(), function);
+public final class ClassLoaderUtils {
+
+    private ClassLoaderUtils() {
+        throw new UnsupportedOperationException("Utility class");
+    }
+
+    public static <V> V withClassLoader(ClassLoader cls, Callable<V> function) throws Exception {
+        return withClassLoaderAndLock(cls, Optional.<Lock> absent(), function);
     }
-    
-    public static <V> V withClassLoaderAndLock(ClassLoader cls,Lock lock,Callable<V> function) throws Exception {
-        checkNotNull(lock,"Lock should not be null");
+
+    public static <V> V withClassLoaderAndLock(ClassLoader cls, Lock lock, Callable<V> function) throws Exception {
+        checkNotNull(lock, "Lock should not be null");
         return withClassLoaderAndLock(cls, Optional.of(lock), function);
     }
-    
-    public static <V> V withClassLoaderAndLock(ClassLoader cls,Optional<Lock> lock,Callable<V> function) throws Exception {
+
+    public static <V> V withClassLoaderAndLock(ClassLoader cls, Optional<Lock> lock, Callable<V> function)
+            throws Exception {
         checkNotNull(cls, "Classloader should not be null");
-        checkNotNull(function,"Function should not be null");
-        if(lock.isPresent()) {
+        checkNotNull(function, "Function should not be null");
+        if (lock.isPresent()) {
             lock.get().lock();
         }
         ClassLoader oldCls = Thread.currentThread().getContextClassLoader();
         try {
             Thread.currentThread().setContextClassLoader(cls);
-            V result = function.call();
-            return result;
-        }  finally {
+            return function.call();
+        } finally {
             Thread.currentThread().setContextClassLoader(oldCls);
-            if(lock.isPresent()) {
+            if (lock.isPresent()) {
                 lock.get().unlock();
             }
         }
     }
 
-    public static Object construct(Constructor<? extends Object> constructor, ArrayList<Object> objects) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
-    Object[] initargs = objects.toArray(new Object[]{});
-    return constructor.newInstance(initargs);
+    public static Object construct(Constructor<? extends Object> constructor, List<Object> objects)
+            throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+        Object[] initargs = objects.toArray(new Object[] {});
+        return constructor.newInstance(initargs);
     }
-    
-    
+
     public static Class<?> loadClassWithTCCL(String name) throws ClassNotFoundException {
-        if("byte[]".equals(name)) {
+        if ("byte[]".equals(name)) {
             return byte[].class;
         }
-        
+
         return Thread.currentThread().getContextClassLoader().loadClass(name);
     }
 }
\ No newline at end of file
diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/YangSchemaUtils.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/YangSchemaUtils.java
new file mode 100644 (file)
index 0000000..b7a21cb
--- /dev/null
@@ -0,0 +1,44 @@
+package org.opendaylight.controller.sal.binding.impl.util;
+
+import java.util.List;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+
+import com.google.common.base.Preconditions;
+
+public class YangSchemaUtils {
+
+    public static final String AUGMENT_IDENTIFIER = "augment-identifier";
+
+
+    public YangSchemaUtils() {
+        throw new UnsupportedOperationException("Helper class. Instantiation is prohibited");
+    }
+
+
+    public static QName getAugmentationQName(AugmentationSchema augmentation) {
+        Preconditions.checkNotNull(augmentation, "Augmentation must not be null.");
+        QName identifier = getAugmentationIdentifier(augmentation);
+        if(identifier != null) {
+            return identifier;
+        }
+        for(DataSchemaNode child : augmentation.getChildNodes()) {
+            // FIXME: Return true name
+            return QName.create(child.getQName(), "foo_augment");
+        }
+        // FIXME: Allways return a qname with module namespace.
+        return null;
+    }
+
+    public static QName getAugmentationIdentifier(AugmentationSchema augmentation) {
+        for(UnknownSchemaNode extension : augmentation.getUnknownSchemaNodes()) {
+            if(AUGMENT_IDENTIFIER.equals(extension.getNodeType().getLocalName())) {
+                return extension.getQName();
+            }
+        }
+        return null;
+    }
+}
index 9f3a6e8652f8c3d47dc65c2aafce56061d26aace..c67a0176d2de550ed6287607b14b546df64d71f7 100644 (file)
@@ -51,7 +51,7 @@ public abstract class AbstractDataServiceTest {
     protected ListeningExecutorService executor;
     protected BindingIndependentDataServiceConnector connectorServiceImpl;
     protected HashMapDataStore rawDataStore;
-    private SchemaAwareDataStoreAdapter schemaAwareDataStore;
+    protected SchemaAwareDataStoreAdapter schemaAwareDataStore;
     private DataStoreStatsWrapper dataStoreStats;
 
     protected DataStore dataStore;
@@ -137,15 +137,15 @@ public abstract class AbstractDataServiceTest {
     @After
     public void afterTest() {
 
-        log.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ns AverageTime (ns): {} ns",
+        log.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
                 dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(),
                 dataStoreStats.getConfigurationReadAverageTime());
 
-        log.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ns AverageTime (ns): {} ns",
+        log.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
                 dataStoreStats.getOperationalReadCount(), dataStoreStats.getOperationalReadTotalTime(),
                 dataStoreStats.getOperationalReadAverageTime());
 
-        log.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ns AverageTime (ns): {} ns",
+        log.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
                 dataStoreStats.getRequestCommitCount(), dataStoreStats.getRequestCommitTotalTime(),
                 dataStoreStats.getRequestCommitAverageTime());
 
index f60ddb991dfc54017e8df463bcb14d0642ee144b..5a98767ff863bc2f446db8566a6ff5505a8312dc 100644 (file)
@@ -10,6 +10,7 @@ import java.util.concurrent.Executors;
 
 
 
+
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
@@ -28,6 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.M
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
@@ -148,7 +150,7 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest {
         assertEquals(TransactionStatus.COMMITED, ret2.getResult());
 
         // Data are not in the store.
-        assertNull(baDataService.readOperationalData(FLOW_INSTANCE_ID_BA));
+        assertNull(baDataService.readConfigurationData(FLOW_INSTANCE_ID_BA));
 
     }
 
@@ -169,11 +171,13 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest {
         flow.setNode(NODE_REF);
         InstructionsBuilder instructions = new InstructionsBuilder();
         InstructionBuilder instruction = new InstructionBuilder();
+        
+        instruction.setOrder(10);
         ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
         List<Action> actionList = new ArrayList<>();
         PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
         popMplsAction.setEthernetType(34);
-        actionList.add(new ActionBuilder().setAction(popMplsAction.build()).build());
+        actionList.add(new ActionBuilder().setAction(popMplsAction.build()).setOrder(10).build());
 
         applyActions.setAction(actionList );
         
@@ -200,17 +204,9 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest {
         FlowBuilder flow = new FlowBuilder();
         flow.setKey(key);
         MatchBuilder match = new MatchBuilder();
-        Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
-        // ipv4Match.setIpv4Destination(new Ipv4Prefix(cliInput.get(4)));
         match.setLayer4Match(new TcpMatchBuilder().build());
         flow.setMatch(match.build());
-        DropAction dropAction = new DropActionBuilder().build();
-        //   ActionBuilder action = new ActionBuilder();
-
-        //  List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action> actions = Collections
-             //   .singletonList(action.build());
-        //   flow.setAction(actions);
-        flow.setPriority(2);
+        
         System.out.println("Putting the configuration Data................");
         path1 = InstanceIdentifier.builder(Flows.class).child(Flow.class, key).toInstance();
        // DataObject cls = (DataObject) modification.readConfigurationData(path1);
index 4df10bc135e51082169c9cd7c8072c6422e4de02..85d484a617afa2acbbdef8c5af8032272483f289 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 import static org.junit.Assert.*;
 
@@ -77,8 +78,10 @@ public class DOMCodecBug02Test extends AbstractDataServiceTest {
                 return transaction.commit();
             }
         });
-        mappingServiceImpl.onGlobalContextUpdated(getContext(getAllModelFilenames()));
         
+        SchemaContext ctx = getContext(getAllModelFilenames());
+        schemaAwareDataStore.onGlobalContextUpdated(ctx);
+        mappingServiceImpl.onGlobalContextUpdated(ctx);
         RpcResult<TransactionStatus> result = future.get().get();
         assertEquals(TransactionStatus.COMMITED, result.getResult());
         
index 2cd396dedc091076e08a28fe964a984619698eb9..91163d80f2ff4f4db1dbfec370aa5a2cd801a737 100644 (file)
@@ -97,9 +97,6 @@ public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataCh
         
         
         testAddingNodeConnector();
-        
-        
-        
         testNodeRemove();
         
         
index 63368bd6c8471597bec9d4225d9aa2eb864a6c95..7fe5f0c5bea91336c103ce3f6224ed6986d9c545 100644 (file)
@@ -166,11 +166,12 @@ public class ChangeOriginatedInDomBrokerTest extends AbstractDataServiceTest {
         flow.setNode(NODE_REF);
         InstructionsBuilder instructions = new InstructionsBuilder();
         InstructionBuilder instruction = new InstructionBuilder();
+        instruction.setOrder(10);
         ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
         List<Action> actionList = new ArrayList<>();
         PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
         popMplsAction.setEthernetType(34);
-        actionList.add(new ActionBuilder().setAction(popMplsAction.build()).build());
+        actionList.add(new ActionBuilder().setAction(popMplsAction.build()).setOrder(0).build());
 
         applyActions.setAction(actionList );
         
index 7fb05806df36f1925a936fb49615212f64339a8d..47e9c611d88ed10f8b701edc5188c5ea27174320 100644 (file)
             <groupId>org.eclipse.xtend</groupId>
             <artifactId>org.eclipse.xtend.lib</artifactId>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
index bee863321fdb1055887c35ff4a3c72e68939ca7e..fb3e38f44af0fff91264f24d197fb77e02d67c49 100644 (file)
@@ -10,8 +10,9 @@ import java.util.concurrent.ConcurrentMap;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
+import org.opendaylight.yangtools.concepts.Path;
 
-public abstract class AbstractDataModification<P /* extends Path<P> */, D> implements DataModification<P, D> {
+public abstract class AbstractDataModification<P extends Path<P>, D> implements DataModification<P, D> {
 
     private final ConcurrentMap<P, D> operationalOriginal;
     private final ConcurrentMap<P, D> configurationOriginal;
@@ -56,28 +57,28 @@ public abstract class AbstractDataModification<P /* extends Path<P> */, D> imple
         unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
         unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
         unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
-
     }
 
     @Override
     public final void putConfigurationData(P path, D data) {
         checkMutable();
-
-        if (!hasConfigurationOriginal(path)) {
+        D original = null;
+        if ((original = getConfigurationOriginal(path)) == null) {
             configurationCreated.put(path, data);
         }
 
-        configurationUpdate.put(path, data);
+        configurationUpdate.put(path, mergeConfigurationData(path,original, data));
         configurationRemove.remove(path);
     }
 
     @Override
     public final void putOperationalData(P path, D data) {
         checkMutable();
-        if (!hasOperationalOriginal(path)) {
+        D original = null;
+        if ((original = getOperationalOriginal(path)) == null) {
             operationalCreated.put(path, data);
         }
-        operationalUpdate.put(path, data);
+        operationalUpdate.put(path, mergeOperationalData(path,original,data));
         operationalRemove.remove(path);
     }
 
@@ -89,7 +90,7 @@ public abstract class AbstractDataModification<P /* extends Path<P> */, D> imple
     @Override
     public final void removeOperationalData(P path) {
         checkMutable();
-        hasOperationalOriginal(path);
+        getOperationalOriginal(path);
         operationalUpdate.remove(path);
         operationalRemove.put(path, path);
     }
@@ -102,7 +103,7 @@ public abstract class AbstractDataModification<P /* extends Path<P> */, D> imple
     @Override
     public final void removeConfigurationData(P path) {
         checkMutable();
-        hasConfigurationOriginal(path);
+        getConfigurationOriginal(path);
         configurationUpdate.remove(path);
         configurationRemove.put(path, path);
     }
@@ -163,27 +164,37 @@ public abstract class AbstractDataModification<P /* extends Path<P> */, D> imple
         return reader.readConfigurationData(path);
     }
 
-    private boolean hasConfigurationOriginal(P path) {
-        if (configurationOriginal.containsKey(path)) {
-            return true;
+    private D getConfigurationOriginal(P path) {
+        D data = configurationOriginal.get(path);
+        if (data != null) {
+            return data;
         }
-        data = reader.readConfigurationData(path);
+        data = reader.readConfigurationData(path);
         if (data != null) {
             configurationOriginal.putIfAbsent(path, data);
-            return true;
+            return data;
         }
-        return false;
+        return null;
     }
 
-    private boolean hasOperationalOriginal(P path) {
-        if (operationalOriginal.containsKey(path)) {
-            return true;
+    private D getOperationalOriginal(P path) {
+        D data = operationalOriginal.get(path);
+        if (data != null) {
+            return data;
         }
-        data = reader.readOperationalData(path);
+        data = reader.readOperationalData(path);
         if (data != null) {
             operationalOriginal.putIfAbsent(path, data);
-            return true;
+            return data;
         }
-        return false;
+        return null;
+    }
+    
+    protected D mergeOperationalData(P path,D stored, D modified) {
+        return modified;
+    }
+    
+    protected D mergeConfigurationData(P path,D stored, D modified) {
+        return modified;
     }
 }
index d6b3c5334aa1c4d02563d51cef0a0d27d8939c61..9e6147359db58cc1ff60e9100feca555f3061333 100644 (file)
@@ -20,7 +20,7 @@ import com.google.common.collect.Multimap;
  * @param <P>
  * @param <D>
  */
-public abstract class AbstractDataReadRouter<P extends Path<?>, D> implements DataReader<P, D> {
+public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements DataReader<P, D> {
 
     Multimap<P, DataReaderRegistration<P, D>> configReaders = HashMultimap.create();
     Multimap<P, DataReaderRegistration<P, D>> operationalReaders = HashMultimap.create();
@@ -139,14 +139,15 @@ public abstract class AbstractDataReadRouter<P extends Path<?>, D> implements Da
             
             @Override
             public boolean apply(Entry<P, DataReaderRegistration<P, D>> input) {
-                final Path key = input.getKey();
-                return key.contains(path) || ((Path) path).contains(key);
+                final P key = input.getKey();
+                return key.contains(path) || ((P) path).contains(key);
             }
             
         };
     }
 
-    private class ConfigurationDataReaderRegistration<P extends Path<?>, D> extends DataReaderRegistration<P, D> {
+    @SuppressWarnings("hiding")
+    private class ConfigurationDataReaderRegistration<P extends Path<P>, D> extends DataReaderRegistration<P, D> {
 
         public ConfigurationDataReaderRegistration(P key, DataReader<P, D> instance) {
             super(key, instance);
@@ -158,7 +159,8 @@ public abstract class AbstractDataReadRouter<P extends Path<?>, D> implements Da
         }
     }
 
-    private class OperationalDataReaderRegistration<P extends Path<?>, D> extends DataReaderRegistration<P, D> {
+    @SuppressWarnings("hiding")
+    private class OperationalDataReaderRegistration<P extends Path<P>, D> extends DataReaderRegistration<P, D> {
 
         public OperationalDataReaderRegistration(P key, DataReader<P, D> instance) {
             super(key, instance);
@@ -170,7 +172,7 @@ public abstract class AbstractDataReadRouter<P extends Path<?>, D> implements Da
         }
     }
 
-    private abstract static class DataReaderRegistration<P extends Path<?>, D> extends
+    private abstract static class DataReaderRegistration<P extends Path<P>, D> extends
             AbstractObjectRegistration<DataReader<P, D>> {
 
         private final P key;
index a18e5a9c824a675af339d93e02d770e4ccbaf285..5f4f8159617e695e930b5c142708834166fbb985 100644 (file)
@@ -28,8 +28,6 @@ import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRo
 import org.opendaylight.yangtools.concepts.Path
 import org.slf4j.LoggerFactory
 import java.util.HashSet
-import java.util.Map.Entry
-import java.util.Iterator
 import java.util.Collection
 import com.google.common.collect.FluentIterable;
 import java.util.Set
@@ -37,7 +35,6 @@ import com.google.common.collect.ImmutableList
 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandlerRegistration
 import org.opendaylight.controller.md.sal.common.api.RegistrationListener
 import org.opendaylight.yangtools.concepts.util.ListenerRegistry
-import java.util.concurrent.atomic.AtomicLong
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent
 
 abstract class AbstractDataBroker<P extends Path<P>, D, DCL extends DataChangeListener<P, D>> implements DataModificationTransactionFactory<P, D>, //
index 68f9506c56425e29ad91e6b2c42a1fd9059542f1..83943a1f389edb229b94963b57f3ec37544cd12d 100644 (file)
@@ -5,8 +5,10 @@ import java.util.Set;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChange;
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.Path;
 
-public class DataChangeEventImpl<P, D> implements DataChangeEvent<P, D> {
+public class DataChangeEventImpl<P extends Path<P>, D> implements DataChangeEvent<P, D>, Immutable {
 
     private final DataChange<P, D> dataChange;
 
index 2764635720bfd7d4da05280778ad1dfd17d142ea..474d4b88117defbcf80d974f2e57b6b76c81c606 100644 (file)
@@ -5,15 +5,28 @@ import java.util.Map;
 import java.util.Set;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.Path;
 
-public class InitialDataChangeEventImpl<P,D> implements DataChangeEvent<P, D> {
+public class InitialDataChangeEventImpl<P extends Path<P>,D> implements DataChangeEvent<P, D>, Immutable {
 
-    private final D originalOperationalTree;
-    private final D originalConfigurationTree;
+    private final D updatedOperationalTree;
+    private final D updatedConfigurationTree;
+    private final Map<P,D> updatedConfigurationData;
+    private final Map<P,D> updatedOperationalData;
 
     public InitialDataChangeEventImpl(D configTree, D operTree) {
-        originalConfigurationTree = configTree;
-        originalOperationalTree = operTree;
+        updatedConfigurationTree = configTree;
+        updatedOperationalTree = operTree;
+        updatedConfigurationData = Collections.emptyMap();
+        updatedOperationalData = Collections.emptyMap();
+    }
+    
+    public InitialDataChangeEventImpl(D configTree, D operTree, Map<P, D> updatedCfgData, Map<P, D> updatedOperData) {
+        updatedConfigurationTree = configTree;
+        updatedOperationalTree = operTree;
+        updatedConfigurationData = updatedCfgData;
+        updatedOperationalData = updatedOperData;
     }
     
     @Override
@@ -44,31 +57,31 @@ public class InitialDataChangeEventImpl<P,D> implements DataChangeEvent<P, D> {
     }
     @Override
     public Map<P, D> getUpdatedConfigurationData() {
-        return Collections.emptyMap();
+        return updatedConfigurationData;
     }
     
     @Override
     public D getUpdatedConfigurationSubtree() {
-        return originalConfigurationTree;
+        return updatedConfigurationTree;
     }
     @Override
     public D getUpdatedOperationalSubtree() {
-        return originalOperationalTree;
+        return updatedOperationalTree;
     }
     
     @Override
     public D getOriginalConfigurationSubtree() {
-        return originalConfigurationTree;
+        return updatedConfigurationTree;
     }
     
     @Override
     public D getOriginalOperationalSubtree() {
-        return originalOperationalTree;
+        return updatedOperationalTree;
     }
     
     @Override
     public Map<P, D> getUpdatedOperationalData() {
-        return Collections.emptyMap();
+        return updatedOperationalData;
     }
     
 
index 14ab0573989887d2431f9d2262c2dbee8e6a215b..a6601cef21f98e50c378cc573b2ea14f207655c7 100644 (file)
             <artifactId>sal-common-util</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
-
-        <dependency>
-            <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>yang-data-impl</artifactId>
-            <version>0.5.9-SNAPSHOT</version>
-        </dependency>
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-common-impl</artifactId>
             <artifactId>config-api</artifactId>
             <version>0.2.3-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-impl</artifactId>
+            <version>0.5.9-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-parser-impl</artifactId>
index 54c94dca9f83601dfbbd666a49e48476091feb02..da7cccb156d9ac1437474a01e8cc1260c8ee9bcf 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
 import org.opendaylight.controller.sal.core.api.data.DataStore
 import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter
+import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener
 
 class BrokerConfigActivator implements AutoCloseable {
     
@@ -51,6 +52,8 @@ class BrokerConfigActivator implements AutoCloseable {
         wrappedStore = new SchemaAwareDataStoreAdapter();
         wrappedStore.changeDelegate(store);
         wrappedStore.setValidationEnabled(false);
+       
+        context.registerService(SchemaServiceListener,wrappedStore,emptyProperties)  
         
         dataService.registerConfigurationReader(ROOT, wrappedStore);
         dataService.registerCommitHandler(ROOT, wrappedStore);
index 531f9e86c2dd76f55116a46a8d347d9b2daa1f6a..a6c1c508aaa7327b7a008975dd50aa9c3b09ae9a 100644 (file)
@@ -41,9 +41,9 @@ import com.google.common.collect.Sets;
 import static com.google.common.base.Preconditions.*;
 
 public class SchemaServiceImpl implements //
-SchemaService, //
-ServiceTrackerCustomizer<SchemaServiceListener, SchemaServiceListener>, //
-AutoCloseable {
+        SchemaService, //
+        ServiceTrackerCustomizer<SchemaServiceListener, SchemaServiceListener>, //
+        AutoCloseable {
     private static final Logger logger = LoggerFactory.getLogger(SchemaServiceImpl.class);
 
     private ListenerRegistry<SchemaServiceListener> listeners;
@@ -61,7 +61,7 @@ AutoCloseable {
     private BundleTracker<Object> bundleTracker;
     private final YangStoreCache cache = new YangStoreCache();
 
-    private ServiceTracker<SchemaServiceListener,SchemaServiceListener> listenerTracker;
+    private ServiceTracker<SchemaServiceListener, SchemaServiceListener> listenerTracker;
 
     public ListenerRegistry<SchemaServiceListener> getListeners() {
         return listeners;
@@ -93,7 +93,7 @@ AutoCloseable {
         if (listeners == null) {
             listeners = new ListenerRegistry<>();
         }
-        
+
         listenerTracker = new ServiceTracker<>(context, SchemaServiceListener.class, this);
         bundleTracker = new BundleTracker<Object>(context, BundleEvent.RESOLVED | BundleEvent.UNRESOLVED, scanner);
         bundleTracker.open();
@@ -132,12 +132,11 @@ AutoCloseable {
         throw new UnsupportedOperationException();
     }
 
-    
     @Override
     public ListenerRegistration<SchemaServiceListener> registerSchemaServiceListener(SchemaServiceListener listener) {
         return listeners.register(listener);
     }
-    
+
     @Override
     public void close() throws Exception {
         bundleTracker.close();
@@ -147,7 +146,7 @@ AutoCloseable {
 
     private synchronized boolean tryToUpdateState(Collection<URL> changedURLs, Multimap<Bundle, URL> proposedNewState,
             boolean adding) {
-        Preconditions.checkArgument(changedURLs.size() > 0, "No change can occur when no URLs are changed");
+        Preconditions.checkArgument(!changedURLs.isEmpty(), "No change can occur when no URLs are changed");
 
         try {
             // consistent state
@@ -166,8 +165,8 @@ AutoCloseable {
         } catch (Exception e) {
             // inconsistent state
             logger.debug(
-                    "SchemaService is falling back on last consistent state containing {}, inconsistent yang files {}, reason {}",
-                    consistentBundlesToYangURLs, inconsistentBundlesToYangURLs, e.toString());
+                    "SchemaService is falling back on last consistent state containing {}, inconsistent yang files {}",
+                    consistentBundlesToYangURLs, inconsistentBundlesToYangURLs, e);
             return false;
         }
     }
@@ -196,15 +195,15 @@ AutoCloseable {
 
     private void updateCache(SchemaContext snapshot) {
         cache.cacheYangStore(consistentBundlesToYangURLs, snapshot);
-        
+
         Object[] services = listenerTracker.getServices();
-        if(services != null) {
-            for(Object rawListener : services) {
+        if (services != null) {
+            for (Object rawListener : services) {
                 SchemaServiceListener listener = (SchemaServiceListener) rawListener;
                 try {
                     listener.onGlobalContextUpdated(snapshot);
                 } catch (Exception e) {
-                    logger.error("Exception occured during invoking listener",e);
+                    logger.error("Exception occured during invoking listener", e);
                 }
             }
         }
@@ -212,7 +211,7 @@ AutoCloseable {
             try {
                 listener.getInstance().onGlobalContextUpdated(snapshot);
             } catch (Exception e) {
-                logger.error("Exception occured during invoking listener",e);
+                logger.error("Exception occured during invoking listener", e);
             }
         }
     }
@@ -225,8 +224,9 @@ AutoCloseable {
             // system bundle might have config-api on classpath &&
             // config-api contains yang files =>
             // system bundle might contain yang files from that bundle
-            if (bundle.getBundleId() == 0)
+            if (bundle.getBundleId() == 0) {
                 return bundle;
+            }
 
             Enumeration<URL> enumeration = bundle.findEntries("META-INF/yang", "*.yang", false);
             if (enumeration != null && enumeration.hasMoreElements()) {
@@ -243,7 +243,7 @@ AutoCloseable {
                     proposedNewState.putAll(inconsistentBundlesToYangURLs);
                     proposedNewState.putAll(bundle, addedURLs);
                     boolean adding = true;
-                    
+
                     if (tryToUpdateState(addedURLs, proposedNewState, adding) == false) {
                         inconsistentBundlesToYangURLs.putAll(bundle, addedURLs);
                     }
@@ -301,23 +301,23 @@ AutoCloseable {
             this.cachedContextSnapshot = ctx;
         }
     }
-    
+
     @Override
     public SchemaServiceListener addingService(ServiceReference<SchemaServiceListener> reference) {
-        
+
         SchemaServiceListener listener = context.getService(reference);
         SchemaContext _ctxContext = getGlobalContext();
-        if(getContext() != null) {
+        if (getContext() != null) {
             listener.onGlobalContextUpdated(_ctxContext);
         }
         return listener;
     }
-    
+
     @Override
     public void modifiedService(ServiceReference<SchemaServiceListener> reference, SchemaServiceListener service) {
         // NOOP
     }
-    
+
     @Override
     public void removedService(ServiceReference<SchemaServiceListener> reference, SchemaServiceListener service) {
         context.ungetService(reference);
index 9116d50d9c4965fc81842a4a6e1f558f457c2ad3..0d2d1c87512db820b459341eb73978acd3559f03 100644 (file)
@@ -52,7 +52,7 @@ public class DataStoreStatsWrapper implements Delegator<DataStore>, DataStore {
         } finally {
             final long endTime = System.nanoTime();
             final long runTime = endTime - startTime;
-            cfgReadTimeTotal.addAndGet(runTime);
+            operReadTimeTotal.addAndGet(runTime);
         }
     }
 
@@ -98,40 +98,40 @@ public class DataStoreStatsWrapper implements Delegator<DataStore>, DataStore {
         return requestCommitCount.get();
     }
 
-    public final long getConfigurationReadTotalTime() {
-        return cfgReadTimeTotal.get();
+    public final double getConfigurationReadTotalTime() {
+        return cfgReadTimeTotal.get() / 1000.0d;
     }
 
-    public final long getOperationalReadTotalTime() {
-        return operReadTimeTotal.get();
+    public final double getOperationalReadTotalTime() {
+        return operReadTimeTotal.get() / 1000.0d;
     }
 
-    public final long getRequestCommitTotalTime() {
-        return requestCommitTimeTotal.get();
+    public final double getRequestCommitTotalTime() {
+        return requestCommitTimeTotal.get() / 1000.0d;
     }
 
-    public final long getConfigurationReadAverageTime() {
+    public final double getConfigurationReadAverageTime() {
         long readCount = cfgReadCount.get();
         if(readCount == 0) {
             return 0;
         }
-        return cfgReadTimeTotal.get() / readCount;
+        return getConfigurationReadTotalTime() / readCount;
     }
 
-    public final long getOperationalReadAverageTime() {
+    public final double getOperationalReadAverageTime() {
         long readCount = operReadCount.get();
         if(readCount == 0) {
             return 0;
         }
-        return operReadTimeTotal.get() / readCount;
+        return getOperationalReadTotalTime() / readCount;
     }
 
-    public final long getRequestCommitAverageTime() {
+    public final double getRequestCommitAverageTime() {
         long count = requestCommitCount.get();
         if(count == 0) {
             return 0;
         }
-        return requestCommitTimeTotal.get() / count;
+        return getRequestCommitTotalTime() / count;
     }
 
 }
index d67697f84941cf67fdce2a7a77443a508df95521..d8680ce3b4fba50da12903344a4bad551de87075 100644 (file)
@@ -12,9 +12,9 @@ import java.util.concurrent.ConcurrentHashMap
 import java.util.Set
 import java.util.Collections
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration
-import org.opendaylight.controller.md.sal.common.impl.ListenerRegistry
 import org.opendaylight.controller.sal.core.api.RpcRegistrationListener
 import org.slf4j.LoggerFactory
+import org.opendaylight.yangtools.concepts.util.ListenerRegistry
 
 class RpcRouterImpl implements RpcRouter, Identifiable<String> {
 
diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataMerger.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataMerger.xtend
deleted file mode 100644 (file)
index 8cdbf92..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.opendaylight.controller.sal.dom.broker.impl
-
-import org.opendaylight.yangtools.yang.model.api.SchemaContext
-import org.opendaylight.yangtools.yang.data.api.CompositeNode
-
-class SchemaAwareDataMerger {
-
-    private SchemaContext schema;
-    
-    
-    
-    
-}
\ No newline at end of file
index 1f908140b0ba60ca286095e4c693804609ec3472..4f4fadcc443a755809394998246fccfeb7845aa8 100644 (file)
@@ -5,23 +5,35 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
+import org.opendaylight.controller.md.sal.common.impl.AbstractDataModification;
 import org.opendaylight.controller.md.sal.common.impl.util.AbstractLockableDelegator;
 import org.opendaylight.controller.sal.core.api.data.DataStore;
 import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.util.YangDataOperations;
+import org.opendaylight.yangtools.yang.util.YangSchemaUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,6 +41,7 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 
 import static com.google.common.base.Preconditions.*;
+import org.opendaylight.yangtools.yang.util.YangDataOperations;
 
 public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataStore> implements //
         DataStore, //
@@ -39,7 +52,6 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
 
     private SchemaContext schema = null;
     private boolean validationEnabled = false;
-    private SchemaAwareDataMerger dataMerger = null;
     private DataReader<InstanceIdentifier, CompositeNode> reader = new MergeFirstLevelReader();
 
     @Override
@@ -100,7 +112,8 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
     public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier, CompositeNode> requestCommit(
             DataModification<InstanceIdentifier, CompositeNode> modification) {
         validateAgainstSchema(modification);
-        DataModification<InstanceIdentifier, CompositeNode> cleanedUp = prepareMergedTransaction(modification);
+        NormalizedDataModification cleanedUp = prepareMergedTransaction(modification);
+        cleanedUp.status = TransactionStatus.SUBMITED;
         return retrieveDelegate().requestCommit(cleanedUp);
     }
 
@@ -138,10 +151,39 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
         this.schema = null;
     }
 
-    private DataModification<InstanceIdentifier, CompositeNode> prepareMergedTransaction(
+    protected CompositeNode mergeData(InstanceIdentifier path, CompositeNode stored, CompositeNode modified, boolean config) {
+        long startTime = System.nanoTime();
+        try {
+        DataSchemaNode node = schemaNodeFor(path);
+        return YangDataOperations.merge(node,stored,modified,config);
+        } finally {
+            //System.out.println("Merge time: " + ((System.nanoTime() - startTime) / 1000.0d));
+        }
+    }
+    
+    
+    private DataSchemaNode schemaNodeFor(InstanceIdentifier path) {
+        checkState(schema != null,"YANG Schema is not available");
+        return YangSchemaUtils.getSchemaNode(schema, path);
+    }
+
+    private NormalizedDataModification prepareMergedTransaction(
             DataModification<InstanceIdentifier, CompositeNode> original) {
         // NOOP for now
-        return original;
+        NormalizedDataModification normalized = new NormalizedDataModification(original);
+        for (Entry<InstanceIdentifier,CompositeNode> entry : original.getUpdatedConfigurationData().entrySet()) {
+            normalized.putConfigurationData(entry.getKey(), entry.getValue());
+        }
+        for (Entry<InstanceIdentifier,CompositeNode> entry : original.getUpdatedOperationalData().entrySet()) {
+            normalized.putOperationalData(entry.getKey(), entry.getValue());
+        }
+        for (InstanceIdentifier entry : original.getRemovedConfigurationData()) {
+            normalized.removeConfigurationData(entry);
+        }
+        for(InstanceIdentifier entry : original.getRemovedOperationalData()) {
+            normalized.removeOperationalData(entry);
+        }
+        return normalized;
     }
 
     private final Comparator<Entry<InstanceIdentifier, CompositeNode>> preparationComparator = new Comparator<Entry<InstanceIdentifier, CompositeNode>>() {
@@ -242,4 +284,44 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
             }
         }
     }
+    
+    private class NormalizedDataModification extends AbstractDataModification<InstanceIdentifier, CompositeNode> {
+
+        private Object identifier;
+        private TransactionStatus status;
+
+        public NormalizedDataModification(DataModification<InstanceIdentifier, CompositeNode> original) {
+            super(getDelegate());
+            identifier = original;
+            status = TransactionStatus.NEW;
+        }
+        
+        @Override
+        public Object getIdentifier() {
+            return this.identifier;
+        }
+        
+        @Override
+        public TransactionStatus getStatus() {
+            return status;
+        }
+
+        @Override
+        public Future<RpcResult<TransactionStatus>> commit() {
+            throw new UnsupportedOperationException("Commit should not be invoked on this");
+        }
+        
+        @Override
+        protected CompositeNode mergeConfigurationData(InstanceIdentifier path,CompositeNode stored, CompositeNode modified) {
+            return mergeData(path,stored, modified,true);
+        }
+        
+        @Override
+        protected CompositeNode mergeOperationalData(InstanceIdentifier path,CompositeNode stored, CompositeNode modified) {
+            // TODO Auto-generated method stub
+            return mergeData(path,stored,modified,false);
+        }
+        
+    }
+
 }
diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangDataOperations.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangDataOperations.xtend
new file mode 100644 (file)
index 0000000..f69e00a
--- /dev/null
@@ -0,0 +1,116 @@
+package org.opendaylight.yangtools.yang.util
+
+import org.opendaylight.yangtools.yang.data.api.CompositeNode
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
+import static com.google.common.base.Preconditions.*;
+import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl
+import java.util.ArrayList
+
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
+import org.opendaylight.yangtools.yang.data.api.Node
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
+import java.util.List
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode
+import java.util.Collections
+import static extension org.opendaylight.yangtools.yang.util.YangDataUtils.*;
+import java.util.HashSet
+import org.opendaylight.yangtools.yang.common.QName
+
+class YangDataOperations {
+
+    static def CompositeNode merge(DataSchemaNode schema, CompositeNode stored, CompositeNode modified, boolean config) {
+        checkConfigurational(schema, config);
+        if (stored === null) {
+            return modified;
+        }
+
+        if (schema instanceof ListSchemaNode || schema instanceof ContainerSchemaNode) {
+            return mergeContainer(schema as DataNodeContainer, stored, modified, config);
+        }
+        throw new IllegalArgumentException("Supplied node is not data node container.");
+    }
+
+    private def static checkConfigurational(DataSchemaNode node, boolean config) {
+        if (config) {
+            checkArgument(node.configuration, "Supplied composite node is not configurational.");
+        }
+    }
+
+    private static dispatch def Iterable<? extends Node<?>> mergeMultiple(LeafSchemaNode node, List<Node<?>> original,
+        List<Node<?>> modified, boolean configurational) {
+        checkArgument(original.size === 1);
+        checkArgument(modified.size === 1);
+        checkConfigurational(node, configurational);
+        return modified;
+    }
+
+    private static dispatch def Iterable<? extends Node<?>> mergeMultiple(LeafListSchemaNode node,
+        List<Node<?>> original, List<Node<?>> modified, boolean configurational) {
+        return modified;
+    }
+
+    private static dispatch def Iterable<? extends Node<?>> mergeMultiple(ContainerSchemaNode node,
+        List<Node<?>> original, List<Node<?>> modified, boolean configurational) {
+        checkArgument(original.size === 1);
+        checkArgument(modified.size === 1);
+        return Collections.singletonList(
+            merge(node, original.get(0) as CompositeNode, modified.get(0) as CompositeNode, configurational));
+    }
+
+    private static dispatch def Iterable<? extends Node<?>> mergeMultiple(ListSchemaNode node, List<Node<?>> original,
+        List<Node<?>> modified, boolean configurational) {
+        checkConfigurational(node,configurational);
+        if(node.keyDefinition === null || node.keyDefinition.empty) {
+            return modified;
+        } 
+        val originalMap = (original as List).toIndexMap(node.keyDefinition);
+        val modifiedMap = (modified as List).toIndexMap(node.keyDefinition);
+        
+        val List<Node<?>> mergedNodes = new ArrayList(original.size + modified.size);
+        for(entry : modifiedMap.entrySet) {
+            val originalEntry = originalMap.get(entry.key);
+            if(originalEntry != null) {
+                originalMap.remove(entry.key);
+                mergedNodes.add(merge(node,originalEntry,entry.value,configurational));
+                
+            }
+        }
+        mergedNodes.addAll(originalMap.values);
+        return mergedNodes;
+    }
+
+    static private def CompositeNode mergeContainer(DataNodeContainer schema, CompositeNode stored,
+        CompositeNode modified, boolean config) {
+        if (stored == null) {
+            return modified;
+        }
+        checkNotNull(stored)
+        checkNotNull(modified)
+        checkArgument(stored.nodeType == modified.nodeType);
+
+        val mergedChildNodes = new ArrayList<Node<?>>(stored.children.size + modified.children.size);
+        
+        val toProcess = new HashSet<QName>(stored.keySet);
+        toProcess.addAll(modified.keySet);
+        
+        for (qname : toProcess) {
+            val schemaChild = schema.getDataChildByName(qname);
+            val storedChildren = stored.get(qname);
+            val modifiedChildren = modified.get(qname);
+
+            if (modifiedChildren !== null && !modifiedChildren.empty) {
+                if (storedChildren === null || storedChildren.empty || schemaChild === null) {
+                    mergedChildNodes.addAll(modifiedChildren);
+                } else {
+                    mergedChildNodes.addAll(mergeMultiple(schemaChild, storedChildren, modifiedChildren, config));
+                }
+            } else if (storedChildren !== null && !storedChildren.empty) {
+                mergedChildNodes.addAll(storedChildren);
+            }
+        }
+        return new CompositeNodeTOImpl(stored.nodeType, null, mergedChildNodes);
+    }
+
+}
diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangDataUtils.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangDataUtils.java
new file mode 100644 (file)
index 0000000..687e4d9
--- /dev/null
@@ -0,0 +1,44 @@
+package org.opendaylight.yangtools.yang.util;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.SimpleNode;
+
+import static com.google.common.base.Preconditions.*;
+
+public class YangDataUtils {
+
+    public YangDataUtils() {
+        // TODO Auto-generated constructor stub
+    }
+
+    
+    
+    public static Map<Map<QName,Object>,CompositeNode> toIndexMap(List<CompositeNode> nodes,List<QName> keys) {
+        ConcurrentHashMap<Map<QName,Object>,CompositeNode> ret = new ConcurrentHashMap<>();
+        for(CompositeNode node : nodes) {
+            Map<QName, Object> key = getKeyMap(node,keys);
+            ret.put(key, node);
+        }
+        return ret;
+    }
+
+
+
+    public static Map<QName,Object> getKeyMap(CompositeNode node, List<QName> keys) {
+        Map<QName,Object> map = new HashMap<>();
+        for(QName key : keys) {
+            SimpleNode<?> keyNode = node.getFirstSimpleByName(QName.create(node.getNodeType(), key.getLocalName()));
+            checkArgument(keyNode != null,"Node must contains all keys.");
+            Object value = keyNode.getValue();
+            map.put(key, value);
+            
+        }
+        return map;
+    }
+}
diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangSchemaUtils.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangSchemaUtils.java
new file mode 100644 (file)
index 0000000..44ee2a3
--- /dev/null
@@ -0,0 +1,239 @@
+package org.opendaylight.yangtools.yang.util;
+
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
+import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+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.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
+
+import static com.google.common.base.Preconditions.*;
+
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+
+public class YangSchemaUtils {
+
+    private static final Function<PathArgument, QName> QNAME_FROM_PATH_ARGUMENT = new Function<PathArgument, QName>(){
+        
+        @Override
+        public QName apply(PathArgument input) {
+            if(input == null) {
+                return null;
+            }
+            return input.getNodeType();
+        }
+    };
+
+    private  YangSchemaUtils() {
+        throw new UnsupportedOperationException("Utility class.");
+    }
+    
+    
+    public static DataSchemaNode getSchemaNode(SchemaContext schema,InstanceIdentifier path) {
+        checkArgument(schema != null,"YANG Schema must not be null.");
+        checkArgument(path != null,"Path must not be null.");
+        return getSchemaNode(schema, FluentIterable.from(path.getPath()).transform(QNAME_FROM_PATH_ARGUMENT));
+    }
+    
+    public static DataSchemaNode getSchemaNode(SchemaContext schema,Iterable<QName> path) {
+        checkArgument(schema != null,"YANG Schema must not be null.");
+        checkArgument(path != null,"Path must not be null.");
+        if(!path.iterator().hasNext()){
+            return toRootDataNode(schema);
+        }
+        
+        QName firstNode = path.iterator().next();
+        DataNodeContainer previous = schema.findModuleByNamespaceAndRevision(firstNode.getNamespace(),
+                firstNode.getRevision());
+        Iterator<QName> iterator = path.iterator();
+        
+        while (iterator.hasNext()) {
+            checkArgument(previous!= null, "Supplied path does not resolve into valid schema node.");
+            QName arg = iterator.next();
+            DataSchemaNode currentNode = previous.getDataChildByName(arg);
+            if (currentNode == null && previous instanceof DataNodeContainer) {
+                currentNode = searchInChoices(previous, arg);
+            }
+            if (currentNode instanceof DataNodeContainer) {
+                previous = (DataNodeContainer) currentNode;
+            } else if (currentNode instanceof LeafSchemaNode || currentNode instanceof LeafListSchemaNode) {
+                checkArgument(!iterator.hasNext(), "Path nests inside leaf node, which is not allowed.");
+                return currentNode;
+            }
+        }
+        return (DataSchemaNode) previous;
+    }
+    
+
+    private static DataSchemaNode searchInChoices(DataNodeContainer node, QName arg) {
+        Set<DataSchemaNode> children = node.getChildNodes();
+        for (DataSchemaNode child : children) {
+            if (child instanceof ChoiceNode) {
+                ChoiceNode choiceNode = (ChoiceNode) child;
+                DataSchemaNode potential = searchInCases(choiceNode, arg);
+                if (potential != null) {
+                    return potential;
+                }
+            }
+        }
+        return null;
+    }
+
+    private static DataSchemaNode searchInCases(ChoiceNode choiceNode, QName arg) {
+        Set<ChoiceCaseNode> cases = choiceNode.getCases();
+        for (ChoiceCaseNode caseNode : cases) {
+            DataSchemaNode node = caseNode.getDataChildByName(arg);
+            if (node != null) {
+                return node;
+            }
+        }
+        return null;
+    }
+
+    private static ContainerSchemaNode toRootDataNode(SchemaContext schema) {
+        return new NetconfDataRootNode(schema);
+    }
+
+    private static final class NetconfDataRootNode implements ContainerSchemaNode {
+    
+        public NetconfDataRootNode(SchemaContext schema) {
+            // TODO Auto-generated constructor stub
+        }
+
+        @Override
+        public YangNode getParent() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public Set<TypeDefinition<?>> getTypeDefinitions() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public Set<DataSchemaNode> getChildNodes() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public Set<GroupingDefinition> getGroupings() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public DataSchemaNode getDataChildByName(QName name) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public DataSchemaNode getDataChildByName(String name) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public Set<UsesNode> getUses() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public Set<AugmentationSchema> getAvailableAugmentations() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public boolean isAugmenting() {
+            // TODO Auto-generated method stub
+            return false;
+        }
+    
+        @Override
+        public boolean isAddedByUses() {
+            // TODO Auto-generated method stub
+            return false;
+        }
+    
+        @Override
+        public boolean isConfiguration() {
+            // TODO Auto-generated method stub
+            return false;
+        }
+    
+        @Override
+        public ConstraintDefinition getConstraints() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public QName getQName() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public SchemaPath getPath() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public String getDescription() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public String getReference() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public Status getStatus() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    
+        @Override
+        public boolean isPresenceContainer() {
+            // TODO Auto-generated method stub
+            return false;
+        }
+    
+    }
+
+}
index 0cc7beb356a38a508a1cdd52138f88b4a45a4a0c..c48ac311abb33dc0ffdfe5ee1ca4c3f26595111b 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.controller.md.statistics.manager;
 
 import java.util.List;
 
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.features.GroupFeatures;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
index cdcd1ef32edde93dbc83745a62c97f81a2f42a83..7dda447e6ae524c60f7075cb2c470ad2155ee5b9 100644 (file)
@@ -20,8 +20,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
@@ -31,8 +29,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -55,8 +51,9 @@ public class StatisticsProvider implements AutoCloseable {
     
     private Thread statisticsRequesterThread;
     
-    private final  InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class).toInstance();
+    private final  InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder(Nodes.class).toInstance();
     
+    private final int STATS_THREAD_EXECUTION_TIME= 50000;
     //Local caching of stats
     
     private final ConcurrentMap<NodeId,NodeStatistics> statisticsCache = 
@@ -103,7 +100,7 @@ public class StatisticsProvider implements AutoCloseable {
                     try {
                         statsRequestSender();
                         
-                        Thread.sleep(5000);
+                        Thread.sleep(STATS_THREAD_EXECUTION_TIME);
                     }catch (Exception e){
                         spLogger.error("Exception occurred while sending stats request : {}",e);
                     }
@@ -111,9 +108,9 @@ public class StatisticsProvider implements AutoCloseable {
             }
         });
         
-        spLogger.debug("Statistics requester thread started with timer interval : {}",5000);
+        spLogger.debug("Statistics requester thread started with timer interval : {}",STATS_THREAD_EXECUTION_TIME);
         
-        //statisticsRequesterThread.start();
+        statisticsRequesterThread.start();
         
         spLogger.info("Statistics Provider started.");
     }
@@ -141,17 +138,18 @@ public class StatisticsProvider implements AutoCloseable {
                 InstanceIdentifier<Node> targetInstanceId = InstanceIdentifier.builder(Nodes.class).child(Node.class,targetNode.getKey()).toInstance();
                 NodeRef targetNodeRef = new NodeRef(targetInstanceId);
                 
-                sendAllGroupStatisticsRequest(targetNodeRef);
-                
-                sendAllMeterStatisticsRequest(targetNodeRef);
-                
-                sendGroupDescriptionRequest(targetNodeRef);
-                
-                sendGroupFeaturesRequest(targetNodeRef);
-                
-                sendMeterConfigStatisticsRequest(targetNodeRef);
-                
-                sendMeterFeaturesRequest(targetNodeRef);
+                try{
+                  sendAllGroupStatisticsRequest(targetNodeRef);
+                  Thread.sleep(1000);
+                  sendAllMeterStatisticsRequest(targetNodeRef);
+                  Thread.sleep(1000);
+                  sendGroupDescriptionRequest(targetNodeRef);
+                  Thread.sleep(1000);
+                  sendMeterConfigStatisticsRequest(targetNodeRef);
+                  Thread.sleep(1000);
+                }catch(Exception e){
+                    spLogger.error("Exception occured while sending statistics request : {}", e);
+                }
             }
         }
     }
@@ -178,17 +176,6 @@ public class StatisticsProvider implements AutoCloseable {
                 groupStatsService.getGroupDescription(input.build());
     }
     
-    private void sendGroupFeaturesRequest(NodeRef targetNode){
-        
-        GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder();
-        
-        input.setNode(targetNode);
-
-        @SuppressWarnings("unused")
-        Future<RpcResult<GetGroupFeaturesOutput>> response = 
-                groupStatsService.getGroupFeatures(input.build());
-    }
-    
     private void sendAllMeterStatisticsRequest(NodeRef targetNode){
         
         GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
@@ -211,16 +198,6 @@ public class StatisticsProvider implements AutoCloseable {
                 meterStatsService.getAllMeterConfigStatistics(input.build());
         
     }
-    private void sendMeterFeaturesRequest(NodeRef targetNode){
-     
-        GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder();
-        
-        input.setNode(targetNode);
-
-        @SuppressWarnings("unused")
-        Future<RpcResult<GetMeterFeaturesOutput>> response = 
-                meterStatsService.getMeterFeatures(input.build());
-    }
     
     public ConcurrentMap<NodeId, NodeStatistics> getStatisticsCache() {
         return statisticsCache;
index bbbb5c856646cf273445f47e84e8a1a5e46df844..d1bfe1e972a6b0273cfe002a4ee3eb1a8549f677 100644 (file)
@@ -20,9 +20,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatistics;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatisticsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupFeaturesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupStatisticsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.desc.GroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.features.GroupFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.statistics.GroupStatisticsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
@@ -86,7 +86,7 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         nodeData.addAugmentation(NodeMeterConfigStats.class, meterConfig.build());
         
         InstanceIdentifier<? extends Object> refValue = ref.getValue();
-        it.putRuntimeData(refValue, nodeData.build());
+        it.putOperationalData(refValue, nodeData.build());
         it.commit();
 
     }
@@ -117,7 +117,7 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         nodeData.addAugmentation(NodeMeterStatistics.class, meterStats.build());
         
         InstanceIdentifier<? extends Object> refValue = ref.getValue();
-        it.putRuntimeData(refValue, nodeData.build());
+        it.putOperationalData(refValue, nodeData.build());
         it.commit();
 
     }
@@ -148,7 +148,7 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         nodeData.addAugmentation(NodeGroupDescStats.class, groupDesc.build());
         
         InstanceIdentifier<? extends Object> refValue = ref.getValue();
-        it.putRuntimeData(refValue, nodeData.build());
+        it.putOperationalData(refValue, nodeData.build());
         it.commit();
 
     }
@@ -181,7 +181,7 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         nodeData.addAugmentation(NodeGroupStatistics.class, groupStats.build());
         
         InstanceIdentifier<? extends Object> refValue = ref.getValue();
-        it.putRuntimeData(refValue, nodeData.build());
+        it.putOperationalData(refValue, nodeData.build());
         it.commit();
     }
     
@@ -194,8 +194,8 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
             cache.put(notification.getId(), new NodeStatistics());
         }
         MeterFeaturesBuilder meterFeature = new MeterFeaturesBuilder();
-        meterFeature.setBandTypes(notification.getBandTypes());
-        meterFeature.setCapabilities(notification.getCapabilities());
+        meterFeature.setMeterBandSupported(notification.getMeterBandSupported());
+        meterFeature.setMeterCapabilitiesSupported(notification.getMeterCapabilitiesSupported());
         meterFeature.setMaxBands(notification.getMaxBands());
         meterFeature.setMaxColor(notification.getMaxColor());
         meterFeature.setMaxMeter(notification.getMaxMeter());
@@ -217,12 +217,13 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         nodeData.addAugmentation(NodeMeterFeatures.class, nodeMeterFeatures.build());
         
         InstanceIdentifier<? extends Object> refValue = ref.getValue();
-        it.putRuntimeData(refValue, nodeData.build());
+        it.putOperationalData(refValue, nodeData.build());
         it.commit();
     }
     
     @Override
     public void onGroupFeaturesUpdated(GroupFeaturesUpdated notification) {
+
         //Add statistics to local cache
         ConcurrentMap<NodeId, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
         if(!cache.containsKey(notification.getId())){
@@ -231,8 +232,8 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         
         GroupFeaturesBuilder groupFeatures = new GroupFeaturesBuilder();
         groupFeatures.setActions(notification.getActions());
-        groupFeatures.setCapabilities(notification.getCapabilities());
-        groupFeatures.setTypes(notification.getTypes());
+        groupFeatures.setGroupCapabilitiesSupported(notification.getGroupCapabilitiesSupported());
+        groupFeatures.setGroupTypesSupported(notification.getGroupTypesSupported());
         groupFeatures.setMaxGroups(notification.getMaxGroups());
         cache.get(notification.getId()).setGroupFeatures(groupFeatures.build());
         
@@ -251,13 +252,13 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         nodeData.addAugmentation(NodeGroupFeatures.class, nodeGroupFeatures.build());
         
         InstanceIdentifier<? extends Object> refValue = ref.getValue();
-        it.putRuntimeData(refValue, nodeData.build());
+        it.putOperationalData(refValue, nodeData.build());
         it.commit();
     }
 
     private NodeRef getNodeRef(NodeKey nodeKey){
-        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder().node(Nodes.class);
-        return new NodeRef(builder.node(Node.class,nodeKey).toInstance());
+        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey);
+        return new NodeRef(builder.toInstance());
     }
 
 }
diff --git a/opendaylight/netconf/config-persister-impl/configuration/current/controller.config.2.txt b/opendaylight/netconf/config-persister-impl/configuration/current/controller.config.2.txt
new file mode 100644 (file)
index 0000000..e69de29
index dce858fce63dbad06159d7109f77fb40005c301e..c6caf417a17484aca119f7c2e5e655ce08102440 100644 (file)
             <artifactId>commons-io</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-directory-adapter</artifactId>
+            <version>${parent.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
index ac6b5b28fd697fdf1290f3e5d8df2a6717834429..d83b1eaaf341931571ce723378f41145a3342154 100644 (file)
@@ -101,25 +101,7 @@ public class ConfigPersisterNotificationHandler implements NotificationListener,
         if (maybeConfig.isPresent()) {
             logger.debug("Last config found {}", persister);
             ConflictingVersionException lastException = null;
-            int maxAttempts = 30;
-            for(int i = 0 ; i < maxAttempts; i++) {
-                registerToNetconf(maybeConfig.get().getCapabilities());
-
-                final String configSnapshot = maybeConfig.get().getConfigSnapshot();
-                logger.trace("Pushing following xml to netconf {}", configSnapshot);
-                try {
-                    pushLastConfig(XmlUtil.readXmlToElement(configSnapshot));
-                    return;
-                } catch(ConflictingVersionException e) {
-                    closeClientAndDispatcher(netconfClient, netconfClientDispatcher);
-                    lastException = e;
-                    Thread.sleep(1000);
-                } catch (SAXException | IOException e) {
-                    throw new IllegalStateException("Unable to load last config", e);
-                }
-            }
-            throw new IllegalStateException("Failed to push configuration, maximum attempt count has been reached: "
-                    + maxAttempts, lastException);
+            pushLastConfigWithRetries(maybeConfig, lastException);
 
         } else {
             // this ensures that netconf is initialized, this is first
@@ -132,6 +114,28 @@ public class ConfigPersisterNotificationHandler implements NotificationListener,
         registerAsJMXListener();
     }
 
+    private void pushLastConfigWithRetries(Optional<ConfigSnapshotHolder> maybeConfig, ConflictingVersionException lastException) throws InterruptedException {
+        int maxAttempts = 30;
+        for(int i = 0 ; i < maxAttempts; i++) {
+            registerToNetconf(maybeConfig.get().getCapabilities());
+
+            final String configSnapshot = maybeConfig.get().getConfigSnapshot();
+            logger.trace("Pushing following xml to netconf {}", configSnapshot);
+            try {
+                pushLastConfig(XmlUtil.readXmlToElement(configSnapshot));
+                return;
+            } catch(ConflictingVersionException e) {
+                closeClientAndDispatcher(netconfClient, netconfClientDispatcher);
+                lastException = e;
+                Thread.sleep(1000);
+            } catch (SAXException | IOException e) {
+                throw new IllegalStateException("Unable to load last config", e);
+            }
+        }
+        throw new IllegalStateException("Failed to push configuration, maximum attempt count has been reached: "
+                + maxAttempts, lastException);
+    }
+
     private synchronized long registerToNetconf(Set<String> expectedCaps) throws InterruptedException {
 
         Set<String> currentCapabilities = Sets.newHashSet();
@@ -209,6 +213,7 @@ public class ConfigPersisterNotificationHandler implements NotificationListener,
     }
 
     private void registerAsJMXListener() {
+        logger.trace("Called registerAsJMXListener");
         try {
             mbeanServer.addNotificationListener(on, this, null, null);
         } catch (InstanceNotFoundException | IOException e) {
index 7add448025b51794ef6ed0cc261e6dbd4cb50479..e109ebec887b8e3c2a1579e5e2292fc970b25f1e 100644 (file)
@@ -61,7 +61,7 @@ public final class PersisterAggregator implements Persister {
 
     public static class PersisterWithConfiguration {
 
-        public final Persister storage;
+        private final Persister storage;
         private final boolean readOnly;
 
         public PersisterWithConfiguration(Persister storage, boolean readOnly) {
@@ -69,6 +69,16 @@ public final class PersisterAggregator implements Persister {
             this.readOnly = readOnly;
         }
 
+        @VisibleForTesting
+        public Persister getStorage() {
+            return storage;
+        }
+
+        @VisibleForTesting
+        public boolean isReadOnly() {
+            return readOnly;
+        }
+
         @Override
         public String toString() {
             return "PersisterWithConfiguration{" +
diff --git a/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/DummyAdapter.java b/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/DummyAdapter.java
new file mode 100644 (file)
index 0000000..7a11b9c
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.netconf.persist.impl;
+
+import com.google.common.base.Optional;
+import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
+import org.opendaylight.controller.config.persist.api.Persister;
+import org.opendaylight.controller.config.persist.api.PropertiesProvider;
+import org.opendaylight.controller.config.persist.api.StorageAdapter;
+
+import java.io.IOException;
+
+public class DummyAdapter implements StorageAdapter, Persister {
+
+    static int persist = 0;
+
+    @Override
+    public void persistConfig(ConfigSnapshotHolder holder) throws IOException {
+        persist++;
+    }
+
+    static int load = 0;
+
+    @Override
+    public Optional<ConfigSnapshotHolder> loadLastConfig() throws IOException {
+        load++;
+        return Optional.absent();
+    }
+
+    static int props = 0;
+
+    @Override
+    public Persister instantiate(PropertiesProvider propertiesProvider) {
+        props++;
+        return this;
+    }
+
+    @Override
+    public void close() {
+    }
+
+}
index 1b4031ac57d3e3d4c2dd4331f012850a47f5962f..7141bc27d3b0fbe847b043dd55afa8d3d4efce18 100644 (file)
 package org.opendaylight.controller.netconf.persist.impl;
 
 import com.google.common.base.Optional;
-import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
 import org.opendaylight.controller.config.persist.api.Persister;
-import org.opendaylight.controller.config.persist.api.PropertiesProvider;
-import org.opendaylight.controller.config.persist.api.StorageAdapter;
 import org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter;
 import org.opendaylight.controller.netconf.persist.impl.osgi.ConfigPersisterActivator;
 import org.opendaylight.controller.netconf.persist.impl.osgi.PropertiesProviderBaseImpl;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.matchers.JUnitMatchers.containsString;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.opendaylight.controller.netconf.persist.impl.PersisterAggregator.PersisterWithConfiguration;
+import static org.opendaylight.controller.netconf.persist.impl.PersisterAggregatorTest.TestingPropertiesProvider.loadFile;
 
 public class PersisterAggregatorTest {
-    @Mock
-    TestingPropertiesProvider propertiesProvider;
 
-    class TestingPropertiesProvider extends PropertiesProviderBaseImpl {
-        TestingPropertiesProvider() {
+    static class TestingPropertiesProvider extends PropertiesProviderBaseImpl {
+
+        private static Properties prop = new Properties();
+
+        public TestingPropertiesProvider() {
             super(null);
         }
 
+        public static TestingPropertiesProvider loadFile(String fileName) {
+            try {
+                prop.load(TestingPropertiesProvider.class.getClassLoader().getResourceAsStream(fileName));
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            return new TestingPropertiesProvider();
+        }
+
         @Override
         public String getFullKeyForReporting(String key) {
-            return "prefix." + key;
+            return ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER + "." + key;
         }
 
         @Override
         public String getProperty(String key) {
-            throw new UnsupportedOperationException("should be mocked");
+            return prop.getProperty(getFullKeyForReporting(key));
         }
-    }
 
-    @Before
-    public void setUpMocks() {
-        MockitoAnnotations.initMocks(this);
-        doCallRealMethod().when(propertiesProvider).getFullKeyForReporting(anyString());
+        @Override
+        public String getPropertyWithoutPrefix(String fullKey){
+            return prop.getProperty(fullKey);
+        }
     }
 
-    @Ignore
     @Test
-    public void testFromProperties() throws Exception {
-        doReturn("").when(propertiesProvider).getProperty(ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER);
-        doReturn(MockAdapter.class.getName()).when(propertiesProvider).getProperty(
-                ConfigPersisterActivator.STORAGE_ADAPTER_CLASS_PROP_SUFFIX);
-        doReturn("false").when(propertiesProvider).getProperty("readOnly");
+    public void testDummyAdapter() throws Exception {
+        PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(loadFile("test1.properties"));
+        List<PersisterWithConfiguration> persisters = persisterAggregator.getPersisterWithConfigurations();
+        assertEquals(1, persisters.size());
+        PersisterWithConfiguration persister = persisters.get(0);
+        assertEquals(DummyAdapter.class.getName() ,persister.getStorage().getClass().getName());
+        assertFalse(persister.isReadOnly());
 
-        PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(propertiesProvider);
         persisterAggregator.persistConfig(null);
         persisterAggregator.loadLastConfig();
         persisterAggregator.persistConfig(null);
         persisterAggregator.loadLastConfig();
 
-        assertEquals(2, MockAdapter.persist);
-        assertEquals(2, MockAdapter.load);
-        assertEquals(1, MockAdapter.props);
+        assertEquals(2, DummyAdapter.persist);
+        assertEquals(2, DummyAdapter.load);
+        assertEquals(1, DummyAdapter.props);
     }
 
-
-    @Ignore
     @Test
-    public void testFromProperties2() throws Exception {
-        String prefix = "";
-        doReturn(prefix).when(propertiesProvider).getProperty(ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER);
-        doReturn(FileStorageAdapter.class.getName()).when(propertiesProvider).getProperty(
-                ConfigPersisterActivator.STORAGE_ADAPTER_CLASS_PROP_SUFFIX);
-
-        doReturn("target" + File.separator + "generated-test-sources" + File.separator + "testFile").when(
-                propertiesProvider).getProperty("prefix.properties.fileStorage");
-        doReturn("propertiesProvider").when(propertiesProvider).toString();
-        doReturn(null).when(propertiesProvider).getProperty("prefix.properties.numberOfBackups");
-
-        PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(propertiesProvider);
+    public void testLoadFromPropertyFile() throws Exception {
+        PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(loadFile("test2.properties"));
+        List<PersisterWithConfiguration> persisters = persisterAggregator.getPersisterWithConfigurations();
+        assertEquals(1, persisters.size());
+        PersisterWithConfiguration persister = persisters.get(0);
+        assertEquals(FileStorageAdapter.class.getName() ,persister.getStorage().getClass().getName());
+        assertFalse(persister.isReadOnly());
     }
 
-    @Ignore
     @Test
-    public void testFromProperties3() throws Exception {
-        doReturn("").when(propertiesProvider).getProperty(ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER);
-        doReturn(FileStorageAdapter.class.getName()).when(propertiesProvider).getProperty(
-                ConfigPersisterActivator.STORAGE_ADAPTER_CLASS_PROP_SUFFIX);
-        doReturn("target" + File.separator + "generated-test-sources" + File.separator + "testFile").when(
-                propertiesProvider).getProperty("prefix.properties.fileStorage");
-        doReturn("false").when(propertiesProvider).getProperty("readOnly");
-        doReturn("propertiesProvider").when(propertiesProvider).toString();
-        doReturn("0").when(propertiesProvider).getProperty("prefix.properties.numberOfBackups");
+    public void testFileStorageNumberOfBackups() throws Exception {
         try {
-            PersisterAggregator.createFromProperties(propertiesProvider);
+            PersisterAggregator.createFromProperties(loadFile("test3.properties"));
             fail();
         } catch (RuntimeException e) {
             assertThat(
@@ -122,18 +110,18 @@ public class PersisterAggregatorTest {
 
     @Test
     public void loadLastConfig() throws Exception {
-        List<PersisterAggregator.PersisterWithConfiguration> persisterWithConfigurations = new ArrayList<>();
-        PersisterAggregator.PersisterWithConfiguration first = new PersisterAggregator.PersisterWithConfiguration(mock(Persister.class), false);
+        List<PersisterWithConfiguration> persisterWithConfigurations = new ArrayList<>();
+        PersisterWithConfiguration first = new PersisterWithConfiguration(mock(Persister.class), false);
 
         ConfigSnapshotHolder ignored = mock(ConfigSnapshotHolder.class);
-        doReturn(Optional.of(ignored)).when(first.storage).loadLastConfig(); // should be ignored
+        doReturn(Optional.of(ignored)).when(first.getStorage()).loadLastConfig(); // should be ignored
 
         ConfigSnapshotHolder used = mock(ConfigSnapshotHolder.class);
-        PersisterAggregator.PersisterWithConfiguration second = new PersisterAggregator.PersisterWithConfiguration(mock(Persister.class), false);
-        doReturn(Optional.of(used)).when(second.storage).loadLastConfig(); // should be used
+        PersisterWithConfiguration second = new PersisterWithConfiguration(mock(Persister.class), false);
+        doReturn(Optional.of(used)).when(second.getStorage()).loadLastConfig(); // should be used
 
-        PersisterAggregator.PersisterWithConfiguration third = new PersisterAggregator.PersisterWithConfiguration(mock(Persister.class), false);
-        doReturn(Optional.absent()).when(third.storage).loadLastConfig();
+        PersisterWithConfiguration third = new PersisterWithConfiguration(mock(Persister.class), false);
+        doReturn(Optional.absent()).when(third.getStorage()).loadLastConfig();
 
         persisterWithConfigurations.add(first);
         persisterWithConfigurations.add(second);
@@ -145,50 +133,4 @@ public class PersisterAggregatorTest {
         assertEquals(used, configSnapshotHolderOptional.get());
     }
 
-    @Ignore
-    @Test
-    public void test() throws Exception {
-//        Persister storage = mock(Persister.class);
-//        doReturn(null).when(storage).loadLastConfig();
-//        doNothing().when(storage).persistConfig(any(ConfigSnapshotHolder.class));
-//
-//        PersisterAggregator persister = new PersisterAggregator(storage);
-//        persister.loadLastConfig();
-//        persister.persistConfig(null);
-//
-//        verify(storage).loadLastConfig();
-//        verify(storage).persistConfig(any(ConfigSnapshotHolder.class));
-    }
-
-    public static class MockAdapter implements StorageAdapter, Persister {
-
-        static int persist = 0;
-
-        @Override
-        public void persistConfig(ConfigSnapshotHolder holder) throws IOException {
-            persist++;
-        }
-
-        static int load = 0;
-
-        @Override
-        public Optional<ConfigSnapshotHolder> loadLastConfig() throws IOException {
-            load++;
-            return Optional.absent();
-        }
-
-        static int props = 0;
-
-        @Override
-        public Persister instantiate(PropertiesProvider propertiesProvider) {
-            props++;
-            return this;
-        }
-
-        @Override
-        public void close() {
-        }
-
-    }
-
 }
diff --git a/opendaylight/netconf/config-persister-impl/src/test/resources/test1.properties b/opendaylight/netconf/config-persister-impl/src/test/resources/test1.properties
new file mode 100644 (file)
index 0000000..9380040
--- /dev/null
@@ -0,0 +1,3 @@
+netconf.config.persister.active=1
+netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.netconf.persist.impl.DummyAdapter
+netconf.config.persister.1.properties.fileStorage=configuration/initial/
\ No newline at end of file
diff --git a/opendaylight/netconf/config-persister-impl/src/test/resources/test2.properties b/opendaylight/netconf/config-persister-impl/src/test/resources/test2.properties
new file mode 100644 (file)
index 0000000..bdf2caa
--- /dev/null
@@ -0,0 +1,9 @@
+netconf.config.persister.active=2
+# read startup configuration
+netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.config.persist.storage.directory.DirectoryStorageAdapter
+netconf.config.persister.1.properties.directoryStorage=configuration/initial/
+netconf.config.persister.1.readonly=true
+
+netconf.config.persister.2.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter
+netconf.config.persister.2.properties.fileStorage=configuration/current/controller.config.2.txt
+netconf.config.persister.2.properties.numberOfBackups=3
\ No newline at end of file
diff --git a/opendaylight/netconf/config-persister-impl/src/test/resources/test3.properties b/opendaylight/netconf/config-persister-impl/src/test/resources/test3.properties
new file mode 100644 (file)
index 0000000..c6716ce
--- /dev/null
@@ -0,0 +1,4 @@
+netconf.config.persister.active=3
+netconf.config.persister.3.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter
+netconf.config.persister.3.properties.fileStorage=configuration/current/controller.config.2.txt
+netconf.config.persister.3.properties.numberOfBackups=0
\ No newline at end of file