Merge "BUG-614: introduce AbstractRuntimeCodeGenerator"
authorTony Tkacik <ttkacik@cisco.com>
Tue, 10 Jun 2014 11:30:21 +0000 (11:30 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 10 Jun 2014 11:30:21 +0000 (11:30 +0000)
155 files changed:
opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java
opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java
opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/NodeMappingTest.java
opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestFromSalConversionsUtils.java
opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/AbstractChangeListener.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/FRMActivator.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowChangeListener.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowProvider.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowTransactionValidator.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/group/GroupChangeListener.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/group/GroupProvider.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/meter/MeterChangeListener.java
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/meter/MeterProvider.java
opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/NodeChangeCommiter.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/AbstractBrokerAwareActivator.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareConsumer.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareService.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/NotificationListener.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcConsumerRegistry.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/data/DataBrokerService.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/mount/MountProviderInstance.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcContextIdentifier.java
opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingTable.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/sal/binding/codegen/RuntimeCodeGenerator.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingDomConnectorDeployer.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardingUtils.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/DelegateProxy.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/remote/RemoteRpcRouter.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/UnionSerializationTest.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/BarListener.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/FooListener.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/FooService.java
opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/RpcRegistrationNullPointer.java
opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/BrokerIntegrationTest.java
opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/MessageCapturingFlowService.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/RegistrationListener.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataProvisionService.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/notify/NotificationPublishService.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/routing/MutableRoutingTable.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/routing/Route.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/routing/RoutingTable.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/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-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationException.java
opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java
opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/RpcErrors.java
opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalPropertyClassUtils.java
opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/BindingAwareRpcRouter.java
opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/BindingAwareZeroMqRpcRouter.java
opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/Connector.java
opendaylight/md-sal/sal-connector-api/src/main/java/org/opendaylight/controller/sal/connector/api/RpcRouter.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/AbstractConsumer.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/BrokerService.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Consumer.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Provider.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcConsumptionRegistry.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcProvisionRegistry.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRegistrationListener.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRoutingContext.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataBrokerService.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataProviderService.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataStore.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataValidator.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/notify/NotificationListener.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/notify/NotificationPublishService.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/notify/NotificationService.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/statistics/DomBrokerRuntimeMXBeanImpl.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/SnapshotBackedWriteTransaction.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTreeFactory.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/DataBrokerImpl.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/DataTransactionImpl.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/DataBrokerServiceProxy.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/DataProviderServiceProxy.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/spi/NotificationRouter.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/util/YangDataUtils.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/util/YangSchemaUtils.java
opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDataStoreTest.java
opendaylight/md-sal/sal-remoterpc-connector/implementation/src/main/java/org/opendaylight/controller/config/yang/md/sal/remote/rpc/ZeroMQServerModuleFactory.java
opendaylight/md-sal/sal-remoterpc-connector/implementation/src/main/java/org/opendaylight/controller/sal/connector/remoterpc/dto/MessageWrapper.java
opendaylight/md-sal/sal-remoterpc-connector/integrationtest/provider-service/src/main/java/org/opendaylight/controller/sample/zeromq/provider/ExampleProvider.java
opendaylight/md-sal/sal-remoterpc-connector/integrationtest/test-it/src/test/java/org/opendaylight/controller/sample/zeromq/test/it/RouterTest.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/api/RestconfService.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/RestUtil.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/EmptyNodeWrapper.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/IdentityValuesDTO.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/NodeWrapper.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestCodec.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/SimpleNodeWrapper.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/listeners/ListenerAdapter.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/listeners/Notificator.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServer.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServerHandler.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServerInitializer.java
opendaylight/md-sal/sal-rest-connector/src/main/resources/WEB-INF/web.xml
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnJsonChoiceCaseTest.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonLeafrefType.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/xml/test/CnSnInstanceIdentifierToXmlTest.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/xml/test/CnSnToXmlWithDataFromSeveralModulesTest.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/DummyFuture.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestDeleteOperationTest.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/TestUtils.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/structures/CompareLf.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/xml/to/cnsn/test/XmlAugmentedElementToCnSnTest.java
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/augmentation/xml/data.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_case_defined_without_case.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_container.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_leaflist.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_list.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_more_choices_same_level.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_more_choices_same_level_various_paths_err.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_no_first_case.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_random_level.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_three_choices_same_level.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/choice/xml/data_various_path_err.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/leafref/xml/data_absolut_ref_to_existing_leaf.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/leafref/xml/data_from_leafref_to_leafref.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/leafref/xml/data_ref_to_non_existing_leaf.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/leafref/xml/data_ref_to_not_leaf.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/leafref/xml/data_relativ_ref_from_leaflist_to_existing_leaf.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/leafref/xml/data_relativ_ref_to_existing_leaf.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/simple-data-types/xml/data.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/simple-yang-types/xml/data.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/cnsn-to-json/simple-yang-types/xml/empty_data.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/full-versions/test-data2/data-rpc-input.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/instanceidentifier/xml/xmldata.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/parts/ietf-interfaces_interfaces_absolute_path.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/data-container.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/data-list.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/empty-data.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/identityref/xml/data-default-nmspc-in-element.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/identityref/xml/data-default-nmspc-in-parrent-element.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/identityref/xml/data-nmspc-in-parrent-element.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/identityref/xml/data-no-nmspc-value-with-prefix.xml
opendaylight/md-sal/sal-rest-connector/src/test/resources/xml-to-cnsn/identityref/xml/data-no-nmspc-value-without-prefix.xml
opendaylight/md-sal/sal-rest-docgen/src/main/java/org/opendaylight/controller/sal/rest/doc/impl/ModelGenerator.java
opendaylight/md-sal/sal-rest-docgen/src/main/resources/WEB-INF/web.xml
opendaylight/md-sal/sal-rest-docgen/src/test/java/org/opendaylight/controller/sal/rest/doc/impl/DocGeneratorTest.java
opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatisticsHandler.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/StatisticsRequestScheduler.java
opendaylight/md-sal/topology-lldp-discovery/src/main/java/org/opendaylight/md/controller/topology/lldp/LLDPDiscoveryListener.java
opendaylight/md-sal/topology-lldp-discovery/src/main/java/org/opendaylight/md/controller/topology/lldp/LLDPLinkAger.java
opendaylight/md-sal/topology-lldp-discovery/src/main/java/org/opendaylight/md/controller/topology/lldp/utils/LLDPDiscoveryUtils.java
opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyExporter.java
opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyProvider.java
opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/OperationProcessor.java [new file with mode: 0644]
opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/TopologyOperation.java [new file with mode: 0644]

index 53257f8c835759543fea5cc2c74dd4706e50f1dc..a879a36f8c23e6321f26c8fee0ec47a4569df2a9 100644 (file)
@@ -261,11 +261,11 @@ public class FromSalConversionsUtils {
                     .setType(etherType);
             targetEthMatchBuild.setEthernetType(ethType.build());
         }
-        if((sourceMatch.getField(DL_SRC) != null && sourceMatch.getField(DL_SRC).getValue() != null) || 
-                (sourceMatch.getField(DL_DST) != null && sourceMatch.getField(DL_DST).getValue() != null)|| 
+        if((sourceMatch.getField(DL_SRC) != null && sourceMatch.getField(DL_SRC).getValue() != null) ||
+                (sourceMatch.getField(DL_DST) != null && sourceMatch.getField(DL_DST).getValue() != null)||
                 dataLinkType != null ) {
-            return targetEthMatchBuild.build();            
-        } 
+            return targetEthMatchBuild.build();
+        }
         return null;
     }
 
@@ -372,7 +372,7 @@ public class FromSalConversionsUtils {
                     .toAddrString(inetDestAddress);
             layer4MatchBuild
             .setIpv4Destination(new Ipv4Prefix(inetDstAddressString));
-        }       
+        }
         return layer4MatchBuild.build();
 
     }
@@ -388,13 +388,13 @@ public class FromSalConversionsUtils {
         }
         if(inetDestAddress != null) {
             String inetDstAddressString = InetAddresses
-                    .toAddrString(inetDestAddress);    
+                    .toAddrString(inetDestAddress);
             layer6MatchBuild
                     .setIpv6Destination(new Ipv6Prefix(inetDstAddressString));
         }
         return layer6MatchBuild.build();
     }
-    
+
     public static boolean flowEquals(Flow statsFlow, Flow storedFlow) {
         if (statsFlow.getClass() != storedFlow.getClass()) {
             return false;
index 74b94c7cba10771fee33f10eeddb6e6a0c2e2b16..da3477ee45329e57d6174c01b9d53de76b098c39 100644 (file)
@@ -168,7 +168,7 @@ public class ToSalConversionsUtils {
     public static List<org.opendaylight.controller.sal.action.Action> actionFrom(List<Action> actions, Node node) {
         List<org.opendaylight.controller.sal.action.Action> targetAction = new ArrayList<>();
         for (Action action : actions) {
-               org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action sourceAction = action
+            org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action sourceAction = action
                     .getAction();
 
             if (sourceAction instanceof ControllerActionCase) {
@@ -585,7 +585,7 @@ public class ToSalConversionsUtils {
         }
         return macAddress;
     }
-    
+
     public static byte[] bytesFromDpid(long dpid) {
         byte[] mac = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 
index b9a2f5bff0154418b102504173c1eed30b5d5673..041924af336c7b1e20647eb64526cbdf961e9329 100644 (file)
@@ -45,7 +45,7 @@ public class NodeMappingTest {
                 {(byte) 0x7f, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff},
                 {(byte) 0x76, (byte) 0x4a, (byte) 0xe9, (byte) 0xac, (byte) 0xe6, (byte) 0x5a}
         };
-        
+
         Assert.assertEquals(expectedMacs.length, nodeIds.length);
 
         for (int i = 0; i < expectedMacs.length; i++) {
index 81ccb35cd982070bc85a7845dfa10d8787f8e450..5d5a409445a4708bf3b04472ded1e3bac89be496 100644 (file)
@@ -249,7 +249,7 @@ public class TestFromSalConversionsUtils {
             boolean b) {
         int numOfFoundActions = 0;
         for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action action : actions) {
-               org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action innerAction = action
+            org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action innerAction = action
                     .getAction();
             if (cl.isInstance(innerAction)) {
                 numOfFoundActions++;
index 71f2e9480543feae77bb92275595c29d2119f1c6..e1fd294d2fd814d998dc7f25f4bda9335b344520 100644 (file)
@@ -155,9 +155,9 @@ public class TestToSalConversionsUtils {
     public void testToSalConversion() throws ConstructionException {
         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
         odNodeFlowBuilder = prepareOdFlowCommon();
-        
+
         Node node = new Node(NodeIDType.OPENFLOW,(long)1);
-        
+
         Flow salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.other), node);
         checkSalMatch(salFlow.getMatch(), MtchType.other);
 
@@ -185,7 +185,7 @@ public class TestToSalConversionsUtils {
     private void checkSalMatch(org.opendaylight.controller.sal.match.Match match, MtchType mt) {
         switch (mt) {
         case other:
-            /*assertNotNull("DL_DST isn't equal.", "3C:A9:F4:00:E0:C8", 
+            /*assertNotNull("DL_DST isn't equal.", "3C:A9:F4:00:E0:C8",
                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
             assertEquals("DL_SRC isn't equal.", "24:77:03:7C:C5:F1",
                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
@@ -431,14 +431,14 @@ public class TestToSalConversionsUtils {
         odActions.add(new ActionBuilder().setAction(setVlanPcpActionBuilder.build()).build());
         odActions.add(new ActionBuilder().setAction(swPathActionBuilder.build()).build());
 
-        
+
         ApplyActionsCase innerInst = new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(odActions).build()).build();
         Instruction applyActions = new InstructionBuilder().setInstruction(innerInst).build();
         List<Instruction> instructions = Collections.singletonList(applyActions );
         InstructionsBuilder instBuilder = new InstructionsBuilder();
-        
+
         instBuilder.setInstruction(instructions);
-        
+
         return instBuilder.build();
     }
 
@@ -492,7 +492,7 @@ public class TestToSalConversionsUtils {
 
     private void prepareActionSetNwDst(List<Action> odActions) {
         // test case for IPv4
-        
+
         SetNwDstActionBuilder setNwDstActionBuilderIpv4 = new SetNwDstActionBuilder();
         setNwDstActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.101"));
         odActions.add(new ActionBuilder().setAction(new SetNwDstActionCaseBuilder().setSetNwDstAction(setNwDstActionBuilderIpv4.build()).build()).build());
index 426f4ba2d5ac9dc9625d2a919ef658fdbeb57bd5..c8a7f01e132b519c5f522554faa7e2dd8bfd2ae7 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -19,7 +19,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 /**
- * 
+ *
  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
  *
  */
@@ -32,17 +32,17 @@ public abstract class AbstractChangeListener implements DataChangeListener {
     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
         this.transactionId = this.newTransactionIdentifier().toString();
 
-        final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries = 
+        final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries =
                 changeEvent.getCreatedConfigurationData().entrySet();
-        final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries = 
+        final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries =
                 new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
 
-        Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updateConfigEntrySet = 
+        Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updateConfigEntrySet =
                 changeEvent.getUpdatedConfigurationData().entrySet();
         updatedEntries.addAll(updateConfigEntrySet);
         updatedEntries.removeAll(createdEntries);
 
-        final Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers = 
+        final Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers =
                 changeEvent.getRemovedConfigurationData();
 
         for (final Entry<InstanceIdentifier<? extends DataObject>, DataObject> createdEntry : createdEntries) {
@@ -52,7 +52,7 @@ public abstract class AbstractChangeListener implements DataChangeListener {
         }
 
         for (final Entry<InstanceIdentifier<?>, DataObject> updatedEntrie : updatedEntries) {
-            Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData = 
+            Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData =
                     changeEvent.getOriginalConfigurationData();
 
             InstanceIdentifier<? extends Object> u_key = updatedEntrie.getKey();
@@ -62,7 +62,7 @@ public abstract class AbstractChangeListener implements DataChangeListener {
         }
 
         for (final InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers) {
-            Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData = 
+            Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData =
                     changeEvent.getOriginalConfigurationData();
 
             final DataObject removeValue = origConfigData.get(instanceId);
index 929c489eaf36fa200c88a7bec70834a0fa9f2c1b..2f986ea5bcbbf83c75d81adb9a6724855641fe60 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -24,10 +24,10 @@ public class FRMActivator extends AbstractBindingAwareProvider {
 
     private final static Logger LOG = LoggerFactory.getLogger(FRMActivator.class);
 
-    private static FlowProvider flowProvider = new FlowProvider(); 
+    private static FlowProvider flowProvider = new FlowProvider();
     private static GroupProvider groupProvider = new GroupProvider();
     private static MeterProvider meterProvider = new MeterProvider();
-    
+
     @Override
     public void onSessionInitiated(final ProviderContext session) {
         DataProviderService flowSalService = session.<DataProviderService>getSALService(DataProviderService.class);
@@ -46,7 +46,7 @@ public class FRMActivator extends AbstractBindingAwareProvider {
         FRMActivator.meterProvider.setSalMeterService(rpcMeterSalService);
         FRMActivator.meterProvider.start();
     }
-    
+
     @Override
     protected void stopImpl(final BundleContext context) {
         try {
index df086c7acc9ac92f13bad11cec3f5957d75beebe..b60424513f2fb9f6c930e1648f937008bf9d203e 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -32,7 +32,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * 
+ *
  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
  *
  */
@@ -45,7 +45,7 @@ public class FlowChangeListener extends AbstractChangeListener {
     public SalFlowService getSalFlowService() {
         return this.salFlowService;
     }
-    
+
     public FlowChangeListener(final SalFlowService manager) {
         this.salFlowService = manager;
     }
@@ -58,16 +58,16 @@ public class FlowChangeListener extends AbstractChangeListener {
     @Override
     protected void remove(InstanceIdentifier<? extends DataObject> identifier, DataObject removeDataObj) {
         if ((removeDataObj instanceof Flow)) {
-            
+
             final Flow flow = ((Flow) removeDataObj);
             final InstanceIdentifier<Table> tableInstanceId = identifier.<Table> firstIdentifierOf(Table.class);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow);
-            
+
             builder.setFlowRef(new FlowRef(identifier));
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setFlowTable(new FlowTableRef(tableInstanceId));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
             this.salFlowService.removeFlow((RemoveFlowInput) builder.build());
@@ -78,21 +78,21 @@ public class FlowChangeListener extends AbstractChangeListener {
     @Override
     protected void update(InstanceIdentifier<? extends DataObject> identifier, DataObject original, DataObject update) {
         if (original instanceof Flow && update instanceof Flow) {
-            
+
             final Flow originalFlow = ((Flow) original);
             final Flow updatedFlow = ((Flow) update);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node>firstIdentifierOf(Node.class);
             final UpdateFlowInputBuilder builder = new UpdateFlowInputBuilder();
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setFlowRef(new FlowRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
-            
+
             builder.setUpdatedFlow((UpdatedFlow) (new UpdatedFlowBuilder(updatedFlow)).build());
             builder.setOriginalFlow((OriginalFlow) (new OriginalFlowBuilder(originalFlow)).build());
-            
+
             this.salFlowService.updateFlow((UpdateFlowInput) builder.build());
             LOG.debug("Transaction {} - Update Flow has updated flow {} with {}", new Object[]{uri, original, update});
       }
@@ -101,16 +101,16 @@ public class FlowChangeListener extends AbstractChangeListener {
     @Override
     protected void add(InstanceIdentifier<? extends DataObject> identifier, DataObject addDataObj) {
         if ((addDataObj instanceof Flow)) {
-            
+
             final Flow flow = ((Flow) addDataObj);
             final InstanceIdentifier<Table> tableInstanceId = identifier.<Table> firstIdentifierOf(Table.class);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow);
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setFlowRef(new FlowRef(identifier));
             builder.setFlowTable(new FlowTableRef(tableInstanceId));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
             this.salFlowService.addFlow((AddFlowInput) builder.build());
index afdd628bbb7d39ff8d61d1a6ef079e3677921fa9..33db529598dc9115c4dfcb52906f585bcb00313e 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -42,7 +42,7 @@ public class FlowProvider implements AutoCloseable {
         InstanceIdentifierBuilder<Table> tableChild = augmentFlowCapNode.<Table> child(Table.class);
         InstanceIdentifierBuilder<Flow> flowChild = tableChild.<Flow> child(Flow.class);
         final InstanceIdentifier<? extends DataObject> flowDataObjectPath = flowChild.toInstance();
-        
+
         /* DataChangeListener registration */
         this.flowDataChangeListener = new FlowChangeListener(this.salFlowService);
         this.flowDataChangeListenerRegistration = this.dataService.registerDataChangeListener(flowDataObjectPath, flowDataChangeListener);
index 4ef93a55e9d515ebcc8e15312ae72108658d379b..9cd42466a6d91e987d69b8d512d08bafcb95511e 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
index 1260f0ec530ebd3daecfbfa43fbe9fb4b3efc791..54f12bfdcf64346191ab589969e579b0dfdf5db7 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -30,7 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * 
+ *
  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
  *
  */
@@ -43,7 +43,7 @@ public class GroupChangeListener extends AbstractChangeListener {
     public SalGroupService getSalGroupService() {
         return this.salGroupService;
     }
-    
+
     public GroupChangeListener(final SalGroupService manager) {
         this.salGroupService = manager;
     }
@@ -56,14 +56,14 @@ public class GroupChangeListener extends AbstractChangeListener {
     @Override
     protected void remove(InstanceIdentifier<? extends DataObject> identifier, DataObject removeDataObj) {
         if ((removeDataObj instanceof Group)) {
-            
+
             final Group group = ((Group) removeDataObj);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final RemoveGroupInputBuilder builder = new RemoveGroupInputBuilder(group);
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setGroupRef(new GroupRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
             this.salGroupService.removeGroup((RemoveGroupInput) builder.build());
@@ -74,21 +74,21 @@ public class GroupChangeListener extends AbstractChangeListener {
     @Override
     protected void update(InstanceIdentifier<? extends DataObject> identifier, DataObject original, DataObject update) {
         if (original instanceof Group && update instanceof Group) {
-            
+
             final Group originalGroup = ((Group) original);
             final Group updatedGroup = ((Group) update);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final UpdateGroupInputBuilder builder = new UpdateGroupInputBuilder();
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setGroupRef(new GroupRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
-            
+
             builder.setUpdatedGroup((UpdatedGroup) (new UpdatedGroupBuilder(updatedGroup)).build());
             builder.setOriginalGroup((OriginalGroup) (new OriginalGroupBuilder(originalGroup)).build());
-            
+
             this.salGroupService.updateGroup((UpdateGroupInput) builder.build());
             LOG.debug("Transaction {} - Update Group has updated group {} with group {}", new Object[]{uri, original, update});
         }
@@ -100,10 +100,10 @@ public class GroupChangeListener extends AbstractChangeListener {
             final Group group = ((Group) addDataObj);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final AddGroupInputBuilder builder = new AddGroupInputBuilder(group);
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setGroupRef(new GroupRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
             this.salGroupService.addGroup((AddGroupInput) builder.build());
index 14b1b6f2fd85eed770b177ffa6c79a600c995ea5..9f2806e929a25344726fa125ec1ec7b918b8197e 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -46,11 +46,11 @@ public class GroupProvider implements AutoCloseable {
         this.groupDataChangeListenerRegistration = this.dataService.registerDataChangeListener(groupDataObjectPath, groupDataChangeListener);
         LOG.info("Group Config Provider started.");
     }
-    
+
     protected DataModificationTransaction startChange() {
         return this.dataService.beginTransaction();
     }
-    
+
     public void close() throws Exception {
         if(groupDataChangeListenerRegistration != null){
             groupDataChangeListenerRegistration.close();
index 839e556fbc65d6207a0b41d651fcd7abc600190e..48d5257978cc28ff5c86a44449b55a45f15024cc 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -30,7 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * 
+ *
  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
  *
  */
@@ -43,7 +43,7 @@ public class MeterChangeListener extends AbstractChangeListener {
     public SalMeterService getSalMeterService() {
         return this.salMeterService;
     }
-    
+
     public MeterChangeListener(final SalMeterService manager) {
         this.salMeterService = manager;
     }
@@ -56,14 +56,14 @@ public class MeterChangeListener extends AbstractChangeListener {
     @Override
     protected void remove(InstanceIdentifier<? extends DataObject> identifier, DataObject removeDataObj) {
         if ((removeDataObj instanceof Meter)) {
-            
+
             final Meter meter = ((Meter) removeDataObj);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final RemoveMeterInputBuilder builder = new RemoveMeterInputBuilder(meter);
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setMeterRef(new MeterRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
             this.salMeterService.removeMeter((RemoveMeterInput) builder.build());
@@ -74,21 +74,21 @@ public class MeterChangeListener extends AbstractChangeListener {
     @Override
     protected void update(InstanceIdentifier<? extends DataObject> identifier, DataObject original, DataObject update) {
         if (original instanceof Meter && update instanceof Meter) {
-            
+
             final Meter originalMeter = ((Meter) original);
             final Meter updatedMeter = ((Meter) update);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final UpdateMeterInputBuilder builder = new UpdateMeterInputBuilder();
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setMeterRef(new MeterRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
-            
+
             builder.setUpdatedMeter((UpdatedMeter) (new UpdatedMeterBuilder(updatedMeter)).build());
             builder.setOriginalMeter((OriginalMeter) (new OriginalMeterBuilder(originalMeter)).build());
-            
+
             this.salMeterService.updateMeter((UpdateMeterInput) builder.build());
             LOG.debug("Transaction {} - Update Meter has updated meter {} with {}", new Object[]{uri, original, update});
         }
@@ -97,14 +97,14 @@ public class MeterChangeListener extends AbstractChangeListener {
     @Override
     protected void add(InstanceIdentifier<? extends DataObject> identifier, DataObject addDataObj) {
         if ((addDataObj instanceof Meter)) {
-            
+
             final Meter meter = ((Meter) addDataObj);
             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
             final AddMeterInputBuilder builder = new AddMeterInputBuilder(meter);
-            
+
             builder.setNode(new NodeRef(nodeInstanceId));
             builder.setMeterRef(new MeterRef(identifier));
-            
+
             Uri uri = new Uri(this.getTransactionId());
             builder.setTransactionUri(uri);
             this.salMeterService.addMeter((AddMeterInput) builder.build());
index 620801fba502c1850460b9f39b7f431752e2f925..8596c3fec6e7f8f04dc2fcc4917240d35b85f8eb 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- * 
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
@@ -46,7 +46,7 @@ public class MeterProvider implements AutoCloseable {
         this.meterDataChangeListenerRegistration = this.dataService.registerDataChangeListener(meterDataObjectPath, meterDataChangeListener);
         LOG.info("Meter Config Provider started.");
     }
-    
+
     protected DataModificationTransaction startChange() {
         return this.dataService.beginTransaction();
     }
index 2a3d8fd37e26c1cafc012c68102f417063c51713..674ae398d3194d06e8a097d28be01a5b8d7a1ec3 100644 (file)
@@ -126,7 +126,7 @@ public class NodeChangeCommiter implements OpendaylightInventoryListener {
         Future<RpcResult<TransactionStatus>> commitResult = it.commit();
         listenOnTransactionState(it.getIdentifier(), commitResult, "node update", ref.getValue());
     }
-    
+
     /**
      * @param txId transaction identificator
      * @param future transaction result
@@ -136,13 +136,13 @@ public class NodeChangeCommiter implements OpendaylightInventoryListener {
     private static void listenOnTransactionState(final Object txId, Future<RpcResult<TransactionStatus>> future,
             final String action, final InstanceIdentifier<?> nodeConnectorPath) {
         Futures.addCallback(JdkFutureAdapters.listenInPoolThread(future),new FutureCallback<RpcResult<TransactionStatus>>() {
-            
+
             @Override
             public void onFailure(Throwable t) {
                 LOG.error("Action {} [{}] failed for Tx:{}", action, nodeConnectorPath, txId, t);
-                
+
             }
-            
+
             @Override
             public void onSuccess(RpcResult<TransactionStatus> result) {
                 if(!result.isSuccessful()) {
index 4d008295a367d0ede83219326cb610c8c89a6b32..6047f058b7ab667c6383b3b6431844f12b125de1 100644 (file)
@@ -23,12 +23,12 @@ public abstract class AbstractBrokerAwareActivator implements BundleActivator {
     private ServiceTracker<BindingAwareBroker, BindingAwareBroker> tracker;
     private BindingAwareBroker broker;
     private ServiceTrackerCustomizer<BindingAwareBroker, BindingAwareBroker> customizer = new ServiceTrackerCustomizer<BindingAwareBroker, BindingAwareBroker>() {
-        
+
         @Override
         public BindingAwareBroker addingService(ServiceReference<BindingAwareBroker> reference) {
             broker = context.getService(reference);
             mdActivationPool.execute(new Runnable() {
-                
+
                 @Override
                 public void run() {
                     onBrokerAvailable(broker, context);;
@@ -36,50 +36,50 @@ public abstract class AbstractBrokerAwareActivator implements BundleActivator {
             });
             return broker;
         }
-        
+
         @Override
         public void modifiedService(ServiceReference<BindingAwareBroker> reference, BindingAwareBroker service) {
             // TODO Auto-generated method stub
-            
+
         }
 
         @Override
         public void removedService(ServiceReference<BindingAwareBroker> reference, BindingAwareBroker service) {
             // TODO Auto-generated method stub
-            
+
         }
 
     };
-    
-    
+
+
     @Override
     public final void start(BundleContext context) throws Exception {
         this.context = context;
         startImpl(context);
         tracker = new ServiceTracker<>(context, BindingAwareBroker.class, customizer);
         tracker.open();
-        
+
     }
 
 
-    
+
     @Override
     public final  void stop(BundleContext context) throws Exception {
         tracker.close();
         stopImpl(context);
     }
-    
-    
+
+
     /**
      * Called when this bundle is started (before
      * {@link #onSessionInitiated(ProviderContext)} so the Framework can perform
      * the bundle-specific activities necessary to start this bundle. This
      * method can be used to register services or to allocate any resources that
      * this bundle needs.
-     * 
+     *
      * <p>
      * This method must complete and return to its caller in a timely manner.
-     * 
+     *
      * @param context
      *            The execution context of the bundle being started.
      * @throws Exception
@@ -99,10 +99,10 @@ public abstract class AbstractBrokerAwareActivator implements BundleActivator {
      * started. There should be no active threads that were started by this
      * bundle when this bundle returns. A stopped bundle must not call any
      * Framework objects.
-     * 
+     *
      * <p>
      * This method must complete and return to its caller in a timely manner.
-     * 
+     *
      * @param context The execution context of the bundle being stopped.
      * @throws Exception If this method throws an exception, the bundle is still
      *         marked as stopped, and the Framework will remove the bundle's
@@ -112,11 +112,11 @@ public abstract class AbstractBrokerAwareActivator implements BundleActivator {
     protected void stopImpl(BundleContext context) {
         // NOOP
     }
-    
+
 
     protected abstract void onBrokerAvailable(BindingAwareBroker broker, BundleContext context);
-    
+
     protected void onBrokerRemoved(BindingAwareBroker broker, BundleContext context) {
-        
+
     }
 }
index 871abb211710cf52d393398570d83a2ffcd21c59..4327451d2126fa51b6a3a7767e0c2fbd0781703c 100644 (file)
@@ -10,28 +10,28 @@ package org.opendaylight.controller.sal.binding.api;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
 
 /**
- * 
+ *
  * Defines the component of controller and supplies additional metadata. A
  * component of the controller or application supplies a concrete implementation
  * of this interface.
- * 
+ *
  * A user-implemented component (application) which facilitates the SAL and SAL
  * services to access infrastructure services or providers' functionality.
- * 
- * 
- * 
+ *
+ *
+ *
  */
 public interface BindingAwareConsumer {
 
     /**
      * Callback signaling initialization of the consumer session to the SAL.
-     * 
+     *
      * The consumer MUST use the session for all communication with SAL or
      * retrieving SAL infrastructure services.
-     * 
+     *
      * This method is invoked by
      * {@link BindingAwareBroker#registerConsumer(BindingAwareConsumer)}
-     * 
+     *
      * @param session
      *            Unique session between consumer and SAL.
      */
index 120674fa0d578746992656b83aa52ca88792598f..0812e5f53c3d9193cbafaae8acabaaa06be3b880 100644 (file)
@@ -14,24 +14,24 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderCo
 import org.opendaylight.yangtools.yang.binding.RpcService;
 
 /**
- * 
+ *
  * Defines the component of controller and supplies additional metadata. A
  * component of the controller or application supplies a concrete implementation
  * of this interface.
- * 
+ *
  * <p>
  * A user-implemented component (application) which facilitates the SAL and SAL
  * services to access infrastructure services and to provide functionality to
  * {@link Consumer}s and other providers.
- * 
- * 
+ *
+ *
  */
 public interface BindingAwareProvider {
 
     /**
      * Returns a set of provided implementations of YANG modules and their rpcs.
-     * 
-     * 
+     *
+     *
      * @return Set of provided implementation of YANG modules and their Rpcs
      */
     Collection<? extends RpcService> getImplementations();
@@ -39,24 +39,24 @@ public interface BindingAwareProvider {
     /**
      * Gets a set of implementations of provider functionality to be registered
      * into system during the provider registration to the SAL.
-     * 
+     *
      * <p>
      * This method is invoked by {@link Broker#registerProvider(Provider)} to
      * learn the initial provided functionality
-     * 
+     *
      * @return Set of provider's functionality.
      */
     Collection<? extends ProviderFunctionality> getFunctionality();
 
     /**
      * Functionality provided by the {@link BindingAwareProvider}
-     * 
+     *
      * <p>
      * Marker interface used to mark the interfaces describing specific
      * functionality which could be exposed by providers to other components.
-     * 
-     * 
-     * 
+     *
+     *
+     *
      */
     public interface ProviderFunctionality {
 
index b3680568bba9a9d1ed3ae59bc3eb0e03d4eaf17a..20d69a4ca91890879ca4d196aa867c8189e9623d 100644 (file)
@@ -10,20 +10,20 @@ package org.opendaylight.controller.sal.binding.api;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
 
 /**
- * 
+ *
  * Session-specific instance of the broker functionality.
- * 
+ *
  * <p>
  * BindingAwareService is marker interface for infrastructure services provided
  * by the SAL. These services are session-specific, each
  * {@link BindingAwareConsumer} and {@link BindingAwareProvider} usually has own
  * instance of the service with it's own context.
- * 
+ *
  * <p>
  * The consumer's (or provider's) instance of specific service could be obtained
  * by invoking {@link ConsumerContext#getSALService(Class)} method on session
  * assigned to the consumer.
- * 
+ *
  * <p>
  * {@link BindingAwareService} and {@link BindingAwareProvider} may seem
  * similar, but provider provides YANG model-based functionality and
@@ -31,9 +31,9 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerCo
  * to implement specific functionality of YANG and to reuse it in the
  * development of {@link BindingAwareConsumer}s and {@link BindingAwareProvider}
  * s.
- * 
- * 
- * 
+ *
+ *
+ *
  */
 public interface BindingAwareService {
 
index dd454c66207f5012f83f5f8426ec33b0dc6c2ff3..9429d3f8fa33372dedbbc8b0a00201db695d99a9 100644 (file)
@@ -19,13 +19,13 @@ import org.opendaylight.yangtools.yang.binding.Notification;
  * @param <T> Notification type
  */
 public interface NotificationListener<T extends Notification> extends EventListener {
-       /**
-        * Invoked to deliver the notification. Note that this method may be invoked
-        * from a shared thread pool, so implementations SHOULD NOT perform CPU-intensive
-        * operations and they definitely MUST NOT invoke any potentially blocking
-        * operations.
-        *
-        * @param notification Notification being delivered.
-        */
+    /**
+     * Invoked to deliver the notification. Note that this method may be invoked
+     * from a shared thread pool, so implementations SHOULD NOT perform CPU-intensive
+     * operations and they definitely MUST NOT invoke any potentially blocking
+     * operations.
+     *
+     * @param notification Notification being delivered.
+     */
     void onNotification(T notification);
 }
index f71d69b860d5127ee0f01be5c409a319e36cfd6e..7da0a48517fddf715db5f55ced1d431680f0a755 100644 (file)
@@ -12,13 +12,13 @@ import org.opendaylight.yangtools.yang.binding.RpcService;
 /**
  * Base interface defining contract for retrieving MD-SAL
  * version of RpcServices
- * 
+ *
  */
 public interface RpcConsumerRegistry extends BindingAwareService {
     /**
      * Returns a session specific instance (implementation) of requested
      * YANG module implementation / service provided by consumer.
-     * 
+     *
      * @return Session specific implementation of service
      */
     <T extends RpcService> T getRpcService(Class<T> module);
index 65f1ff2fe368ac07255d852e57c58ee2e5e1f610..d0225768b4e2500acf0eccfb13e4999e0a8591e3 100644 (file)
@@ -33,7 +33,7 @@ public interface DataBrokerService extends //
      * @return new blank data modification transaction.
      */
     @Override
-       DataModificationTransaction beginTransaction();
+    DataModificationTransaction beginTransaction();
 
     /**
      * Reads data subtree from configurational store.
index dec44f364fc10e95c4ffdb6f9b93422de52e0b53..0d9a90286e091693ca4ffd66b6322d88dda00a69 100644 (file)
@@ -15,9 +15,9 @@ import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
  * Provider's version of Mount Point, this version allows access to MD-SAL
  * services specific for this mountpoint and registration / provision of
  * interfaces for mount point.
- * 
+ *
  * @author ttkacik
- * 
+ *
  */
 public interface MountProviderInstance //
         extends //
index d6374fff909a2e8972b152269fbbfd8b6ff66a5c..e3bedd33f9a2307bf9e76437e48729765698c763 100644 (file)
@@ -15,7 +15,7 @@ public final  class RpcContextIdentifier implements Immutable{
 
     public final Class<? extends RpcService> rpcService;
     public final Class<? extends BaseIdentity> routingContext;
-   
+
     private RpcContextIdentifier(Class<? extends RpcService> rpcService, Class<? extends BaseIdentity> routingContext) {
         super();
         this.rpcService = rpcService;
@@ -29,11 +29,11 @@ public final  class RpcContextIdentifier implements Immutable{
     public Class<? extends BaseIdentity> getRoutingContext() {
         return routingContext;
     }
-    
+
     public static final RpcContextIdentifier contextForGlobalRpc(Class<? extends RpcService> serviceType) {
         return new RpcContextIdentifier(serviceType, null);
     }
-    
+
     public static final RpcContextIdentifier contextFor(Class<? extends RpcService> serviceType,Class<? extends BaseIdentity> routingContext) {
         return new RpcContextIdentifier(serviceType, routingContext);
     }
index cc800b6bbbdfd6c9b6f46678134fa6fa1fb9713a..61c7cfc9533b376c33f9243aae6e63abd5c66ae6 100644 (file)
@@ -22,7 +22,7 @@ public interface RpcRoutingTable<C extends BaseIdentity, S extends RpcService> e
     /**
      * Updates route for particular path to specified instance of
      * {@link RpcService}.
-     * 
+     *
      * @param path
      *            Path for which RpcService routing is to be updated
      * @param service
@@ -33,19 +33,19 @@ public interface RpcRoutingTable<C extends BaseIdentity, S extends RpcService> e
 
     /**
      * Deletes a route for particular path
-     * 
+     *
      * @param path
      *            Path for which
      */
     void removeRoute(InstanceIdentifier<?> path);
 
     /**
-     * 
+     *
      */
     S getRoute(InstanceIdentifier<?> nodeInstance);
 
     /**
-     * 
+     *
      * @return
      */
     Map<InstanceIdentifier<?>, S> getRoutes();
index df3b7ece5dbd13a7b3bc2c24618ce79355d6ee7d..a11a7d67f5d4077006676dc476cf154e1de8ade8 100644 (file)
@@ -26,14 +26,14 @@ import org.osgi.framework.BundleContext;
 */
 public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory {
 
-    
+
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) {
         BindingBrokerImplModule module = (BindingBrokerImplModule) super.createModule(instanceName, dependencyResolver, bundleContext);
         module.setBundleContext(bundleContext);
         return module;
     }
-    
+
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver,
             DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
index 8aff12b44a5f1b5c58dfd816f457a918b497925d..fb6f6ca1013b506eacf1f3b32ebdaf5d8aaf50ef 100644 (file)
@@ -18,7 +18,7 @@ public interface RuntimeCodeGenerator {
     /**
      * Returns an instance of provided RpcService type which delegates all calls
      * to the delegate.
-     * 
+     *
      * <p>
      * Returned instance:
      * <ul>
@@ -36,23 +36,23 @@ public interface RuntimeCodeGenerator {
      * all calls are delegated.
      * <li>{@link DelegateProxy#setDelegate(Object)} - sets the delegate for
      * particular instance
-     * 
+     *
      * </ul>
-     * 
+     *
      * @param serviceType
      *            - Subclass of RpcService for which direct proxy is to be
      *            generated.
      * @return Instance of RpcService of provided serviceType which implements
      *         and {@link DelegateProxy}
      * @throws IllegalArgumentException
-     * 
+     *
      */
     <T extends RpcService> T getDirectProxyFor(Class<T> serviceType) throws IllegalArgumentException;
 
     /**
      * Returns an instance of provided RpcService type which routes all calls to
      * other instances selected on particular input field.
-     * 
+     *
      * <p>
      * Returned instance:
      * <ul>
@@ -80,7 +80,7 @@ public interface RuntimeCodeGenerator {
      * is not present on any field invocation will be delegated to default
      * service {@link RpcRouter#getDefaultService()}.
      * </ul>
-     * 
+     *
      * @param serviceType
      *            - Subclass of RpcService for which Router is to be generated.
      * @return Instance of RpcService of provided serviceType which implements
index 3ad1dabffe0b39958b65019274b459fae167d8bb..75d44db9d190df195e80381ce2611f50ccd5ef68 100644 (file)
@@ -112,7 +112,7 @@ public class RootBindingAwareBroker implements //
         LOG.info("Starting Binding Aware Broker: {}", identifier);
 
         controllerRoot = new RootSalInstance(getRpcProviderRegistry(), getNotificationBroker(), getDataBroker());
-        
+
 
         supportedConsumerServices = ImmutableClassToInstanceMap.<BindingAwareService> builder()
                 .put(NotificationService.class, getRoot()) //
@@ -144,19 +144,19 @@ public class RootBindingAwareBroker implements //
     public void close() throws Exception {
         // FIXME: Close all sessions
     }
-    
+
     @Override
     public <T extends RpcService> RoutedRpcRegistration<T> addRoutedRpcImplementation(Class<T> type, T implementation)
             throws IllegalStateException {
         return getRoot().addRoutedRpcImplementation(type, implementation);
     }
-    
+
     @Override
     public <T extends RpcService> RpcRegistration<T> addRpcImplementation(Class<T> type, T implementation)
             throws IllegalStateException {
         return getRoot().addRpcImplementation(type, implementation);
     }
-    
+
     @Override
     public <T extends RpcService> T getRpcService(Class<T> module) {
         return getRoot().getRpcService(module);
@@ -166,7 +166,7 @@ public class RootBindingAwareBroker implements //
             L arg0) {
         return getRoot().registerRouteChangeListener(arg0);
     }
-    
+
 
     public class RootSalInstance extends
             AbstractBindingSalProviderInstance<DataProviderService, NotificationProviderService, RpcProviderRegistry> {
index 978c79ea02752b1a6d19e3fbc953dc80e50c011c..bfafc1f9b722e2100b4e327a3050e25b5188914c 100644 (file)
@@ -80,7 +80,7 @@ public class BindingDomConnectorDeployer {
         connector.startDataForwarding();
     }
 
-    public static void startNotificationForwarding(BindingIndependentConnector connector, 
+    public static void startNotificationForwarding(BindingIndependentConnector connector,
             NotificationProviderService baService, NotificationPublishService domService) {
         if(connector.isNotificationForwarding()) {
             return;
index e455bea19cdb258e020a454c7e110c1e68707ed4..d28b3b5c9182b031cc0521f3f22d6b52f698c377 100644 (file)
@@ -21,7 +21,7 @@ public class DomForwardingUtils {
         DomForwardedBroker forwardedSource = (DomForwardedBroker) source;
         DomForwardedBroker forwardedTarget = (DomForwardedBroker) target;
         reuseForwardingFrom(forwardedTarget, forwardedSource);
-        
+
     }
 
     private static void reuseForwardingFrom(DomForwardedBroker target, DomForwardedBroker source) {
index e34ee28a316ad0b9229f21382e663ffa0099a743..d22335e66e1cf1d0346272f0a4070b8e57b6fb2f 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.sal.binding.spi;
 
 public interface DelegateProxy<T> {
-    
+
     void setDelegate(T delegate);
     T getDelegate();
 }
index 526ca4059517544938d1331a69abe894b08c67d3..068c68a81f499d0cc4626e63f67caa8e52d50e45 100644 (file)
@@ -12,13 +12,13 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration;
 public interface RemoteRpcRouter {
 
 
-    
-    
-    
-    
+
+
+
+
     ListenerRegistration<RouteChangeListener> registerRouteChangeListener(RouteChangeListener listener);
 
-    
-    
+
+
 
 }
index 36a172d09c3f1a99bee21586f9a2b47c75103d9f..9f8a443bbf7e37400683736c64d2a08fad2f13f8 100644 (file)
@@ -19,22 +19,22 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 
 public class UnionSerializationTest extends AbstractDataServiceTest {
-    
+
     public static final String PREFIX_STRING = "192.168.0.1/32";
-    
-    
+
+
     @Test
     public void testPrefixSerialization() throws Exception {
-        
+
         Ipv4Prefix ipv4prefix = new Ipv4Prefix(PREFIX_STRING);
         IpPrefix ipPrefix = new IpPrefix(ipv4prefix);
         Prefix prefix = new PrefixBuilder().setPrefix(ipPrefix).build();
-        
+
         CompositeNode serialized = testContext.getBindingToDomMappingService().toDataDom(prefix);
         assertNotNull(serialized);
         assertNotNull(serialized.getFirstSimpleByName(Prefix.QNAME));
         assertEquals(PREFIX_STRING, serialized.getFirstSimpleByName(Prefix.QNAME).getValue());
-        
+
         Prefix deserialized = (Prefix) testContext.getBindingToDomMappingService().dataObjectFromDataDom(Prefix.class, serialized);
         assertNotNull(deserialized);
         assertNotNull(deserialized.getPrefix());
index f7c19ba1c3c211397e362eb12f6260cd8d096976..6c133728b67bc73fb888457076b95b20976c534d 100644 (file)
@@ -12,7 +12,7 @@ import org.opendaylight.yangtools.yang.binding.NotificationListener;
 public interface BarListener extends NotificationListener {
 
     void onBarUpdate(BarUpdate notification);
-    
+
     void onFlowDelete(FlowDelete notification);
 
 }
index 3b872d0149b04937fbb2ab9ca1e6c0a1ef93767a..cb8020e3fd4e200f3e06ae4ca4e6fd22faca533a 100644 (file)
@@ -12,5 +12,5 @@ import org.opendaylight.yangtools.yang.binding.NotificationListener;
 public interface FooListener extends NotificationListener {
 
     void onFooUpdate(FooUpdate notification);
-    
+
 }
index e844809662e3b6fb9e22d747fcf016df4fffc4c8..2bd211995d4a74bacabcbc47998b757ebc9bca66 100644 (file)
@@ -13,11 +13,11 @@ import org.opendaylight.yangtools.yang.binding.RpcService;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public interface FooService extends RpcService {
-    
+
     Future<RpcResult<Void>> foo();
-    
+
     Future<RpcResult<Void>> simple(SimpleInput obj);
-    
+
     Future<RpcResult<Void>> inheritedContext(InheritedContextInput obj);
 
 }
index 1480f0c610247f7d9334e6a32bc4f3a00cd1b4f4..6d0226849f3a81a02b143046ea8d092cfd755b5b 100644 (file)
@@ -78,14 +78,14 @@ public class BrokerIntegrationTest extends AbstractDataServiceTest {
 
         /**
          * We create transaction no 2
-         * 
+         *
          */
         DataModificationTransaction removalTransaction = baDataService.beginTransaction();
         assertNotNull(transaction);
 
         /**
          * We remove node 1
-         * 
+         *
          */
         removalTransaction.removeConfigurationData(node1.getValue());
 
index cfdab376516a3db39393a79dd713035db348e9a2..df287791ef01fa53e14c79320c75662e3fb60349 100644 (file)
@@ -114,16 +114,16 @@ public class MessageCapturingFlowService implements SalFlowService, AutoCloseabl
         registration.unregisterPath(context, path);
         return this;
     }
-    
+
     public static MessageCapturingFlowService create() {
         return new MessageCapturingFlowService();
     }
-    
+
     public static MessageCapturingFlowService create(RpcProviderRegistry registry) {
         MessageCapturingFlowService ret = new MessageCapturingFlowService();
         ret.registerTo(registry);
         return ret;
     }
-    
-    
+
+
 }
index b4f51f5771950826ede6d67f37b568106f29f01e..f088c0a0bdde1f29f5ff0bd4054d3b3137ab8f7e 100644 (file)
@@ -14,6 +14,6 @@ import org.opendaylight.yangtools.concepts.Registration;
 public interface RegistrationListener<T extends Registration<?>> extends EventListener {
 
     void onRegister(T registration);
-    
+
     void onUnregister(T registration);
 }
index 7d78fd283d169d16cc11510d4b68750ecb5c5733..da7efebdfeb1f7f02eda505d48a1f83be6a79b89 100644 (file)
@@ -16,8 +16,8 @@ import org.opendaylight.yangtools.concepts.Registration;
 public interface DataProvisionService<P extends Path<P> , D> {
 
     public Registration<DataCommitHandler<P, D>> registerCommitHandler(P path, DataCommitHandler<P, D> commitHandler);
-    
-    public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<P, D>>> 
+
+    public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<P, D>>>
         registerCommitHandlerListener(RegistrationListener<DataCommitHandlerRegistration<P, D>> commitHandlerListener);
 
 }
index 6a906c5b880df468e7dce19c63e44152089bd568..f5f03a106b36119b188ca489924d514f88b12f00 100644 (file)
@@ -12,6 +12,6 @@ import java.util.concurrent.ExecutorService;
 public interface NotificationPublishService<N> {
 
     void publish(N notification);
-    
+
     void publish(N notification,ExecutorService executor);
 }
index f99c13ecf53499ab6770d9107025cb7f91828b8a..0ecb2c57689d907af476ac1e68cac04b537f8e39 100644 (file)
@@ -11,7 +11,7 @@ import org.opendaylight.yangtools.concepts.Mutable;
 import org.opendaylight.yangtools.concepts.Path;
 
 public interface MutableRoutingTable<C, P extends Path<P>, T> extends RoutingTable<C,P,T>, Mutable {
-    
+
     void setDefaultRoute(T target);
     void updateRoute(P path,T target);
     void removeRoute(P path);
index fbf735fa754e1d6ecba56fc406daeb9cbe97a486..4bfb30f828ed2b0d7eb61ca8951c4063e620bb79 100644 (file)
@@ -12,6 +12,6 @@ import org.opendaylight.yangtools.concepts.Immutable;
 public interface Route<C,P> extends Immutable {
 
     C getType();
-    
+
     P getPath();
 }
index 4402f69a5f73896f8f905c190a7743f3f0b28e80..9e72b68cd63624d65840d19e6eaca4cc5de1260b 100644 (file)
@@ -14,10 +14,10 @@ import org.opendaylight.yangtools.concepts.Path;
 public interface RoutingTable<C, P extends Path<P>, T> {
 
     C getIdentifier();
-    
+
     T getDefaultRoute();
-    
+
     Map<P,T> getRoutes();
-    
+
     T getRoute(P path);
 }
index 4d395267dd8db5f59ba65d7802d8eade7184f921..ee9af6cb80d91ccc4083a61e3e6a01604769a757 100644 (file)
@@ -24,7 +24,7 @@ import com.google.common.collect.Multimaps;
 /**
  * Base abstract implementation of DataReadRouter, which performs
  * a read operation on multiple data readers and then merges result.
- * 
+ *
  * @param <P>
  * @param <D>
  */
@@ -50,7 +50,7 @@ public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements Da
 
     /**
      * Merges data readed by reader instances from specified path
-     * 
+     *
      * @param path Path on which read was performed
      * @param data Data which was returned by read operation.
      * @return Merged result.
@@ -59,11 +59,11 @@ public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements Da
 
     /**
      * Returns a function which performs configuration read for supplied path
-     * 
+     *
      * @param path
      * @return function which performs configuration read for supplied path
      */
-    
+
     private Function<DataReader<P, D>, D> configurationRead(final P path) {
         return new Function<DataReader<P, D>, D>() {
             @Override
@@ -75,7 +75,7 @@ public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements Da
 
     /**
      * Returns a function which performs operational read for supplied path
-     * 
+     *
      * @param path
      * @return function which performs operational read for supplied path
      */
@@ -92,10 +92,10 @@ public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements Da
 
     /**
      * Register's a reader for operational data.
-     * 
+     *
      * @param path Path which is served by this reader
      * @param reader Reader instance which is responsible for reading particular subpath.
-     * @return 
+     * @return
      */
     public Registration<DataReader<P, D>> registerOperationalReader(P path, DataReader<P, D> reader) {
         OperationalDataReaderRegistration<P, D> ret = new OperationalDataReaderRegistration<>(path, reader);
@@ -142,15 +142,15 @@ public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements Da
     }
 
     private Predicate<? super Entry<P, DataReaderRegistration<P, D>>> affects(final P path) {
-        
+
         return new Predicate<Entry<P, DataReaderRegistration<P, D>>>() {
-            
+
             @Override
             public boolean apply(Entry<P, DataReaderRegistration<P, D>> input) {
                 final P key = input.getKey();
                 return key.contains(path) || ((P) path).contains(key);
             }
-            
+
         };
     }
 
index 691c30368866963abd9137888a17182ce2b6a035..c86aec96d13ad711870ad0b248695be5bffb1ed6 100644 (file)
@@ -24,9 +24,9 @@ public class DataChangeEventImpl<P extends Path<P>, D> implements DataChangeEven
     private final D updatedOperationalSubtree;
     private final D updatedConfigurationSubtree;
 
-    
-    
-    
+
+
+
     public DataChangeEventImpl(DataChange<P, D> dataChange, D originalConfigurationSubtree,
             D originalOperationalSubtree, D updatedOperationalSubtree, D updatedConfigurationSubtree) {
         super();
index d90442750226fb7f155fded5545db22876084acf..f35d6dc6af29e2780a4d090d44984eb6ec6d3f97 100644 (file)
@@ -28,24 +28,24 @@ public class InitialDataChangeEventImpl<P extends Path<P>,D> implements DataChan
         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
     public Map<P, D> getCreatedConfigurationData() {
         return Collections.emptyMap();
     }
-    
+
     @Override
     public Map<P, D> getCreatedOperationalData() {
         return Collections.emptyMap();
     }
-    
+
     @Override
     public Map<P, D> getOriginalConfigurationData() {
         return Collections.emptyMap();
@@ -66,7 +66,7 @@ public class InitialDataChangeEventImpl<P extends Path<P>,D> implements DataChan
     public Map<P, D> getUpdatedConfigurationData() {
         return updatedConfigurationData;
     }
-    
+
     @Override
     public D getUpdatedConfigurationSubtree() {
         return updatedConfigurationTree;
@@ -75,21 +75,21 @@ public class InitialDataChangeEventImpl<P extends Path<P>,D> implements DataChan
     public D getUpdatedOperationalSubtree() {
         return updatedOperationalTree;
     }
-    
+
     @Override
     public D getOriginalConfigurationSubtree() {
         return updatedConfigurationTree;
     }
-    
+
     @Override
     public D getOriginalOperationalSubtree() {
         return updatedOperationalTree;
     }
-    
+
     @Override
     public Map<P, D> getUpdatedOperationalData() {
         return updatedOperationalData;
     }
-    
+
 
 }
index f7a15b614e26d03877a682b44565c465eb3879e5..daecfdb59ba8243cd8e00650d6cc9da50e639e1b 100644 (file)
@@ -8,13 +8,13 @@
 package org.opendaylight.controller.md.sal.common.impl.util.compat;
 
 public class DataNormalizationException extends Exception {
-       private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-       public DataNormalizationException(String message) {
-               super(message);
-       }
+    public DataNormalizationException(String message) {
+        super(message);
+    }
 
-       public DataNormalizationException(String message, Throwable cause) {
-               super(message, cause);
-       }
+    public DataNormalizationException(String message, Throwable cause) {
+        super(message, cause);
+    }
 }
index 5d73b1eefb3343b43e3547e7d754f0900ab2bb31..1af7ccc79ad2de55b1f26a3b53b11b6b44bfadea 100644 (file)
@@ -18,7 +18,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 public class CommitHandlerTransactions {
 
     private static class AllwaysSuccessfulTransaction<P extends Path<P>,D> implements DataCommitTransaction<P, D> {
-        
+
         private final  DataModification<P, D> modification;
 
         public AllwaysSuccessfulTransaction(DataModification<P, D> modification) {
@@ -32,13 +32,13 @@ public class CommitHandlerTransactions {
         public RpcResult<Void> finish() throws IllegalStateException {
             return Rpcs.<Void>getRpcResult(true, null, Collections.<RpcError>emptyList());
         }
-        
+
         @Override
         public DataModification<P, D> getModification() {
             return modification;
         }
     }
-    
+
     public static final <P extends Path<P>,D> AllwaysSuccessfulTransaction<P, D> allwaysSuccessfulTransaction(DataModification<P, D> modification)  {
         return new AllwaysSuccessfulTransaction<>(modification);
     }
index 86dcba9596debc92e8618518120596ac57fa9279..4d41249b4d5600e7932d9b56dd34bbaaf80f8854 100644 (file)
@@ -16,20 +16,20 @@ import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
  *
  */
 public class RpcErrors {
-    
+
     /**
      * @param applicationTag
      * @param tag
      * @param info
      * @param severity
      * @param message
-     * @param errorType 
-     * @param cause 
+     * @param errorType
+     * @param cause
      * @return {@link RpcError} implementation
      */
     public static RpcError getRpcError(String applicationTag, String tag, String info,
             ErrorSeverity severity, String message, ErrorType errorType, Throwable cause) {
-        RpcErrorTO ret = new RpcErrorTO(applicationTag, tag, info, severity, message, 
+        RpcErrorTO ret = new RpcErrorTO(applicationTag, tag, info, severity, message,
                 errorType, cause);
         return ret;
     }
@@ -94,7 +94,7 @@ public class RpcErrors {
         public Throwable getCause() {
             return cause;
         }
-        
+
         @Override
         public ErrorType getErrorType() {
             return errorType;
index ff9f037f5aeb62883dfc90eb0cd360937b86de65..670a7c8f22e5c810938de68f80c665dad4a0779f 100644 (file)
@@ -14,36 +14,36 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No
 
 public class ToSalPropertyClassUtils {
     public static Bandwidth salAdvertisedBandwidthFrom(NodeConnector nodeConnector) {
-        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);        
+        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
         PortFeatures portFeatures = flowCapNodeConn.getAdvertisedFeatures();
         return new AdvertisedBandwidth(resolveBandwidth(portFeatures));
     }
 
     public static Bandwidth salPeerBandwidthFrom(NodeConnector nodeConnector) {
-        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);        
+        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
         PortFeatures portFeatures = flowCapNodeConn.getPeerFeatures();
         return new PeerBandwidth(resolveBandwidth(portFeatures));
     }
 
     public static Bandwidth salSupportedBandwidthFrom(NodeConnector nodeConnector) {
-        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);        
+        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
         PortFeatures portFeatures = flowCapNodeConn.getSupported();
         return new SupportedBandwidth(resolveBandwidth(portFeatures));
     }
 
     public static MacAddress salMacAddressFrom(NodeConnector nodeConnector) {
-        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);        
+        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
         String hwAddress = flowCapNodeConn.getHardwareAddress().getValue();
-        return new MacAddress(bytesFrom(hwAddress));        
+        return new MacAddress(bytesFrom(hwAddress));
     }
-    
-    
+
+
     public static Name salNameFrom(NodeConnector nodeConnector) {
-        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);        
+        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
         return new Name(flowCapNodeConn.getName());
     }
-    
-    
+
+
 
     private static byte[] bytesFrom(String hwAddress) {
         String[] mac = hwAddress.split(":");
index a1d573db08240ad4deca1b1f7ddb67bb9e20454c..cf59eb4a9063fbd531749727143927cc26dd47d4 100644 (file)
@@ -53,8 +53,8 @@ public interface BindingAwareRpcRouter extends RpcRouter<String, String, String,
 
         /**
          * Java class name of Rpc Context
-         * 
-         * 
+         *
+         *
          */
         @Override
         public String getContext() {
@@ -63,7 +63,7 @@ public interface BindingAwareRpcRouter extends RpcRouter<String, String, String,
 
         /**
          * String representation of route e.g. node-id
-         * 
+         *
          */
         @Override
         public String getRoute() {
@@ -72,7 +72,7 @@ public interface BindingAwareRpcRouter extends RpcRouter<String, String, String,
 
         /**
          * Java class name of Rpc Type e.g org.opendaylight.AddFlowInput
-         * 
+         *
          */
         @Override
         public String getType() {
index ac7120ffdb1a6c0ea0343529e340fcf8bf4f9028..71d56a7c0eba32828df97f06891bb81c110779dc 100644 (file)
@@ -12,7 +12,7 @@ import java.util.concurrent.Future;
 public class BindingAwareZeroMqRpcRouter implements BindingAwareRpcRouter {
 
     BindingAwareRpcRouter mdSalRouter;
-    
+
     public BindingAwareRpcRouter getMdSalRouter() {
         return mdSalRouter;
     }
@@ -28,10 +28,10 @@ public class BindingAwareZeroMqRpcRouter implements BindingAwareRpcRouter {
         // Write message down to the wire
         return null;
     }
-    
+
     // Receiver part - invoked when request is received and deserialized
     private Future<RpcReply<byte[]>> receivedRequest(RpcRequest<String, String, String, byte[]> input) {
-        
+
         return mdSalRouter.sendRpc(input);
     }
 
index efa24d099f589f77db327ee0f06951237375d599..519d21bf4fe6aea0fd3e0cdeda94132d7ce8b113 100644 (file)
@@ -15,11 +15,11 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 
 public interface Connector extends RpcImplementation, NotificationListener {
 
-    
-    
+
+
     Set<InstanceIdentifier> getConfigurationPrefixes();
     Set<InstanceIdentifier> getRuntimePrefixes();
-    
+
     void registerListener(ConnectorListener listener);
     void unregisterListener(ConnectorListener listener);
 }
index f161644f6dccad55fdc7151dc6a898335745af97..fa4c8048fac87e1e218b45d6508f78274b14a75c 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.controller.sal.connector.api;
 import java.util.concurrent.Future;
 
 /**
- * 
+ *
  * @author ttkacik
  *
  * @param <C> Routing Context Identifier
@@ -20,14 +20,14 @@ import java.util.concurrent.Future;
  */
 public interface RpcRouter<C,T,R,D> {
 
-    
-    
+
+
     Future<RpcReply<D>> sendRpc(RpcRequest<C, T, R, D> input);
-    
-    
+
+
     /**
-     * 
-     * @author 
+     *
+     * @author
      *
      * @param <C> Routing Context Identifier
         * @param <R> Route Type
@@ -39,14 +39,14 @@ public interface RpcRouter<C,T,R,D> {
         RouteIdentifier<C,T,R> getRoutingInformation();
         D getPayload();
     }
-    
+
     public interface RouteIdentifier<C,T,R> {
-        
+
         C getContext(); // defines a routing table (e.g. NodeContext)
         T getType(); // rpc type
         R getRoute(); // e.g. (node identity)
     }
-    
+
     public interface RpcReply<D> {
         D getPayload();
     }
index 99a38ca43a5be68fd3c9bad328e20ab98d0578a4..c14d5a679cf8c2f8bcb2172f520273fac160ea50 100644 (file)
@@ -18,9 +18,9 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 public abstract class AbstractConsumer implements Consumer, BundleActivator,ServiceTrackerCustomizer<Broker, Broker> {
 
-    
-    
-    
+
+
+
     private BundleContext context;
     private ServiceTracker<Broker, Broker> tracker;
     private Broker broker;
@@ -54,7 +54,7 @@ public abstract class AbstractConsumer implements Consumer, BundleActivator,Serv
         return Collections.emptySet();
     }
 
-    
+
     @Override
     public Broker addingService(ServiceReference<Broker> reference) {
         if(broker == null) {
@@ -62,15 +62,15 @@ public abstract class AbstractConsumer implements Consumer, BundleActivator,Serv
             broker.registerConsumer(this, context);
             return broker;
         }
-        
+
         return null;
     }
-    
+
     @Override
     public void modifiedService(ServiceReference<Broker> reference, Broker service) {
         // NOOP
     }
-    
+
     @Override
     public void removedService(ServiceReference<Broker> reference, Broker service) {
         stopImpl(context);
index c1518b1ec64757136b42a2cc8f92193c6902beb2..dec2f7a4845ecf5a720384865299714f15c1982a 100644 (file)
@@ -10,28 +10,28 @@ package org.opendaylight.controller.sal.core.api;
 import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;
 
 /**
- * 
+ *
  * Session-specific instance of the broker functionality.
- * 
+ *
  * <p>
  * BrokerService is marker interface for infrastructure services provided by the
  * SAL. These services are session-specific, each {@link Provider} and
  * {@link Consumer} usually has own instance of the service with it's own
  * context.
- * 
+ *
  * <p>
  * The consumer's (or provider's) instance of specific service could be obtained
  * by invoking {@link ConsumerSession#getService(Class)} method on session
  * assigned to the consumer.
- * 
+ *
  * <p>
  * {@link BrokerService} and {@link Provider} may seem similar, but provider
  * provides YANG model-based functionality and {@link BrokerService} exposes the
  * necessary supporting functionality to implement specific functionality of
  * YANG and to reuse it in the development of {@link Consumer}s and
  * {@link Provider}s.
- * 
- * 
+ *
+ *
  */
 public interface BrokerService {
 
index 3127df521f72547a0567f00f60e07101c247f5dc..a693cd6c49b475bc5f046cbb48c465f37858729f 100644 (file)
@@ -12,26 +12,26 @@ import java.util.Collection;
 import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;
 
 /**
- * 
+ *
  * Defines the component of controller and supplies additional metadata. A
  * component of the controller or application supplies a concrete implementation
  * of this interface.
- * 
+ *
  * A user-implemented component (application) which facilitates the SAL and SAL
  * services to access infrastructure services or providers' functionality.
- * 
- * 
+ *
+ *
  */
 public interface Consumer {
 
     /**
      * Callback signaling initialization of the consumer session to the SAL.
-     * 
+     *
      * The consumer MUST use the session for all communication with SAL or
      * retrieving SAL infrastructure services.
-     * 
+     *
      * This method is invoked by {@link Broker#registerConsumer(Consumer)}
-     * 
+     *
      * @param session
      *            Unique session between consumer and SAL.
      */
@@ -40,9 +40,9 @@ public interface Consumer {
     /**
      * Get a set of implementations of consumer functionality to be registered
      * into system during the consumer registration to the SAL.
-     * 
+     *
      * This method is invoked by {@link Broker#registerConsumer(Consumer)}.
-     * 
+     *
      * @return Set of consumer functionality.
      */
     public Collection<ConsumerFunctionality> getConsumerFunctionality();
@@ -50,8 +50,8 @@ public interface Consumer {
     /**
      * The marker interface for the interfaces describing the consumer
      * functionality contracts.
-     * 
-     * 
+     *
+     *
      */
     public interface ConsumerFunctionality {
 
index fef8618b2c450d4a4a6f095d35d7939d2edfd70e..0a57d12579239ae29e9fff251651db8483f1ee16 100644 (file)
@@ -12,30 +12,30 @@ import java.util.Collection;
 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
 
 /**
- * 
+ *
  * Defines the component of controller and supplies additional metadata. A
  * component of the controller or application supplies a concrete implementation
  * of this interface.
- * 
+ *
  * <p>
  * A user-implemented component (application) which facilitates the SAL and SAL
  * services to access infrastructure services and to provide functionality to
  * {@link Consumer}s and other providers.
- * 
- * 
+ *
+ *
  */
 public interface Provider {
 
     /**
      * Callback signaling initialization of the provider session to the SAL.
-     * 
+     *
      * <p>
      * The provider <b>MUST use the session</b> for all communication with SAL
      * or retrieving SAL infrastructure services.
-     * 
+     *
      * <p>
      * This method is invoked by {@link Broker#registerConsumer(Consumer)}
-     * 
+     *
      * @param session
      *            Unique session between provider and SAL.
      */
@@ -44,24 +44,24 @@ public interface Provider {
     /**
      * Gets a set of implementations of provider functionality to be registered
      * into system during the provider registration to the SAL.
-     * 
+     *
      * <p>
      * This method is invoked by {@link Broker#registerProvider(Provider)} to
      * learn the initial provided functionality
-     * 
+     *
      * @return Set of provider's functionality.
      */
     public Collection<ProviderFunctionality> getProviderFunctionality();
 
     /**
      * Functionality provided by the {@link Provider}
-     * 
+     *
      * <p>
      * Marker interface used to mark the interfaces describing specific
      * functionality which could be exposed by providers to other components.
-     * 
+     *
 
-     * 
+     *
      */
     public interface ProviderFunctionality {
 
index 665a50f9ca2881690a05a29a3779a974ce0b6ac9..da592e9b22689704b393f6b2f7d4b9588ddb9bed 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 public interface RpcConsumptionRegistry {
     /**
      * Sends an RPC to other components registered to the broker.
-     * 
+     *
      * @see RpcImplementation
      * @param rpc
      *            Name of RPC
index f43dcd6b43565692136eda0eecac5354b29681ac..a22a6ef75e6be7d25461071b1c8290d1a13c0be4 100644 (file)
@@ -18,17 +18,17 @@ public interface RpcProvisionRegistry extends RpcImplementation, BrokerService,
 
     /**
      * Registers an implementation of the rpc.
-     * 
+     *
      * <p>
      * The registered rpc functionality will be available to all other
      * consumers and providers registered to the broker, which are aware of
      * the {@link QName} assigned to the rpc.
-     * 
+     *
      * <p>
      * There is no assumption that rpc type is in the set returned by
      * invoking {@link RpcImplementation#getSupportedRpcs()}. This allows
      * for dynamic rpc implementations.
-     * 
+     *
      * @param rpcType
      *            Name of Rpc
      * @param implementation
@@ -38,7 +38,7 @@ public interface RpcProvisionRegistry extends RpcImplementation, BrokerService,
      */
     RpcRegistration addRpcImplementation(QName rpcType, RpcImplementation implementation)
             throws IllegalArgumentException;
-    
+
     ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(RpcRegistrationListener listener);
 
     RoutedRpcRegistration addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation);
index 2ba5c4ba20377323f165542301d97153135df17b..a0be886b24d7c10e892c598c4e8072fea7835a81 100644 (file)
@@ -12,8 +12,8 @@ import java.util.EventListener;
 import org.opendaylight.yangtools.yang.common.QName;
 
 public interface RpcRegistrationListener extends EventListener {
-    
+
     public void onRpcImplementationAdded(QName name);
-    
+
     public void onRpcImplementationRemoved(QName name);
 }
index 64195303e80b1ab6883acef8d12bd8c7940b501a..66d290f531aa41f5346d970c92bba1963094f28f 100644 (file)
@@ -15,20 +15,20 @@ import org.opendaylight.yangtools.yang.common.QName;
 public class RpcRoutingContext implements Immutable, Serializable {
 
     /**
-     * 
+     *
      */
     private static final long serialVersionUID = -9079324728075883325L;
-    
+
     private final QName context;
     private final QName rpc;
-    
-    
+
+
     private RpcRoutingContext(QName context, QName rpc) {
         super();
         this.context = context;
         this.rpc = rpc;
     }
-    
+
     public static final RpcRoutingContext create(QName context, QName rpc) {
         return new RpcRoutingContext(context, rpc);
     }
index 2d5f4b2a550d0c6412a3fe3ac604baef7d2d4656..266b6976afbde367ecca294a90023253d903b0ff 100644 (file)
@@ -18,12 +18,12 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 /**
  * DataBrokerService provides unified access to the data stores available in the
  * system.
- * 
- * 
+ *
+ *
  * @see DataProviderService
- * 
+ *
  */
-public interface DataBrokerService extends 
+public interface DataBrokerService extends
     BrokerService, //
     DataReader<InstanceIdentifier, CompositeNode>, //
     DataModificationTransactionFactory<InstanceIdentifier, CompositeNode>, //
index 20fa29dceb7cd807ca78c2650d357f5a30bb0cb1..0538660fd79eea473d705ae588ce83035683941e 100644 (file)
@@ -15,14 +15,14 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.DataReader;;
 
-public interface DataProviderService extends 
+public interface DataProviderService extends
     DataBrokerService, //
     DataProvisionService<InstanceIdentifier, CompositeNode>
     {
 
     /**
      * Adds {@link DataValidator} for specified Data Store
-     * 
+     *
      * @param store
      *            Data Store
      * @param validator
@@ -32,7 +32,7 @@ public interface DataProviderService extends
 
     /**
      * Removes {@link DataValidator} from specified Data Store
-     * 
+     *
      * @param store
      * @param validator
      *            Validator
@@ -42,7 +42,7 @@ public interface DataProviderService extends
 
     /**
      * Adds {@link DataRefresher} for specified data store
-     * 
+     *
      * @param store
      * @param refresher
      */
@@ -50,22 +50,22 @@ public interface DataProviderService extends
 
     /**
      * Removes {@link DataRefresher} from specified data store
-     * 
+     *
      * @param store
      * @param refresher
      */
     void removeRefresher(DataStoreIdentifier store, DataRefresher refresher);
 
-    
+
     Registration<DataReader<InstanceIdentifier, CompositeNode>> registerConfigurationReader(InstanceIdentifier path, DataReader<InstanceIdentifier, CompositeNode> reader);
 
     Registration<DataReader<InstanceIdentifier, CompositeNode>> registerOperationalReader(InstanceIdentifier path, DataReader<InstanceIdentifier, CompositeNode> reader);
-    
+
     public interface DataRefresher extends Provider.ProviderFunctionality {
 
         /**
          * Fired when some component explicitly requested the data refresh.
-         * 
+         *
          * The provider which exposed the {@link DataRefresher} should republish
          * its provided data by editing the data in all affected data stores.
          */
index 8bdd0618716558494ed7bcacec5214bfb886d34e..58ffb38365c0d6673fa10ef9f1ccd229cdb26bcd 100644 (file)
@@ -15,11 +15,11 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 public interface DataStore extends //
     DataReader<InstanceIdentifier, CompositeNode>,
     DataCommitHandler<InstanceIdentifier, CompositeNode> {
-    
-    
+
+
     Iterable<InstanceIdentifier> getStoredConfigurationPaths();
     Iterable<InstanceIdentifier> getStoredOperationalPaths();
-    
+
     boolean containsConfigurationPath(InstanceIdentifier path);
     boolean containsOperationalPath(InstanceIdentifier path);
 
index 2bcb84be34f375486f4791dab794ff58d168c4d7..286770b0482d36d600f9f2eeebe5ed24cf928a43 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 
 /**
  * {@link Provider}-supplied Validator of the data.
- * 
+ *
  * <p>
  * The registration could be done by :
  * <ul>
@@ -27,25 +27,25 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
  * as arguments to the
  * {@link DataProviderService#addValidator(DataStoreIdentifier, DataValidator)}
  * </ul>
- * 
+ *
  **/
 public interface DataValidator extends Provider.ProviderFunctionality {
 
     /**
      * A set of Data Stores supported by implementation.
-     * 
+     *
      * The set of {@link DataStoreIdentifier}s which identifies target data
      * stores which are supported by this implementation. This set is used, when
      * {@link Provider} is registered to the SAL, to register and expose the
      * validation functionality to affected data stores.
-     * 
+     *
      * @return Set of Data Store identifiers
      */
     Set<DataStoreIdentifier> getSupportedDataStores();
 
     /**
      * Performs validation on supplied data.
-     * 
+     *
      * @param toValidate
      *            Data to validate
      * @return Validation result. The
index f87fee5bce27732ee71b482d4fc9251ed2e68536..7dc8cb36c5b266c20f3521efc16e93ba3676553f 100644 (file)
@@ -21,21 +21,21 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 public interface NotificationListener extends Consumer.ConsumerFunctionality, EventListener {
     /**
      * A set of notification types supported by listeners.
-     * 
+     *
      * The set of notification {@link QName}s which are supported by this
      * listener. This set is used, when {@link Consumer} is registered to the
      * SAL, to automatically register the listener.
-     * 
+     *
      * @return Set of QNames identifying supported notifications.
      */
     Set<QName> getSupportedNotifications();
 
     /**
      * Fired when the notification occurs.
-     * 
+     *
      * The type of the notification could be learned by
      * <code>QName type = notification.getNodeType();</code>
-     * 
+     *
      * @param notification
      *            Notification content
      */
index aa22b90f65478092374d53d06961e6c09f5fbcd7..8dab4cd70536f6188b4f91850f49d05e158e8fbc 100644 (file)
@@ -13,14 +13,14 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 
 /**
  * Notification Publishing Service
- * 
+ *
  * The simplified process of the notification publishing is following:
- * 
+ *
  * <ol>
  * <li> {@link Provider} invokes {@link #sendNotification(CompositeNode)}
  * <li> {@link Broker} finds {@link NotificationListener}s which subscribed for
  * the notification type.
- * 
+ *
  * <li>For each subscriber {@link Broker} invokes
  * {@link NotificationListener#onNotification(CompositeNode)}
  * </ol>
@@ -28,11 +28,11 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 public interface NotificationPublishService extends NotificationService {
     /**
      * Publishes a notification.
-     * 
+     *
      * Notification type is determined by the
      * {@link CompositeNode#getNodeType()} of the
      * <code>notification<code> parameter.
-     * 
+     *
      * @param notification
      *            Notification to publish
      */
index f654ca9ad6c87ee3c9e0c4b5bcb58ab0004d0708..7a60f2d67783f0ac2690914325c1bd0e13b3539a 100644 (file)
@@ -18,10 +18,10 @@ import org.opendaylight.yangtools.yang.common.QName;
 /**
  * NotificationService provides access to the notification functionality of the
  * SAL.
- * 
+ *
  * NotificationService allows for consumption of notifications by registering
  * implementations of NotificationListener.
- * 
+ *
  * The registration of notification listeners could be done by:
  * <ul>
  * <li>returning an instance of implementation in the return value of
@@ -30,14 +30,14 @@ import org.opendaylight.yangtools.yang.common.QName;
  * arguments to the
  * {@link ProviderSession#addRpcImplementation(QName, RpcImplementation)}
  * </ul>
- * 
- * 
+ *
+ *
  */
 public interface NotificationService extends BrokerService {
 
     /**
      * Registers a notification listener for supplied notification type.
-     * 
+     *
      * @param notification
      * @param listener
      */
index 692a0babdfcaaa43d2601fc1f065dee1dcaa45b3..8e2a11184c973504c7784b8c748a9cf7a347937c 100644 (file)
@@ -14,13 +14,13 @@ import org.opendaylight.controller.sal.dom.broker.DataBrokerImpl;
 
 public class DomBrokerRuntimeMXBeanImpl implements
         DomBrokerImplRuntimeMXBean {
-    
+
     private final DataBrokerImpl dataService;
     private final Transactions transactions = new Transactions();
     private final Data data = new Data();
-    
+
     public DomBrokerRuntimeMXBeanImpl(DataBrokerImpl dataService) {
-        this.dataService = dataService; 
+        this.dataService = dataService;
     }
 
     public Transactions getTransactions() {
index 25e6d047217ce33480918217eafb2b1576fba089..10b838a2c6122a2d8e629f7ce02f3698fe90703c 100644 (file)
@@ -50,12 +50,12 @@ import com.google.common.util.concurrent.ListeningExecutorService;
 
 /**
  * In-memory DOM Data Store
- * 
+ *
  * Implementation of {@link DOMStore} which uses {@link DataTree} and other
  * classes such as {@link SnapshotBackedWriteTransaction}.
  * {@link SnapshotBackedReadTransaction} and {@link ResolveDataChangeEventsTask}
  * to implement {@link DOMStore} contract.
- * 
+ *
  */
 public class InMemoryDOMDataStore implements DOMStore, Identifiable<String>, SchemaContextListener,
         TransactionReadyPrototype {
@@ -108,7 +108,7 @@ public class InMemoryDOMDataStore implements DOMStore, Identifiable<String>, Sch
         /*
          * Make sure commit is not occurring right now. Listener has to be
          * registered and its state capture enqueued at a consistent point.
-         * 
+         *
          * FIXME: improve this to read-write lock, such that multiple listener
          * registrations can occur simultaneously
          */
index 717fb11987b8a1754581123687555fa1b2b701e4..534ee64b8af9b77591a1b20a5d63f2985cc332e1 100644 (file)
@@ -26,7 +26,7 @@ import com.google.common.base.Throwables;
  * Implementation of Write transaction which is backed by
  * {@link DataTreeSnapshot} and executed according to
  * {@link TransactionReadyPrototype}.
- * 
+ *
  */
 class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction implements DOMStoreWriteTransaction {
 
@@ -37,7 +37,7 @@ class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction impleme
 
     /**
      * Creates new write-only transaction.
-     * 
+     *
      * @param identifier
      *            transaction Identifier
      * @param snapshot
@@ -140,19 +140,19 @@ class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction impleme
     /**
      * Prototype implementation of
      * {@link #ready(SnapshotBackedWriteTransaction)}
-     * 
+     *
      * This class is intended to be implemented by Transaction factories
      * responsible for allocation of {@link SnapshotBackedWriteTransaction} and
      * providing underlying logic for applying implementation.
-     * 
+     *
      */
     public static interface TransactionReadyPrototype {
 
         /**
          * Returns a commit coordinator associated with supplied transactions.
-         * 
+         *
          * This call must not fail.
-         * 
+         *
          * @param tx
          *            Transaction on which ready was invoked.
          * @return DOMStoreThreePhaseCommitCohort associated with transaction
index 7422c116ef0484e72ce182024a76cff51ef56c5c..c6dd25c76bae32d8bad58980577841b8ad051484 100644 (file)
@@ -11,10 +11,10 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree;
  * Factory interface for creating data trees.
  */
 public interface DataTreeFactory {
-       /**
-        * Create a new data tree.
-        *
-        * @return A data tree instance.
-        */
-       DataTree create();
+    /**
+     * Create a new data tree.
+     *
+     * @return A data tree instance.
+     */
+    DataTree create();
 }
index 7f834351d3e20bd59b0a72e2ce2c46672c1b7e2e..3291afa0616908b6e1512679141b990e1fad77bf 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * 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
index ba3dcc8c866f833fe18cb1ebe9e32061a947f521..69f518bb32f5c57f467285f0a32056240893043b 100644 (file)
@@ -27,16 +27,16 @@ public class DataBrokerImpl extends AbstractDataBroker<InstanceIdentifier, Compo
 
     private AtomicLong nextTransaction = new AtomicLong();
     private final AtomicLong createdTransactionsCount = new AtomicLong();
-    
+
     public DataBrokerImpl() {
         setDataReadRouter(new DataReaderRouter());
         setExecutor(MoreExecutors.sameThreadExecutor());
     }
-    
+
     public AtomicLong getCreatedTransactionsCount() {
         return createdTransactionsCount;
     }
-    
+
     @Override
     public DataTransactionImpl beginTransaction() {
         String transactionId = "DOM-" + nextTransaction.getAndIncrement();
@@ -83,7 +83,7 @@ public class DataBrokerImpl extends AbstractDataBroker<InstanceIdentifier, Compo
 
     @Override
     public void close() throws Exception {
-        
+
     }
 
 }
index 39008b48f169fe3901f90de3eb31216da90849a5..65aa99deea9e70b62a0a86d6b108a10048ea1a30 100644 (file)
@@ -15,12 +15,12 @@ import org.opendaylight.yangtools.concepts.util.ListenerRegistry;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 
-public class DataTransactionImpl extends AbstractDataTransaction<InstanceIdentifier, CompositeNode> 
+public class DataTransactionImpl extends AbstractDataTransaction<InstanceIdentifier, CompositeNode>
     implements DataModificationTransaction {
     private final ListenerRegistry<DataTransactionListener> listeners = new ListenerRegistry<DataTransactionListener>();
-    
-    
-    
+
+
+
     public DataTransactionImpl(Object identifier,DataBrokerImpl dataBroker) {
         super(identifier,dataBroker);
     }
index 5839db46ca745bc8ac6da65c852cca6796ea7395..30027ec929b2529d366de9c7fd5c6d0fe25f5d7d 100644 (file)
@@ -37,6 +37,6 @@ public class DataBrokerServiceProxy extends AbstractBrokerServiceProxy<DataBroke
     public DataModificationTransaction beginTransaction() {
         return getDelegate().beginTransaction();
     }
-    
-    
+
+
 }
index 1793c53a56546b7262a6ba12d6fad8d9d7252919..caae2971f8bf8eaba5cc392f7252aa123c086fa4 100644 (file)
@@ -83,7 +83,7 @@ public class DataProviderServiceProxy extends AbstractBrokerServiceProxy<DataPro
     public void removeValidator(DataStoreIdentifier store, DataValidator validator) {
         getDelegate().removeValidator(store, validator);
     }
-    
+
     @Override
     public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<InstanceIdentifier, CompositeNode>>> registerCommitHandlerListener(
             RegistrationListener<DataCommitHandlerRegistration<InstanceIdentifier, CompositeNode>> commitHandlerListener) {
index 74923dd8b8626d9f4a1b8175b95b95d7b666d7c0..ebe95d6eb5589624536c887f7b8802898b0e7384 100644 (file)
@@ -18,7 +18,7 @@ public interface NotificationRouter {
 
     /**
      * Registers a notification listener for supplied notification type.
-     * 
+     *
      * @param notification
      * @param listener
      */
index 8b78b83e2f23c6122cadfaf1a042cbc85bed3087..9cc96e147f9787ba42d76f51033066273becbeae 100644 (file)
@@ -24,8 +24,8 @@ public class 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) {
@@ -44,7 +44,7 @@ public class YangDataUtils {
             checkArgument(keyNode != null,"Node must contains all keys.");
             Object value = keyNode.getValue();
             map.put(key, value);
-            
+
         }
         return map;
     }
index 7f6918f2a1e7d7fbf89d8533f4b2719da9d6093c..a478aaac97779b0499eb684797e8cbc220d8df24 100644 (file)
@@ -40,7 +40,7 @@ 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) {
@@ -53,26 +53,26 @@ public class YangSchemaUtils {
     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();
@@ -122,119 +122,119 @@ public class YangSchemaUtils {
     }
 
     private static final class NetconfDataRootNode implements ContainerSchemaNode {
-    
+
         public NetconfDataRootNode(SchemaContext schema) {
             // TODO Auto-generated constructor stub
         }
-    
+
         @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 94ac8d652e637491311c7ac94ce1ba043016569d..413d81d0295694ae0e670c7297a0c77c155e9738 100644 (file)
@@ -45,24 +45,24 @@ public class InMemoryDataStoreTest {
         DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
         assertNotNull(writeTx);
         /**
-         * 
+         *
          * Writes /test in writeTx
-         * 
+         *
          */
         writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
 
         /**
-         * 
+         *
          * Reads /test from writeTx Read should return container.
-         * 
+         *
          */
         ListenableFuture<Optional<NormalizedNode<?, ?>>> writeTxContainer = writeTx.read(TestModel.TEST_PATH);
         assertTrue(writeTxContainer.get().isPresent());
 
         /**
-         * 
+         *
          * Reads /test from readTx Read should return Absent.
-         * 
+         *
          */
         ListenableFuture<Optional<NormalizedNode<?, ?>>> readTxContainer = readTx.read(TestModel.TEST_PATH);
         assertFalse(readTxContainer.get().isPresent());
@@ -74,16 +74,16 @@ public class InMemoryDataStoreTest {
         DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
         assertNotNull(writeTx);
         /**
-         * 
+         *
          * Writes /test in writeTx
-         * 
+         *
          */
         writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
 
         /**
-         * 
+         *
          * Reads /test from writeTx Read should return container.
-         * 
+         *
          */
         ListenableFuture<Optional<NormalizedNode<?, ?>>> writeTxContainer = writeTx.read(TestModel.TEST_PATH);
         assertTrue(writeTxContainer.get().isPresent());
@@ -123,8 +123,8 @@ public class InMemoryDataStoreTest {
 
         /**
          * We alocate new read-write transaction and write /test
-         * 
-         * 
+         *
+         *
          */
         DOMStoreReadWriteTransaction firstTx = txChain.newReadWriteTransaction();
         assertTestContainerWrite(firstTx);
@@ -142,27 +142,27 @@ public class InMemoryDataStoreTest {
         DOMStoreReadTransaction secondReadTx = txChain.newReadOnlyTransaction();
 
         /**
-         * 
+         *
          * We test if we are able to read data from tx, read should not fail
          * since we are using chained transaction.
-         * 
-         * 
+         *
+         *
          */
         assertTestContainerExists(secondReadTx);
 
         /**
-         * 
+         *
          * We alocate next transaction, which is still based on first one, but
          * is read-write.
-         * 
+         *
          */
         DOMStoreReadWriteTransaction thirdDeleteTx = txChain.newReadWriteTransaction();
 
         /**
          * We test existence of /test in third transaction container should
          * still be visible from first one (which is still uncommmited).
-         * 
-         * 
+         *
+         *
          */
         assertTestContainerExists(thirdDeleteTx);
 
@@ -178,7 +178,7 @@ public class InMemoryDataStoreTest {
 
         /**
          * We commit first transaction
-         * 
+         *
          */
         assertThreePhaseCommit(firstWriteTxCohort);
 
@@ -191,7 +191,7 @@ public class InMemoryDataStoreTest {
         assertTestContainerExists(storeReadTx);
         /**
          * We commit third transaction
-         * 
+         *
          */
         assertThreePhaseCommit(thirdDeleteTxCohort);
     }
@@ -225,9 +225,9 @@ public class InMemoryDataStoreTest {
     private static Optional<NormalizedNode<?, ?>> assertTestContainerWrite(final DOMStoreReadWriteTransaction writeTx)
             throws InterruptedException, ExecutionException {
         /**
-         * 
+         *
          * Writes /test in writeTx
-         * 
+         *
          */
         writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
 
@@ -235,9 +235,9 @@ public class InMemoryDataStoreTest {
     }
 
     /**
-     * 
+     *
      * Reads /test from readTx Read should return container.
-     * 
+     *
      */
     private static Optional<NormalizedNode<?, ?>> assertTestContainerExists(DOMStoreReadTransaction readTx)
             throws InterruptedException, ExecutionException {
index c8d6806344214f533d9cb93d0594e67fe6c5af26..0c2a370e069d48e1de827fd0c811282cdd04d0a5 100644 (file)
@@ -24,7 +24,7 @@ public class ZeroMQServerModuleFactory extends org.opendaylight.controller.confi
         module.setBundleContext(bundleContext);
         return module;
     }
-    
+
     @Override
     public Module createModule(String instanceName, DependencyResolver dependencyResolver,
             DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
index 8d2198c365967b2f1751a9d47940a07912a4f346..85f4113663c3d952771d03f2ff8500ad125c7a05 100644 (file)
@@ -16,7 +16,7 @@ public class MessageWrapper {
 
   private Message _message;
   private ZMQ.Socket _receiveSocket;
-  
+
   public MessageWrapper(Message message, ZMQ.Socket receiveSocket) {
     this._message = message;
     this._receiveSocket = receiveSocket;
index e33011b92b4255327a54cfa82de036c78542d557..5703799bb5d8f7ff0d6ba558b69968f1942d35a4 100644 (file)
@@ -91,7 +91,7 @@ public class ExampleProvider extends AbstractProvider implements RpcImplementati
     }
     return false;
   }
-  
+
   // Adds a child SimpleNode containing the value "success" to the input CompositeNode
   private CompositeNode addSuccessNode(CompositeNode input) {
     List<Node<?>> list = new ArrayList<Node<?>>(input.getChildren());
index 5ee982009e53e5b1492af9811ddf9336a821acfc..30f8fd4ed1fd64254f38fb064a81dd29d395c66c 100644 (file)
@@ -67,7 +67,7 @@ public class RouterTest {
   @Inject
   @Filter(timeout=60*1000)
   Broker broker;
-  
+
   private ZMQ.Context zmqCtx = ZMQ.context(1);
   //private Server router;
   //private ExampleProvider provider;
@@ -336,7 +336,7 @@ public class RouterTest {
     return msg;
   }
 
-  
+
   private void printState(){
     Bundle[] b = ctx.getBundles();
     _logger.debug("\n\nNumber of bundles [{}]\n\n]", b.length);
index 067b7d96ec8c94f0af3bef597621c1c7d62586f7..4d9b198795f093c53834f6977447191f2b122136 100644 (file)
@@ -31,12 +31,12 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode;
  *   <ul>
  *    <li><b>/restconf</b> - {@link #getRoot()}
  *     <ul>
- *      <li><b>/config</b> - {@link #readConfigurationData(String)} 
+ *      <li><b>/config</b> - {@link #readConfigurationData(String)}
  *                              {@link #updateConfigurationData(String, CompositeNode)}
  *                              {@link #createConfigurationData(CompositeNode)}
  *                              {@link #createConfigurationData(String, CompositeNode)}
  *                              {@link #deleteConfigurationData(String)}
- *      <li><b>/operational</b> - {@link #readOperationalData(String)} 
+ *      <li><b>/operational</b> - {@link #readOperationalData(String)}
  *      <li>/modules - {@link #getModules()}
  *       <ul>
  *        <li>/module
@@ -95,41 +95,41 @@ public interface RestconfService {
                Draft02.MediaTypes.DATA+JSON, Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public StructuredData invokeRpc(@Encoded @PathParam("identifier") String identifier, CompositeNode payload);
-    
+
     @POST
     @Path("/operations/{identifier:.+}")
     @Produces({Draft02.MediaTypes.OPERATION+JSON, Draft02.MediaTypes.OPERATION+XML,
                Draft02.MediaTypes.DATA+JSON, Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public StructuredData invokeRpc(@Encoded @PathParam("identifier") String identifier, @DefaultValue("") String noPayload);
-    
+
     @GET
     @Path("/config/{identifier:.+}")
-    @Produces({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML, 
+    @Produces({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public StructuredData readConfigurationData(@Encoded @PathParam("identifier") String identifier);
 
     @GET
     @Path("/operational/{identifier:.+}")
-    @Produces({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML, 
+    @Produces({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public StructuredData readOperationalData(@Encoded @PathParam("identifier") String identifier);
 
     @PUT
     @Path("/config/{identifier:.+}")
-    @Consumes({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML, 
+    @Consumes({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public Response updateConfigurationData(@Encoded @PathParam("identifier") String identifier, CompositeNode payload);
 
     @POST
     @Path("/config/{identifier:.+}")
-    @Consumes({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML, 
+    @Consumes({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public Response createConfigurationData(@Encoded @PathParam("identifier") String identifier, CompositeNode payload);
 
     @POST
     @Path("/config")
-    @Consumes({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML, 
+    @Consumes({Draft02.MediaTypes.DATA+JSON,Draft02.MediaTypes.DATA+XML,
                MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
     public Response createConfigurationData(CompositeNode payload);
 
index ba3e315e72728d9e0b9f7aa2c4ee78ff892ea428..290d976b2857c493e7c638592e2715e963a03277 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.controller.sal.restconf.impl.IdentityValuesDTO.Predicate
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 public final class RestUtil {
-    
+
     public static final String SQUOTE = "'";
     public static final String DQUOTE = "\"";
     private static final Pattern PREDICATE_PATTERN = Pattern.compile("\\[(.*?)\\]");
@@ -45,29 +45,29 @@ public final class RestUtil {
         IdentityValuesDTO identityValuesDTO = new IdentityValuesDTO(value);
         for (int i = 1; i < xPathParts.length; i++) {
             String xPathPartTrimmed = xPathParts[i].trim();
-            
+
             String xPathPartStr = getIdAndPrefixAsStr(xPathPartTrimmed);
             IdentityValue identityValue = toIdentity(xPathPartStr, prefixMap);
             if (identityValue == null) {
                 return null;
             }
-            
+
             List<Predicate> predicates = toPredicates(xPathPartTrimmed, prefixMap);
             if (predicates == null) {
                 return null;
             }
             identityValue.setPredicates(predicates);
-            
+
             identityValuesDTO.add(identityValue);
         }
         return identityValuesDTO.getValuesWithNamespaces().isEmpty() ? null : identityValuesDTO;
     }
-    
+
     private static String getIdAndPrefixAsStr(String pathPart) {
         int predicateStartIndex = pathPart.indexOf("[");
         return predicateStartIndex == -1 ? pathPart : pathPart.substring(0, predicateStartIndex);
     }
-    
+
     private static IdentityValue toIdentity(String xPathPart, PrefixesMaping prefixMap) {
         String xPathPartTrimmed = xPathPart.trim();
         if (xPathPartTrimmed.isEmpty()) {
index f7f70e8d87ca697b5050144c56bb165976c2551c..934d4434c38a3e724279405da05198099eba2f70 100644 (file)
@@ -18,9 +18,9 @@ import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
 import com.google.common.base.Preconditions;
 
 public final class EmptyNodeWrapper implements NodeWrapper<Node<?>>, Node<Void> {
-    
+
     private Node<?> unwrapped;
-    
+
     private String localName;
     private URI namespace;
     private QName name;
@@ -30,27 +30,27 @@ public final class EmptyNodeWrapper implements NodeWrapper<Node<?>>, Node<Void>
     public boolean isComposite() {
         return composite;
     }
-    
+
     public void setComposite(boolean composite) {
         this.composite = composite;
     }
-    
+
     public EmptyNodeWrapper(URI namespace, String localName) {
         this.localName = Preconditions.checkNotNull(localName);
         this.namespace = namespace;
     }
-    
+
     @Override
     public void setQname(QName name) {
         Preconditions.checkState(unwrapped == null, "Cannot change the object, due to data inconsistencies.");
         this.name = name;
     }
-    
+
     @Override
     public QName getQname() {
         return name;
     }
-    
+
     @Override
     public String getLocalName() {
         if (unwrapped != null) {
@@ -58,7 +58,7 @@ public final class EmptyNodeWrapper implements NodeWrapper<Node<?>>, Node<Void>
         }
         return localName;
     }
-    
+
     @Override
     public URI getNamespace() {
         if (unwrapped != null) {
index 14a558967d2081a18e045192712ab0988cde6efa..d66e1610a58e62b07a1834b0c7b61197f49b2ab4 100644 (file)
@@ -20,11 +20,11 @@ public final class IdentityValuesDTO {
         elementData.add(new IdentityValue(namespace, value, prefix));
         this.originValue = originValue;
     }
-    
+
     public IdentityValuesDTO(String originValue) {
         this.originValue = originValue;
     }
-    
+
     public IdentityValuesDTO() {
         originValue = null;
     }
@@ -32,21 +32,21 @@ public final class IdentityValuesDTO {
     public void add(String namespace, String value, String prefix) {
         elementData.add(new IdentityValue(namespace, value, prefix));
     }
-    
+
     public void add(IdentityValue identityValue) {
         elementData.add(identityValue);
     }
-    
+
 
     public List<IdentityValue> getValuesWithNamespaces() {
         return Collections.unmodifiableList(elementData);
     }
-    
+
     @Override
     public String toString() {
         return elementData.toString();
     }
-    
+
     public String getOriginValue() {
         return originValue;
     }
@@ -86,7 +86,7 @@ public final class IdentityValuesDTO {
         public void setPredicates(List<Predicate> predicates) {
             this.predicates = predicates;
         }
-        
+
         @Override
         public String toString() {
             StringBuilder sb = new StringBuilder();
@@ -110,22 +110,22 @@ public final class IdentityValuesDTO {
         }
 
     }
-    
+
     public static final class Predicate {
-        
+
         private final IdentityValue name;
         private final String value;
-        
+
         public Predicate(IdentityValue name, String value) {
             super();
             this.name = name;
             this.value = value;
         }
-        
+
         public IdentityValue getName() {
             return name;
         }
-        
+
         public String getValue() {
             return value;
         }
@@ -141,10 +141,10 @@ public final class IdentityValuesDTO {
             }
             return sb.toString();
         }
-        
+
         public boolean isLeafList() {
             return name == null ? true : false;
         }
-        
+
     }
 }
index f9bd7d7aaa4edf0fa4d46a995ee5ce83b61dc138..48fd1a3dfc49e4abf6d22ae040cf504781ff0bc8 100644 (file)
@@ -15,16 +15,16 @@ import org.opendaylight.yangtools.yang.data.api.Node;
 public interface NodeWrapper<T extends Node<?>> {
 
     void setQname(QName name);
-    
+
     QName getQname();
-    
+
     T unwrap();
-    
+
     boolean isChangeAllowed();
-    
+
     URI getNamespace();
 
     void setNamespace(URI namespace);
-    
+
     String getLocalName();
 }
index 42658d79f1468b97eaead0e852b57a125ee528b9..265cc5db4536c96ecbf51bf4005ff4ced54e8c14 100644 (file)
@@ -41,7 +41,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class RestCodec {
-    
+
     private static final Logger logger = LoggerFactory.getLogger(RestCodec.class);
 
     private RestCodec() {
@@ -180,7 +180,7 @@ public class RestCodec {
                 logger.info("Idenetityref will be translated as NULL for data - {}", String.valueOf(valueWithNamespace));
                 return null;
             }
-            
+
             return QName.create(module.getNamespace(), module.getRevision(), valueWithNamespace.getValue());
         }
 
@@ -292,7 +292,7 @@ public class RestCodec {
                     }
                 }
             }
-            
+
             return result.isEmpty() ? null : new InstanceIdentifier(result);
         }
 
@@ -312,7 +312,7 @@ public class RestCodec {
             return null;
         }
     }
-    
+
     private static Module getModuleByNamespace(String namespace, MountInstance mountPoint) {
         URI validNamespace = resolveValidNamespace(namespace, mountPoint);
 
@@ -328,7 +328,7 @@ public class RestCodec {
         }
         return module;
     }
-    
+
     private static URI resolveValidNamespace(String namespace, MountInstance mountPoint) {
         URI validNamespace;
         if (mountPoint != null) {
index 4d22bfa73adce9106ff3ebc59a8a2f9227d4dda7..3131668ed9ed23ae8fb8f0edb75076c8635a235d 100644 (file)
@@ -19,9 +19,9 @@ import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
 import com.google.common.base.Preconditions;
 
 public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, SimpleNode<Object> {
-    
+
     private SimpleNode<Object> simpleNode;
-    
+
     private String localName;
     private Object value;
     private URI namespace;
@@ -31,23 +31,23 @@ public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, Simp
         this.localName = Preconditions.checkNotNull(localName);
         this.value = value;
     }
-    
+
     public SimpleNodeWrapper(URI namespace, String localName, Object value) {
         this(localName, value);
         this.namespace = namespace;
     }
-    
+
     @Override
     public void setQname(QName name) {
         Preconditions.checkState(simpleNode == null, "Cannot change the object, due to data inconsistencies.");
         this.name = name;
     }
-    
+
     @Override
     public QName getQname() {
         return name;
     }
-    
+
     @Override
     public String getLocalName() {
         if (simpleNode != null) {
@@ -55,7 +55,7 @@ public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, Simp
         }
         return localName;
     }
-    
+
     @Override
     public URI getNamespace() {
         if (simpleNode != null) {
@@ -83,7 +83,7 @@ public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, Simp
                 name = new QName(namespace, localName);
             }
             simpleNode = NodeFactory.createImmutableSimpleNode(name, null, value);
-            
+
             value = null;
             namespace = null;
             localName = null;
@@ -126,7 +126,7 @@ public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, Simp
     public Object setValue(Object value) {
         return unwrap().setValue(value);
     }
-    
+
 
 
 }
index f2a0d48e0a18e67f5708da3becc0876ed679ba87..6282f37602be8236a737fe3e8ef42852816756bc 100644 (file)
@@ -64,611 +64,611 @@ import com.google.common.eventbus.Subscribe;
  */
 public class ListenerAdapter implements DataChangeListener {
 
-       private static final Logger logger = LoggerFactory
-                       .getLogger(ListenerAdapter.class);
-       private final XmlMapper xmlMapper = new XmlMapper();
-       private final SimpleDateFormat rfc3339 = new SimpleDateFormat(
-                       "yyyy-MM-dd'T'hh:mm:ssZ");
-
-       private final InstanceIdentifier path;
-       private ListenerRegistration<DataChangeListener> registration;
-       private final String streamName;
-       private Set<Channel> subscribers = new ConcurrentSet<>();
-       private final EventBus eventBus;
-       private final EventBusChangeRecorder eventBusChangeRecorder;
-
-       /**
-        * Creates new {@link ListenerAdapter} listener specified by path and stream
-        * name.
-        * 
-        * @param path
-        *            Path to data in data store.
-        * @param streamName
-        *            The name of the stream.
-        */
-       ListenerAdapter(InstanceIdentifier path, String streamName) {
-               Preconditions.checkNotNull(path);
-               Preconditions
-                               .checkArgument(streamName != null && !streamName.isEmpty());
-               this.path = path;
-               this.streamName = streamName;
-               eventBus = new AsyncEventBus(Executors.newSingleThreadExecutor());
-               eventBusChangeRecorder = new EventBusChangeRecorder();
-               eventBus.register(eventBusChangeRecorder);
-       }
-
-       @Override
-       public void onDataChanged(
-                       DataChangeEvent<InstanceIdentifier, CompositeNode> change) {
-               if (!change.getCreatedConfigurationData().isEmpty()
-                               || !change.getCreatedOperationalData().isEmpty()
-                               || !change.getUpdatedConfigurationData().isEmpty()
-                               || !change.getUpdatedOperationalData().isEmpty()
-                               || !change.getRemovedConfigurationData().isEmpty()
-                               || !change.getRemovedOperationalData().isEmpty()) {
-                       String xml = prepareXmlFrom(change);
-                       Event event = new Event(EventType.NOTIFY);
-                       event.setData(xml);
-                       eventBus.post(event);
-               }
-       }
-
-       /**
-        * Tracks events of data change by customer.
-        */
-       private final class EventBusChangeRecorder {
-               @Subscribe
-               public void recordCustomerChange(Event event) {
-                       if (event.getType() == EventType.REGISTER) {
-                               Channel subscriber = event.getSubscriber();
-                               if (!subscribers.contains(subscriber)) {
-                                       subscribers.add(subscriber);
-                               }
-                       } else if (event.getType() == EventType.DEREGISTER) {
-                               subscribers.remove(event.getSubscriber());
-                               Notificator
-                                               .removeListenerIfNoSubscriberExists(ListenerAdapter.this);
-                       } else if (event.getType() == EventType.NOTIFY) {
-                               for (Channel subscriber : subscribers) {
-                                       if (subscriber.isActive()) {
-                                               logger.debug("Data are sent to subscriber {}:",
-                                                               subscriber.remoteAddress());
-                                               subscriber.writeAndFlush(new TextWebSocketFrame(event
-                                                               .getData()));
-                                       } else {
-                                               logger.debug(
-                                                               "Subscriber {} is removed - channel is not active yet.",
-                                                               subscriber.remoteAddress());
-                                               subscribers.remove(subscriber);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Represents event of specific {@link EventType} type, holds data and
-        * {@link Channel} subscriber.
-        */
-       private final class Event {
-               private final EventType type;
-               private Channel subscriber;
-               private String data;
-
-               /**
-                * Creates new event specified by {@link EventType} type.
-                * 
-                * @param type
-                *            EventType
-                */
-               public Event(EventType type) {
-                       this.type = type;
-               }
-
-               /**
-                * Gets the {@link Channel} subscriber.
-                * 
-                * @return Channel
-                */
-               public Channel getSubscriber() {
-                       return subscriber;
-               }
-
-               /**
-                * Sets subscriber for event.
-                * 
-                * @param subscriber
-                *            Channel
-                */
-               public void setSubscriber(Channel subscriber) {
-                       this.subscriber = subscriber;
-               }
-
-               /**
-                * Gets event data.
-                * 
-                * @return String representation of event data.
-                */
-               public String getData() {
-                       return data;
-               }
-
-               /**
-                * Sets event data.
-                * 
-                * @param String
-                *            data.
-                */
-               public void setData(String data) {
-                       this.data = data;
-               }
-
-               /**
-                * Gets event type.
-                * 
-                * @return The type of the event.
-                */
-               public EventType getType() {
-                       return type;
-               }
-       }
-
-       /**
-        * Type of the event.
-        */
-       private enum EventType {
-               REGISTER, DEREGISTER, NOTIFY;
-       }
-
-       /**
-        * Prepare data in printable form and transform it to String.
-        * 
-        * @param change
-        *            DataChangeEvent
-        * @return Data in printable form.
-        */
-       private String prepareXmlFrom(
-                       DataChangeEvent<InstanceIdentifier, CompositeNode> change) {
-               Document doc = createDocument();
-               Element notificationElement = doc.createElementNS(
-                               "urn:ietf:params:xml:ns:netconf:notification:1.0",
-                               "notification");
-               doc.appendChild(notificationElement);
-
-               Element eventTimeElement = doc.createElement("eventTime");
-               eventTimeElement.setTextContent(toRFC3339(new Date()));
-               notificationElement.appendChild(eventTimeElement);
-
-               Element dataChangedNotificationEventElement = doc.createElementNS(
-                               "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote",
-                               "data-changed-notification");
-               addValuesToDataChangedNotificationEventElement(doc,
-                               dataChangedNotificationEventElement, change);
-               notificationElement.appendChild(dataChangedNotificationEventElement);
-
-               try {
-                       ByteArrayOutputStream out = new ByteArrayOutputStream();
-                       TransformerFactory tf = TransformerFactory.newInstance();
-                       Transformer transformer = tf.newTransformer();
-                       transformer
-                                       .setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
-                       transformer.setOutputProperty(OutputKeys.METHOD, "xml");
-                       transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-                       transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-                       transformer.setOutputProperty(
-                                       "{http://xml.apache.org/xslt}indent-amount", "4");
-                       transformer.transform(new DOMSource(doc), new StreamResult(
-                                       new OutputStreamWriter(out, "UTF-8")));
-                       byte[] charData = out.toByteArray();
-                       return new String(charData, "UTF-8");
-               } catch (TransformerException | UnsupportedEncodingException e) {
-                       String msg = "Error during transformation of Document into String";
-                       logger.error(msg, e);
-                       return msg;
-               }
-       }
-
-       /**
-        * Formats data specified by RFC3339.
-        * 
-        * @param d
-        *            Date
-        * @return Data specified by RFC3339.
-        */
-       private String toRFC3339(Date d) {
-               return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2");
-       }
-
-       /**
-        * Creates {@link Document} document.
-        * 
-        * @return {@link Document} document.
-        */
-       private Document createDocument() {
-               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-               Document doc = null;
-               try {
-                       DocumentBuilder bob = dbf.newDocumentBuilder();
-                       doc = bob.newDocument();
-               } catch (ParserConfigurationException e) {
-                       return null;
-               }
-               return doc;
-       }
-
-       /**
-        * Adds values to data changed notification event element.
-        * 
-        * @param doc
-        *            {@link Document}
-        * @param dataChangedNotificationEventElement
-        *            {@link Element}
-        * @param change
-        *            {@link DataChangeEvent}
-        */
-       private void addValuesToDataChangedNotificationEventElement(Document doc,
-                       Element dataChangedNotificationEventElement,
-                       DataChangeEvent<InstanceIdentifier, CompositeNode> change) {
-               addValuesFromDataToElement(doc, change.getCreatedConfigurationData(),
-                               dataChangedNotificationEventElement, Store.CONFIG,
-                               Operation.CREATED);
-               addValuesFromDataToElement(doc, change.getCreatedOperationalData(),
-                               dataChangedNotificationEventElement, Store.OPERATION,
-                               Operation.CREATED);
-               if (change.getCreatedConfigurationData().isEmpty()) {
-                       addValuesFromDataToElement(doc,
-                                       change.getUpdatedConfigurationData(),
-                                       dataChangedNotificationEventElement, Store.CONFIG,
-                                       Operation.UPDATED);
-               }
-               if (change.getCreatedOperationalData().isEmpty()) {
-                       addValuesFromDataToElement(doc, change.getUpdatedOperationalData(),
-                                       dataChangedNotificationEventElement, Store.OPERATION,
-                                       Operation.UPDATED);
-               }
-               addValuesFromDataToElement(doc, change.getRemovedConfigurationData(),
-                               dataChangedNotificationEventElement, Store.CONFIG,
-                               Operation.DELETED);
-               addValuesFromDataToElement(doc, change.getRemovedOperationalData(),
-                               dataChangedNotificationEventElement, Store.OPERATION,
-                               Operation.DELETED);
-       }
-
-       /**
-        * Adds values from data to element.
-        * 
-        * @param doc
-        *            {@link Document}
-        * @param data
-        *            Set of {@link InstanceIdentifier}.
-        * @param element
-        *            {@link Element}
-        * @param store
-        *            {@link Store}
-        * @param operation
-        *            {@link Operation}
-        */
-       private void addValuesFromDataToElement(Document doc,
-                       Set<InstanceIdentifier> data, Element element, Store store,
-                       Operation operation) {
-               if (data == null || data.isEmpty()) {
-                       return;
-               }
-               for (InstanceIdentifier path : data) {
-                       Node node = createDataChangeEventElement(doc, path, null, store,
-                                       operation);
-                       element.appendChild(node);
-               }
-       }
-
-       /**
-        * Adds values from data to element.
-        * 
-        * @param doc
-        *            {@link Document}
-        * @param data
-        *            Map of {@link InstanceIdentifier} and {@link CompositeNode}.
-        * @param element
-        *            {@link Element}
-        * @param store
-        *            {@link Store}
-        * @param operation
-        *            {@link Operation}
-        */
-       private void addValuesFromDataToElement(Document doc,
-                       Map<InstanceIdentifier, CompositeNode> data, Element element,
-                       Store store, Operation operation) {
-               if (data == null || data.isEmpty()) {
-                       return;
-               }
-               for (Entry<InstanceIdentifier, CompositeNode> entry : data.entrySet()) {
-                       Node node = createDataChangeEventElement(doc, entry.getKey(),
-                                       entry.getValue(), store, operation);
-                       element.appendChild(node);
-               }
-       }
-
-       /**
-        * Creates changed event element from data.
-        * 
-        * @param doc
-        *            {@link Document}
-        * @param path
-        *            Path to data in data store.
-        * @param data
-        *            {@link CompositeNode}
-        * @param store
-        *            {@link Store}
-        * @param operation
-        *            {@link Operation}
-        * @return {@link Node} node represented by changed event element.
-        */
-       private Node createDataChangeEventElement(Document doc,
-                       InstanceIdentifier path, CompositeNode data, Store store,
-                       Operation operation) {
-               Element dataChangeEventElement = doc.createElement("data-change-event");
-
-               Element pathElement = doc.createElement("path");
-               addPathAsValueToElement(path, pathElement);
-               dataChangeEventElement.appendChild(pathElement);
-
-               Element storeElement = doc.createElement("store");
-               storeElement.setTextContent(store.value);
-               dataChangeEventElement.appendChild(storeElement);
-
-               Element operationElement = doc.createElement("operation");
-               operationElement.setTextContent(operation.value);
-               dataChangeEventElement.appendChild(operationElement);
-
-               if (data != null) {
-                       Element dataElement = doc.createElement("data");
-                       Node dataAnyXml = translateToXml(path, data);
-                       Node adoptedNode = doc.adoptNode(dataAnyXml);
-                       dataElement.appendChild(adoptedNode);
-                       dataChangeEventElement.appendChild(dataElement);
-               }
-
-               return dataChangeEventElement;
-       }
-
-       /**
-        * Translates {@link CompositeNode} data to XML format.
-        * 
-        * @param path
-        *            Path to data in data store.
-        * @param data
-        *            {@link CompositeNode}
-        * @return Data in XML format.
-        */
-       private Node translateToXml(InstanceIdentifier path, CompositeNode data) {
-               DataNodeContainer schemaNode = ControllerContext.getInstance()
-                               .getDataNodeContainerFor(path);
-               if (schemaNode == null) {
-                       logger.info(
-                                       "Path '{}' contains node with unsupported type (supported type is Container or List) or some node was not found.",
-                                       path);
-                       return null;
-               }
-               try {
-                       Document xml = xmlMapper.write(data, schemaNode);
-                       return xml.getFirstChild();
-               } catch (UnsupportedDataTypeException e) {
-                       logger.error(
-                                       "Error occured during translation of notification to XML.",
-                                       e);
-                       return null;
-               }
-       }
-
-       /**
-        * Adds path as value to element.
-        * 
-        * @param path
-        *            Path to data in data store.
-        * @param element
-        *            {@link Element}
-        */
-       private void addPathAsValueToElement(InstanceIdentifier path,
-                       Element element) {
-               // Map< key = namespace, value = prefix>
-               Map<String, String> prefixes = new HashMap<>();
-               InstanceIdentifier instanceIdentifier = path;
-               StringBuilder textContent = new StringBuilder();
-               for (PathArgument pathArgument : instanceIdentifier.getPath()) {
-                       textContent.append("/");
-                       writeIdentifierWithNamespacePrefix(element, textContent,
-                                       pathArgument.getNodeType(), prefixes);
-                       if (pathArgument instanceof NodeIdentifierWithPredicates) {
-                               Map<QName, Object> predicates = ((NodeIdentifierWithPredicates) pathArgument)
-                                               .getKeyValues();
-                               for (QName keyValue : predicates.keySet()) {
-                                       String predicateValue = String.valueOf(predicates
-                                                       .get(keyValue));
-                                       textContent.append("[");
-                                       writeIdentifierWithNamespacePrefix(element, textContent,
-                                                       keyValue, prefixes);
-                                       textContent.append("='");
-                                       textContent.append(predicateValue);
-                                       textContent.append("'");
-                                       textContent.append("]");
-                               }
-                       } else if (pathArgument instanceof NodeWithValue) {
-                               textContent.append("[.='");
-                               textContent.append(((NodeWithValue) pathArgument).getValue());
-                               textContent.append("'");
-                               textContent.append("]");
-                       }
-               }
-               element.setTextContent(textContent.toString());
-       }
-
-       /**
-        * Writes identifier that consists of prefix and QName.
-        * 
-        * @param element
-        *            {@link Element}
-        * @param textContent
-        *            StringBuilder
-        * @param qName
-        *            QName
-        * @param prefixes
-        *            Map of namespaces and prefixes.
-        */
-       private static void writeIdentifierWithNamespacePrefix(Element element,
-                       StringBuilder textContent, QName qName, Map<String, String> prefixes) {
-               String namespace = qName.getNamespace().toString();
-               String prefix = prefixes.get(namespace);
-               if (prefix == null) {
-                       prefix = qName.getPrefix();
-                       if (prefix == null || prefix.isEmpty()
-                                       || prefixes.containsValue(prefix)) {
-                               prefix = generateNewPrefix(prefixes.values());
-                       }
-               }
-
-               element.setAttribute("xmlns:" + prefix, namespace);
-               textContent.append(prefix);
-               prefixes.put(namespace, prefix);
-
-               textContent.append(":");
-               textContent.append(qName.getLocalName());
-       }
-
-       /**
-        * Generates new prefix which consists of four random characters <a-z>.
-        * 
-        * @param prefixes
-        *            Collection of prefixes.
-        * @return New prefix which consists of four random characters <a-z>.
-        */
-       private static String generateNewPrefix(Collection<String> prefixes) {
-               StringBuilder result = null;
-               Random random = new Random();
-               do {
-                       result = new StringBuilder();
-                       for (int i = 0; i < 4; i++) {
-                               int randomNumber = 0x61 + (Math.abs(random.nextInt()) % 26);
-                               result.append(Character.toChars(randomNumber));
-                       }
-               } while (prefixes.contains(result.toString()));
-
-               return result.toString();
-       }
-
-       /**
-        * Gets path pointed to data in data store.
-        * 
-        * @return Path pointed to data in data store.
-        */
-       public InstanceIdentifier getPath() {
-               return path;
-       }
-
-       /**
-        * Sets {@link ListenerRegistration} registration.
-        * 
-        * @param registration
-        *            ListenerRegistration<DataChangeListener>
-        */
-       public void setRegistration(
-                       ListenerRegistration<DataChangeListener> registration) {
-               this.registration = registration;
-       }
-
-       /**
-        * Gets the name of the stream.
-        * 
-        * @return The name of the stream.
-        */
-       public String getStreamName() {
-               return streamName;
-       }
-
-       /**
-        * Removes all subscribers and unregisters event bus change recorder form
-        * event bus.
-        */
-       public void close() throws Exception {
-               subscribers = new ConcurrentSet<>();
-               registration.close();
-               registration = null;
-               eventBus.unregister(eventBusChangeRecorder);
-       }
-
-       /**
-        * Checks if {@link ListenerRegistration} registration exist.
-        * 
-        * @return True if exist, false otherwise.
-        */
-       public boolean isListening() {
-               return registration == null ? false : true;
-       }
-
-       /**
-        * Creates event of type {@link EventType#REGISTER}, set {@link Channel}
-        * subscriber to the event and post event into event bus.
-        * 
-        * @param subscriber
-        *            Channel
-        */
-       public void addSubscriber(Channel subscriber) {
-               if (!subscriber.isActive()) {
-                       logger.debug("Channel is not active between websocket server and subscriber {}"
-                                       + subscriber.remoteAddress());
-               }
-               Event event = new Event(EventType.REGISTER);
-               event.setSubscriber(subscriber);
-               eventBus.post(event);
-       }
-
-       /**
-        * Creates event of type {@link EventType#DEREGISTER}, sets {@link Channel}
-        * subscriber to the event and posts event into event bus.
-        * 
-        * @param subscriber
-        */
-       public void removeSubscriber(Channel subscriber) {
-               logger.debug("Subscriber {} is removed.", subscriber.remoteAddress());
-               Event event = new Event(EventType.DEREGISTER);
-               event.setSubscriber(subscriber);
-               eventBus.post(event);
-       }
-
-       /**
-        * Checks if exists at least one {@link Channel} subscriber.
-        * 
-        * @return True if exist at least one {@link Channel} subscriber, false
-        *         otherwise.
-        */
-       public boolean hasSubscribers() {
-               return !subscribers.isEmpty();
-       }
-
-       /**
-        * Consists of two types {@link Store#CONFIG} and {@link Store#OPERATION}.
-        */
-       private static enum Store {
-               CONFIG("config"), OPERATION("operation");
-
-               private final String value;
-
-               private Store(String value) {
-                       this.value = value;
-               }
-       }
-
-       /**
-        * Consists of three types {@link Operation#CREATED},
-        * {@link Operation#UPDATED} and {@link Operation#DELETED}.
-        */
-       private static enum Operation {
-               CREATED("created"), UPDATED("updated"), DELETED("deleted");
-
-               private final String value;
-
-               private Operation(String value) {
-                       this.value = value;
-               }
-       }
+    private static final Logger logger = LoggerFactory
+            .getLogger(ListenerAdapter.class);
+    private final XmlMapper xmlMapper = new XmlMapper();
+    private final SimpleDateFormat rfc3339 = new SimpleDateFormat(
+            "yyyy-MM-dd'T'hh:mm:ssZ");
+
+    private final InstanceIdentifier path;
+    private ListenerRegistration<DataChangeListener> registration;
+    private final String streamName;
+    private Set<Channel> subscribers = new ConcurrentSet<>();
+    private final EventBus eventBus;
+    private final EventBusChangeRecorder eventBusChangeRecorder;
+
+    /**
+     * Creates new {@link ListenerAdapter} listener specified by path and stream
+     * name.
+     *
+     * @param path
+     *            Path to data in data store.
+     * @param streamName
+     *            The name of the stream.
+     */
+    ListenerAdapter(InstanceIdentifier path, String streamName) {
+        Preconditions.checkNotNull(path);
+        Preconditions
+                .checkArgument(streamName != null && !streamName.isEmpty());
+        this.path = path;
+        this.streamName = streamName;
+        eventBus = new AsyncEventBus(Executors.newSingleThreadExecutor());
+        eventBusChangeRecorder = new EventBusChangeRecorder();
+        eventBus.register(eventBusChangeRecorder);
+    }
+
+    @Override
+    public void onDataChanged(
+            DataChangeEvent<InstanceIdentifier, CompositeNode> change) {
+        if (!change.getCreatedConfigurationData().isEmpty()
+                || !change.getCreatedOperationalData().isEmpty()
+                || !change.getUpdatedConfigurationData().isEmpty()
+                || !change.getUpdatedOperationalData().isEmpty()
+                || !change.getRemovedConfigurationData().isEmpty()
+                || !change.getRemovedOperationalData().isEmpty()) {
+            String xml = prepareXmlFrom(change);
+            Event event = new Event(EventType.NOTIFY);
+            event.setData(xml);
+            eventBus.post(event);
+        }
+    }
+
+    /**
+     * Tracks events of data change by customer.
+     */
+    private final class EventBusChangeRecorder {
+        @Subscribe
+        public void recordCustomerChange(Event event) {
+            if (event.getType() == EventType.REGISTER) {
+                Channel subscriber = event.getSubscriber();
+                if (!subscribers.contains(subscriber)) {
+                    subscribers.add(subscriber);
+                }
+            } else if (event.getType() == EventType.DEREGISTER) {
+                subscribers.remove(event.getSubscriber());
+                Notificator
+                        .removeListenerIfNoSubscriberExists(ListenerAdapter.this);
+            } else if (event.getType() == EventType.NOTIFY) {
+                for (Channel subscriber : subscribers) {
+                    if (subscriber.isActive()) {
+                        logger.debug("Data are sent to subscriber {}:",
+                                subscriber.remoteAddress());
+                        subscriber.writeAndFlush(new TextWebSocketFrame(event
+                                .getData()));
+                    } else {
+                        logger.debug(
+                                "Subscriber {} is removed - channel is not active yet.",
+                                subscriber.remoteAddress());
+                        subscribers.remove(subscriber);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Represents event of specific {@link EventType} type, holds data and
+     * {@link Channel} subscriber.
+     */
+    private final class Event {
+        private final EventType type;
+        private Channel subscriber;
+        private String data;
+
+        /**
+         * Creates new event specified by {@link EventType} type.
+         *
+         * @param type
+         *            EventType
+         */
+        public Event(EventType type) {
+            this.type = type;
+        }
+
+        /**
+         * Gets the {@link Channel} subscriber.
+         *
+         * @return Channel
+         */
+        public Channel getSubscriber() {
+            return subscriber;
+        }
+
+        /**
+         * Sets subscriber for event.
+         *
+         * @param subscriber
+         *            Channel
+         */
+        public void setSubscriber(Channel subscriber) {
+            this.subscriber = subscriber;
+        }
+
+        /**
+         * Gets event data.
+         *
+         * @return String representation of event data.
+         */
+        public String getData() {
+            return data;
+        }
+
+        /**
+         * Sets event data.
+         *
+         * @param String
+         *            data.
+         */
+        public void setData(String data) {
+            this.data = data;
+        }
+
+        /**
+         * Gets event type.
+         *
+         * @return The type of the event.
+         */
+        public EventType getType() {
+            return type;
+        }
+    }
+
+    /**
+     * Type of the event.
+     */
+    private enum EventType {
+        REGISTER, DEREGISTER, NOTIFY;
+    }
+
+    /**
+     * Prepare data in printable form and transform it to String.
+     *
+     * @param change
+     *            DataChangeEvent
+     * @return Data in printable form.
+     */
+    private String prepareXmlFrom(
+            DataChangeEvent<InstanceIdentifier, CompositeNode> change) {
+        Document doc = createDocument();
+        Element notificationElement = doc.createElementNS(
+                "urn:ietf:params:xml:ns:netconf:notification:1.0",
+                "notification");
+        doc.appendChild(notificationElement);
+
+        Element eventTimeElement = doc.createElement("eventTime");
+        eventTimeElement.setTextContent(toRFC3339(new Date()));
+        notificationElement.appendChild(eventTimeElement);
+
+        Element dataChangedNotificationEventElement = doc.createElementNS(
+                "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote",
+                "data-changed-notification");
+        addValuesToDataChangedNotificationEventElement(doc,
+                dataChangedNotificationEventElement, change);
+        notificationElement.appendChild(dataChangedNotificationEventElement);
+
+        try {
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            TransformerFactory tf = TransformerFactory.newInstance();
+            Transformer transformer = tf.newTransformer();
+            transformer
+                    .setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
+            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+            transformer.setOutputProperty(
+                    "{http://xml.apache.org/xslt}indent-amount", "4");
+            transformer.transform(new DOMSource(doc), new StreamResult(
+                    new OutputStreamWriter(out, "UTF-8")));
+            byte[] charData = out.toByteArray();
+            return new String(charData, "UTF-8");
+        } catch (TransformerException | UnsupportedEncodingException e) {
+            String msg = "Error during transformation of Document into String";
+            logger.error(msg, e);
+            return msg;
+        }
+    }
+
+    /**
+     * Formats data specified by RFC3339.
+     *
+     * @param d
+     *            Date
+     * @return Data specified by RFC3339.
+     */
+    private String toRFC3339(Date d) {
+        return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2");
+    }
+
+    /**
+     * Creates {@link Document} document.
+     *
+     * @return {@link Document} document.
+     */
+    private Document createDocument() {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        Document doc = null;
+        try {
+            DocumentBuilder bob = dbf.newDocumentBuilder();
+            doc = bob.newDocument();
+        } catch (ParserConfigurationException e) {
+            return null;
+        }
+        return doc;
+    }
+
+    /**
+     * Adds values to data changed notification event element.
+     *
+     * @param doc
+     *            {@link Document}
+     * @param dataChangedNotificationEventElement
+     *            {@link Element}
+     * @param change
+     *            {@link DataChangeEvent}
+     */
+    private void addValuesToDataChangedNotificationEventElement(Document doc,
+            Element dataChangedNotificationEventElement,
+            DataChangeEvent<InstanceIdentifier, CompositeNode> change) {
+        addValuesFromDataToElement(doc, change.getCreatedConfigurationData(),
+                dataChangedNotificationEventElement, Store.CONFIG,
+                Operation.CREATED);
+        addValuesFromDataToElement(doc, change.getCreatedOperationalData(),
+                dataChangedNotificationEventElement, Store.OPERATION,
+                Operation.CREATED);
+        if (change.getCreatedConfigurationData().isEmpty()) {
+            addValuesFromDataToElement(doc,
+                    change.getUpdatedConfigurationData(),
+                    dataChangedNotificationEventElement, Store.CONFIG,
+                    Operation.UPDATED);
+        }
+        if (change.getCreatedOperationalData().isEmpty()) {
+            addValuesFromDataToElement(doc, change.getUpdatedOperationalData(),
+                    dataChangedNotificationEventElement, Store.OPERATION,
+                    Operation.UPDATED);
+        }
+        addValuesFromDataToElement(doc, change.getRemovedConfigurationData(),
+                dataChangedNotificationEventElement, Store.CONFIG,
+                Operation.DELETED);
+        addValuesFromDataToElement(doc, change.getRemovedOperationalData(),
+                dataChangedNotificationEventElement, Store.OPERATION,
+                Operation.DELETED);
+    }
+
+    /**
+     * Adds values from data to element.
+     *
+     * @param doc
+     *            {@link Document}
+     * @param data
+     *            Set of {@link InstanceIdentifier}.
+     * @param element
+     *            {@link Element}
+     * @param store
+     *            {@link Store}
+     * @param operation
+     *            {@link Operation}
+     */
+    private void addValuesFromDataToElement(Document doc,
+            Set<InstanceIdentifier> data, Element element, Store store,
+            Operation operation) {
+        if (data == null || data.isEmpty()) {
+            return;
+        }
+        for (InstanceIdentifier path : data) {
+            Node node = createDataChangeEventElement(doc, path, null, store,
+                    operation);
+            element.appendChild(node);
+        }
+    }
+
+    /**
+     * Adds values from data to element.
+     *
+     * @param doc
+     *            {@link Document}
+     * @param data
+     *            Map of {@link InstanceIdentifier} and {@link CompositeNode}.
+     * @param element
+     *            {@link Element}
+     * @param store
+     *            {@link Store}
+     * @param operation
+     *            {@link Operation}
+     */
+    private void addValuesFromDataToElement(Document doc,
+            Map<InstanceIdentifier, CompositeNode> data, Element element,
+            Store store, Operation operation) {
+        if (data == null || data.isEmpty()) {
+            return;
+        }
+        for (Entry<InstanceIdentifier, CompositeNode> entry : data.entrySet()) {
+            Node node = createDataChangeEventElement(doc, entry.getKey(),
+                    entry.getValue(), store, operation);
+            element.appendChild(node);
+        }
+    }
+
+    /**
+     * Creates changed event element from data.
+     *
+     * @param doc
+     *            {@link Document}
+     * @param path
+     *            Path to data in data store.
+     * @param data
+     *            {@link CompositeNode}
+     * @param store
+     *            {@link Store}
+     * @param operation
+     *            {@link Operation}
+     * @return {@link Node} node represented by changed event element.
+     */
+    private Node createDataChangeEventElement(Document doc,
+            InstanceIdentifier path, CompositeNode data, Store store,
+            Operation operation) {
+        Element dataChangeEventElement = doc.createElement("data-change-event");
+
+        Element pathElement = doc.createElement("path");
+        addPathAsValueToElement(path, pathElement);
+        dataChangeEventElement.appendChild(pathElement);
+
+        Element storeElement = doc.createElement("store");
+        storeElement.setTextContent(store.value);
+        dataChangeEventElement.appendChild(storeElement);
+
+        Element operationElement = doc.createElement("operation");
+        operationElement.setTextContent(operation.value);
+        dataChangeEventElement.appendChild(operationElement);
+
+        if (data != null) {
+            Element dataElement = doc.createElement("data");
+            Node dataAnyXml = translateToXml(path, data);
+            Node adoptedNode = doc.adoptNode(dataAnyXml);
+            dataElement.appendChild(adoptedNode);
+            dataChangeEventElement.appendChild(dataElement);
+        }
+
+        return dataChangeEventElement;
+    }
+
+    /**
+     * Translates {@link CompositeNode} data to XML format.
+     *
+     * @param path
+     *            Path to data in data store.
+     * @param data
+     *            {@link CompositeNode}
+     * @return Data in XML format.
+     */
+    private Node translateToXml(InstanceIdentifier path, CompositeNode data) {
+        DataNodeContainer schemaNode = ControllerContext.getInstance()
+                .getDataNodeContainerFor(path);
+        if (schemaNode == null) {
+            logger.info(
+                    "Path '{}' contains node with unsupported type (supported type is Container or List) or some node was not found.",
+                    path);
+            return null;
+        }
+        try {
+            Document xml = xmlMapper.write(data, schemaNode);
+            return xml.getFirstChild();
+        } catch (UnsupportedDataTypeException e) {
+            logger.error(
+                    "Error occured during translation of notification to XML.",
+                    e);
+            return null;
+        }
+    }
+
+    /**
+     * Adds path as value to element.
+     *
+     * @param path
+     *            Path to data in data store.
+     * @param element
+     *            {@link Element}
+     */
+    private void addPathAsValueToElement(InstanceIdentifier path,
+            Element element) {
+        // Map< key = namespace, value = prefix>
+        Map<String, String> prefixes = new HashMap<>();
+        InstanceIdentifier instanceIdentifier = path;
+        StringBuilder textContent = new StringBuilder();
+        for (PathArgument pathArgument : instanceIdentifier.getPath()) {
+            textContent.append("/");
+            writeIdentifierWithNamespacePrefix(element, textContent,
+                    pathArgument.getNodeType(), prefixes);
+            if (pathArgument instanceof NodeIdentifierWithPredicates) {
+                Map<QName, Object> predicates = ((NodeIdentifierWithPredicates) pathArgument)
+                        .getKeyValues();
+                for (QName keyValue : predicates.keySet()) {
+                    String predicateValue = String.valueOf(predicates
+                            .get(keyValue));
+                    textContent.append("[");
+                    writeIdentifierWithNamespacePrefix(element, textContent,
+                            keyValue, prefixes);
+                    textContent.append("='");
+                    textContent.append(predicateValue);
+                    textContent.append("'");
+                    textContent.append("]");
+                }
+            } else if (pathArgument instanceof NodeWithValue) {
+                textContent.append("[.='");
+                textContent.append(((NodeWithValue) pathArgument).getValue());
+                textContent.append("'");
+                textContent.append("]");
+            }
+        }
+        element.setTextContent(textContent.toString());
+    }
+
+    /**
+     * Writes identifier that consists of prefix and QName.
+     *
+     * @param element
+     *            {@link Element}
+     * @param textContent
+     *            StringBuilder
+     * @param qName
+     *            QName
+     * @param prefixes
+     *            Map of namespaces and prefixes.
+     */
+    private static void writeIdentifierWithNamespacePrefix(Element element,
+            StringBuilder textContent, QName qName, Map<String, String> prefixes) {
+        String namespace = qName.getNamespace().toString();
+        String prefix = prefixes.get(namespace);
+        if (prefix == null) {
+            prefix = qName.getPrefix();
+            if (prefix == null || prefix.isEmpty()
+                    || prefixes.containsValue(prefix)) {
+                prefix = generateNewPrefix(prefixes.values());
+            }
+        }
+
+        element.setAttribute("xmlns:" + prefix, namespace);
+        textContent.append(prefix);
+        prefixes.put(namespace, prefix);
+
+        textContent.append(":");
+        textContent.append(qName.getLocalName());
+    }
+
+    /**
+     * Generates new prefix which consists of four random characters <a-z>.
+     *
+     * @param prefixes
+     *            Collection of prefixes.
+     * @return New prefix which consists of four random characters <a-z>.
+     */
+    private static String generateNewPrefix(Collection<String> prefixes) {
+        StringBuilder result = null;
+        Random random = new Random();
+        do {
+            result = new StringBuilder();
+            for (int i = 0; i < 4; i++) {
+                int randomNumber = 0x61 + (Math.abs(random.nextInt()) % 26);
+                result.append(Character.toChars(randomNumber));
+            }
+        } while (prefixes.contains(result.toString()));
+
+        return result.toString();
+    }
+
+    /**
+     * Gets path pointed to data in data store.
+     *
+     * @return Path pointed to data in data store.
+     */
+    public InstanceIdentifier getPath() {
+        return path;
+    }
+
+    /**
+     * Sets {@link ListenerRegistration} registration.
+     *
+     * @param registration
+     *            ListenerRegistration<DataChangeListener>
+     */
+    public void setRegistration(
+            ListenerRegistration<DataChangeListener> registration) {
+        this.registration = registration;
+    }
+
+    /**
+     * Gets the name of the stream.
+     *
+     * @return The name of the stream.
+     */
+    public String getStreamName() {
+        return streamName;
+    }
+
+    /**
+     * Removes all subscribers and unregisters event bus change recorder form
+     * event bus.
+     */
+    public void close() throws Exception {
+        subscribers = new ConcurrentSet<>();
+        registration.close();
+        registration = null;
+        eventBus.unregister(eventBusChangeRecorder);
+    }
+
+    /**
+     * Checks if {@link ListenerRegistration} registration exist.
+     *
+     * @return True if exist, false otherwise.
+     */
+    public boolean isListening() {
+        return registration == null ? false : true;
+    }
+
+    /**
+     * Creates event of type {@link EventType#REGISTER}, set {@link Channel}
+     * subscriber to the event and post event into event bus.
+     *
+     * @param subscriber
+     *            Channel
+     */
+    public void addSubscriber(Channel subscriber) {
+        if (!subscriber.isActive()) {
+            logger.debug("Channel is not active between websocket server and subscriber {}"
+                    + subscriber.remoteAddress());
+        }
+        Event event = new Event(EventType.REGISTER);
+        event.setSubscriber(subscriber);
+        eventBus.post(event);
+    }
+
+    /**
+     * Creates event of type {@link EventType#DEREGISTER}, sets {@link Channel}
+     * subscriber to the event and posts event into event bus.
+     *
+     * @param subscriber
+     */
+    public void removeSubscriber(Channel subscriber) {
+        logger.debug("Subscriber {} is removed.", subscriber.remoteAddress());
+        Event event = new Event(EventType.DEREGISTER);
+        event.setSubscriber(subscriber);
+        eventBus.post(event);
+    }
+
+    /**
+     * Checks if exists at least one {@link Channel} subscriber.
+     *
+     * @return True if exist at least one {@link Channel} subscriber, false
+     *         otherwise.
+     */
+    public boolean hasSubscribers() {
+        return !subscribers.isEmpty();
+    }
+
+    /**
+     * Consists of two types {@link Store#CONFIG} and {@link Store#OPERATION}.
+     */
+    private static enum Store {
+        CONFIG("config"), OPERATION("operation");
+
+        private final String value;
+
+        private Store(String value) {
+            this.value = value;
+        }
+    }
+
+    /**
+     * Consists of three types {@link Operation#CREATED},
+     * {@link Operation#UPDATED} and {@link Operation#DELETED}.
+     */
+    private static enum Operation {
+        CREATED("created"), UPDATED("updated"), DELETED("deleted");
+
+        private final String value;
+
+        private Operation(String value) {
+            this.value = value;
+        }
+    }
 
 }
index 6f154f8affa66ed57dd6a4f6fa1952f99b31bb59..a576eed26978fb0380cd8a28613712409bf6ce53 100644 (file)
@@ -21,11 +21,11 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 public class Notificator {
 
     private static Map<String, ListenerAdapter> listenersByStreamName = new ConcurrentHashMap<>();
-       private static Map<InstanceIdentifier, ListenerAdapter> listenersByInstanceIdentifier = new ConcurrentHashMap<>();
-       private static final Lock lock = new ReentrantLock();
+    private static Map<InstanceIdentifier, ListenerAdapter> listenersByInstanceIdentifier = new ConcurrentHashMap<>();
+    private static final Lock lock = new ReentrantLock();
 
-       private Notificator() {
-       }
+    private Notificator() {
+    }
 
     /**
      * Returns list of all stream names
@@ -35,152 +35,152 @@ public class Notificator {
     }
 
 
-       /**
-        * Gets {@link ListenerAdapter} specified by stream name.
-        * 
-        * @param streamName
-        *            The name of the stream.
-        * @return {@link ListenerAdapter} specified by stream name.
-        */
-       public static ListenerAdapter getListenerFor(String streamName) {
-               return listenersByStreamName.get(streamName);
-       }
-
-       /**
-        * Gets {@link ListenerAdapter} listener specified by
-        * {@link InstanceIdentifier} path.
-        * 
-        * @param path
-        *            Path to data in data repository.
-        * @return ListenerAdapter
-        */
-       public static ListenerAdapter getListenerFor(InstanceIdentifier path) {
-               return listenersByInstanceIdentifier.get(path);
-       }
-
-       /**
-        * Checks if the listener specified by {@link InstanceIdentifier} path
-        * exist.
-        * 
-        * @param path
-        *            Path to data in data repository.
-        * @return True if the listener exist, false otherwise.
-        */
-       public static boolean existListenerFor(InstanceIdentifier path) {
-               return listenersByInstanceIdentifier.containsKey(path);
-       }
-
-       /**
-        * Creates new {@link ListenerAdapter} listener from
-        * {@link InstanceIdentifier} path and stream name.
-        * 
-        * @param path
-        *            Path to data in data repository.
-        * @param streamName
-        *            The name of the stream.
-        * @return New {@link ListenerAdapter} listener from
-        *         {@link InstanceIdentifier} path and stream name.
-        */
-       public static ListenerAdapter createListener(InstanceIdentifier path,
-                       String streamName) {
-               ListenerAdapter listener = new ListenerAdapter(path, streamName);
-               try {
-                       lock.lock();
-                       listenersByInstanceIdentifier.put(path, listener);
-                       listenersByStreamName.put(streamName, listener);
-               } finally {
-                       lock.unlock();
-               }
-               return listener;
-       }
-
-       /**
-        * Looks for listener determined by {@link InstanceIdentifier} path and
-        * removes it.
-        * 
-        * @param path
-        *            InstanceIdentifier
-        */
-       public static void removeListener(InstanceIdentifier path) {
-               ListenerAdapter listener = listenersByInstanceIdentifier.get(path);
-               deleteListener(listener);
-       }
-
-       /**
-        * Creates String representation of stream name from URI. Removes slash from
-        * URI in start and end position.
-        * 
-        * @param uri
-        *            URI for creation stream name.
-        * @return String representation of stream name.
-        */
-       public static String createStreamNameFromUri(String uri) {
-               if (uri == null) {
-                       return null;
-               }
-               String result = uri;
-               if (result.startsWith("/")) {
-                       result = result.substring(1);
-               }
-               if (result.endsWith("/")) {
-                       result = result.substring(0, result.length());
-               }
-               return result;
-       }
-
-       /**
-        * Removes all listeners.
-        */
-       public static void removeAllListeners() {
-               for (ListenerAdapter listener : listenersByInstanceIdentifier.values()) {
-                       try {
-                               listener.close();
-                       } catch (Exception e) {
-                       }
-               }
-               try {
-                       lock.lock();
-                       listenersByStreamName = new ConcurrentHashMap<>();
-                       listenersByInstanceIdentifier = new ConcurrentHashMap<>();
-               } finally {
-                       lock.unlock();
-               }
-       }
-
-       /**
-        * Checks if listener has at least one subscriber. In case it doesn't have any, delete
-        * listener.
-        * 
-        * @param listener
-        *            ListenerAdapter
-        */
-       public static void removeListenerIfNoSubscriberExists(
-                       ListenerAdapter listener) {
-               if (!listener.hasSubscribers()) {
-                       deleteListener(listener);
-               }
-       }
-
-       /**
-        * Delete {@link ListenerAdapter} listener specified in parameter.
-        * 
-        * @param listener
-        *            ListenerAdapter
-        */
-       private static void deleteListener(ListenerAdapter listener) {
-               if (listener != null) {
-                       try {
-                               listener.close();
-                       } catch (Exception e) {
-                       }
-                       try {
-                               lock.lock();
-                               listenersByInstanceIdentifier.remove(listener.getPath());
-                               listenersByStreamName.remove(listener.getStreamName());
-                       } finally {
-                               lock.unlock();
-                       }
-               }
-       }
+    /**
+     * Gets {@link ListenerAdapter} specified by stream name.
+     *
+     * @param streamName
+     *            The name of the stream.
+     * @return {@link ListenerAdapter} specified by stream name.
+     */
+    public static ListenerAdapter getListenerFor(String streamName) {
+        return listenersByStreamName.get(streamName);
+    }
+
+    /**
+     * Gets {@link ListenerAdapter} listener specified by
+     * {@link InstanceIdentifier} path.
+     *
+     * @param path
+     *            Path to data in data repository.
+     * @return ListenerAdapter
+     */
+    public static ListenerAdapter getListenerFor(InstanceIdentifier path) {
+        return listenersByInstanceIdentifier.get(path);
+    }
+
+    /**
+     * Checks if the listener specified by {@link InstanceIdentifier} path
+     * exist.
+     *
+     * @param path
+     *            Path to data in data repository.
+     * @return True if the listener exist, false otherwise.
+     */
+    public static boolean existListenerFor(InstanceIdentifier path) {
+        return listenersByInstanceIdentifier.containsKey(path);
+    }
+
+    /**
+     * Creates new {@link ListenerAdapter} listener from
+     * {@link InstanceIdentifier} path and stream name.
+     *
+     * @param path
+     *            Path to data in data repository.
+     * @param streamName
+     *            The name of the stream.
+     * @return New {@link ListenerAdapter} listener from
+     *         {@link InstanceIdentifier} path and stream name.
+     */
+    public static ListenerAdapter createListener(InstanceIdentifier path,
+            String streamName) {
+        ListenerAdapter listener = new ListenerAdapter(path, streamName);
+        try {
+            lock.lock();
+            listenersByInstanceIdentifier.put(path, listener);
+            listenersByStreamName.put(streamName, listener);
+        } finally {
+            lock.unlock();
+        }
+        return listener;
+    }
+
+    /**
+     * Looks for listener determined by {@link InstanceIdentifier} path and
+     * removes it.
+     *
+     * @param path
+     *            InstanceIdentifier
+     */
+    public static void removeListener(InstanceIdentifier path) {
+        ListenerAdapter listener = listenersByInstanceIdentifier.get(path);
+        deleteListener(listener);
+    }
+
+    /**
+     * Creates String representation of stream name from URI. Removes slash from
+     * URI in start and end position.
+     *
+     * @param uri
+     *            URI for creation stream name.
+     * @return String representation of stream name.
+     */
+    public static String createStreamNameFromUri(String uri) {
+        if (uri == null) {
+            return null;
+        }
+        String result = uri;
+        if (result.startsWith("/")) {
+            result = result.substring(1);
+        }
+        if (result.endsWith("/")) {
+            result = result.substring(0, result.length());
+        }
+        return result;
+    }
+
+    /**
+     * Removes all listeners.
+     */
+    public static void removeAllListeners() {
+        for (ListenerAdapter listener : listenersByInstanceIdentifier.values()) {
+            try {
+                listener.close();
+            } catch (Exception e) {
+            }
+        }
+        try {
+            lock.lock();
+            listenersByStreamName = new ConcurrentHashMap<>();
+            listenersByInstanceIdentifier = new ConcurrentHashMap<>();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Checks if listener has at least one subscriber. In case it doesn't have any, delete
+     * listener.
+     *
+     * @param listener
+     *            ListenerAdapter
+     */
+    public static void removeListenerIfNoSubscriberExists(
+            ListenerAdapter listener) {
+        if (!listener.hasSubscribers()) {
+            deleteListener(listener);
+        }
+    }
+
+    /**
+     * Delete {@link ListenerAdapter} listener specified in parameter.
+     *
+     * @param listener
+     *            ListenerAdapter
+     */
+    private static void deleteListener(ListenerAdapter listener) {
+        if (listener != null) {
+            try {
+                listener.close();
+            } catch (Exception e) {
+            }
+            try {
+                lock.lock();
+                listenersByInstanceIdentifier.remove(listener.getPath());
+                listenersByStreamName.remove(listener.getStreamName());
+            } finally {
+                lock.unlock();
+            }
+        }
+    }
 
 }
index 16400354205a68cbf6993760f9dfa3fee04ec37a..fcfa8858ee940065baee9f4c8c4df2fb3a73089c 100644 (file)
@@ -16,45 +16,45 @@ import org.slf4j.LoggerFactory;
  */
 public class WebSocketServer implements Runnable {
 
-       private static final Logger logger = LoggerFactory
-                       .getLogger(WebSocketServer.class);
-
-       public static final int PORT = 8181;
-       private EventLoopGroup bossGroup;
-       private EventLoopGroup workerGroup;
-
-       @Override
-       public void run() {
-               bossGroup = new NioEventLoopGroup();
-               workerGroup = new NioEventLoopGroup();
-               try {
-                       ServerBootstrap b = new ServerBootstrap();
-                       b.group(bossGroup, workerGroup)
-                                       .channel(NioServerSocketChannel.class)
-                                       .childHandler(new WebSocketServerInitializer());
-
-                       Channel ch = b.bind(PORT).sync().channel();
-                       logger.info("Web socket server started at port {}.", PORT);
-
-                       ch.closeFuture().sync();
-               } catch (InterruptedException e) {
-                       // NOOP
-               } finally {
-                       stop();
-               }
-       }
-
-       /**
-        * Stops the web socket server and removes all listeners.
-        */
-       private void stop() {
-               Notificator.removeAllListeners();
-               if (bossGroup != null) {
-                       bossGroup.shutdownGracefully();
-               }
-               if (workerGroup != null) {
-                       workerGroup.shutdownGracefully();
-               }
-       }
+    private static final Logger logger = LoggerFactory
+            .getLogger(WebSocketServer.class);
+
+    public static final int PORT = 8181;
+    private EventLoopGroup bossGroup;
+    private EventLoopGroup workerGroup;
+
+    @Override
+    public void run() {
+        bossGroup = new NioEventLoopGroup();
+        workerGroup = new NioEventLoopGroup();
+        try {
+            ServerBootstrap b = new ServerBootstrap();
+            b.group(bossGroup, workerGroup)
+                    .channel(NioServerSocketChannel.class)
+                    .childHandler(new WebSocketServerInitializer());
+
+            Channel ch = b.bind(PORT).sync().channel();
+            logger.info("Web socket server started at port {}.", PORT);
+
+            ch.closeFuture().sync();
+        } catch (InterruptedException e) {
+            // NOOP
+        } finally {
+            stop();
+        }
+    }
+
+    /**
+     * Stops the web socket server and removes all listeners.
+     */
+    private void stop() {
+        Notificator.removeAllListeners();
+        if (bossGroup != null) {
+            bossGroup.shutdownGracefully();
+        }
+        if (workerGroup != null) {
+            workerGroup.shutdownGracefully();
+        }
+    }
 
 }
index bf899a0b2521297603b5d538e0c5158e31dba2d7..b5d6a6ea9be647d22c1dc8a75609506433e850f6 100644 (file)
@@ -40,147 +40,147 @@ import org.slf4j.LoggerFactory;
  */
 public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> {
 
-       private static final Logger logger = LoggerFactory
-                       .getLogger(WebSocketServerHandler.class);
-
-       private WebSocketServerHandshaker handshaker;
-
-       @Override
-       protected void channelRead0(ChannelHandlerContext ctx, Object msg)
-                       throws Exception {
-               if (msg instanceof FullHttpRequest) {
-                       handleHttpRequest(ctx, (FullHttpRequest) msg);
-               } else if (msg instanceof WebSocketFrame) {
-                       handleWebSocketFrame(ctx, (WebSocketFrame) msg);
-               }
-       }
-
-       /**
-        * Checks if HTTP request method is GET and if is possible to decode HTTP
-        * result of request.
-        * 
-        * @param ctx
-        *            ChannelHandlerContext
-        * @param req
-        *            FullHttpRequest
-        */
-       private void handleHttpRequest(ChannelHandlerContext ctx,
-                       FullHttpRequest req) throws Exception {
-               // Handle a bad request.
-               if (!req.getDecoderResult().isSuccess()) {
-                       sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1,
-                                       BAD_REQUEST));
-                       return;
-               }
-
-               // Allow only GET methods.
-               if (req.getMethod() != GET) {
-                       sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1,
-                                       FORBIDDEN));
-                       return;
-               }
-
-               String streamName = Notificator.createStreamNameFromUri(req.getUri());
-               ListenerAdapter listener = Notificator.getListenerFor(streamName);
-               if (listener != null) {
-                       listener.addSubscriber(ctx.channel());
-                       logger.debug("Subscriber successfully registered.");
-               } else {
-                       logger.error("Listener for stream with name '{}' was not found.",
-                                       streamName);
-                       sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1,
-                                       INTERNAL_SERVER_ERROR));
-               }
-
-               // Handshake
-               WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
-                               getWebSocketLocation(req), null, false);
-               handshaker = wsFactory.newHandshaker(req);
-               if (handshaker == null) {
-                       WebSocketServerHandshakerFactory
-                                       .sendUnsupportedWebSocketVersionResponse(ctx.channel());
-               } else {
-                       handshaker.handshake(ctx.channel(), req);
-               }
-
-       }
-
-       /**
-        * Checks response status, send response and close connection if necessary
-        * 
-        * @param ctx
-        *            ChannelHandlerContext
-        * @param req
-        *            HttpRequest
-        * @param res
-        *            FullHttpResponse
-        */
-       private static void sendHttpResponse(ChannelHandlerContext ctx,
-                       HttpRequest req, FullHttpResponse res) {
-               // Generate an error page if response getStatus code is not OK (200).
-               if (res.getStatus().code() != 200) {
-                       ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(),
-                                       CharsetUtil.UTF_8);
-                       res.content().writeBytes(buf);
-                       buf.release();
-                       setContentLength(res, res.content().readableBytes());
-               }
-
-               // Send the response and close the connection if necessary.
-               ChannelFuture f = ctx.channel().writeAndFlush(res);
-               if (!isKeepAlive(req) || res.getStatus().code() != 200) {
-                       f.addListener(ChannelFutureListener.CLOSE);
-               }
-       }
-
-       /**
-        * Handles web socket frame.
-        * 
-        * @param ctx
-        *            {@link ChannelHandlerContext}
-        * @param frame
-        *            {@link WebSocketFrame}
-        */
-       private void handleWebSocketFrame(ChannelHandlerContext ctx,
-                       WebSocketFrame frame) throws IOException {
-               if (frame instanceof CloseWebSocketFrame) {
-                       handshaker.close(ctx.channel(),
-                                       (CloseWebSocketFrame) frame.retain());
-                       String streamName = Notificator
-                                       .createStreamNameFromUri(((CloseWebSocketFrame) frame)
-                                                       .reasonText());
-                       ListenerAdapter listener = Notificator.getListenerFor(streamName);
-                       if (listener != null) {
-                               listener.removeSubscriber(ctx.channel());
-                               logger.debug("Subscriber successfully registered.");
-                       }
-                       Notificator.removeListenerIfNoSubscriberExists(listener);
-                       return;
-               } else if (frame instanceof PingWebSocketFrame) {
-                       ctx.channel().write(
-                                       new PongWebSocketFrame(frame.content().retain()));
-                       return;
-               }
-       }
-
-       @Override
-       public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
-                       throws Exception {
-               if (cause instanceof java.nio.channels.ClosedChannelException == false) {
-                       // cause.printStackTrace();
-               }
-               ctx.close();
-       }
-
-       /**
-        * Get web socket location from HTTP request.
-        * 
-        * @param req
-        *            HTTP request from which the location will be returned
-        * @return String representation of web socket location.
-        */
-       private static String getWebSocketLocation(HttpRequest req) {
-               return "http://" + req.headers().get(HOST) + req.getUri();
-       }
+    private static final Logger logger = LoggerFactory
+            .getLogger(WebSocketServerHandler.class);
+
+    private WebSocketServerHandshaker handshaker;
+
+    @Override
+    protected void channelRead0(ChannelHandlerContext ctx, Object msg)
+            throws Exception {
+        if (msg instanceof FullHttpRequest) {
+            handleHttpRequest(ctx, (FullHttpRequest) msg);
+        } else if (msg instanceof WebSocketFrame) {
+            handleWebSocketFrame(ctx, (WebSocketFrame) msg);
+        }
+    }
+
+    /**
+     * Checks if HTTP request method is GET and if is possible to decode HTTP
+     * result of request.
+     *
+     * @param ctx
+     *            ChannelHandlerContext
+     * @param req
+     *            FullHttpRequest
+     */
+    private void handleHttpRequest(ChannelHandlerContext ctx,
+            FullHttpRequest req) throws Exception {
+        // Handle a bad request.
+        if (!req.getDecoderResult().isSuccess()) {
+            sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1,
+                    BAD_REQUEST));
+            return;
+        }
+
+        // Allow only GET methods.
+        if (req.getMethod() != GET) {
+            sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1,
+                    FORBIDDEN));
+            return;
+        }
+
+        String streamName = Notificator.createStreamNameFromUri(req.getUri());
+        ListenerAdapter listener = Notificator.getListenerFor(streamName);
+        if (listener != null) {
+            listener.addSubscriber(ctx.channel());
+            logger.debug("Subscriber successfully registered.");
+        } else {
+            logger.error("Listener for stream with name '{}' was not found.",
+                    streamName);
+            sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1,
+                    INTERNAL_SERVER_ERROR));
+        }
+
+        // Handshake
+        WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
+                getWebSocketLocation(req), null, false);
+        handshaker = wsFactory.newHandshaker(req);
+        if (handshaker == null) {
+            WebSocketServerHandshakerFactory
+                    .sendUnsupportedWebSocketVersionResponse(ctx.channel());
+        } else {
+            handshaker.handshake(ctx.channel(), req);
+        }
+
+    }
+
+    /**
+     * Checks response status, send response and close connection if necessary
+     *
+     * @param ctx
+     *            ChannelHandlerContext
+     * @param req
+     *            HttpRequest
+     * @param res
+     *            FullHttpResponse
+     */
+    private static void sendHttpResponse(ChannelHandlerContext ctx,
+            HttpRequest req, FullHttpResponse res) {
+        // Generate an error page if response getStatus code is not OK (200).
+        if (res.getStatus().code() != 200) {
+            ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(),
+                    CharsetUtil.UTF_8);
+            res.content().writeBytes(buf);
+            buf.release();
+            setContentLength(res, res.content().readableBytes());
+        }
+
+        // Send the response and close the connection if necessary.
+        ChannelFuture f = ctx.channel().writeAndFlush(res);
+        if (!isKeepAlive(req) || res.getStatus().code() != 200) {
+            f.addListener(ChannelFutureListener.CLOSE);
+        }
+    }
+
+    /**
+     * Handles web socket frame.
+     *
+     * @param ctx
+     *            {@link ChannelHandlerContext}
+     * @param frame
+     *            {@link WebSocketFrame}
+     */
+    private void handleWebSocketFrame(ChannelHandlerContext ctx,
+            WebSocketFrame frame) throws IOException {
+        if (frame instanceof CloseWebSocketFrame) {
+            handshaker.close(ctx.channel(),
+                    (CloseWebSocketFrame) frame.retain());
+            String streamName = Notificator
+                    .createStreamNameFromUri(((CloseWebSocketFrame) frame)
+                            .reasonText());
+            ListenerAdapter listener = Notificator.getListenerFor(streamName);
+            if (listener != null) {
+                listener.removeSubscriber(ctx.channel());
+                logger.debug("Subscriber successfully registered.");
+            }
+            Notificator.removeListenerIfNoSubscriberExists(listener);
+            return;
+        } else if (frame instanceof PingWebSocketFrame) {
+            ctx.channel().write(
+                    new PongWebSocketFrame(frame.content().retain()));
+            return;
+        }
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
+            throws Exception {
+        if (cause instanceof java.nio.channels.ClosedChannelException == false) {
+            // cause.printStackTrace();
+        }
+        ctx.close();
+    }
+
+    /**
+     * Get web socket location from HTTP request.
+     *
+     * @param req
+     *            HTTP request from which the location will be returned
+     * @return String representation of web socket location.
+     */
+    private static String getWebSocketLocation(HttpRequest req) {
+        return "http://" + req.headers().get(HOST) + req.getUri();
+    }
 
 }
index 65ae5d6fab1af08b9aaabaed03e1cd824513fa7f..983cd9bda98cb490e3c831488d542f43dbe28e0e 100644 (file)
@@ -12,14 +12,14 @@ import io.netty.handler.codec.http.HttpServerCodec;
  * {@link ChannelPipeline} of a {@link Channel}.
  */
 public class WebSocketServerInitializer extends
-               ChannelInitializer<SocketChannel> {
+        ChannelInitializer<SocketChannel> {
 
-       @Override
-       protected void initChannel(SocketChannel ch) throws Exception {
-               ChannelPipeline pipeline = ch.pipeline();
-               pipeline.addLast("codec-http", new HttpServerCodec());
-               pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
-               pipeline.addLast("handler", new WebSocketServerHandler());
-       }
+    @Override
+    protected void initChannel(SocketChannel ch) throws Exception {
+        ChannelPipeline pipeline = ch.pipeline();
+        pipeline.addLast("codec-http", new HttpServerCodec());
+        pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
+        pipeline.addLast("handler", new WebSocketServerHandler());
+    }
 
 }
index 840887ecec60920372b9d343283e4fd852c68dd4..4b62bf7c2fcb2a1c219c7936063f721e1e7a2f9b 100644 (file)
@@ -31,7 +31,7 @@
         </init-param>
         <init-param>
             <param-name>cors.allowed.headers</param-name>
-            <param-value>Content-Type,X-Requested-With,accept,authorization, 
+            <param-value>Content-Type,X-Requested-With,accept,authorization,
         origin,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
         </init-param>
         <init-param>
index 8abf366bf7153dea82055de0ded4c816accffebd..21590ecb335fa81c309012bc34b92c1975da169c 100644 (file)
@@ -32,7 +32,7 @@ public class CnSnJsonChoiceCaseTest extends YangAndXmlAndDataSchemaLoader {
      * Test when some data are in one case node and other in another. This isn't
      * correct. Next Json validator should return error because nodes has to be
      * from one case below concrete choice.
-     * 
+     *
      */
     @Test
     public void nodeSchemasOnVariousChoiceCasePathTest() {
@@ -44,7 +44,7 @@ public class CnSnJsonChoiceCaseTest extends YangAndXmlAndDataSchemaLoader {
      * Additionally data are loadef from various choices. This isn't correct.
      * Next Json validator should return error because nodes has to be from one
      * case below concrete choice.
-     * 
+     *
      */
     @Test
     public void nodeSchemasOnVariousChoiceCasePathAndMultipleChoicesTest() {
@@ -95,7 +95,7 @@ public class CnSnJsonChoiceCaseTest extends YangAndXmlAndDataSchemaLoader {
     }
 
     /**
-     * 
+     *
      */
     @Test
     public void nodeSchemasInMultipleChoicesTest() {
index 12555bc9a2501074741307db4bd7323c919be86d..21a46a6cc32b60de0e3db3c9c74e71c96e5385ec 100644 (file)
@@ -25,9 +25,9 @@ import org.opendaylight.controller.sal.restconf.impl.test.YangAndXmlAndDataSchem
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 
 /**
- * 
+ *
  * All tests are commented now because leafref isn't supported now
- * 
+ *
  */
 
 public class CnSnToJsonLeafrefType extends YangAndXmlAndDataSchemaLoader {
index 92de14bba4a730406f4a58b4e738b618cc05bf3b..086e648097294354cb8a34baca155581397dad15 100644 (file)
@@ -25,14 +25,14 @@ import org.opendaylight.controller.sal.restconf.impl.test.YangAndXmlAndDataSchem
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 
 /**
- * 
+ *
  * CnSn = Composite node and Simple node data structure Class contains test of
  * serializing simple nodes data values according data types from YANG schema to
  * XML file
- * 
+ *
  */
 public class CnSnInstanceIdentifierToXmlTest extends YangAndXmlAndDataSchemaLoader {
-    
+
     @BeforeClass
     public static void initialization() throws URISyntaxException {
         dataLoad("/instanceidentifier/yang", 4, "instance-identifier-module", "cont");
index b7a58886dc056e797f667ca7ef7b1ecfd451418c..f8d04c157f2e9d1678da36c6636bd872e05e4cc7 100644 (file)
@@ -42,10 +42,10 @@ public class CnSnToXmlWithDataFromSeveralModulesTest extends YangAndXmlAndDataSc
 
 //         String output =
 //         String.format("<data>" +
-//                      "\n<cont_m1>" +
-//                             "\n\t<lf1_m1>" +
-//                                 "\n\t\tlf1 m1 value" +
-//                                     "\n\t</lf1_m1>" +
+//                  "\n<cont_m1>" +
+//                         "\n\t<lf1_m1>" +
+//                             "\n\t\tlf1 m1 value" +
+//                             "\n\t</lf1_m1>" +
 //                         "\n</cont_m1>" +
 //                         "\n<cont_m2>" +
 //                             "\n\t<lf1_m2>" +
@@ -60,8 +60,8 @@ public class CnSnToXmlWithDataFromSeveralModulesTest extends YangAndXmlAndDataSc
         regex.append(".*<data.*");
         regex.append(".*xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"");
         regex.append(".*>");
-        
-        
+
+
         regex.append(".*<contB_m1.*\\/>");
         regex.append(".*xmlns=\"module:one\"");
         regex.append(".*>");
@@ -97,7 +97,7 @@ public class CnSnToXmlWithDataFromSeveralModulesTest extends YangAndXmlAndDataSc
         SimpleNodeWrapper lf1_m1 = new SimpleNodeWrapper(uriModule1, "lf1_m1", "lf1 m1 value");
         cont_m1.addValue(lf1_m1);
         CompositeNodeWrapper contB_m1 = new CompositeNodeWrapper(uriModule1, "contB_m1");
-        
+
         data.addValue(contB_m1);
         data.addValue(cont_m1);
 
index 67b5b8c93a0aaa2994b5c640df52c3bc48bce4d9..f6664ed34de9cac49dca8341aa9d0c6e63dbc9b1 100644 (file)
@@ -13,26 +13,26 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public class DummyFuture implements Future<RpcResult<TransactionStatus>> {
-    
+
     private final boolean cancel;
     private final boolean isCancelled;
     private final boolean isDone;
     private final RpcResult<TransactionStatus> result;
-    
+
     public DummyFuture() {
         cancel = false;
         isCancelled = false;
         isDone = false;
         result = null;
     }
-    
+
     private DummyFuture(Builder builder) {
         cancel = builder.cancel;
         isCancelled = builder.isCancelled;
         isDone = builder.isDone;
         result = builder.result;
     }
-    
+
     public static Builder builder() {
         return new DummyFuture.Builder();
     }
@@ -62,9 +62,9 @@ public class DummyFuture implements Future<RpcResult<TransactionStatus>> {
             ExecutionException, TimeoutException {
         return result;
     }
-    
+
     public static class Builder {
-        
+
         private boolean cancel;
         private boolean isCancelled;
         private boolean isDone;
@@ -74,22 +74,22 @@ public class DummyFuture implements Future<RpcResult<TransactionStatus>> {
             this.cancel = cancel;
             return this;
         }
-        
+
         public Builder isCancelled(boolean isCancelled) {
             this.isCancelled = isCancelled;
             return this;
         }
-        
+
         public Builder isDone(boolean isDone) {
             this.isDone = isDone;
             return this;
         }
-        
+
         public Builder rpcResult(RpcResult<TransactionStatus> result) {
             this.result = result;
             return this;
         }
-        
+
         public Future<RpcResult<TransactionStatus>> build() {
             return new DummyFuture(this);
         }
index 408b14acfe8e67d93fb45c31a55fd0700f9b23a5..56a58eeadd1f5d80f4dc4f2926c48a9968fbe3c8 100644 (file)
@@ -76,13 +76,13 @@ public class RestDeleteOperationTest extends JerseyTest {
         when(brokerFacade.commitConfigurationDataDelete(any(InstanceIdentifier.class))).thenReturn(dummyFuture);
         Response response = target(uri).request(MediaType.APPLICATION_XML).delete();
         assertEquals(200, response.getStatus());
-        
+
         dummyFuture = createFuture(TransactionStatus.FAILED);
         when(brokerFacade.commitConfigurationDataDelete(any(InstanceIdentifier.class))).thenReturn(dummyFuture);
         response = target(uri).request(MediaType.APPLICATION_XML).delete();
         assertEquals(500, response.getStatus());
     }
-    
+
     private Future<RpcResult<TransactionStatus>> createFuture(TransactionStatus statusName) {
         RpcResult<TransactionStatus> rpcResult = new DummyRpcResult.Builder<TransactionStatus>().result(statusName).build();
         return DummyFuture.builder().rpcResult(rpcResult).build();
index eb623096de6828f709c44ffc04affd9732db905b..853c19f93530c16449840b1043ac07d30edaab4f 100644 (file)
@@ -147,7 +147,7 @@ public final class TestUtils {
     }
 
     /**
-     * 
+     *
      * Fill missing data (namespaces) and build correct data type in
      * {@code compositeNode} according to {@code dataSchemaNode}. The method
      * {@link RestconfImpl#createConfigurationData createConfigurationData} is
@@ -165,7 +165,7 @@ public final class TestUtils {
      * Searches module with name {@code searchedModuleName} in {@code modules}.
      * If module name isn't specified and module set has only one element then
      * this element is returned.
-     * 
+     *
      */
     public static Module resolveModule(String searchedModuleName, Set<Module> modules) {
         assertNotNull("Modules can't be null.", modules);
index e935a268a2d54f73a7263818dc52c9a2a942ce0d..34036edc05866ff7a4c658833a36a29ce3b1517d 100644 (file)
@@ -19,7 +19,7 @@ public class CompareLf {
         Lf lf2 = new Lf("name", "value");
         Lf lf3 = new Lf("name1", "value");
         Lf lf4 = new Lf("name", "value1");
-        
+
         assertTrue(lf1.equals(lf2));
         assertFalse(lf1.equals(lf3));
         assertFalse(lf1.equals(lf4));
index ffddb00485c6ac165ab558d4ff254c7f5d48c9ed..62159ccad6c0edf76e4e8ac75282935e80c06450 100644 (file)
@@ -24,7 +24,7 @@ public class XmlAugmentedElementToCnSnTest {
         loadAndNormalizeData("/common/augment/xml/dataa.xml", "/common/augment/yang", "main","cont");
         loadAndNormalizeData("/common/augment/xml/datab.xml", "/common/augment/yang", "main","cont");
     }
-    
+
     private void loadAndNormalizeData(String xmlPath, String yangPath, String topLevelElementName, String moduleName) {
         CompositeNode compNode = TestUtils.readInputToCnSn(xmlPath, false,
                 XmlToCompositeNodeProvider.INSTANCE);
index 08cdb3429077c60b5d458c63b4247d4d0f5998a5..5b1c8324acf603ec2dd2e5d10aa69ca940bc723c 100644 (file)
@@ -1,16 +1,16 @@
 <cont>
-       <lf1>lf1</lf1>
-       <lf2>lf2</lf2>
-       <cont1>
-               <lf11>lf11</lf11>
-       </cont1>
-       <lst1>
-               <lf11>lf1_1</lf11>
-       </lst1>
-       <lst1>
-               <lf11>lf1_2</lf11>
-       </lst1>
-       <lflst1>lflst1_1</lflst1>
-       <lflst1>lflst1_2</lflst1>
-       <lflst1>lflst1_3</lflst1>
+    <lf1>lf1</lf1>
+    <lf2>lf2</lf2>
+    <cont1>
+        <lf11>lf11</lf11>
+    </cont1>
+    <lst1>
+        <lf11>lf1_1</lf11>
+    </lst1>
+    <lst1>
+        <lf11>lf1_2</lf11>
+    </lst1>
+    <lflst1>lflst1_1</lflst1>
+    <lflst1>lflst1_2</lflst1>
+    <lflst1>lflst1_3</lflst1>
 </cont>
\ No newline at end of file
index 9c751949d0a68657869e7df19c6cfaaaec6b12d4..0d5fa4a5147c4a13016f8a32af54923c26852200 100644 (file)
@@ -1,5 +1,5 @@
 <cont>
-       <cont1c>
-               <lf11c>lf11c val</lf11c>
-       </cont1c>
+    <cont1c>
+        <lf11c>lf11c val</lf11c>
+    </cont1c>
 </cont>
\ No newline at end of file
index 6cebb6424af1e83152945716e4cd77b2fcd4423f..0278389d73521eb1679c36b2277925f9e91badd9 100644 (file)
@@ -1,4 +1,4 @@
 <cont>
-       <lflst1d>lflst1d_1 val</lflst1d>
-       <lflst1d>lflst1d_2 val</lflst1d>
+    <lflst1d>lflst1d_1 val</lflst1d>
+    <lflst1d>lflst1d_2 val</lflst1d>
 </cont>
\ No newline at end of file
index 710da55de661a2bcb073f0859c09d2962c5fb39a..488873d5efe83ec76e03864d79ff231e40a086df 100644 (file)
@@ -1,8 +1,8 @@
 <cont>
-       <lst1b>
-               <lf11b>lf11b_1 val</lf11b>
-       </lst1b>
-       <lst1b>
-               <lf11b>lf11b_2 val</lf11b>
-       </lst1b>
+    <lst1b>
+        <lf11b>lf11b_1 val</lf11b>
+    </lst1b>
+    <lst1b>
+        <lf11b>lf11b_2 val</lf11b>
+    </lst1b>
 </cont>
\ No newline at end of file
index 97e219736fa1eb906a32d250699c07d4fd409da4..f21d83f8f04b0d92eed343baa536794aae87e7dd 100644 (file)
@@ -1,6 +1,6 @@
 <cont>
-       <cont1c>
-               <lf11c>lf11c val</lf11c>
-       </cont1c>
-       <lf2b>lf2b value</lf2b>
+    <cont1c>
+        <lf11c>lf11c val</lf11c>
+    </cont1c>
+    <lf2b>lf2b value</lf2b>
 </cont>
\ No newline at end of file
index 331c8aec085a048f3369b85e2ba6fb09eb3a3d7a..9e28730355a4474f4ff1254857a8a3f209e94094 100644 (file)
@@ -1,7 +1,7 @@
 <cont>
-       <cont1c>
-               <lf11c>lf11c val</lf11c>
-       </cont1c>
-       <lf2b>lf2b value</lf2b>
-       <lf2a>lf2b value</lf2a>
+    <cont1c>
+        <lf11c>lf11c val</lf11c>
+    </cont1c>
+    <lf2b>lf2b value</lf2b>
+    <lf2a>lf2b value</lf2a>
 </cont>
\ No newline at end of file
index 43e9974a2c9725b5e8a58ce8274a505dfeff700e..dbd2684526f9c1311eb31ab7c3337179bc273338 100644 (file)
@@ -1,5 +1,5 @@
 <cont>
-       <lf1>lf1 val</lf1>
-       <lf1a>121</lf1a>
-       <lf1ab>lf1ab val</lf1ab>
+    <lf1>lf1 val</lf1>
+    <lf1a>121</lf1a>
+    <lf1ab>lf1ab val</lf1ab>
 </cont>
\ No newline at end of file
index b1b78e474481bfd1ad4f152eccf7d5e7d05949a6..e3e66b78e65ee6a44c256f71425406f656358cf0 100644 (file)
@@ -1,6 +1,6 @@
 <cont>
-       <lf1aa>lf1aa val</lf1aa>
-       <lf1>lf1 val</lf1>
-       <lf1a>121</lf1a>
-       <lf1aaa>lf1aaa val</lf1aaa>
+    <lf1aa>lf1aa val</lf1aa>
+    <lf1>lf1 val</lf1>
+    <lf1a>121</lf1a>
+    <lf1aaa>lf1aaa val</lf1aaa>
 </cont>
\ No newline at end of file
index ecc0caae5613e815135370344279aa24582fa10a..49b4143a2e44fb5898c7ad7691cf338d5af46ed1 100644 (file)
@@ -1,13 +1,13 @@
 <cont>
-       <lf1aaa>lf1aaa value</lf1aaa>
-       <lf2b>lf2b value</lf2b>
-       <lst4a>
-               <lf4ab>33</lf4ab>
-       </lst4a>
-       <lst4a>
-               <lf4ab>33</lf4ab>
-       </lst4a>
-       <lst4a>
-               <lf4ab>37</lf4ab>
-       </lst4a>
+    <lf1aaa>lf1aaa value</lf1aaa>
+    <lf2b>lf2b value</lf2b>
+    <lst4a>
+        <lf4ab>33</lf4ab>
+    </lst4a>
+    <lst4a>
+        <lf4ab>33</lf4ab>
+    </lst4a>
+    <lst4a>
+        <lf4ab>37</lf4ab>
+    </lst4a>
 </cont>
\ No newline at end of file
index c43dab60c0bc196672c32d6a8482816964f10cd5..e8634682cd524fb7c9adef64dc42605c7f49c775 100644 (file)
@@ -1,6 +1,6 @@
 <cont>
-       <lf1aa>lf1aa val</lf1aa>
-       <lf1>lf1 val</lf1>
-       <lf1a>121</lf1a>
-       <lf1ab>lf1ab value</lf1ab>      
+    <lf1aa>lf1aa val</lf1aa>
+    <lf1>lf1 val</lf1>
+    <lf1a>121</lf1a>
+    <lf1ab>lf1ab value</lf1ab>
 </cont>
\ No newline at end of file
index bbebabec4edb21b87ec882ec761cb79c7cd6399f..6bb975947b0c774951aa277be57f3fb8eeea61da 100644 (file)
@@ -1,6 +1,6 @@
 <cont>
-       <cont1>
-               <lf11>true</lf11>
-       </cont1>
-       <lf3>true</lf3>
+    <cont1>
+        <lf11>true</lf11>
+    </cont1>
+    <lf3>true</lf3>
 </cont>
\ No newline at end of file
index 0d8cf660ac3c056257a3053c5e629e653b894fcf..49d2dc39aa8688df339a65e476b535c093b36540 100644 (file)
@@ -1,5 +1,5 @@
 <cont>
-       <lflst1>345</lflst1>
-       <lflst1>346</lflst1>
-       <lflst1>347</lflst1>
+    <lflst1>345</lflst1>
+    <lflst1>346</lflst1>
+    <lflst1>347</lflst1>
 </cont>
\ No newline at end of file
index f73ce1b65c38a154a8ae2067318c1b261e012c36..28d355dbab0a44375559dad7e57670f87cc7b047 100644 (file)
@@ -1,42 +1,42 @@
 <cont>
-       <lfnint8Min>-128</lfnint8Min>
-       <lfnint8Max>127</lfnint8Max>
-       <lfnint16Min>-32768</lfnint16Min>
-       <lfnint16Max>32767</lfnint16Max>
-       <lfnint32Min>-2147483648</lfnint32Min>
-       <lfnint32Max>2147483647</lfnint32Max>
-       <lfnint64Min>-9223372036854775808</lfnint64Min>
-       <lfnint64Max>9223372036854775807</lfnint64Max>  
-       <lfnuint8Max>255</lfnuint8Max>
-       <lfnuint16Max>65535</lfnuint16Max>
-       <lfnuint32Max>4294967295</lfnuint32Max>
-       <lfstr>lfstr</lfstr>
-       <lfstr1></lfstr1>
-       <lfbool1>true</lfbool1>
-       <lfbool2>false</lfbool2>
-       <lfbool3>bla</lfbool3>
-       <lfdecimal1>43.32</lfdecimal1>
-       <lfdecimal2>-0.43</lfdecimal2>
-       <lfdecimal3>43</lfdecimal3>
-       <lfdecimal4>43E3</lfdecimal4>
-       <lfdecimal6>33.12345</lfdecimal6>
-       <lfenum>enum3</lfenum>
-       <lfbits>bit3 bit2</lfbits>      
-       <lfbinary>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</lfbinary>
-       <lfempty />
-       <lfunion1>324</lfunion1>
-       <lfunion2>33.3</lfunion2>
-       <lfunion3>55</lfunion3>
-       <lfunion4>true</lfunion4>
-       <lfunion5>true</lfunion5>
-       <lfunion6>10</lfunion6>
-       <lfunion7></lfunion7>
-       <lfunion8></lfunion8>
-       <lfunion9></lfunion9>
-       <lfunion10>bt1</lfunion10>
-       <lfunion11>33</lfunion11>
-       <lfunion12>false</lfunion12>
-       <lfunion13>b1</lfunion13>
-       <lfunion14>zero</lfunion14>
-       <identityref1 xmlns:x="simple:data:types">x:iden</identityref1>
+    <lfnint8Min>-128</lfnint8Min>
+    <lfnint8Max>127</lfnint8Max>
+    <lfnint16Min>-32768</lfnint16Min>
+    <lfnint16Max>32767</lfnint16Max>
+    <lfnint32Min>-2147483648</lfnint32Min>
+    <lfnint32Max>2147483647</lfnint32Max>
+    <lfnint64Min>-9223372036854775808</lfnint64Min>
+    <lfnint64Max>9223372036854775807</lfnint64Max>
+    <lfnuint8Max>255</lfnuint8Max>
+    <lfnuint16Max>65535</lfnuint16Max>
+    <lfnuint32Max>4294967295</lfnuint32Max>
+    <lfstr>lfstr</lfstr>
+    <lfstr1></lfstr1>
+    <lfbool1>true</lfbool1>
+    <lfbool2>false</lfbool2>
+    <lfbool3>bla</lfbool3>
+    <lfdecimal1>43.32</lfdecimal1>
+    <lfdecimal2>-0.43</lfdecimal2>
+    <lfdecimal3>43</lfdecimal3>
+    <lfdecimal4>43E3</lfdecimal4>
+    <lfdecimal6>33.12345</lfdecimal6>
+    <lfenum>enum3</lfenum>
+    <lfbits>bit3 bit2</lfbits>
+    <lfbinary>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</lfbinary>
+    <lfempty />
+    <lfunion1>324</lfunion1>
+    <lfunion2>33.3</lfunion2>
+    <lfunion3>55</lfunion3>
+    <lfunion4>true</lfunion4>
+    <lfunion5>true</lfunion5>
+    <lfunion6>10</lfunion6>
+    <lfunion7></lfunion7>
+    <lfunion8></lfunion8>
+    <lfunion9></lfunion9>
+    <lfunion10>bt1</lfunion10>
+    <lfunion11>33</lfunion11>
+    <lfunion12>false</lfunion12>
+    <lfunion13>b1</lfunion13>
+    <lfunion14>zero</lfunion14>
+    <identityref1 xmlns:x="simple:data:types">x:iden</identityref1>
 </cont>
\ No newline at end of file
index 17dc2657b05932cf5a0b3685534545c7afa9e24b..61858d28b6042f64d669924de0b839318b910c6c 100644 (file)
@@ -1,63 +1,63 @@
 <cont1>
-       <lf11>lf</lf11>
-       <lflst11>56</lflst11>
-       <lflst11>55</lflst11>
-       <lflst11>57</lflst11>
-       <lflst12>lflst12 str3</lflst12>
-       <lst11>
-               <lst112>
-                       <lf1121>lf1121 str22</lf1121>
-               </lst112>       
-               <lf111>141</lf111>
-               <lf112>lf112 str2</lf112>
-               <lst111>
-                       <lf1111>55</lf1111>
-               </lst111>       
-               <cont111>
-                       <lflst1111>4097</lflst1111>
-                       <lflst1111>2049</lflst1111>
-                       <lflst1111>1025</lflst1111>
-                       <lst1111>
-                               <lf1111A>lf1111A str22</lf1111A>
-                               <lf1111B>8</lf1111B>
-                       </lst1111>
-                       <lf1111>lf1111 str2</lf1111>
-                       <lst1111>
-                               <lf1111B>5</lf1111B>
-                               <lf1111A>lf1111A str21</lf1111A>
-                       </lst1111>
-               </cont111>
-               <lst111>
-                       <lf1111>56</lf1111>
-               </lst111>       
-               <lst112>
-                       <lf1121>lf1121 str21</lf1121>
-               </lst112>       
-       </lst11>
-       <lflst12>lflst12 str1</lflst12> 
-       <lst11>
-               <lf111>140</lf111>
-               <lf112>lf112 str</lf112>
-               <cont111>
-                       <lf1111>lf1111 str</lf1111>
-                       <lflst1111>2048</lflst1111>
-                       <lflst1111>1024</lflst1111>
-                       <lflst1111>4096</lflst1111>
-                       <lst1111>
-                               <lf1111A>lf1111A str11</lf1111A>
-                               <lf1111B>4</lf1111B>
-                       </lst1111>
-                       <lst1111>
-                               <lf1111A>lf1111A str12</lf1111A>
-                               <lf1111B>7</lf1111B>
-                       </lst1111>
-               </cont111>
-               <lst111>
-                       <lf1111>65</lf1111>
-               </lst111>       
-               <lst112>
-                       <lf1121>lf1121 str11</lf1121>
-               </lst112>
-       </lst11>
-       <lflst12>lflst12 str2</lflst12> 
+    <lf11>lf</lf11>
+    <lflst11>56</lflst11>
+    <lflst11>55</lflst11>
+    <lflst11>57</lflst11>
+    <lflst12>lflst12 str3</lflst12>
+    <lst11>
+        <lst112>
+            <lf1121>lf1121 str22</lf1121>
+        </lst112>
+        <lf111>141</lf111>
+        <lf112>lf112 str2</lf112>
+        <lst111>
+            <lf1111>55</lf1111>
+        </lst111>
+        <cont111>
+            <lflst1111>4097</lflst1111>
+            <lflst1111>2049</lflst1111>
+            <lflst1111>1025</lflst1111>
+            <lst1111>
+                <lf1111A>lf1111A str22</lf1111A>
+                <lf1111B>8</lf1111B>
+            </lst1111>
+            <lf1111>lf1111 str2</lf1111>
+            <lst1111>
+                <lf1111B>5</lf1111B>
+                <lf1111A>lf1111A str21</lf1111A>
+            </lst1111>
+        </cont111>
+        <lst111>
+            <lf1111>56</lf1111>
+        </lst111>
+        <lst112>
+            <lf1121>lf1121 str21</lf1121>
+        </lst112>
+    </lst11>
+    <lflst12>lflst12 str1</lflst12>
+    <lst11>
+        <lf111>140</lf111>
+        <lf112>lf112 str</lf112>
+        <cont111>
+            <lf1111>lf1111 str</lf1111>
+            <lflst1111>2048</lflst1111>
+            <lflst1111>1024</lflst1111>
+            <lflst1111>4096</lflst1111>
+            <lst1111>
+                <lf1111A>lf1111A str11</lf1111A>
+                <lf1111B>4</lf1111B>
+            </lst1111>
+            <lst1111>
+                <lf1111A>lf1111A str12</lf1111A>
+                <lf1111B>7</lf1111B>
+            </lst1111>
+        </cont111>
+        <lst111>
+            <lf1111>65</lf1111>
+        </lst111>
+        <lst112>
+            <lf1121>lf1121 str11</lf1121>
+        </lst112>
+    </lst11>
+    <lflst12>lflst12 str2</lflst12>
 </cont1>
index 68470eab26ad9f19955f58a6a8fb458e4707d7e2..9cd503e09b4c5960686fc4555e2cbc4048318c10 100644 (file)
@@ -1,40 +1,40 @@
 <cont1>
-       <lst11>
-               <lf111>1</lf111>
-               <lst111></lst111>       
-               <lst111></lst111>       
-               <lst111>
-                       <lf1111></lf1111>
-               </lst111>       
-               <lst111>
-                       <lf1111>35</lf1111>
-               </lst111>       
-               <cont111></cont111>             
-       </lst11>
-       <lst11>
-               <lf111>2</lf111>
-               <cont111>
-                       <lf1111></lf1111>
-                       <lflst1111></lflst1111>
-                       <lflst1111>1024</lflst1111>
-                       <lflst1111>4096</lflst1111>
-                       <lst1111>
-                               <lf1111B>4</lf1111B>
-                       </lst1111>
-                       <lst1111>
-                               <lf1111A>lf1111A str12</lf1111A>
-                       </lst1111>
-               </cont111>
-               <lst112></lst112>
-       </lst11>
-       <lst11>
-               <lf111>3</lf111>
-               <cont111>
-                       <lf1111></lf1111>
-                       <lflst1111></lflst1111>
-                       <lflst1111></lflst1111>
-                       <lst1111></lst1111>
-                       <lst1111></lst1111>
-               </cont111>
-       </lst11>
+    <lst11>
+        <lf111>1</lf111>
+        <lst111></lst111>
+        <lst111></lst111>
+        <lst111>
+            <lf1111></lf1111>
+        </lst111>
+        <lst111>
+            <lf1111>35</lf1111>
+        </lst111>
+        <cont111></cont111>
+    </lst11>
+    <lst11>
+        <lf111>2</lf111>
+        <cont111>
+            <lf1111></lf1111>
+            <lflst1111></lflst1111>
+            <lflst1111>1024</lflst1111>
+            <lflst1111>4096</lflst1111>
+            <lst1111>
+                <lf1111B>4</lf1111B>
+            </lst1111>
+            <lst1111>
+                <lf1111A>lf1111A str12</lf1111A>
+            </lst1111>
+        </cont111>
+        <lst112></lst112>
+    </lst11>
+    <lst11>
+        <lf111>3</lf111>
+        <cont111>
+            <lf1111></lf1111>
+            <lflst1111></lflst1111>
+            <lflst1111></lflst1111>
+            <lst1111></lst1111>
+            <lst1111></lst1111>
+        </cont111>
+    </lst11>
 </cont1>
index 5954c091e32e86686dbc8de327e6011bd845b4b1..fb9726d5b1f228e38001f008b1890ecf11c5b5f2 100644 (file)
@@ -1,8 +1,8 @@
 <input xmlns="test:module">
-       <cont>
-           <cont1>
-               <lf11>lf1 data</lf11>
-               <lf12>lf2 data</lf12>
-           </cont1>
-       </cont>
+    <cont>
+        <cont1>
+            <lf11>lf1 data</lf11>
+            <lf12>lf2 data</lf12>
+        </cont1>
+    </cont>
 </input>
\ No newline at end of file
index 768cb663ebd4a53dc4898297d0f17b7c79c49987..bd558fb6b912a4e657d2420138d48818b76079c5 100644 (file)
@@ -1,10 +1,10 @@
 <cont xmlns="instance:identifier:module">
     <cont1>
-           <lst11 xmlns="augment:module" xmlns:c="augment:augment:module">
-               <keyvalue111>value1</keyvalue111>
-               <keyvalue112>value2</keyvalue112>
-               <lf111 xmlns="augment:augment:module" xmlns:a="instance:identifier:module" xmlns:b="augment:module" >/a:cont/a:cont1/b:lst11[b:keyvalue111="value1"][b:keyvalue112="value2"]/c:lf112</lf111>
-               <lf112 xmlns="augment:augment:module">lf112 value</lf112>
-           </lst11>
+        <lst11 xmlns="augment:module" xmlns:c="augment:augment:module">
+            <keyvalue111>value1</keyvalue111>
+            <keyvalue112>value2</keyvalue112>
+            <lf111 xmlns="augment:augment:module" xmlns:a="instance:identifier:module" xmlns:b="augment:module" >/a:cont/a:cont1/b:lst11[b:keyvalue111="value1"][b:keyvalue112="value2"]/c:lf112</lf111>
+            <lf112 xmlns="augment:augment:module">lf112 value</lf112>
+        </lst11>
     </cont1>
 </cont>
index 7e3aa97987544bb94a95a680670ceaf670ee1a2b..313f32dce1626d5c43e1fe26edffcd42ba849b69 100644 (file)
@@ -1,8 +1,8 @@
 <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces" >
-       <interface>
-         <name>eth0</name>
-         <type>ethernetCsmacd</type>
-         <enabled>false</enabled>
-         <description>some interface</description>
-       </interface>
+    <interface>
+      <name>eth0</name>
+      <type>ethernetCsmacd</type>
+      <enabled>false</enabled>
+      <description>some interface</description>
+    </interface>
 </interfaces>
\ No newline at end of file
index ce97dd1715c51e8f96b54ca90da5a4d9f6d88ef7..841d351049b5dccb19a58ceb47dcafac3af020bd 100644 (file)
@@ -1,14 +1,14 @@
 <cont>
-       <lf1>str0</lf1>
-       <lf2></lf2>
-       <lf3/>
-       <lflst1>121</lflst1>
-       <lflst1>131</lflst1>
-       <lflst1>str1</lflst1>
-       <lst1>
-               <lf11>str2</lf11>
-       </lst1>                 
-       <cont1>
-               <lf11>100</lf11>
-       </cont1>
+    <lf1>str0</lf1>
+    <lf2></lf2>
+    <lf3/>
+    <lflst1>121</lflst1>
+    <lflst1>131</lflst1>
+    <lflst1>str1</lflst1>
+    <lst1>
+        <lf11>str2</lf11>
+    </lst1>
+    <cont1>
+        <lf11>100</lf11>
+    </cont1>
 </cont>
index cab23c656e7293329b7fd8d9073cc82f0723ce8f..9c4256a50c270a5b5c47580856c0ab9a5042fece 100644 (file)
@@ -1,21 +1,21 @@
 <cont>
-       <lst1>
-               <lf11>str0</lf11>
-               <lflst11>121</lflst11>
-               <lflst11>131</lflst11>
-               <lflst11>str1</lflst11>
-               <lst11>
-                       <lf111>str2</lf111>
-               </lst11>                        
-               <cont11>
-                       <lf111>100</lf111>
-               </cont11>
-       </lst1>
-       <lst1>
-               <lflst11>221</lflst11>
-               <cont11>
-                       <lf111>100</lf111>
-               </cont11>
-       </lst1> 
-       <lf1>lf1</lf1>
+    <lst1>
+        <lf11>str0</lf11>
+        <lflst11>121</lflst11>
+        <lflst11>131</lflst11>
+        <lflst11>str1</lflst11>
+        <lst11>
+            <lf111>str2</lf111>
+        </lst11>
+        <cont11>
+            <lf111>100</lf111>
+        </cont11>
+    </lst1>
+    <lst1>
+        <lflst11>221</lflst11>
+        <cont11>
+            <lf111>100</lf111>
+        </cont11>
+    </lst1>
+    <lf1>lf1</lf1>
 </cont>
index 162a5568877d471e3e489ed6fab1adb0845abc09..7d62b9e24d04f855f04af0044a3ae7236d65857b 100644 (file)
@@ -1,8 +1,8 @@
 <cont>
-       <lf1></lf1>
-       <lflst1></lflst1>
-       <lflst1></lflst1>
-       <lst1>          
-               <lf11></lf11>
-       </lst1>                 
+    <lf1></lf1>
+    <lflst1></lflst1>
+    <lflst1></lflst1>
+    <lst1>
+        <lf11></lf11>
+    </lst1>
 </cont>
index aae2af36d1049922aac169c15f4cdb407b6240d9..ebf7ac61ea3530d290c028e321ab62c01d0359b9 100644 (file)
@@ -1,5 +1,5 @@
 <cont xmlns="general:module" xmlns:x="x:namespace" xmlns:y="y:namespace">
-    <cont1 xmlns:z="z:namespace" xmlns:a="a:namespace" xmlns:b="b:namespace">        
-        <lf11 xmlns="identityref:module" xmlns:c="c:namespace">iden</lf11>  
+    <cont1 xmlns:z="z:namespace" xmlns:a="a:namespace" xmlns:b="b:namespace">
+        <lf11 xmlns="identityref:module" xmlns:c="c:namespace">iden</lf11>
     </cont1>
 </cont>
\ No newline at end of file
index 621d2bc84c8273bb3d08d70aadcd759e98d6c88c..3fe1e4bf488ea79b9da843e67f1c7706cb354603 100644 (file)
@@ -1,5 +1,5 @@
 <cont xmlns:x="x:namespace" xmlns:y="y:namespace">
-    <cont1 xmlns="identityref:module" xmlns:z="z:namespace" xmlns:a="a:namespace" xmlns:b="b:namespace">        
-        <lf11 xmlns:c="c:namespace">iden</lf11>  
+    <cont1 xmlns="identityref:module" xmlns:z="z:namespace" xmlns:a="a:namespace" xmlns:b="b:namespace">
+        <lf11 xmlns:c="c:namespace">iden</lf11>
     </cont1>
 </cont>
\ No newline at end of file
index 497c35f2fc6127f5cd6fcd4eeb818ceadad3f924..30a54185ff2d95d7f3bb0ee05712c40c39229174 100644 (file)
@@ -1,5 +1,5 @@
 <cont xmlns="identityref:module" xmlns:x="x:namespace" xmlns:y="y:namespace">
-    <cont1 xmlns:c="identity:module" xmlns:z="z:namespace" xmlns:a="a:namespace" xmlns:b="b:namespace">        
-        <lf11>z:iden</lf11>  
+    <cont1 xmlns:c="identity:module" xmlns:z="z:namespace" xmlns:a="a:namespace" xmlns:b="b:namespace">
+        <lf11>z:iden</lf11>
     </cont1>
 </cont>
\ No newline at end of file
index 597051ed300549a2c38e5d239706468612a127aa..b2c258825e3453c3f739986d7361d156375e803a 100644 (file)
@@ -95,9 +95,9 @@ public class ModelGenerator {
     for(DataSchemaNode childNode : childNodes){
       JSONObject moduleJSON=null;
       String filename = childNode.getQName().getLocalName();
-                       /*
-                        * For every container in the module
-                        */
+            /*
+             * For every container in the module
+             */
       if(childNode instanceof ContainerSchemaNode) {
         moduleJSON = processContainer((ContainerSchemaNode)childNode, moduleName, true, models);
       }
@@ -307,11 +307,11 @@ public class ModelGenerator {
     childSchema.put(TYPE_KEY, OBJECT_TYPE);
     childSchema.put(PROPERTIES_KEY, childSchemaProperties);
 
-               /*
-                * Due to a limitation of the RAML--->JAX-RS tool, sub-properties
-                * must be in a separate JSON schema file. Hence, we have to write
-                * some properties to a new file, while continuing to process the rest.
-                */
+        /*
+         * Due to a limitation of the RAML--->JAX-RS tool, sub-properties
+         * must be in a separate JSON schema file. Hence, we have to write
+         * some properties to a new file, while continuing to process the rest.
+         */
     //writeToFile(fileName, childSchema.toString(2), moduleName);
     childSchema.put("id", fileName);
     models.put(fileName, childSchema);
index 356a395b97ba81200dc59ad9fc40adeb4a864c94..2a778180d4448dd33ce7cabb17f911e77151df9f 100644 (file)
@@ -31,7 +31,7 @@
         </init-param>
         <init-param>
             <param-name>cors.allowed.headers</param-name>
-            <param-value>Content-Type,X-Requested-With,accept,authorization, 
+            <param-value>Content-Type,X-Requested-With,accept,authorization,
         origin,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
         </init-param>
         <init-param>
index c5a2a0d340cfbfb982d62da396bc7bda2c48b178..61c24c6b6413cae9012916bf93001af11fc77f92 100644 (file)
@@ -55,7 +55,7 @@
                               <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
                               <name>ref_binding-data-broker</name>
                             </data-broker>
-                    
+
                             <notification-service>
                                 <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
                                     binding:binding-notification-service
index 7d9cc7ecbd789634e96ddbf32153e534d594dbc4..db216237d01f7f8fe40523c2c62c6b6ecb88abde 100644 (file)
@@ -103,7 +103,7 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo
             final OpendaylightGroupStatisticsService groupStatsService,
             final OpendaylightMeterStatisticsService meterStatsService,
             final OpendaylightPortStatisticsService portStatsService,
-            final OpendaylightQueueStatisticsService queueStatsService, 
+            final OpendaylightQueueStatisticsService queueStatsService,
             final StatisticsRequestScheduler srScheduler) {
         this.dps = Preconditions.checkNotNull(dps);
         this.targetNodeKey = Preconditions.checkNotNull(nodeKey);
@@ -274,20 +274,20 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo
         this.srScheduler.addRequestToSchedulerQueue(flowTableStats);
 
         this.srScheduler.addRequestToSchedulerQueue(flowStats);
-        
+
         this.srScheduler.addRequestToSchedulerQueue(nodeConnectorStats);
-        
+
         this.srScheduler.addRequestToSchedulerQueue(groupStats);
-        
+
         this.srScheduler.addRequestToSchedulerQueue(groupDescStats);
-        
+
         this.srScheduler.addRequestToSchedulerQueue(meterStats);
-        
+
         this.srScheduler.addRequestToSchedulerQueue(meterConfigStats);
-        
+
         this.srScheduler.addRequestToSchedulerQueue(queueStats);
     }
-    
+
     public synchronized void start(final Timer timer) {
         flowStats.start(dps);
         groupDescStats.start(dps);
@@ -313,7 +313,7 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo
         meterStats.close();
         queueStats.close();
 
-        //Clean up queued statistics request from scheduler queue 
+        //Clean up queued statistics request from scheduler queue
         srScheduler.removeRequestsFromSchedulerQueue(this.getNodeRef());
 
         logger.debug("Statistics handler for {} shut down", targetNodeKey.getId());
index d8bea7c63a4606fffaed51a9dce5fe889dca2d36..b96d2be47e11b5f66fda9bc2d4df156e1b08c421 100644 (file)
@@ -66,7 +66,7 @@ public class StatisticsProvider implements AutoCloseable {
     private OpendaylightFlowTableStatisticsService flowTableStatsService;
 
     private OpendaylightQueueStatisticsService queueStatsService;
-    
+
     private final StatisticsRequestScheduler srScheduler;
 
     public StatisticsProvider(final DataProviderService dataService) {
@@ -90,7 +90,7 @@ public class StatisticsProvider implements AutoCloseable {
         flowTableStatsService = rpcRegistry.getRpcService(OpendaylightFlowTableStatisticsService.class);
         queueStatsService = rpcRegistry.getRpcService(OpendaylightQueueStatisticsService.class);
         this.srScheduler.start();
-        
+
         // Start receiving notifications
         this.listenerRegistration = nps.registerNotificationListener(this.updateCommiter);
 
index bea43ef68a05c1000d7a7d904d0c36f6fccc1b4a..0ae33b8c71fa93add1914d79c595c14538b0737f 100644 (file)
@@ -24,7 +24,7 @@ import org.slf4j.LoggerFactory;
 
 /**
  * Main responsibility of the class is to check the MD-SAL data store read/write
- * transaction accumulation level and send statistics request if number of pending 
+ * transaction accumulation level and send statistics request if number of pending
  * read/write transactions are zero.
  * @author avishnoi@in.ibm.com
  *
@@ -36,15 +36,15 @@ public class StatisticsRequestScheduler implements DataTransactionListener {
     private final Timer timer = new Timer("request-monitor", true);
 
     // We need ordered retrieval, and O(1) contains operation
-    private final Map<AbstractStatsTracker,Integer> requestQueue = 
+    private final Map<AbstractStatsTracker,Integer> requestQueue =
             Collections.synchronizedMap(new LinkedHashMap<AbstractStatsTracker,Integer>());
-    
+
     private Long PendingTransactions;
-    
+
     private long lastRequestTime = System.nanoTime();
-    
+
     private static final long REQUEST_MONITOR_INTERVAL = 1000;
-    
+
     private final TimerTask task = new TimerTask() {
         @Override
         public void run() {
@@ -58,11 +58,11 @@ public class StatisticsRequestScheduler implements DataTransactionListener {
     public StatisticsRequestScheduler(){
         PendingTransactions = (long) 0;
     }
-    
+
     public void addRequestToSchedulerQueue(AbstractStatsTracker statsRequest){
         requestQueue.put(statsRequest, null);
     }
-    
+
     public void removeRequestsFromSchedulerQueue(NodeRef node){
         AbstractStatsTracker stats = null;
         synchronized(requestQueue){
@@ -97,7 +97,7 @@ public class StatisticsRequestScheduler implements DataTransactionListener {
     }
     @Override
     public void onStatusUpdated(DataModificationTransaction transaction, TransactionStatus status) {
-        
+
         AbstractStatsTracker stats = null;
         synchronized(PendingTransactions){
             switch(status){
@@ -119,7 +119,7 @@ public class StatisticsRequestScheduler implements DataTransactionListener {
         }
         sendStatsRequest(stats);
     }
-    
+
     private void sendStatsRequest(AbstractStatsTracker stats){
         if(stats != null){
             try{
index ed96e3aa0cba19e138537791ceea9a50deb18a45..c539ac81d47b949bfc00edbc973b5df971e471f2 100644 (file)
@@ -24,7 +24,7 @@ class LLDPDiscoveryListener implements PacketProcessingListener {
     LLDPDiscoveryListener(LLDPDiscoveryProvider manager) {
         this.manager = manager;
     }
-    
+
     public void onPacketReceived(PacketReceived lldp) {
         NodeConnectorRef src = LLDPDiscoveryUtils.lldpToNodeConnectorRef(lldp.getPayload());
         if(src != null) {
@@ -32,10 +32,10 @@ class LLDPDiscoveryListener implements PacketProcessingListener {
             ldb.setDestination(lldp.getIngress());
             ldb.setSource(new NodeConnectorRef(src));
             LinkDiscovered ld = ldb.build();
-            
+
             manager.getNotificationService().publish(ld);
             LLDPLinkAger.getInstance().put(ld);
         }
     }
-    
+
 }
index 7d2570551d00a1dac716d7f9de4f02a3a2897527..face5967c247e3f2c073f8100f2489e6cf2e7014 100644 (file)
@@ -37,17 +37,17 @@ public class LLDPLinkAger {
     public static LLDPLinkAger getInstance() {
         return instance;
     }
-    
+
     public void put(LinkDiscovered link) {
         Date expires = new Date();
         expires.setTime(expires.getTime() + LLDPDiscoveryUtils.LLDP_EXPIRATION_TIME);
         linkToDate.put(link, expires);
     }
-    
+
     public void close() {
         timer.cancel();
     }
-    
+
     private class LLDPAgingTask extends TimerTask {
 
         @Override
@@ -64,9 +64,9 @@ public class LLDPLinkAger {
                     }
                 }
             }
-            
+
         }
-        
+
     }
 }
 
index ce42283ebe85eb02bfa67eeb4e3e8a565fca22a3..82ab4432462af79fbbc6fe611f06175fa5cb93e9 100644 (file)
@@ -27,10 +27,10 @@ import org.slf4j.LoggerFactory;
 
 public class LLDPDiscoveryUtils {
     static Logger LOG = LoggerFactory.getLogger(LLDPDiscoveryUtils.class);
-    
+
     public static final Long LLDP_INTERVAL = (long) (1000*5); // Send LLDP every five seconds
     public static final Long LLDP_EXPIRATION_TIME = LLDP_INTERVAL*3; // Let up to three intervals pass before we decide we are expired.
-    
+
     public static String macToString(byte[] mac) {
         StringBuilder b = new StringBuilder();
         for (int i = 0; i < mac.length; i++) {
@@ -39,7 +39,7 @@ public class LLDPDiscoveryUtils {
 
         return b.toString();
     }
-    
+
     public static NodeConnectorRef lldpToNodeConnectorRef(byte[] payload)  {
         Ethernet ethPkt = new Ethernet();
         try {
@@ -50,7 +50,7 @@ public class LLDPDiscoveryUtils {
 
         if (ethPkt.getPayload() instanceof LLDP) {
             LLDP lldp = (LLDP) ethPkt.getPayload();
-    
+
             try {
                 NodeId srcNodeId = null;
                 NodeConnectorId srcNodeConnectorId = null;
index 542e972deb2d7585348876219b5f82dab6ceca14..6dbfd7225b81fe7651881e21f954dee73c729a7f 100644 (file)
@@ -15,12 +15,8 @@ import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMap
 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTopologyNode;
 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTopologyNodeId;
 
-import java.util.concurrent.Future;
-
 import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader;
-import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryListener;
@@ -36,146 +32,128 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRem
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.JdkFutureAdapters;
-
-class FlowCapableTopologyExporter implements //
-        FlowTopologyDiscoveryListener, //
-        OpendaylightInventoryListener //
-{
 
-    protected final static Logger LOG = LoggerFactory.getLogger(FlowCapableTopologyExporter.class);
-    public static TopologyKey topology = new TopologyKey(new TopologyId("flow:1"));
+import com.google.common.base.Preconditions;
 
-    // FIXME: Flow capable topology exporter should use transaction chaining API
-    private DataProviderService dataService;
+class FlowCapableTopologyExporter implements FlowTopologyDiscoveryListener, OpendaylightInventoryListener {
+    private final InstanceIdentifier<Topology> topology;
+    private final OperationProcessor processor;
 
-    public DataProviderService getDataService() {
-        return dataService;
-    }
-
-    public void setDataService(final DataProviderService dataService) {
-        this.dataService = dataService;
-    }
-
-    private InstanceIdentifier<Topology> topologyPath;
-
-    public void start() {
-        TopologyBuilder tb = new TopologyBuilder();
-        tb.setKey(topology);
-        topologyPath = InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, topology).build();
-        Topology top = tb.build();
-        DataModificationTransaction tx = dataService.beginTransaction();
-        tx.putOperationalData(topologyPath, top);
-        listenOnTransactionState(tx.getIdentifier(),tx.commit());
+    FlowCapableTopologyExporter(final OperationProcessor processor, final InstanceIdentifier<Topology> topology) {
+        this.processor = Preconditions.checkNotNull(processor);
+        this.topology = Preconditions.checkNotNull(topology);
     }
 
     @Override
-    public synchronized void onNodeRemoved(final NodeRemoved notification) {
-        NodeId nodeId = toTopologyNodeId(getNodeKey(notification.getNodeRef()).getId());
-        InstanceIdentifier<Node> nodeInstance = toNodeIdentifier(notification.getNodeRef());
-
-        DataModificationTransaction tx = dataService.beginTransaction();
-        tx.removeOperationalData(nodeInstance);
-        removeAffectedLinks(tx, nodeId);
-        listenOnTransactionState(tx.getIdentifier(),tx.commit());
+    public void onNodeRemoved(final NodeRemoved notification) {
+        processor.enqueueOperation(new TopologyOperation() {
+            @Override
+            public void applyOperation(final DataModificationTransaction transaction) {
+                NodeId nodeId = toTopologyNodeId(getNodeKey(notification.getNodeRef()).getId());
+                InstanceIdentifier<Node> nodeInstance = toNodeIdentifier(notification.getNodeRef());
+                transaction.removeOperationalData(nodeInstance);
+                removeAffectedLinks(transaction, nodeId);
+            }
+        });
     }
 
     @Override
-    public synchronized void onNodeUpdated(final NodeUpdated notification) {
+    public void onNodeUpdated(final NodeUpdated notification) {
         FlowCapableNodeUpdated fcnu = notification.getAugmentation(FlowCapableNodeUpdated.class);
         if (fcnu != null) {
-            Node node = toTopologyNode(toTopologyNodeId(notification.getId()), notification.getNodeRef());
-            InstanceIdentifier<Node> path = getNodePath(toTopologyNodeId(notification.getId()));
-            DataModificationTransaction tx = dataService.beginTransaction();
-            tx.putOperationalData(path, node);
-            listenOnTransactionState(tx.getIdentifier(),tx.commit());
+            processor.enqueueOperation(new TopologyOperation() {
+                @Override
+                public void applyOperation(final DataModificationTransaction transaction) {
+                    Node node = toTopologyNode(toTopologyNodeId(notification.getId()), notification.getNodeRef());
+                    InstanceIdentifier<Node> path = getNodePath(toTopologyNodeId(notification.getId()));
+                    transaction.putOperationalData(path, node);
+                }
+            });
         }
     }
 
     @Override
-    public synchronized void onNodeConnectorRemoved(final NodeConnectorRemoved notification) {
-        InstanceIdentifier<TerminationPoint> tpInstance = toTerminationPointIdentifier(notification
-                .getNodeConnectorRef());
-        TpId tpId = toTerminationPointId(getNodeConnectorKey(notification.getNodeConnectorRef()).getId());
-        DataModificationTransaction tx = dataService.beginTransaction();
-        tx.removeOperationalData(tpInstance);
-        removeAffectedLinks(tx, tpId);
-        listenOnTransactionState(tx.getIdentifier(),tx.commit());
+    public void onNodeConnectorRemoved(final NodeConnectorRemoved notification) {
+        processor.enqueueOperation(new TopologyOperation() {
+            @Override
+            public void applyOperation(final DataModificationTransaction transaction) {
+                InstanceIdentifier<TerminationPoint> tpInstance = toTerminationPointIdentifier(notification
+                        .getNodeConnectorRef());
+                TpId tpId = toTerminationPointId(getNodeConnectorKey(notification.getNodeConnectorRef()).getId());
 
+                transaction.removeOperationalData(tpInstance);
+                removeAffectedLinks(transaction, tpId);
+            }
+        });
     }
 
     @Override
-    public synchronized void onNodeConnectorUpdated(final NodeConnectorUpdated notification) {
-        FlowCapableNodeConnectorUpdated fcncu = notification.getAugmentation(FlowCapableNodeConnectorUpdated.class);
+    public void onNodeConnectorUpdated(final NodeConnectorUpdated notification) {
+        final FlowCapableNodeConnectorUpdated fcncu = notification.getAugmentation(FlowCapableNodeConnectorUpdated.class);
         if (fcncu != null) {
-            NodeId nodeId = toTopologyNodeId(getNodeKey(notification.getNodeConnectorRef()).getId());
-            TerminationPoint point = toTerminationPoint(toTerminationPointId(notification.getId()),
-                    notification.getNodeConnectorRef());
-            InstanceIdentifier<TerminationPoint> path = tpPath(nodeId, point.getKey().getTpId());
-
-            DataModificationTransaction tx = dataService.beginTransaction();
-            tx.putOperationalData(path, point);
-            if ((fcncu.getState() != null && fcncu.getState().isLinkDown())
-                    || (fcncu.getConfiguration() != null && fcncu.getConfiguration().isPORTDOWN())) {
-                removeAffectedLinks(tx, point.getTpId());
-            }
-            listenOnTransactionState(tx.getIdentifier(),tx.commit());
+            processor.enqueueOperation(new TopologyOperation() {
+                @Override
+                public void applyOperation(final DataModificationTransaction transaction) {
+                    NodeId nodeId = toTopologyNodeId(getNodeKey(notification.getNodeConnectorRef()).getId());
+                    TerminationPoint point = toTerminationPoint(toTerminationPointId(notification.getId()),
+                            notification.getNodeConnectorRef());
+                    InstanceIdentifier<TerminationPoint> path = tpPath(nodeId, point.getKey().getTpId());
+
+                    transaction.putOperationalData(path, point);
+                    if ((fcncu.getState() != null && fcncu.getState().isLinkDown())
+                            || (fcncu.getConfiguration() != null && fcncu.getConfiguration().isPORTDOWN())) {
+                        removeAffectedLinks(transaction, point.getTpId());
+                    }
+                }
+            });
         }
     }
 
     @Override
-    public synchronized void onLinkDiscovered(final LinkDiscovered notification) {
-        Link link = toTopologyLink(notification);
-        InstanceIdentifier<Link> path = linkPath(link);
-        DataModificationTransaction tx = dataService.beginTransaction();
-        tx.putOperationalData(path, link);
-        listenOnTransactionState(tx.getIdentifier(),tx.commit());
-
+    public void onLinkDiscovered(final LinkDiscovered notification) {
+        processor.enqueueOperation(new TopologyOperation() {
+            @Override
+            public void applyOperation(final DataModificationTransaction transaction) {
+                Link link = toTopologyLink(notification);
+                InstanceIdentifier<Link> path = linkPath(link);
+                transaction.putOperationalData(path, link);
+            }
+        });
     }
 
     @Override
-    public synchronized void onLinkOverutilized(final LinkOverutilized notification) {
+    public void onLinkOverutilized(final LinkOverutilized notification) {
         // NOOP
     }
 
     @Override
-    public synchronized void onLinkRemoved(final LinkRemoved notification) {
-        InstanceIdentifier<Link> path = linkPath(toTopologyLink(notification));
-        DataModificationTransaction tx = dataService.beginTransaction();
-        tx.removeOperationalData(path);
-        listenOnTransactionState(tx.getIdentifier(),tx.commit());
+    public void onLinkRemoved(final LinkRemoved notification) {
+        processor.enqueueOperation(new TopologyOperation() {
+            @Override
+            public void applyOperation(final DataModificationTransaction transaction) {
+                transaction.removeOperationalData(linkPath(toTopologyLink(notification)));
+            }
+        });
     }
 
     @Override
-    public synchronized void onLinkUtilizationNormal(final LinkUtilizationNormal notification) {
+    public void onLinkUtilizationNormal(final LinkUtilizationNormal notification) {
         // NOOP
     }
 
-    private static InstanceIdentifier<Node> toNodeIdentifier(final NodeRef ref) {
+    private InstanceIdentifier<Node> toNodeIdentifier(final NodeRef ref) {
         org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey invNodeKey = getNodeKey(ref);
-
         NodeKey nodeKey = new NodeKey(toTopologyNodeId(invNodeKey.getId()));
-        return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, topology)
-                .child(Node.class, nodeKey).build();
+        return topology.child(Node.class, nodeKey);
     }
 
     private InstanceIdentifier<TerminationPoint> toTerminationPointIdentifier(final NodeConnectorRef ref) {
@@ -186,71 +164,39 @@ class FlowCapableTopologyExporter implements //
 
     private void removeAffectedLinks(final DataModificationTransaction transaction, final NodeId id) {
         TypeSafeDataReader reader = TypeSafeDataReader.forReader(transaction);
-
-        Topology topologyData = reader.readOperationalData(topologyPath);
-        if (topologyData == null) {
-            return;
-        }
-        for (Link link : topologyData.getLink()) {
-            if (id.equals(link.getSource().getSourceNode()) || id.equals(link.getDestination().getDestNode())) {
-                InstanceIdentifier<Link> path = topologyPath.child(Link.class, link.getKey());
-                transaction.removeOperationalData(path);
+        Topology topologyData = reader.readOperationalData(topology);
+        if (topologyData != null) {
+            for (Link link : topologyData.getLink()) {
+                if (id.equals(link.getSource().getSourceNode()) || id.equals(link.getDestination().getDestNode())) {
+                    transaction.removeOperationalData(linkPath(link));
+                }
             }
         }
     }
 
     private void removeAffectedLinks(final DataModificationTransaction transaction, final TpId id) {
         TypeSafeDataReader reader = TypeSafeDataReader.forReader(transaction);
-        Topology topologyData = reader.readOperationalData(topologyPath);
-        if (topologyData == null) {
-            return;
-        }
-        for (Link link : topologyData.getLink()) {
-            if (id.equals(link.getSource().getSourceTp()) || id.equals(link.getDestination().getDestTp())) {
-                InstanceIdentifier<Link> path = topologyPath.child(Link.class, link.getKey());
-                transaction.removeOperationalData(path);
+        Topology topologyData = reader.readOperationalData(topology);
+        if (topologyData != null) {
+            for (Link link : topologyData.getLink()) {
+                if (id.equals(link.getSource().getSourceTp()) || id.equals(link.getDestination().getDestTp())) {
+                    transaction.removeOperationalData(linkPath(link));
+                }
             }
         }
     }
 
     private InstanceIdentifier<Node> getNodePath(final NodeId nodeId) {
-        NodeKey nodeKey = new NodeKey(nodeId);
-        return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, topology)
-                .child(Node.class, nodeKey).build();
+        return topology.child(Node.class, new NodeKey(nodeId));
     }
 
     private InstanceIdentifier<TerminationPoint> tpPath(final NodeId nodeId, final TpId tpId) {
         NodeKey nodeKey = new NodeKey(nodeId);
         TerminationPointKey tpKey = new TerminationPointKey(tpId);
-        return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, topology)
-                .child(Node.class, nodeKey).child(TerminationPoint.class, tpKey).build();
+        return topology.child(Node.class, nodeKey).child(TerminationPoint.class, tpKey);
     }
 
     private InstanceIdentifier<Link> linkPath(final Link link) {
-        InstanceIdentifier<Link> linkInstanceId = InstanceIdentifier.builder(NetworkTopology.class)
-                .child(Topology.class, topology).child(Link.class, link.getKey()).build();
-        return linkInstanceId;
-    }
-
-    /**
-     * @param txId transaction identificator
-     * @param future transaction result
-     */
-    private static void listenOnTransactionState(final Object txId, Future<RpcResult<TransactionStatus>> future) {
-        Futures.addCallback(JdkFutureAdapters.listenInPoolThread(future),new FutureCallback<RpcResult<TransactionStatus>>() {
-
-            @Override
-            public void onFailure(Throwable t) {
-                LOG.error("Topology export failed for Tx:{}", txId, t);
-
-            }
-
-            @Override
-            public void onSuccess(RpcResult<TransactionStatus> result) {
-                if(!result.isSuccessful()) {
-                    LOG.error("Topology export failed for Tx:{}", txId);
-                }
-            }
-        });
+        return topology.child(Link.class, link.getKey());
     }
 }
index e77ba8769cbcdbd0f51b65820855e5beb7687f0a..d656bda932f2251e18ea7f71f6c19500115456d3 100644 (file)
@@ -7,11 +7,20 @@
  */
 package org.opendaylight.md.controller.topology.manager;
 
+import java.util.concurrent.ExecutionException;
+
 import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
@@ -19,58 +28,60 @@ import org.slf4j.LoggerFactory;
 
 public class FlowCapableTopologyProvider extends AbstractBindingAwareProvider implements AutoCloseable {
     private final static Logger LOG = LoggerFactory.getLogger(FlowCapableTopologyProvider.class);
+    private Registration<NotificationListener> listenerRegistration;
+    private Thread thread;
 
-    private DataProviderService dataService;
-
-    public DataProviderService getDataService() {
-        return this.dataService;
-    }
+    /**
+     * Gets called on start of a bundle.
+     *
+     * @param session
+     */
+    @Override
+    public synchronized void onSessionInitiated(final ProviderContext session) {
+        final DataProviderService dataService = session.getSALService(DataProviderService.class);
+        final NotificationProviderService notificationService = session.getSALService(NotificationProviderService.class);
 
-    public void setDataService(final DataProviderService dataService) {
-        this.dataService = dataService;
-    }
+        final String name = "flow:1";
+        final TopologyKey key = new TopologyKey(new TopologyId(name));
+        final InstanceIdentifier<Topology> path = InstanceIdentifier
+                .builder(NetworkTopology.class)
+                .child(Topology.class, key)
+                .build();
 
-    private NotificationProviderService notificationService;
+        final OperationProcessor processor = new OperationProcessor(dataService);
+        final FlowCapableTopologyExporter listener = new FlowCapableTopologyExporter(processor, path);
+        this.listenerRegistration = notificationService.registerNotificationListener(listener);
 
-    public NotificationProviderService getNotificationService() {
-        return this.notificationService;
-    }
+        final DataModificationTransaction tx = dataService.beginTransaction();
+        tx.putOperationalData(path, new TopologyBuilder().setKey(key).build());
+        try {
+            tx.commit().get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Initial topology export failed, continuing anyway", e);
+        }
 
-    public void setNotificationService(final NotificationProviderService notificationService) {
-        this.notificationService = notificationService;
+        thread = new Thread(processor);
+        thread.setDaemon(true);
+        thread.setName("FlowCapableTopologyExporter-" + name);
+        thread.start();
     }
 
-    private final FlowCapableTopologyExporter exporter = new FlowCapableTopologyExporter();
-    private Registration<NotificationListener> listenerRegistration;
-
     @Override
-    public void close() {
-
-        FlowCapableTopologyProvider.LOG.info("FlowCapableTopologyProvider stopped.");
-        dataService = null;
-        notificationService = null;
+    public synchronized void close() throws InterruptedException {
+        LOG.info("FlowCapableTopologyProvider stopped.");
         if (this.listenerRegistration != null) {
             try {
                 this.listenerRegistration.close();
             } catch (Exception e) {
-                throw new IllegalStateException("Exception during close of listener registration.",e);
+                LOG.error("Failed to close listener registration", e);
             }
+            listenerRegistration = null;
+        }
+        if (thread != null) {
+            thread.interrupt();
+            thread.join();
+            thread = null;
         }
-    }
-
-    /**
-     * Gets called on start of a bundle.
-     *
-     * @param session
-     */
-    @Override
-    public void onSessionInitiated(final ProviderContext session) {
-        dataService = session.getSALService(DataProviderService.class);
-        notificationService = session.getSALService(NotificationProviderService.class);
-        this.exporter.setDataService(dataService);
-        this.exporter.start();
-        this.listenerRegistration = notificationService.registerNotificationListener(this.exporter);
-        ;
     }
 
     /**
@@ -81,6 +92,10 @@ public class FlowCapableTopologyProvider extends AbstractBindingAwareProvider im
      */
     @Override
     public void stopImpl(final BundleContext context) {
-        this.close();
+        try {
+            this.close();
+        } catch (InterruptedException e) {
+            LOG.error("Failed to stop provider", e);
+        }
     }
 }
diff --git a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/OperationProcessor.java b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/OperationProcessor.java
new file mode 100644 (file)
index 0000000..d60c880
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.md.controller.topology.manager;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+final class OperationProcessor implements Runnable {
+    private static final Logger LOG = LoggerFactory.getLogger(OperationProcessor.class);
+    private static final int MAX_TRANSACTION_OPERATIONS = 100;
+    private static final int OPERATION_QUEUE_DEPTH = 500;
+
+    private final BlockingQueue<TopologyOperation> queue = new LinkedBlockingQueue<>(OPERATION_QUEUE_DEPTH);
+    // FIXME: Flow capable topology exporter should use transaction chaining API
+    private final DataProviderService dataService;
+
+    OperationProcessor(final DataProviderService dataService) {
+        this.dataService = Preconditions.checkNotNull(dataService);
+    }
+
+    void enqueueOperation(final TopologyOperation task) {
+        try {
+            queue.put(task);
+        } catch (InterruptedException e) {
+            LOG.warn("Interrupted while submitting task {}", task, e);
+        }
+    }
+
+    @Override
+    public void run() {
+        try {
+            for (;;) {
+                TopologyOperation op = queue.take();
+
+                LOG.debug("New operations available, starting transaction");
+                final DataModificationTransaction tx = dataService.beginTransaction();
+
+                int ops = 0;
+                do {
+                    op.applyOperation(tx);
+
+                    ops++;
+                    if (ops < MAX_TRANSACTION_OPERATIONS) {
+                        op = queue.poll();
+                    } else {
+                        op = null;
+                    }
+                } while (op != null);
+
+                LOG.debug("Processed {} operations, submitting transaction", ops);
+
+                try {
+                    final RpcResult<TransactionStatus> s = tx.commit().get();
+                    if (!s.isSuccessful()) {
+                        LOG.error("Topology export failed for Tx:{}", tx.getIdentifier());
+                    }
+                } catch (ExecutionException e) {
+                    LOG.error("Topology export transaction {} failed", tx.getIdentifier(), e.getCause());
+                }
+            }
+        } catch (InterruptedException e) {
+            LOG.info("Interrupted processing, terminating", e);
+        }
+
+        // Drain all events, making sure any blocked threads are unblocked
+        while (!queue.isEmpty()) {
+            queue.poll();
+        }
+    }
+}
diff --git a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/TopologyOperation.java b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/TopologyOperation.java
new file mode 100644 (file)
index 0000000..29d06be
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.md.controller.topology.manager;
+
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
+
+/**
+ * Internal interface for submitted operations. Implementations of this
+ * interface are enqueued and batched into data store transactions.
+ */
+interface TopologyOperation {
+    /**
+     * Execute the operation on top of the transaction.
+     *
+     * @param transaction Datastore transaction
+     */
+    void applyOperation(DataModificationTransaction transaction);
+}
\ No newline at end of file