From 8ef9a9c246b2389938b8211defb4911f0806565c Mon Sep 17 00:00:00 2001 From: Michael Vorburger Date: Wed, 1 Jun 2016 22:14:14 +0200 Subject: [PATCH] Improve readability of Toaster code (incl. Java 8 lambda, static import) and some very minor unrelated pom.xml clean-up Change-Id: I47fc27cca633972a7a678c0a0a2852c4ad799d65 Signed-off-by: Michael Vorburger --- .../md-sal/samples/toaster-it/pom.xml | 1 + .../toaster/provider/OpendaylightToaster.java | 71 ++++++++----------- .../provider/OpenDaylightToasterTest.java | 2 +- opendaylight/md-sal/samples/toaster/pom.xml | 9 +-- 4 files changed, 33 insertions(+), 50 deletions(-) diff --git a/opendaylight/md-sal/samples/toaster-it/pom.xml b/opendaylight/md-sal/samples/toaster-it/pom.xml index 766e62b737..d3c54a852b 100644 --- a/opendaylight/md-sal/samples/toaster-it/pom.xml +++ b/opendaylight/md-sal/samples/toaster-it/pom.xml @@ -1,6 +1,7 @@ 4.0.0 + org.opendaylight.controller mdsal-it-parent diff --git a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java index b0daca7ce0..b876fa2cd3 100644 --- a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java +++ b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java @@ -7,6 +7,12 @@ */ package org.opendaylight.controller.sample.toaster.provider; +import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION; +import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL; +import static org.opendaylight.yangtools.yang.common.RpcError.ErrorType.APPLICATION; +import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.DELETE; +import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.WRITE; + import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.util.concurrent.AsyncFunction; @@ -30,7 +36,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.md.sal.common.util.jmx.AbstractMXBean; @@ -55,38 +60,34 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpendaylightToaster extends AbstractMXBean implements ToasterService, ToasterProviderRuntimeMXBean, - DataTreeChangeListener, AutoCloseable { +public class OpendaylightToaster extends AbstractMXBean + implements ToasterService, ToasterProviderRuntimeMXBean, DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(OpendaylightToaster.class); - public static final InstanceIdentifier TOASTER_IID = InstanceIdentifier.builder(Toaster.class).build(); - + private static final InstanceIdentifier TOASTER_IID = InstanceIdentifier.builder(Toaster.class).build(); private static final DisplayString TOASTER_MANUFACTURER = new DisplayString("Opendaylight"); private static final DisplayString TOASTER_MODEL_NUMBER = new DisplayString("Model 1 - Binding Aware"); - private NotificationPublishService notificationProvider; private DataBroker dataProvider; + private NotificationPublishService notificationProvider; private ListenerRegistration dataTreeChangeListenerRegistration; private final ExecutorService executor; - // The following holds the Future for the current make toast task. - // This is used to cancel the current toast. + // This holds the Future for the current make toast task and is used to cancel the current toast. private final AtomicReference> currentMakeToastTask = new AtomicReference<>(); + // Thread safe holders private final AtomicLong amountOfBreadInStock = new AtomicLong( 100 ); - private final AtomicLong toastsMade = new AtomicLong(0); - - // Thread safe holder for our darkness multiplier. private final AtomicLong darknessFactor = new AtomicLong( 1000 ); private final ToasterAppConfig toasterAppConfig; public OpendaylightToaster() { - this(new ToasterAppConfigBuilder().setManufacturer(TOASTER_MANUFACTURER).setModelNumber(TOASTER_MODEL_NUMBER). - setMaxMakeToastTries(2).build()); + this(new ToasterAppConfigBuilder().setManufacturer(TOASTER_MANUFACTURER).setModelNumber(TOASTER_MODEL_NUMBER) + .setMaxMakeToastTries(2).build()); } public OpendaylightToaster(ToasterAppConfig toasterAppConfig) { @@ -101,11 +102,8 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic public void setDataProvider(final DataBroker salDataProvider) { this.dataProvider = salDataProvider; - - dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier( - LogicalDatastoreType.CONFIGURATION, OpendaylightToaster.TOASTER_IID), this); - - setToasterStatusUp( null ); + dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(CONFIGURATION, TOASTER_IID), this); + setToasterStatusUp(null); } /** @@ -120,7 +118,7 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic dataTreeChangeListenerRegistration.close(); WriteTransaction tx = dataProvider.newWriteOnlyTransaction(); - tx.delete(LogicalDatastoreType.OPERATIONAL,TOASTER_IID); + tx.delete(OPERATIONAL,TOASTER_IID); Futures.addCallback( tx.submit(), new FutureCallback() { @Override public void onSuccess( final Void result ) { @@ -136,7 +134,6 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic } private Toaster buildToaster( final ToasterStatus status ) { - // note - we are simulating a device whose manufacture and model are // fixed (embedded) into the hardware. // This is why the manufacture and model number are hardcoded. @@ -153,7 +150,7 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic public void onDataTreeChanged(Collection> changes) { for(DataTreeModification change: changes) { DataObjectModification rootNode = change.getRootNode(); - if(rootNode.getModificationType() == DataObjectModification.ModificationType.WRITE) { + if(rootNode.getModificationType() == WRITE) { Toaster oldToaster = rootNode.getDataBefore(); Toaster newToaster = rootNode.getDataAfter(); LOG.info("onDataTreeChanged - Toaster config with path {} was added or replaced: old Toaster: {}, new Toaster: {}", @@ -163,7 +160,7 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic if(darkness != null) { darknessFactor.set(darkness); } - } else if(rootNode.getModificationType() == DataObjectModification.ModificationType.DELETE) { + } else if(rootNode.getModificationType() == DELETE) { LOG.info("onDataTreeChanged - Toaster config with path {} was deleted: old Toaster: {}", change.getRootPath().getRootIdentifier(), rootNode.getDataBefore()); } @@ -171,18 +168,16 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic } /** - * RPC call implemented from the ToasterService interface that cancels the current - * toast, if any. + * RPC call implemented from the ToasterService interface that cancels the current toast, if any. */ @Override public Future> cancelToast() { - Future current = currentMakeToastTask.getAndSet( null ); if( current != null ) { current.cancel( true ); } - // Always return success from the cancel toast call. + // Always return success from the cancel toast call return Futures.immediateFuture( RpcResultBuilder. success().build() ); } @@ -201,12 +196,12 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic } private RpcError makeToasterOutOfBreadError() { - return RpcResultBuilder.newError( ErrorType.APPLICATION, "resource-denied", + return RpcResultBuilder.newError( APPLICATION, "resource-denied", "Toaster is out of bread", "out-of-stock", null, null ); } private RpcError makeToasterInUseError() { - return RpcResultBuilder.newWarning( ErrorType.APPLICATION, "in-use", + return RpcResultBuilder.newWarning( APPLICATION, "in-use", "Toaster is busy", null, null, null ); } @@ -219,15 +214,10 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic // to make toast. final ReadWriteTransaction tx = dataProvider.newReadWriteTransaction(); - ListenableFuture> readFuture = - tx.read( LogicalDatastoreType.OPERATIONAL, TOASTER_IID ); + ListenableFuture> readFuture = tx.read(OPERATIONAL, TOASTER_IID); final ListenableFuture commitFuture = - Futures.transform( readFuture, new AsyncFunction,Void>() { - - @Override - public ListenableFuture apply( - final Optional toasterData ) throws Exception { + Futures.transform( readFuture, (AsyncFunction, Void>) toasterData -> { ToasterStatus toasterStatus = ToasterStatus.Up; if( toasterData.isPresent() ) { @@ -250,7 +240,7 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic // We're not currently making toast - try to update the status to Down // to indicate we're going to make toast. This acts as a lock to prevent // concurrent toasting. - tx.put( LogicalDatastoreType.OPERATIONAL, TOASTER_IID, + tx.put( OPERATIONAL, TOASTER_IID, buildToaster( ToasterStatus.Down ) ); return tx.submit(); } @@ -262,7 +252,6 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic // TransactionStatus in the RpcResult as an error condition. return Futures.immediateFailedCheckedFuture( new TransactionCommitFailedException( "", makeToasterInUseError() ) ); - } } ); Futures.addCallback( commitFuture, new FutureCallback() { @@ -341,9 +330,8 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic } private void setToasterStatusUp( final Function resultCallback ) { - WriteTransaction tx = dataProvider.newWriteOnlyTransaction(); - tx.put( LogicalDatastoreType.OPERATIONAL,TOASTER_IID, buildToaster( ToasterStatus.Up ) ); + tx.put( OPERATIONAL,TOASTER_IID, buildToaster( ToasterStatus.Up ) ); Futures.addCallback( tx.submit(), new FutureCallback() { @Override @@ -410,9 +398,7 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic // We can't clear the current toast task nor set the Future result until the // update has been committed so we pass a callback to be notified on completion. - setToasterStatusUp( new Function() { - @Override - public Void apply( final Boolean result ) { + setToasterStatusUp( result -> { currentMakeToastTask.set( null ); @@ -421,7 +407,6 @@ public class OpendaylightToaster extends AbstractMXBean implements ToasterServic futureResult.set( RpcResultBuilder.success().build() ); return null; - } } ); return null; diff --git a/opendaylight/md-sal/samples/toaster-provider/src/test/java/org/opendaylight/controller/sample/toaster/provider/OpenDaylightToasterTest.java b/opendaylight/md-sal/samples/toaster-provider/src/test/java/org/opendaylight/controller/sample/toaster/provider/OpenDaylightToasterTest.java index b189e461cc..1f5f0f7cd8 100644 --- a/opendaylight/md-sal/samples/toaster-provider/src/test/java/org/opendaylight/controller/sample/toaster/provider/OpenDaylightToasterTest.java +++ b/opendaylight/md-sal/samples/toaster-provider/src/test/java/org/opendaylight/controller/sample/toaster/provider/OpenDaylightToasterTest.java @@ -30,7 +30,7 @@ import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; -public class OpenDaylightToasterTest extends AbstractDataBrokerTest{ +public class OpenDaylightToasterTest extends AbstractDataBrokerTest { private static InstanceIdentifier TOASTER_IID = InstanceIdentifier.builder( Toaster.class ).build(); diff --git a/opendaylight/md-sal/samples/toaster/pom.xml b/opendaylight/md-sal/samples/toaster/pom.xml index a52c621013..ea6160d3a1 100644 --- a/opendaylight/md-sal/samples/toaster/pom.xml +++ b/opendaylight/md-sal/samples/toaster/pom.xml @@ -1,14 +1,17 @@ 4.0.0 + org.opendaylight.controller.samples sal-samples 1.4.0-SNAPSHOT + sample-toaster bundle + org.opendaylight.mdsal @@ -53,10 +56,4 @@ - - scm:git:http://git.opendaylight.org/gerrit/controller.git - scm:git:ssh://git.opendaylight.org:29418/controller.git - HEAD - https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL - -- 2.36.6