From a3585e66560bdeb3b1536bc68f333969875c9d56 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:17:02 +0900 Subject: [PATCH] #933: Implement Destroyable, Startable and Stoppable for LwM2mObjectTree And call each interface's method at related method of `LeshanClient`; i.e. `start()`, `stop()` and `destroy()`. Signed-off-by: moznion --- .../client/californium/LeshanClient.java | 3 ++ .../client/resource/LwM2mInstanceEnabler.java | 7 ++++ .../client/resource/LwM2mObjectTree.java | 34 ++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/leshan-client-cf/src/main/java/org/eclipse/leshan/client/californium/LeshanClient.java b/leshan-client-cf/src/main/java/org/eclipse/leshan/client/californium/LeshanClient.java index 06939c319f..09bcbbe37a 100644 --- a/leshan-client-cf/src/main/java/org/eclipse/leshan/client/californium/LeshanClient.java +++ b/leshan-client-cf/src/main/java/org/eclipse/leshan/client/californium/LeshanClient.java @@ -207,6 +207,7 @@ public void start() { LOG.info("Starting Leshan client ..."); endpointsManager.start(); engine.start(); + objectTree.start(); if (LOG.isInfoEnabled()) { LOG.info("Leshan client[endpoint:{}] started.", engine.getEndpoint()); } @@ -217,6 +218,7 @@ public void stop(boolean deregister) { LOG.info("Stopping Leshan Client ..."); engine.stop(deregister); endpointsManager.stop(); + objectTree.stop(); LOG.info("Leshan client stopped."); } @@ -226,6 +228,7 @@ public void destroy(boolean deregister) { engine.destroy(deregister); endpointsManager.destroy(); requestSender.destroy(); + objectTree.destroy(); LOG.info("Leshan client destroyed."); } diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mInstanceEnabler.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mInstanceEnabler.java index 2570fdcf59..4d36b5f6c5 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mInstanceEnabler.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mInstanceEnabler.java @@ -44,6 +44,13 @@ *

* Implementations of this interface should adhere to the definition of the implemented LWM2M Object type regarding * acceptable resource IDs for the read, write and execute methods. + *

+ * {@code LeshanClient#destroy()} is called, {@code LwM2mInstanceEnabler#destroy()} is also called if it implements the + * {@link org.eclipse.leshan.core.Destroyable} interface. + * And {@link org.eclipse.leshan.core.Startable} ({@code #start()}) and {@link org.eclipse.leshan.core.Stoppable} ({@code #stop()}) + * are also same as this. + * If you need to restart the instance, please implement {@link org.eclipse.leshan.core.Startable} with + * {@link org.eclipse.leshan.core.Stoppable} together. */ public interface LwM2mInstanceEnabler { diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectTree.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectTree.java index e4ab4d1b56..71b22278cc 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectTree.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectTree.java @@ -25,6 +25,9 @@ import org.eclipse.leshan.client.LwM2mClient; import org.eclipse.leshan.client.resource.listener.ObjectListener; import org.eclipse.leshan.client.resource.listener.ObjectsListener; +import org.eclipse.leshan.core.Destroyable; +import org.eclipse.leshan.core.Startable; +import org.eclipse.leshan.core.Stoppable; /** * The LWM2M Object Tree. @@ -32,7 +35,7 @@ * It contains all the {@link LwM2mObjectEnabler} which are the implementation of each LWM2M object supported by the * client. */ -public class LwM2mObjectTree { +public class LwM2mObjectTree implements Startable, Stoppable, Destroyable { protected ObjectListener dispatcher = new ObjectListenerDispatcher(); protected CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); @@ -94,6 +97,35 @@ public void removeObjectEnabler(int objectId) { } } + @Override + public void destroy() { + for (LwM2mObjectEnabler objectEnabler : objectEnablers.values()) { + if (objectEnabler instanceof Destroyable) { + ((Destroyable) objectEnabler).destroy(); + } else if (objectEnabler instanceof Stoppable) { + ((Stoppable) objectEnabler).stop(); + } + } + } + + @Override + public void start() { + for (LwM2mObjectEnabler objectEnabler : objectEnablers.values()) { + if (objectEnabler instanceof Startable) { + ((Startable) objectEnabler).start(); + } + } + } + + @Override + public void stop() { + for (LwM2mObjectEnabler objectEnabler : objectEnablers.values()) { + if (objectEnabler instanceof Stoppable) { + ((Stoppable) objectEnabler).stop(); + } + } + } + protected class ObjectListenerDispatcher implements ObjectListener { @Override public void objectInstancesAdded(LwM2mObjectEnabler object, int... instanceIds) {