From 31e29703a80e43b50f934d2dd6cadb92c4aa357a Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:11:30 +0900 Subject: [PATCH 1/9] #933: Add new interfaces to core: Destroyable, Startable and Stoppable Signed-off-by: moznion --- .../src/main/java/org/eclipse/leshan/core/Destroyable.java | 6 ++++++ .../src/main/java/org/eclipse/leshan/core/Startable.java | 5 +++++ .../src/main/java/org/eclipse/leshan/core/Stoppable.java | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 leshan-core/src/main/java/org/eclipse/leshan/core/Destroyable.java create mode 100644 leshan-core/src/main/java/org/eclipse/leshan/core/Startable.java create mode 100644 leshan-core/src/main/java/org/eclipse/leshan/core/Stoppable.java diff --git a/leshan-core/src/main/java/org/eclipse/leshan/core/Destroyable.java b/leshan-core/src/main/java/org/eclipse/leshan/core/Destroyable.java new file mode 100644 index 0000000000..b51b61a474 --- /dev/null +++ b/leshan-core/src/main/java/org/eclipse/leshan/core/Destroyable.java @@ -0,0 +1,6 @@ +package org.eclipse.leshan.core; + +public interface Destroyable { + /** Destroy the instances and frees all system resources. */ + void destroy(); +} diff --git a/leshan-core/src/main/java/org/eclipse/leshan/core/Startable.java b/leshan-core/src/main/java/org/eclipse/leshan/core/Startable.java new file mode 100644 index 0000000000..2164436ef4 --- /dev/null +++ b/leshan-core/src/main/java/org/eclipse/leshan/core/Startable.java @@ -0,0 +1,5 @@ +package org.eclipse.leshan.core; + +public interface Startable { + void start(); +} diff --git a/leshan-core/src/main/java/org/eclipse/leshan/core/Stoppable.java b/leshan-core/src/main/java/org/eclipse/leshan/core/Stoppable.java new file mode 100644 index 0000000000..3b3d16a27b --- /dev/null +++ b/leshan-core/src/main/java/org/eclipse/leshan/core/Stoppable.java @@ -0,0 +1,5 @@ +package org.eclipse.leshan.core; + +public interface Stoppable { + void stop(); +} From d8ce2c5447fd69aa384dd54314d055d53a7b29d4 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:12:07 +0900 Subject: [PATCH 2/9] #933: Mark as deprecated for server.(Destroyable, Startable, Stoppable) And make a suggestion to use interfaces that are in the `core` package. Signed-off-by: moznion --- .../src/main/java/org/eclipse/leshan/server/Destroyable.java | 4 ++++ .../src/main/java/org/eclipse/leshan/server/Startable.java | 4 ++++ .../src/main/java/org/eclipse/leshan/server/Stoppable.java | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java index 9f6f5923e7..f5d94e85d3 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java @@ -15,6 +15,10 @@ *******************************************************************************/ package org.eclipse.leshan.server; +/** + * @deprecated please consider to use {@link org.eclipse.leshan.core.Destroyable} instead. + */ +@Deprecated public interface Destroyable { /** Destroy the instances and frees all system resources. */ diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java index fb41866754..02771bff1e 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java @@ -15,6 +15,10 @@ *******************************************************************************/ package org.eclipse.leshan.server; +/** + * @deprecated please consider to use {@link org.eclipse.leshan.core.Startable} instead. + */ +@Deprecated public interface Startable { void start(); diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java index c4fb7bb779..5a5a6d8fa6 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java @@ -15,6 +15,10 @@ *******************************************************************************/ package org.eclipse.leshan.server; +/** + * @deprecated please consider to use {@link org.eclipse.leshan.core.Stoppable} instead. + */ +@Deprecated public interface Stoppable { void stop(); From c830d0865524b4f619e218c9d837665db65ca0c3 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:29:14 +0900 Subject: [PATCH 3/9] #933: Implement Destroyable, Startable and Stoppable for ObjectEnabler To call each interface method on corresponded `LwM2mObjectTree` method. Signed-off-by: moznion --- .../client/resource/LwM2mObjectEnabler.java | 8 +++++ .../leshan/client/resource/ObjectEnabler.java | 34 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectEnabler.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectEnabler.java index e4f4234e30..cc442619e3 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectEnabler.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/LwM2mObjectEnabler.java @@ -53,6 +53,14 @@ *

* In case you really need the flexibility of this interface you should consider to inherit from * {@link BaseObjectEnabler}. + *

+ * An instance that implements this interface synchronizes with the lifecycle of the LeshanClient. + * This means when {@code LeshanClient#destroy()} is called, {@code LwM2mObjectEnabler#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 LwM2mObjectEnabler { diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/ObjectEnabler.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/ObjectEnabler.java index e0930669ca..9aac8be8b7 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/ObjectEnabler.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/resource/ObjectEnabler.java @@ -28,7 +28,10 @@ import org.eclipse.leshan.client.LwM2mClient; import org.eclipse.leshan.client.servers.ServerIdentity; import org.eclipse.leshan.client.servers.ServersInfoExtractor; +import org.eclipse.leshan.core.Destroyable; import org.eclipse.leshan.core.LwM2mId; +import org.eclipse.leshan.core.Startable; +import org.eclipse.leshan.core.Stoppable; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.node.LwM2mObject; import org.eclipse.leshan.core.node.LwM2mObjectInstance; @@ -61,7 +64,7 @@ * Implementing a {@link LwM2mInstanceEnabler} then creating an {@link ObjectEnabler} with {@link ObjectsInitializer} is * the easier way to implement LWM2M object in Leshan client. */ -public class ObjectEnabler extends BaseObjectEnabler { +public class ObjectEnabler extends BaseObjectEnabler implements Destroyable, Startable, Stoppable { protected Map instances; protected LwM2mInstanceEnablerFactory instanceFactory; @@ -399,4 +402,33 @@ public void setLwM2mClient(LwM2mClient client) { instanceEnabler.setLwM2mClient(client); } } + + @Override + public void destroy() { + for (LwM2mInstanceEnabler instanceEnabler : instances.values()) { + if (instanceEnabler instanceof Destroyable) { + ((Destroyable) instanceEnabler).destroy(); + } else if (instanceEnabler instanceof Stoppable) { + ((Stoppable) instanceEnabler).stop(); + } + } + } + + @Override + public void start() { + for (LwM2mInstanceEnabler instanceEnabler : instances.values()) { + if (instanceEnabler instanceof Startable) { + ((Startable) instanceEnabler).start(); + } + } + } + + @Override + public void stop() { + for (LwM2mInstanceEnabler instanceEnabler : instances.values()) { + if (instanceEnabler instanceof Stoppable) { + ((Stoppable) instanceEnabler).stop(); + } + } + } } From a3585e66560bdeb3b1536bc68f333969875c9d56 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:17:02 +0900 Subject: [PATCH 4/9] #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) { From 1ea225e6efbfdebcb1646f952606e4c53f6e258a Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:34:00 +0900 Subject: [PATCH 5/9] #933: Add an interface `LwM2mClientObserver2` to handle unexpected erorr This interface extends `LwM2mClientObserver` interface. And make `LwM2mClientObserverAdapter` and `LwM2mClientObserverDispatcher` implement that new interface. This doesn't break the backward compatibility because `LwM2mClientObserver2` is compatible with `LwM2mClientObserver` and each implementing class conceals the difference between `LwM2mClientObserver` and `LwM2mClientObserver2`. Signed-off-by: moznion --- .../client/observer/LwM2mClientObserver2.java | 14 ++++++++++++++ .../observer/LwM2mClientObserverAdapter.java | 6 +++++- .../observer/LwM2mClientObserverDispatcher.java | 12 ++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserver2.java diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserver2.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserver2.java new file mode 100644 index 0000000000..6f8a7c6add --- /dev/null +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserver2.java @@ -0,0 +1,14 @@ +package org.eclipse.leshan.client.observer; + +/** + * An extended interface of {@link LwM2mClientObserver} with handler for unexpected error. + *

+ * Future plan: Since version 2.0, this interface is going to merge into {@link LwM2mClientObserver}. + * + * @since 1.3 + */ +public interface LwM2mClientObserver2 extends LwM2mClientObserver { + // ============== Unexpected Error Handling ================= + + void onUnexpectedError(Throwable unexpectedError); +} diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverAdapter.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverAdapter.java index 52fc10ba73..fcbd428d7a 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverAdapter.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverAdapter.java @@ -26,7 +26,7 @@ * An abstract adapter class for observing registration life cycle. The methods in this class are empty. This class * exists as convenience for creating client observer objects. */ -public class LwM2mClientObserverAdapter implements LwM2mClientObserver { +public class LwM2mClientObserverAdapter implements LwM2mClientObserver2 { @Override public void onBootstrapStarted(ServerIdentity bsserver, BootstrapRequest request) { @@ -95,4 +95,8 @@ public void onDeregistrationFailure(ServerIdentity server, DeregisterRequest req @Override public void onDeregistrationTimeout(ServerIdentity server, DeregisterRequest request) { } + + @Override + public void onUnexpectedError(Throwable unexpectedError) { + } } diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java index 39002d13a7..0c0eaa93b5 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java @@ -24,8 +24,8 @@ * A dispatcher for LwM2mClientObserver. It allow several observers on a LwM2mClient. * */ -public class LwM2mClientObserverDispatcher implements LwM2mClientObserver { - private CopyOnWriteArrayList observers = new CopyOnWriteArrayList<>(); +public class LwM2mClientObserverDispatcher implements LwM2mClientObserver2 { + protected CopyOnWriteArrayList observers = new CopyOnWriteArrayList<>(); public void addObserver(LwM2mClientObserver observer) { observers.add(observer); @@ -151,4 +151,12 @@ public void onDeregistrationTimeout(ServerIdentity server, DeregisterRequest req } } + @Override + public void onUnexpectedError(Throwable unexpectedError) { + for (LwM2mClientObserver observer : observers) { + if (observer instanceof LwM2mClientObserver2) { + ((LwM2mClientObserver2) observer).onUnexpectedError(unexpectedError); + } + } + } } From 1a8fecbe85f66d2995ee9a06c9c20ab5841b11b6 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:42:18 +0900 Subject: [PATCH 6/9] #933: Call `onUnexpectedError()` when unexpected error occurred If a task that are belong to `DefaultRegistrationEngine` raises unexpected `RuntimeException` and the `observer` member variable implements `LwM2mClientObserver2` (instead of `LwM2mClientObserver`), it calls `LwM2mClientObserver2#onUnexpectedError()` hook. The purpose of this hook gimmick is to shutdown the client application mainly. Signed-off-by: moznion --- .../client/engine/DefaultRegistrationEngine.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/engine/DefaultRegistrationEngine.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/engine/DefaultRegistrationEngine.java index e26b70a964..5e0efa56b7 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/engine/DefaultRegistrationEngine.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/engine/DefaultRegistrationEngine.java @@ -32,6 +32,7 @@ import org.eclipse.leshan.client.RegistrationUpdate; import org.eclipse.leshan.client.bootstrap.BootstrapHandler; import org.eclipse.leshan.client.observer.LwM2mClientObserver; +import org.eclipse.leshan.client.observer.LwM2mClientObserver2; import org.eclipse.leshan.client.request.LwM2mRequestSender; import org.eclipse.leshan.client.resource.LwM2mObjectEnabler; import org.eclipse.leshan.client.resource.LwM2mObjectTree; @@ -517,6 +518,9 @@ public void run() { LOG.info("Bootstrap task interrupted. "); } catch (RuntimeException e) { LOG.error("Unexpected exception during bootstrap task", e); + if (observer instanceof LwM2mClientObserver2) { + ((LwM2mClientObserver2) observer).onUnexpectedError(e); + } } } } @@ -555,6 +559,9 @@ public void run() { LOG.info("Registration task interrupted. "); } catch (RuntimeException e) { LOG.error("Unexpected exception during registration task", e); + if (observer instanceof LwM2mClientObserver2) { + ((LwM2mClientObserver2) observer).onUnexpectedError(e); + } } } } @@ -603,6 +610,9 @@ public void run() { LOG.info("Registration update task interrupted."); } catch (RuntimeException e) { LOG.error("Unexpected exception during update registration task", e); + if (observer instanceof LwM2mClientObserver2) { + ((LwM2mClientObserver2) observer).onUnexpectedError(e); + } } } } From c918c93f0fb1affe54091e67c34458d35dc6cc44 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:48:16 +0900 Subject: [PATCH 7/9] #933: Set an unexpected error hook to destroy the demo client And implements `Destroyable` interface for each threading task that runs with the demo client application. The reason why it doesn't set the hook at `LeshanClient` is to keep the backward compatibility, this means it delegates "what should client do once an unexpected error has occurred" to the users. Signed-off-by: moznion --- .../leshan/client/demo/LeshanClientDemo.java | 16 ++++++++++++++++ .../org/eclipse/leshan/client/demo/MyDevice.java | 12 ++++++++++-- .../client/demo/RandomTemperatureSensor.java | 8 +++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java index 7316a05930..0c1fd5b200 100644 --- a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java +++ b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java @@ -63,6 +63,7 @@ import org.eclipse.leshan.client.californium.LeshanClientBuilder; import org.eclipse.leshan.client.engine.DefaultRegistrationEngineFactory; import org.eclipse.leshan.client.object.Server; +import org.eclipse.leshan.client.observer.LwM2mClientObserverAdapter; import org.eclipse.leshan.client.resource.LwM2mObjectEnabler; import org.eclipse.leshan.client.resource.ObjectsInitializer; import org.eclipse.leshan.client.resource.listener.ObjectsListenerAdapter; @@ -691,6 +692,7 @@ public void objectAdded(LwM2mObjectEnabler object) { LOG.info("Object {} enabled.", object.getId()); } }); + client.addObserver(new ShutdownOnUnexpectedErrorObserver(client)); // Display client public key to easily add it in demo servers. if (clientPublicKey != null) { @@ -807,4 +809,18 @@ public void run() { } } } + + private static class ShutdownOnUnexpectedErrorObserver extends LwM2mClientObserverAdapter { + final LeshanClient client; + + public ShutdownOnUnexpectedErrorObserver(final LeshanClient client) { + this.client = client; + } + + @Override + public void onUnexpectedError(Throwable unexpectedError) { + LOG.error("unexpected error occurred. destroy the leshan-client", unexpectedError); + client.destroy(true); + } + } } diff --git a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java index 5453fa05ec..6be4277e01 100644 --- a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java +++ b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java @@ -14,6 +14,7 @@ import org.eclipse.leshan.client.resource.BaseInstanceEnabler; import org.eclipse.leshan.client.servers.ServerIdentity; +import org.eclipse.leshan.core.Destroyable; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.model.ResourceModel.Type; import org.eclipse.leshan.core.node.LwM2mResource; @@ -23,7 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class MyDevice extends BaseInstanceEnabler { +public class MyDevice extends BaseInstanceEnabler implements Destroyable { private static final Logger LOG = LoggerFactory.getLogger(MyDevice.class); @@ -31,9 +32,11 @@ public class MyDevice extends BaseInstanceEnabler { private static final List supportedResources = Arrays.asList(0, 1, 2, 3, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21); + private final Timer timer; + public MyDevice() { // notify new date each 5 second - Timer timer = new Timer("Device-Current Time"); + timer = new Timer("Device-Current Time"); timer.schedule(new TimerTask() { @Override public void run() { @@ -209,4 +212,9 @@ private long getMemoryTotal() { public List getAvailableResourceIds(ObjectModel model) { return supportedResources; } + + @Override + public void destroy() { + timer.cancel(); + } } diff --git a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java index 7719a55f53..8a1fa3f565 100644 --- a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java +++ b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java @@ -11,6 +11,7 @@ import org.eclipse.leshan.client.resource.BaseInstanceEnabler; import org.eclipse.leshan.client.servers.ServerIdentity; +import org.eclipse.leshan.core.Destroyable; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.response.ExecuteResponse; import org.eclipse.leshan.core.response.ReadResponse; @@ -18,7 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RandomTemperatureSensor extends BaseInstanceEnabler { +public class RandomTemperatureSensor extends BaseInstanceEnabler implements Destroyable { private static final Logger LOG = LoggerFactory.getLogger(RandomTemperatureSensor.class); @@ -113,4 +114,9 @@ private void resetMinMaxMeasuredValues() { public List getAvailableResourceIds(ObjectModel model) { return supportedResources; } + + @Override + public void destroy() { + scheduler.shutdown(); + } } From c67e3ddd3bf923814ec6b7669ca15b3122508cfb Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 03:01:33 +0900 Subject: [PATCH 8/9] #933: Correct the access level of a member variable Signed-off-by: moznion --- .../leshan/client/observer/LwM2mClientObserverDispatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java index 0c0eaa93b5..d5576bc503 100644 --- a/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java +++ b/leshan-client-core/src/main/java/org/eclipse/leshan/client/observer/LwM2mClientObserverDispatcher.java @@ -25,7 +25,7 @@ * */ public class LwM2mClientObserverDispatcher implements LwM2mClientObserver2 { - protected CopyOnWriteArrayList observers = new CopyOnWriteArrayList<>(); + private CopyOnWriteArrayList observers = new CopyOnWriteArrayList<>(); public void addObserver(LwM2mClientObserver observer) { observers.add(observer); From 00f1e5a96979b663edb6f2c09ea045dbc83c4d93 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 03:05:22 +0900 Subject: [PATCH 9/9] #933: Add comment for each deprecated interface To clarify the version that is going to remove the deprecated interfaces. Signed-off-by: moznion --- .../src/main/java/org/eclipse/leshan/server/Destroyable.java | 2 +- .../src/main/java/org/eclipse/leshan/server/Startable.java | 2 +- .../src/main/java/org/eclipse/leshan/server/Stoppable.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java index f5d94e85d3..0f652d1d5c 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Destroyable.java @@ -16,7 +16,7 @@ package org.eclipse.leshan.server; /** - * @deprecated please consider to use {@link org.eclipse.leshan.core.Destroyable} instead. + * @deprecated please consider to use {@link org.eclipse.leshan.core.Destroyable} instead. This interface is going to be removed at version 2.0. */ @Deprecated public interface Destroyable { diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java index 02771bff1e..7947c5d3b2 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Startable.java @@ -16,7 +16,7 @@ package org.eclipse.leshan.server; /** - * @deprecated please consider to use {@link org.eclipse.leshan.core.Startable} instead. + * @deprecated please consider to use {@link org.eclipse.leshan.core.Startable} instead. This interface is going to be removed at version 2.0. */ @Deprecated public interface Startable { diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java index 5a5a6d8fa6..1533eef373 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/Stoppable.java @@ -16,7 +16,7 @@ package org.eclipse.leshan.server; /** - * @deprecated please consider to use {@link org.eclipse.leshan.core.Stoppable} instead. + * @deprecated please consider to use {@link org.eclipse.leshan.core.Stoppable} instead. This interface is going to be removed at version 2.0. */ @Deprecated public interface Stoppable {