Simplify code using Java 8 features 44/74344/4
authorStephen Kitt <skitt@redhat.com>
Mon, 23 Jul 2018 15:31:33 +0000 (17:31 +0200)
committerStephen Kitt <skitt@redhat.com>
Wed, 25 Jul 2018 12:03:20 +0000 (14:03 +0200)
* List::sort
* lambda expressions
* Comparator::comparing...
* Collection::removeIf
* method references
* Map::computeIfAbsent
* Map::merge

Change-Id: I1793591c071c7ce5465939afe8b4846b769b5953
Signed-off-by: Stephen Kitt <skitt@redhat.com>
21 files changed:
opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/BlueprintBundleTracker.java
opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/ActionProviderBean.java
opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedRegistry.java
opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/utils/InMemoryJournal.java
opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/Bug3090MultiKeyList.java
opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/messaging/MessageAssembler.java
opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/messaging/MessageSlicer.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractShardBackendResolver.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActor.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospector.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardCommitCoordinator.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTree.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/CandidateListChangeListener.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardCommitCoordinator.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipStatistics.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/sharding/DistributedShardedDOMDataTree.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerTest.java
opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMBrokerPerformanceTest.java
opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMDataBrokerAdapter.java

index 4d77801..d3db327 100644 (file)
@@ -308,7 +308,7 @@ public class BlueprintBundleTracker implements BundleActivator, BundleTrackerCus
         }
 
         if (!bundlesToDestroy.isEmpty()) {
-            Collections.sort(bundlesToDestroy, (b1, b2) -> (int) (b2.getLastModified() - b1.getLastModified()));
+            bundlesToDestroy.sort((b1, b2) -> (int) (b2.getLastModified() - b1.getLastModified()));
 
             LOG.debug("Selected bundles {} for destroy (no services in use)", bundlesToDestroy);
         } else {
index 70054f8..af943f9 100644 (file)
@@ -129,10 +129,9 @@ public class ActionProviderBean {
         }
 
         final Set<DOMRpcIdentifier> rpcs = ImmutableSet.copyOf(Collections2.transform(paths, DOMRpcIdentifier::create));
-        reg = domRpcProvider.registerRpcImplementation((rpc, input) -> {
-            return FluentFutures.immediateFailedFluentFuture(new DOMRpcImplementationNotAvailableException(
-                "Action %s has no instance matching %s", rpc, input));
-        }, rpcs);
+        reg = domRpcProvider.registerRpcImplementation(
+            (rpc, input) -> FluentFutures.immediateFailedFluentFuture(new DOMRpcImplementationNotAvailableException(
+                "Action %s has no instance matching %s", rpc, input)), rpcs);
         LOG.debug("Registered provider for {}", interfaceName);
     }
 
index 78a09f1..7f99824 100644 (file)
@@ -13,6 +13,7 @@ import static java.util.Collections.emptyList;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -32,8 +33,8 @@ public class CloseTrackedRegistry<T extends CloseTracked<T>> {
     private final Object anchor;
     private final String createDescription;
 
-    private final Set<CloseTracked<T>> tracked = new ConcurrentSkipListSet<>(
-        (o1, o2) -> Integer.compare(System.identityHashCode(o1), System.identityHashCode(o2)));
+    private final Set<CloseTracked<T>> tracked =
+        new ConcurrentSkipListSet<>(Comparator.comparingInt(System::identityHashCode));
 
     private final boolean isDebugContextEnabled;
 
@@ -101,16 +102,13 @@ public class CloseTrackedRegistry<T extends CloseTracked<T>> {
         }
 
         Set<CloseTrackedRegistryReportEntry<T>> report = new HashSet<>();
-        map.forEach((stackTraceElements, number) -> {
-            copyOfTracked.stream().filter(closeTracked -> {
-                StackTraceElement[] closeTrackedStackTraceArray = closeTracked.getAllocationContextStackTrace();
-                List<StackTraceElement> closeTrackedStackTraceElements =
-                        closeTrackedStackTraceArray != null ? asList(closeTrackedStackTraceArray) : emptyList();
-                return closeTrackedStackTraceElements.equals(stackTraceElements);
-            }).findAny().ifPresent(exampleCloseTracked -> {
-                report.add(new CloseTrackedRegistryReportEntry<>(exampleCloseTracked, number, stackTraceElements));
-            });
-        });
+        map.forEach((stackTraceElements, number) -> copyOfTracked.stream().filter(closeTracked -> {
+            StackTraceElement[] closeTrackedStackTraceArray = closeTracked.getAllocationContextStackTrace();
+            List<StackTraceElement> closeTrackedStackTraceElements =
+                closeTrackedStackTraceArray != null ? asList(closeTrackedStackTraceArray) : emptyList();
+            return closeTrackedStackTraceElements.equals(stackTraceElements);
+        }).findAny().ifPresent(exampleCloseTracked -> report.add(
+            new CloseTrackedRegistryReportEntry<>(exampleCloseTracked, number, stackTraceElements))));
         return report;
     }
 
index 9964ceb..90aff5b 100644 (file)
@@ -16,7 +16,6 @@ import com.google.common.util.concurrent.Uninterruptibles;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -232,13 +231,7 @@ public class InMemoryJournal extends AsyncWriteJournal {
         Map<Long, Object> journal = JOURNALS.get(persistenceId);
         if (journal != null) {
             synchronized (journal) {
-                Iterator<Long> iter = journal.keySet().iterator();
-                while (iter.hasNext()) {
-                    Long num = iter.next();
-                    if (num <= toSequenceNr) {
-                        iter.remove();
-                    }
-                }
+                journal.keySet().removeIf(num -> num <= toSequenceNr);
             }
         }
 
index 57e1151..a150d24 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.collect.ImmutableSet;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -50,7 +51,7 @@ public class Bug3090MultiKeyList extends AbstractDataTreeChangeListenerTest {
         final Root root = new RootBuilder().setListInRoot(listInRoots).build();
 
         final TestListener<Root> listener = createListener(LogicalDatastoreType.CONFIGURATION, ROOT_PATH,
-                match(ModificationType.WRITE, ROOT_PATH, dataBefore -> dataBefore == null,
+                match(ModificationType.WRITE, ROOT_PATH, Objects::isNull,
                         (Function<Root, Boolean>) dataAfter -> checkData(root, dataAfter)));
 
         final ReadWriteTransaction readWriteTransaction = getDataBroker().newReadWriteTransaction();
index 87f0e98..4b7f854 100644 (file)
@@ -12,7 +12,6 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.RemovalListener;
 import com.google.common.cache.RemovalNotification;
 import com.google.common.io.ByteSource;
 import java.io.IOException;
@@ -49,8 +48,7 @@ public final  class MessageAssembler implements AutoCloseable {
 
         stateCache = CacheBuilder.newBuilder()
                 .expireAfterAccess(builder.expireStateAfterInactivityDuration, builder.expireStateAfterInactivityUnit)
-                .removalListener((RemovalListener<Identifier, AssembledMessageState>) notification ->
-                    stateRemoved(notification)).build();
+                .removalListener(this::stateRemoved).build();
     }
 
     /**
index 5f75e49..ca2441e 100644 (file)
@@ -16,7 +16,6 @@ import com.google.common.cache.RemovalNotification;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
-import java.util.Iterator;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -55,7 +54,7 @@ public class MessageSlicer implements AutoCloseable {
         this.logContext = builder.logContext + "_slicer-id-" + id;
 
         CacheBuilder<Identifier, SlicedMessageState<ActorRef>> cacheBuilder =
-                CacheBuilder.newBuilder().removalListener(notification -> stateRemoved(notification));
+                CacheBuilder.newBuilder().removalListener(this::stateRemoved);
         if (builder.expireStateAfterInactivityDuration > 0) {
             cacheBuilder = cacheBuilder.expireAfterAccess(builder.expireStateAfterInactivityDuration,
                     builder.expireStateAfterInactivityUnit);
@@ -206,12 +205,8 @@ public class MessageSlicer implements AutoCloseable {
      * @param filter filters by Identifier
      */
     public void cancelSlicing(@Nonnull final Predicate<Identifier> filter) {
-        final Iterator<MessageSliceIdentifier> iter = stateCache.asMap().keySet().iterator();
-        while (iter.hasNext()) {
-            if (filter.test(iter.next().getClientIdentifier())) {
-                iter.remove();
-            }
-        }
+        stateCache.asMap().keySet().removeIf(
+            messageSliceIdentifier -> filter.test(messageSliceIdentifier.getClientIdentifier()));
     }
 
     private static MessageSlice getNextSliceMessage(final SlicedMessageState<ActorRef> state) throws IOException {
index 9b5942c..faffe0a 100644 (file)
@@ -136,9 +136,7 @@ abstract class AbstractShardBackendResolver extends BackendInfoResolver<ShardBac
         LOG.debug("Shard {} resolved to {}, attempting to connect", shardName, info);
 
         FutureConverters.toJava(ExplicitAsk.ask(info.getPrimaryShardActor(), connectFunction, CONNECT_TIMEOUT))
-            .whenComplete((response, failure) -> {
-                onConnectResponse(shardName, cookie, future, response, failure);
-            });
+            .whenComplete((response, failure) -> onConnectResponse(shardName, cookie, future, response, failure));
     }
 
     private void onConnectResponse(final String shardName, final long cookie,
index e8db09a..37fb4ea 100644 (file)
@@ -194,7 +194,7 @@ final class DataTreeCohortActor extends AbstractUntypedActor {
             TransactionIdentifier txId = message.getTxId();
             ListenableFuture<S> future = process(handledMessageType.cast(message));
             Executor callbackExecutor = future.isDone() ? MoreExecutors.directExecutor()
-                    : runnable -> executeInSelf(runnable);
+                    : DataTreeCohortActor.this::executeInSelf;
             Futures.addCallback(future, new FutureCallback<S>() {
                 @Override
                 public void onSuccess(S nextStep) {
index c0ed129..0f7d80b 100644 (file)
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -311,8 +310,8 @@ public class DatastoreContextIntrospector {
         // Sort the property keys by putting the names prefixed with the data store type last. This
         // is done so data store specific settings are applied after global settings.
         final ArrayList<String> keys = new ArrayList<>(inKeys);
-        Collections.sort(keys, (key1, key2) -> key1.startsWith(dataStoreTypePrefix) ? 1 :
-                   key2.startsWith(dataStoreTypePrefix) ? -1 : key1.compareTo(key2));
+        keys.sort((key1, key2) -> key1.startsWith(dataStoreTypePrefix) ? 1 :
+            key2.startsWith(dataStoreTypePrefix) ? -1 : key1.compareTo(key2));
         return keys;
     }
 
index 7b1f9df..dbcbd3d 100644 (file)
@@ -395,9 +395,7 @@ public class Shard extends RaftActor {
                         responseMessageSlicer.slice(SliceOptions.builder().identifier(success.getTarget())
                             .message(envelope.newSuccessEnvelope(success, executionTimeNanos))
                             .sendTo(envelope.getMessage().getReplyTo()).replyTo(self())
-                            .onFailureCallback(t -> {
-                                LOG.warn("Error slicing response {}", success, t);
-                            }).build()));
+                            .onFailureCallback(t -> LOG.warn("Error slicing response {}", success, t)).build()));
                 } else {
                     envelope.sendSuccess(success, executionTimeNanos);
                 }
index 0dd50d4..eebad9c 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Deque;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 import javax.annotation.Nonnull;
@@ -398,13 +397,7 @@ final class ShardCommitCoordinator {
     }
 
     void checkForExpiredTransactions(final long timeout, final Shard shard) {
-        Iterator<CohortEntry> iter = cohortCache.values().iterator();
-        while (iter.hasNext()) {
-            CohortEntry cohortEntry = iter.next();
-            if (cohortEntry.isFailed()) {
-                iter.remove();
-            }
-        }
+        cohortCache.values().removeIf(CohortEntry::isFailed);
     }
 
     void abortPendingTransactions(final String reason, final Shard shard) {
index 980d181..e1c12cd 100644 (file)
@@ -1057,7 +1057,7 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
     ShardDataTreeCohort createReadyCohort(final TransactionIdentifier txId, final DataTreeModification mod,
             final java.util.Optional<SortedSet<String>> participatingShardNames) {
         SimpleShardDataTreeCohort cohort = new SimpleShardDataTreeCohort(this, mod, txId,
-                cohortRegistry.createCohort(schemaContext, txId, runnable -> shard.executeInSelf(runnable),
+                cohortRegistry.createCohort(schemaContext, txId, shard::executeInSelf,
                         COMMIT_STEP_TIMEOUT), participatingShardNames);
         pendingTransactions.add(new CommitEntry(cohort, readTime()));
         return cohort;
index 005de87..a7be8c5 100644 (file)
@@ -93,11 +93,7 @@ class CandidateListChangeListener implements DOMDataTreeChangeListener {
     }
 
     private Collection<String> addToCurrentCandidates(YangInstanceIdentifier entityId, String newCandidate) {
-        Collection<String> candidates = currentCandidates.get(entityId);
-        if (candidates == null) {
-            candidates = new LinkedHashSet<>();
-            currentCandidates.put(entityId, candidates);
-        }
+        Collection<String> candidates = currentCandidates.computeIfAbsent(entityId, k -> new LinkedHashSet<>());
 
         candidates.add(newCandidate);
         return candidates;
index 4e344cd..f3adfbd 100644 (file)
@@ -222,13 +222,7 @@ class EntityOwnershipShardCommitCoordinator {
             }
 
             // Prune the subsequent pending modifications.
-            Iterator<Modification> iter = pendingModifications.iterator();
-            while (iter.hasNext()) {
-                Modification mod = iter.next();
-                if (!canForwardModificationToNewLeader(mod)) {
-                    iter.remove();
-                }
-            }
+            pendingModifications.removeIf(mod -> !canForwardModificationToNewLeader(mod));
         }
     }
 
index a96bbe3..8fca4df 100644 (file)
@@ -79,12 +79,7 @@ class EntityOwnershipStatistics extends AbstractEntityOwnerChangeListener {
             map.put(candidateName, count);
             statistics.put(entityType, map);
         } else {
-            Long candidateOwnedEntities = map.get(candidateName);
-            if (candidateOwnedEntities == null) {
-                map.put(candidateName, count);
-            } else {
-                map.put(candidateName, candidateOwnedEntities + count);
-            }
+            map.merge(candidateName, count, (ownedEntities, addedEntities) -> ownedEntities + addedEntities);
         }
     }
 }
index 7f727fa..64c3f14 100644 (file)
@@ -31,9 +31,9 @@ import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
 import com.google.common.util.concurrent.Uninterruptibles;
 import java.util.AbstractMap.SimpleEntry;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.List;
@@ -363,19 +363,11 @@ public class DistributedShardedDOMDataTree implements DOMDataTreeService, DOMDat
 
     void resolveShardAdditions(final Set<DOMDataTreeIdentifier> additions) {
         LOG.debug("{}: Resolving additions : {}", memberName, additions);
-        final ArrayList<DOMDataTreeIdentifier> list = new ArrayList<>(additions);
         // we need to register the shards from top to bottom, so we need to atleast make sure the ordering reflects that
-        Collections.sort(list, (o1, o2) -> {
-            if (o1.getRootIdentifier().getPathArguments().size() < o2.getRootIdentifier().getPathArguments().size()) {
-                return -1;
-            } else if (o1.getRootIdentifier().getPathArguments().size()
-                    == o2.getRootIdentifier().getPathArguments().size()) {
-                return 0;
-            } else {
-                return 1;
-            }
-        });
-        list.forEach(this::createShardFrontend);
+        additions
+            .stream()
+            .sorted(Comparator.comparingInt(o -> o.getRootIdentifier().getPathArguments().size()))
+            .forEachOrdered(this::createShardFrontend);
     }
 
     void resolveShardRemovals(final Set<DOMDataTreeIdentifier> removals) {
index d87b7dd..a91ca9c 100644 (file)
@@ -636,9 +636,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest {
             leaderLastApplied.set(rs.getLastApplied());
         });
 
-        verifyRaftState(peer2, rs -> {
-            assertEquals("LastApplied", leaderLastApplied.get(), rs.getLastIndex());
-        });
+        verifyRaftState(peer2, rs -> assertEquals("LastApplied", leaderLastApplied.get(), rs.getLastIndex()));
 
         // Kill the local leader and elect peer2 the leader. This should cause a new owner to be selected for
         // the entities (1 and 3) previously owned by the local leader member.
index 6548fe9..41413d9 100644 (file)
@@ -1435,7 +1435,7 @@ public class ShardManagerTest extends AbstractShardManagerTest {
         Function<ShardSnapshot, String> shardNameTransformer = ShardSnapshot::getName;
 
         assertEquals("Shard names", Sets.newHashSet("shard1", "shard2"), Sets.newHashSet(
-                Lists.transform(datastoreSnapshot.getShardSnapshots(), shardNameTransformer)));
+            datastoreSnapshot.getShardSnapshots().stream().map(shardNameTransformer).collect(Collectors.toSet())));
 
         // Add a new replica
 
index ece552d..72a3c2e 100644 (file)
@@ -213,7 +213,7 @@ public class DOMBrokerPerformanceTest {
         });
 
         measure("Txs:1 Submit, Finish", (Callable<Void>) () -> {
-            measure("Txs:1 Submit", (Callable<ListenableFuture<?>>) () -> writeTx.submit()).get();
+            measure("Txs:1 Submit", (Callable<ListenableFuture<?>>) writeTx::submit).get();
             return null;
         });
     }
index 7f11d5f..6ae6116 100644 (file)
@@ -42,8 +42,6 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.MappingCheckedFuture;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohort;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistration;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
@@ -98,9 +96,9 @@ public class LegacyDOMDataBrokerAdapter extends ForwardingObject implements DOMD
                     final org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener delegateListener;
                     if (listener instanceof ClusteredDOMDataTreeChangeListener) {
                         delegateListener = (org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener)
-                            changes -> listener.onDataTreeChanged(changes);
+                            listener::onDataTreeChanged;
                     } else {
-                        delegateListener = changes -> listener.onDataTreeChanged(changes);
+                        delegateListener = listener::onDataTreeChanged;
                     }
 
                     final ListenerRegistration<org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener> reg =
@@ -127,13 +125,7 @@ public class LegacyDOMDataBrokerAdapter extends ForwardingObject implements DOMD
                 (org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry) delegateExtensions.get(
                         org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry.class);
         if (delegateCohortRegistry != null) {
-            extBuilder.put(DOMDataTreeCommitCohortRegistry.class, new DOMDataTreeCommitCohortRegistry() {
-                @Override
-                public <T extends DOMDataTreeCommitCohort> DOMDataTreeCommitCohortRegistration<T> registerCommitCohort(
-                        org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier path, T cohort) {
-                    return delegateCohortRegistry.registerCommitCohort(path, cohort);
-                }
-            });
+            extBuilder.put(DOMDataTreeCommitCohortRegistry.class, delegateCohortRegistry::registerCommitCohort);
         }
 
         extensions = extBuilder.build();

©2013 OpenDaylight, A Linux Foundation Collaborative Project. All Rights Reserved.
OpenDaylight is a registered trademark of The OpenDaylight Project, Inc.
Linux Foundation and OpenDaylight are registered trademarks of the Linux Foundation.
Linux is a registered trademark of Linus Torvalds.