From: Tony Tkacik Date: Tue, 18 Feb 2014 11:05:27 +0000 (+0000) Subject: Merge "Untangle the XML/Hello message decoders" X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~413 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=6958a923b6da4fb9e74c4050f8d38a7360e03f6d;hp=c74edd02f5044772f226cea9da9967023f6842d6 Merge "Untangle the XML/Hello message decoders" --- diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryNotificationProvider.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryNotificationProvider.java index 23a98ff39a..6a9db37dbb 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryNotificationProvider.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryNotificationProvider.java @@ -1,5 +1,7 @@ package org.opendaylight.controller.sal.compatibility; +import java.util.List; + import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService; @@ -11,8 +13,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - public class InventoryNotificationProvider implements AutoCloseable{ private ListenerRegistration nodeConnectorDataChangeListenerRegistration; @@ -33,7 +33,7 @@ public class InventoryNotificationProvider implements AutoCloseable{ && inventoryPublisher!= null){ if(nodeConnectorDataChangeListener == null){ - InstanceIdentifier nodeConnectorPath = InstanceIdentifier.builder(Nodes.class).child(Node.class).child(NodeConnector.class).build(); + InstanceIdentifier nodeConnectorPath = InstanceIdentifier.builder(Nodes.class).child(Node.class).child(NodeConnector.class).build(); nodeConnectorDataChangeListener = new NodeConnectorDataChangeListener(); nodeConnectorDataChangeListener.setInventoryPublisher(inventoryPublisher); nodeConnectorDataChangeListenerRegistration = dataProviderService.registerDataChangeListener(nodeConnectorPath, nodeConnectorDataChangeListener); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java index a0bbb28d9e..790c1fcd4c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java @@ -9,7 +9,10 @@ package org.opendaylight.controller.sal.binding.codegen.impl; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import javassist.ClassPool; @@ -27,13 +30,26 @@ public class SingletonHolder { CLASS_POOL); public static final RuntimeCodeGenerator RPC_GENERATOR = RPC_GENERATOR_IMPL; public static final NotificationInvokerFactory INVOKER_FACTORY = RPC_GENERATOR_IMPL.getInvokerFactory(); + + public static final int CORE_NOTIFICATION_THREADS = 4; + public static final int MAX_NOTIFICATION_THREADS = 32; + public static final int NOTIFICATION_THREAD_LIFE = 15; + private static ListeningExecutorService NOTIFICATION_EXECUTOR = null; private static ListeningExecutorService COMMIT_EXECUTOR = null; private static ListeningExecutorService CHANGE_EVENT_EXECUTOR = null; + /** + * @deprecated This method is only used from configuration modules and thus callers of it + * should use service injection to make the executor configurable. + */ + @Deprecated public static synchronized final ListeningExecutorService getDefaultNotificationExecutor() { if (NOTIFICATION_EXECUTOR == null) { - NOTIFICATION_EXECUTOR = createNamedExecutor("md-sal-binding-notification-%d"); + ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("md-sal-binding-notification-%d").build(); + ExecutorService executor = new ThreadPoolExecutor(CORE_NOTIFICATION_THREADS, MAX_NOTIFICATION_THREADS, + NOTIFICATION_THREAD_LIFE, TimeUnit.SECONDS, new LinkedBlockingQueue(), factory); + NOTIFICATION_EXECUTOR = MoreExecutors.listeningDecorator(executor); } return NOTIFICATION_EXECUTOR; } @@ -46,13 +62,13 @@ public class SingletonHolder { public static synchronized final ListeningExecutorService getDefaultCommitExecutor() { if (COMMIT_EXECUTOR == null) { ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("md-sal-binding-commit-%d").build(); - /* - * FIXME: this used to be newCacheThreadPool(), but MD-SAL does not have transaction - * ordering guarantees, which means that using a concurrent threadpool results - * in application data being committed in random order, potentially resulting - * in inconsistent data being present. Once proper primitives are introduced, - * concurrency can be reintroduced. - */ + /* + * FIXME: this used to be newCacheThreadPool(), but MD-SAL does not have transaction + * ordering guarantees, which means that using a concurrent threadpool results + * in application data being committed in random order, potentially resulting + * in inconsistent data being present. Once proper primitives are introduced, + * concurrency can be reintroduced. + */ ExecutorService executor = Executors.newSingleThreadExecutor(factory); COMMIT_EXECUTOR = MoreExecutors.listeningDecorator(executor); } @@ -60,12 +76,6 @@ public class SingletonHolder { return COMMIT_EXECUTOR; } - private static ListeningExecutorService createNamedExecutor(String format) { - ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(format).build(); - ExecutorService executor = Executors.newCachedThreadPool(factory); - return MoreExecutors.listeningDecorator(executor); - } - public static ExecutorService getDefaultChangeEventExecutor() { if (CHANGE_EVENT_EXECUTOR == null) { ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("md-sal-binding-change-%d").build(); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend index 9a431fec74..bf82302e54 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend @@ -8,25 +8,25 @@ package org.opendaylight.controller.sal.binding.impl import com.google.common.collect.HashMultimap +import com.google.common.collect.ImmutableSet import com.google.common.collect.Multimap -import java.util.Collection +import com.google.common.collect.Multimaps import java.util.Collections import java.util.concurrent.Callable import java.util.concurrent.ExecutorService +import java.util.concurrent.Future +import java.util.Set import org.opendaylight.controller.sal.binding.api.NotificationListener import org.opendaylight.controller.sal.binding.api.NotificationProviderService +import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener +import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory.NotificationInvoker import org.opendaylight.yangtools.concepts.AbstractObjectRegistration import org.opendaylight.yangtools.concepts.ListenerRegistration import org.opendaylight.yangtools.concepts.Registration +import org.opendaylight.yangtools.concepts.util.ListenerRegistry import org.opendaylight.yangtools.yang.binding.Notification import org.slf4j.LoggerFactory -import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder import com.google.common.collect.Multimaps -import org.opendaylight.yangtools.concepts.util.ListenerRegistry -import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener import java.util.Set -import java.util.Set -import com.google.common.collect.ImmutableSet -import java.util.concurrent.Future class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable { @@ -69,11 +69,6 @@ class NotificationBrokerImpl implements NotificationProviderService, AutoCloseab notification.class.interfaces.filter[it != Notification && Notification.isAssignableFrom(it)] } - @SuppressWarnings("unchecked") - private def notifyAll(Collection> listeners, Notification notification) { - listeners.forEach[(it as NotificationListener).onNotification(notification)] - } - @Deprecated override addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) { throw new UnsupportedOperationException("Deprecated method. Use registerNotificationListener instead."); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.xtend index 95de575b51..c60686d209 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/MapUtils.xtend @@ -7,13 +7,11 @@ */ package org.opendaylight.controller.sal.binding.impl.util -import java.util.Map.Entry -import org.opendaylight.yangtools.concepts.Path -import java.util.Map -import java.util.Set +import com.google.common.collect.Multimap import java.util.Collection import java.util.HashSet -import com.google.common.collect.Multimap +import java.util.Map.Entry +import org.opendaylight.yangtools.concepts.Path class MapUtils { diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/SimpleInput.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/SimpleInput.java index b56b94a67b..0a38c90a6a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/SimpleInput.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/mock/SimpleInput.java @@ -16,5 +16,5 @@ import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; public interface SimpleInput extends DataObject,Augmentable { @RoutingContext(BaseIdentity.class) - InstanceIdentifier getIdentifier(); + InstanceIdentifier getIdentifier(); } diff --git a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java index 4e4416777b..e8a52d069d 100644 --- a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java +++ b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java @@ -23,8 +23,6 @@ public class TestHelper { public static final String CONTROLLER_MODELS = "org.opendaylight.controller.model"; public static final String YANGTOOLS_MODELS = "org.opendaylight.yangtools.model"; - private static final String OPENDAYLIGHT_SNAPSHOT = "http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/"; - private static final String OPENDAYLIGHT_RELEASE = "http://nexus.opendaylight.org/content/repositories/opendaylight.release/"; public static Option mdSalCoreBundles() { return new DefaultCompositeOption( // diff --git a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/DataServiceTest.java b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/DataServiceTest.java index 105f6e59a3..8a390b337e 100644 --- a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/DataServiceTest.java +++ b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/DataServiceTest.java @@ -7,15 +7,17 @@ */ package org.opendaylight.controller.test.sal.binding.it; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import java.util.concurrent.Future; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; -import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; +import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer; import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.controller.sal.core.api.Broker; @@ -34,8 +36,8 @@ import com.google.inject.Inject; public class DataServiceTest extends AbstractTest { protected DataBrokerService consumerDataService; - - + + @Inject Broker broker2; @@ -56,59 +58,58 @@ public class DataServiceTest extends AbstractTest { assertNotNull(consumerDataService); - + DataModificationTransaction transaction = consumerDataService.beginTransaction(); assertNotNull(transaction); - + NodeRef node1 = createNodeRef("0"); DataObject node = consumerDataService.readConfigurationData(node1.getValue()); assertNull(node); Node nodeData1 = createNode("0"); - + transaction.putConfigurationData(node1.getValue(), nodeData1); Future> commitResult = transaction.commit(); assertNotNull(commitResult); - + RpcResult result = commitResult.get(); - + assertNotNull(result); assertNotNull(result.getResult()); assertEquals(TransactionStatus.COMMITED, result.getResult()); - + Node readedData = (Node) consumerDataService.readConfigurationData(node1.getValue()); assertNotNull(readedData); assertEquals(nodeData1.getKey(), readedData.getKey()); - - + + DataModificationTransaction transaction2 = consumerDataService.beginTransaction(); assertNotNull(transaction); - + transaction2.removeConfigurationData(node1.getValue()); - + Future> commitResult2 = transaction2.commit(); assertNotNull(commitResult2); - + RpcResult result2 = commitResult2.get(); - + assertNotNull(result2); assertNotNull(result2.getResult()); assertEquals(TransactionStatus.COMMITED, result2.getResult()); - + DataObject readedData2 = consumerDataService.readConfigurationData(node1.getValue()); assertNull(readedData2); - - + + } - + private static NodeRef createNodeRef(String string) { NodeKey key = new NodeKey(new NodeId(string)); - InstanceIdentifier path = InstanceIdentifier.builder().node(Nodes.class).node(Node.class, key) - .toInstance(); + InstanceIdentifier path = InstanceIdentifier.builder(Nodes.class).child(Node.class, key).build(); return new NodeRef(path); } - + private static Node createNode(String string) { NodeBuilder ret = new NodeBuilder(); NodeId id = new NodeId(string); diff --git a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/RoutedServiceTest.java b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/RoutedServiceTest.java index befe703764..9c24ca0830 100644 --- a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/RoutedServiceTest.java +++ b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/RoutedServiceTest.java @@ -192,8 +192,7 @@ public class RoutedServiceTest extends AbstractTest { */ private static NodeRef createNodeRef(String string) { NodeKey key = new NodeKey(new NodeId(string)); - InstanceIdentifier path = InstanceIdentifier.builder().node(Nodes.class).node(Node.class, key) - .toInstance(); + InstanceIdentifier path = InstanceIdentifier.builder(Nodes.class).child(Node.class, key).build(); return new NodeRef(path); } diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/routing/RoutingUtils.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/routing/RoutingUtils.java index 274f084f01..9001aaa4de 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/routing/RoutingUtils.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/routing/RoutingUtils.java @@ -16,28 +16,28 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; public class RoutingUtils { - + public static RouteChange removalChange(C context,P path) { final ImmutableMap> announcements = ImmutableMap.>of(); final ImmutableMap> removals = ImmutableMap.>of(context, ImmutableSet.of(path)); return new RouteChangeImpl(announcements, removals); } - + public static RouteChange announcementChange(C context,P path) { final ImmutableMap> announcements = ImmutableMap.>of(context, ImmutableSet.of(path)); final ImmutableMap> removals = ImmutableMap.>of(); return new RouteChangeImpl(announcements, removals); } - - + + public static RouteChange change(Map> announcements, Map> removals) { final ImmutableMap> immutableAnnouncements = ImmutableMap.>copyOf(announcements); final ImmutableMap> immutableRemovals = ImmutableMap.>copyOf(removals); return new RouteChangeImpl(immutableAnnouncements, immutableRemovals); } - - + + private static class RouteChangeImpl implements RouteChange { private final Map> removal; private final Map> announcement; @@ -52,7 +52,7 @@ public class RoutingUtils { public Map> getAnnouncements() { return announcement; } - + @Override public Map> getRemovals() { return removal; @@ -78,7 +78,7 @@ public class RoutingUtils { if (getClass() != obj.getClass()) { return false; } - RouteChangeImpl other = (RouteChangeImpl) obj; + RouteChangeImpl other = (RouteChangeImpl) obj; if (announcement == null) { if (other.announcement != null) return false; @@ -95,5 +95,5 @@ public class RoutingUtils { } - + } diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java index bfffb594cb..ed186dcf31 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java @@ -408,7 +408,7 @@ public abstract class AbstractDataBroker

, D extends Object, DC Preconditions.checkNotNull(transaction); transaction.changeStatus(TransactionStatus.SUBMITED); final TwoPhaseCommit task = new TwoPhaseCommit(transaction, this); - ; + this.getSubmittedTransactionsCount().getAndIncrement(); return this.getExecutor().submit(task); } diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java index e99fc0f24c..33de1d83da 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java @@ -61,6 +61,17 @@ public class TwoPhaseCommit

, D extends Object, DCL extends Dat log.trace("Transaction: {} Affected Subtrees:", transactionId, changedPaths); + // The transaction has no effects, let's just shortcut it + if (changedPaths.isEmpty()) { + dataBroker.getFinishedTransactionsCount().getAndIncrement(); + transaction.changeStatus(TransactionStatus.COMMITED); + + log.trace("Transaction: {} Finished successfully (no effects).", transactionId); + + return Rpcs. getRpcResult(true, TransactionStatus.COMMITED, + Collections. emptySet()); + } + final ImmutableList.Builder> listenersBuilder = ImmutableList.builder(); listenersBuilder.addAll(dataBroker.affectedListeners(changedPaths)); filterProbablyAffectedListeners(dataBroker.probablyAffectedListeners(changedPaths),listenersBuilder); @@ -211,14 +222,12 @@ public class TwoPhaseCommit

, D extends Object, DCL extends Dat @Override public void run() { for (final ListenerStateCapture listenerSet : listeners) { - { - DataChangeEvent changeEvent = listenerSet.createEvent(transaction); - for (final DataChangeListenerRegistration listener : listenerSet.getListeners()) { - try { - listener.getInstance().onDataChanged(changeEvent); - } catch (Exception e) { - log.error("Unhandled exception when invoking listener {}", listener); - } + DataChangeEvent changeEvent = listenerSet.createEvent(transaction); + for (final DataChangeListenerRegistration listener : listenerSet.getListeners()) { + try { + listener.getInstance().onDataChanged(changeEvent); + } catch (Exception e) { + log.error("Unhandled exception when invoking listener {}", listener, e); } } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend index 8f734d7d4c..3bbdab2c07 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend @@ -8,32 +8,27 @@ package org.opendaylight.controller.sal.dom.broker; import java.util.Collections -import java.util.HashMap import java.util.HashSet -import java.util.Map import java.util.Set import java.util.concurrent.Callable import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.Future +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener import org.opendaylight.controller.sal.core.api.Broker -import org.opendaylight.controller.sal.core.api.BrokerService import org.opendaylight.controller.sal.core.api.Consumer import org.opendaylight.controller.sal.core.api.Provider -import org.opendaylight.controller.sal.core.spi.BrokerModule +import org.opendaylight.controller.sal.core.api.RpcImplementation +import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry +import org.opendaylight.controller.sal.core.api.RpcRegistrationListener +import org.opendaylight.controller.sal.core.api.RpcRoutingContext +import org.opendaylight.controller.sal.dom.broker.spi.RpcRouter import org.opendaylight.yangtools.yang.common.QName import org.opendaylight.yangtools.yang.common.RpcResult import org.opendaylight.yangtools.yang.data.api.CompositeNode +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier import org.osgi.framework.BundleContext import org.slf4j.LoggerFactory -import org.opendaylight.controller.sal.dom.broker.spi.RpcRouter -import org.opendaylight.yangtools.concepts.ListenerRegistration -import org.opendaylight.controller.sal.core.api.RpcRegistrationListener -import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry -import org.opendaylight.controller.sal.core.api.RpcImplementation -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener -import org.opendaylight.controller.sal.core.api.RpcRoutingContext -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier public class BrokerImpl implements Broker, RpcProvisionRegistry, AutoCloseable { private static val log = LoggerFactory.getLogger(BrokerImpl); diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/DataReaderRouter.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/DataReaderRouter.xtend index cc44613e44..95d0018b21 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/DataReaderRouter.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/DataReaderRouter.xtend @@ -7,29 +7,26 @@ */ package org.opendaylight.controller.sal.dom.broker.impl -import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier -import org.opendaylight.yangtools.yang.data.api.CompositeNode -import org.opendaylight.controller.md.sal.common.api.data.DataReader -import org.opendaylight.yangtools.yang.common.QName import java.net.URI -import java.util.List -import org.opendaylight.yangtools.yang.data.api.Node import java.util.ArrayList -import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl -import java.util.Map -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier -import org.opendaylight.yangtools.yang.data.api.SimpleNode +import java.util.Collection import java.util.Collections -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates import java.util.HashMap -import static com.google.common.base.Preconditions.*; -import java.util.Collection -import java.util.Set +import java.util.Map import java.util.Map.Entry -import org.slf4j.LoggerFactory +import java.util.Set +import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter +import org.opendaylight.yangtools.yang.common.QName +import org.opendaylight.yangtools.yang.data.api.CompositeNode +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument +import org.opendaylight.yangtools.yang.data.api.Node +import org.opendaylight.yangtools.yang.data.api.SimpleNode import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl +import org.slf4j.LoggerFactory + +import static com.google.common.base.Preconditions.* class DataReaderRouter extends AbstractDataReadRouter { private static val LOG = LoggerFactory.getLogger(DataReaderRouter); @@ -42,7 +39,6 @@ class DataReaderRouter extends AbstractDataReadRouter>(); val keyNodes = new HashMap>(); - val iterator = data.iterator; for(dataBit : data) { try { if(pathArgument != null && dataBit != null) { diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataStoreAdapter.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataStoreAdapter.java index b02a37c300..602afd7c0c 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataStoreAdapter.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataStoreAdapter.java @@ -150,7 +150,7 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator> mergeMultiple(LeafSchemaNode node, List> original, List> modified, boolean configurational) { checkArgument(original.size === 1); diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend index f409ecdade..e5a24fcf63 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend @@ -16,30 +16,23 @@ import java.util.Collections import java.util.List import java.util.Set import java.util.concurrent.atomic.AtomicInteger +import org.opendaylight.controller.netconf.api.NetconfMessage import org.opendaylight.controller.sal.common.util.Rpcs +import org.opendaylight.yangtools.yang.common.QName +import org.opendaylight.yangtools.yang.common.RpcResult import org.opendaylight.yangtools.yang.data.api.CompositeNode import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument -import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl -import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode -import java.util.Collections -import java.util.List -import java.util.Set -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument import org.opendaylight.yangtools.yang.data.api.Node import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl +import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode +import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils import org.opendaylight.yangtools.yang.model.api.NotificationDefinition import org.opendaylight.yangtools.yang.model.api.SchemaContext import org.w3c.dom.Document import org.w3c.dom.Element -import org.opendaylight.yangtools.yang.common.QName -import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl -import org.opendaylight.controller.netconf.api.NetconfMessage -import org.opendaylight.yangtools.yang.common.RpcResult class NetconfMapping { diff --git a/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfConfigPersisterITTest.java b/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfConfigPersisterITTest.java index 0037981a3e..ff2efed128 100644 --- a/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfConfigPersisterITTest.java +++ b/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfConfigPersisterITTest.java @@ -7,9 +7,27 @@ */ package org.opendaylight.controller.netconf.it; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; +import static junit.framework.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import io.netty.channel.ChannelFuture; + +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.management.InstanceNotFoundException; +import javax.management.Notification; +import javax.management.NotificationListener; + import org.apache.commons.lang3.StringUtils; import org.junit.After; import org.junit.Assert; @@ -44,33 +62,13 @@ import org.opendaylight.controller.netconf.monitoring.osgi.NetconfMonitoringOper import org.opendaylight.controller.netconf.persist.impl.ConfigPersisterNotificationHandler; import org.opendaylight.controller.netconf.util.test.XmlFileLoader; import org.opendaylight.controller.netconf.util.xml.XmlUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.w3c.dom.Element; -import javax.management.InstanceNotFoundException; -import javax.management.Notification; -import javax.management.NotificationListener; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; - -import static junit.framework.Assert.assertEquals; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; public class NetconfConfigPersisterITTest extends AbstractNetconfConfigTest { - private static final Logger logger = LoggerFactory.getLogger(NetconfConfigPersisterITTest.class); - private static final InetSocketAddress tcpAddress = new InetSocketAddress("127.0.0.1", 12023); @@ -230,7 +228,7 @@ public class NetconfConfigPersisterITTest extends AbstractNetconfConfigTest { public VerifyingPersister() throws IOException { Persister mockedAggregator = mock(Persister.class); - doAnswer(new Answer() { + doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { ConfigSnapshotHolder configSnapshot = (ConfigSnapshotHolder) invocation.getArguments()[0]; diff --git a/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfMonitoringITTest.java b/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfMonitoringITTest.java index be2c32e34f..7a840be02a 100644 --- a/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfMonitoringITTest.java +++ b/opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfMonitoringITTest.java @@ -7,11 +7,23 @@ */ package org.opendaylight.controller.netconf.it; -import com.google.common.base.Charsets; -import com.google.common.base.Optional; -import com.google.common.collect.Sets; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import io.netty.channel.ChannelFuture; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.Collection; +import java.util.List; +import java.util.Set; + import junit.framework.Assert; + import org.junit.Before; import org.junit.Test; import org.junit.matchers.JUnitMatchers; @@ -41,19 +53,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import static org.mockito.Matchers.anyLong; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; +import com.google.common.base.Charsets; +import com.google.common.base.Optional; +import com.google.common.collect.Sets; public class NetconfMonitoringITTest extends AbstractNetconfConfigTest { @@ -162,6 +164,8 @@ public class NetconfMonitoringITTest extends AbstractNetconfConfigTest { } } + sock.close(); + org.junit.Assert.assertThat(responseBuilder.toString(), JUnitMatchers.containsString("urn:ietf:params:netconf:capability:candidate:1.0")); org.junit.Assert.assertThat(responseBuilder.toString(), JUnitMatchers.containsString("tomas")); } diff --git a/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java b/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java index 75fcec5b3c..ea9e599d83 100644 --- a/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java +++ b/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java @@ -136,6 +136,10 @@ public class UserConfig extends ConfigurationObject implements Serializable { return new ArrayList(roles); } + public byte[] getSalt() { + return salt.clone(); + } + @Override public int hashCode() { final int prime = 31; diff --git a/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/DaylightWebAdmin.java b/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/DaylightWebAdmin.java index 4c8a6b8439..b6a4d0dd54 100644 --- a/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/DaylightWebAdmin.java +++ b/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/DaylightWebAdmin.java @@ -212,10 +212,12 @@ public class DaylightWebAdmin { UserConfig newConfig = gson.fromJson(json, UserConfig.class); List currentUserConfig = userManager.getLocalUserList(); String password = null; + byte[] salt = null; String user = newConfig.getUser(); for (UserConfig userConfig : currentUserConfig) { if(userConfig.getUser().equals(user)){ password = userConfig.getPassword(); + salt = userConfig.getSalt(); break; } } @@ -228,8 +230,9 @@ public class DaylightWebAdmin { //The password is stored in hash mode, hence it cannot be retrieved and added to UserConfig object //The hashed password is injected below to the json string containing username and new roles before //converting to UserConfig object. - json = json.replace("\"roles\"", "\"password\":\""+ password + "\",\"roles\""); Gson gson = new Gson(); + json = json.replace("\"roles\"", "\"salt\":" + gson.toJson(salt, salt.getClass()) + ",\"password\":\""+ password + "\",\"roles\""); + newConfig = gson.fromJson(json, UserConfig.class); Status result = userManager.modifyLocalUser(newConfig); diff --git a/third-party/ganymed/pom.xml b/third-party/ganymed/pom.xml index b601eef4b5..f67828bdab 100644 --- a/third-party/ganymed/pom.xml +++ b/third-party/ganymed/pom.xml @@ -14,10 +14,6 @@ 1.1-SNAPSHOT bundle - - build209 - - org.osgi