From 1c322bf6efc077c433bc2cfbb6324cd2abce9571 Mon Sep 17 00:00:00 2001 From: Carlos Gonzalo Date: Mon, 19 Feb 2018 13:30:10 +0100 Subject: [PATCH] Added ClientAwakeTimeInformation to change the default 93 sec. Signed-off-by: Carlos Gonzalo --- .../californium/LeshanServerBuilder.java | 20 +++++++-- .../server/californium/impl/LeshanServer.java | 6 ++- .../server/queue/ClientAwakeTimeProvider.java | 30 ++++++++++++++ .../leshan/server/queue/PresenceListener.java | 1 - .../server/queue/PresenceServiceImpl.java | 15 +++++-- .../leshan/server/queue/PresenceStatus.java | 27 +----------- .../queue/StaticClientAwakeTimeProvider.java | 41 +++++++++++++++++++ .../server/queue/PresenceServiceTest.java | 7 ++-- 8 files changed, 107 insertions(+), 40 deletions(-) create mode 100644 leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/ClientAwakeTimeProvider.java create mode 100644 leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/StaticClientAwakeTimeProvider.java diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServerBuilder.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServerBuilder.java index 554afcbc4d..fae73e3302 100644 --- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServerBuilder.java +++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/LeshanServerBuilder.java @@ -47,6 +47,8 @@ import org.eclipse.leshan.server.impl.InMemorySecurityStore; import org.eclipse.leshan.server.model.LwM2mModelProvider; import org.eclipse.leshan.server.model.StandardModelProvider; +import org.eclipse.leshan.server.queue.ClientAwakeTimeProvider; +import org.eclipse.leshan.server.queue.StaticClientAwakeTimeProvider; import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.RegistrationStore; import org.eclipse.leshan.server.security.Authorizer; @@ -69,6 +71,7 @@ public class LeshanServerBuilder { private SecurityStore securityStore; private LwM2mModelProvider modelProvider; private Authorizer authorizer; + private ClientAwakeTimeProvider awakeTimeProvider; private InetSocketAddress localAddress; private InetSocketAddress localSecureAddress; @@ -319,6 +322,16 @@ public LeshanServerBuilder disableQueueModeSupport() { return this; } + /** + * Sets a new {@link ClientAwakeTimeProvider} object different from the default one (93 seconds). + * + * @param awakeTimeProvider the {@link ClientAwakeTimeProvider} to set. + */ + public LeshanServerBuilder setClientAwakeTimeProvider(ClientAwakeTimeProvider awakeTimeProvider) { + this.awakeTimeProvider = awakeTimeProvider; + return this; + } + /** * The default Californium/CoAP {@link NetworkConfig} used by the builder. */ @@ -341,9 +354,10 @@ public LeshanServer build() { encoder = new DefaultLwM2mNodeEncoder(); if (decoder == null) decoder = new DefaultLwM2mNodeDecoder(); - if (coapConfig == null) { + if (coapConfig == null) coapConfig = createDefaultNetworkConfig(); - } + if (awakeTimeProvider == null) + awakeTimeProvider = new StaticClientAwakeTimeProvider(); // handle dtlsConfig DtlsConnectorConfig dtlsConfig = null; @@ -464,6 +478,6 @@ public LeshanServer build() { } return new LeshanServer(unsecuredEndpoint, securedEndpoint, registrationStore, securityStore, authorizer, - modelProvider, encoder, decoder, coapConfig, noQueueMode); + modelProvider, encoder, decoder, coapConfig, noQueueMode, awakeTimeProvider); } } diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java index 83ad91009d..c9c5d77f88 100644 --- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java +++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java @@ -46,6 +46,7 @@ import org.eclipse.leshan.server.impl.RegistrationServiceImpl; import org.eclipse.leshan.server.model.LwM2mModelProvider; import org.eclipse.leshan.server.observation.ObservationService; +import org.eclipse.leshan.server.queue.ClientAwakeTimeProvider; import org.eclipse.leshan.server.queue.PresenceService; import org.eclipse.leshan.server.queue.PresenceServiceImpl; import org.eclipse.leshan.server.queue.PresenceStateListener; @@ -117,11 +118,12 @@ public class LeshanServer implements LwM2mServer { * @param encoder encode used to encode request payload. * @param coapConfig the CoAP {@link NetworkConfig}. * @param noQueueMode true to disable presenceService. + * @param awakeTimeProvider to set the client awake time if queue mode is used */ public LeshanServer(CoapEndpoint unsecuredEndpoint, CoapEndpoint securedEndpoint, CaliforniumRegistrationStore registrationStore, SecurityStore securityStore, Authorizer authorizer, LwM2mModelProvider modelProvider, LwM2mNodeEncoder encoder, LwM2mNodeDecoder decoder, - NetworkConfig coapConfig, boolean noQueueMode) { + NetworkConfig coapConfig, boolean noQueueMode, ClientAwakeTimeProvider awakeTimeProvider) { Validate.notNull(registrationStore, "registration store cannot be null"); Validate.notNull(authorizer, "authorizer cannot be null"); @@ -197,7 +199,7 @@ protected Resource createRoot() { decoder); presenceService = null; } else { - presenceService = new PresenceServiceImpl(); + presenceService = new PresenceServiceImpl(awakeTimeProvider); registrationService.addListener(new PresenceStateListener(presenceService)); requestSender = new QueueModeLwM2mRequestSender(presenceService, new CaliforniumLwM2mRequestSender(endpoints, observationService, modelProvider, encoder, decoder)); diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/ClientAwakeTimeProvider.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/ClientAwakeTimeProvider.java new file mode 100644 index 0000000000..01417bd482 --- /dev/null +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/ClientAwakeTimeProvider.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2018 RISE SICS AB. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Eclipse Distribution License v1.0 which accompany this distribution. + * + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * and the Eclipse Distribution License is available at + * http://www.eclipse.org/org/documents/edl-v10.html. + * + * Contributors: + * RISE SICS AB - initial API and implementation + *******************************************************************************/ +package org.eclipse.leshan.server.queue; + +import org.eclipse.leshan.server.registration.Registration; + +public interface ClientAwakeTimeProvider { + + /** + * Returns the client awake time for the corresponding client, identified by the {@link Registration} object. + * + * @param reg the client's registration object + * @return the client awake time in milliseconds + */ + int getClientAwakeTime(Registration reg); + +} diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceListener.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceListener.java index b2972b8fbb..c319850af8 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceListener.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceListener.java @@ -22,7 +22,6 @@ * */ public interface PresenceListener { - /** * This method is invoked when the LWM2M client with the given endpoint state changes to awake. diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceServiceImpl.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceServiceImpl.java index 5c54e1f579..83559daafe 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceServiceImpl.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceServiceImpl.java @@ -38,7 +38,12 @@ public final class PresenceServiceImpl implements PresenceService { private final ConcurrentMap clientStatusList = new ConcurrentHashMap<>(); private final List listeners = new CopyOnWriteArrayList<>(); - ScheduledExecutorService clientTimersExecutor = Executors.newSingleThreadScheduledExecutor(); + private final ClientAwakeTimeProvider awakeTimeProvider; + private final ScheduledExecutorService clientTimersExecutor = Executors.newSingleThreadScheduledExecutor(); + + public PresenceServiceImpl(ClientAwakeTimeProvider awakeTimeProvider) { + this.awakeTimeProvider = awakeTimeProvider; + } @Override public void addListener(PresenceListener listener) { @@ -76,8 +81,10 @@ public void setAwake(Registration reg) { boolean stateChanged = false; synchronized (status) { + + // Every time we set the clientAwakeTime, in case it changes dynamically stateChanged = status.setAwake(); - startClientAwakeTimer(reg, status); + startClientAwakeTimer(reg, status, awakeTimeProvider.getClientAwakeTime(reg)); } if (stateChanged) { @@ -137,9 +144,9 @@ private PresenceStatus getPresenceStatusObject(Registration reg) { * * @param status */ - public void startClientAwakeTimer(final Registration reg, PresenceStatus clientPresenceStatus) { + public void startClientAwakeTimer(final Registration reg, PresenceStatus clientPresenceStatus, + int clientAwakeTime) { - int clientAwakeTime = clientPresenceStatus.getClientAwakeTime(); ScheduledFuture clientScheduledFuture = clientPresenceStatus.getClientScheduledFuture(); if (clientAwakeTime != 0) { diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceStatus.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceStatus.java index ec45a8d389..a5b8a375a5 100644 --- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceStatus.java +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/PresenceStatus.java @@ -27,18 +27,10 @@ public class PresenceStatus { /* The state of the client: Awake or Sleeping */ private Presence state; - ScheduledFuture clientScheduledFuture; - - private int clientAwakeTime; + private ScheduledFuture clientScheduledFuture; public PresenceStatus() { this.state = Presence.SLEEPING; - this.clientAwakeTime = 93000; /* ms, default CoAP value */ - } - - public PresenceStatus(int clientAwakeTime) { - this.state = Presence.SLEEPING; - this.clientAwakeTime = clientAwakeTime; /* ms */ } /* Client State Control */ @@ -88,23 +80,6 @@ public boolean isClientAwake() { } /* Control of the time the client waits before going to sleep */ - /** - * Get the time that the client stays awake after an update message or the last received request. - * - * @return The client awake time. - */ - public int getClientAwakeTime() { - return clientAwakeTime; - } - - /** - * Sets the client awake time, in case it wants to be modified during run time. - * - * @param clientAwakeTime - */ - public void setClientAwakeTime(int clientAwakeTime) { - this.clientAwakeTime = clientAwakeTime; - } /** * Sets the client scheduled task future, in order to cancel it. diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/StaticClientAwakeTimeProvider.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/StaticClientAwakeTimeProvider.java new file mode 100644 index 0000000000..d108dadf36 --- /dev/null +++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/StaticClientAwakeTimeProvider.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2018 Sierra Wireless and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Eclipse Distribution License v1.0 which accompany this distribution. + * + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * and the Eclipse Distribution License is available at + * http://www.eclipse.org/org/documents/edl-v10.html. + * + * Contributors: + * Sierra Wireless - initial API and implementation + *******************************************************************************/ +package org.eclipse.leshan.server.queue; + +import org.eclipse.leshan.server.registration.Registration; + +public class StaticClientAwakeTimeProvider implements ClientAwakeTimeProvider { + + private final int clientAwakeTime; + + /** + * Create a {@link ClientAwakeTimeProvider} which always return 9300ms which is the default CoAP MAX_TRANSMIT_WAIT + * value. + */ + public StaticClientAwakeTimeProvider() { + this.clientAwakeTime = 93000; + } + + public StaticClientAwakeTimeProvider(int defaultClientAwakeTime) { + this.clientAwakeTime = defaultClientAwakeTime; + } + + @Override + public int getClientAwakeTime(Registration reg) { + return clientAwakeTime; + } + +} diff --git a/leshan-server-core/src/test/java/org/eclipse/leshan/server/queue/PresenceServiceTest.java b/leshan-server-core/src/test/java/org/eclipse/leshan/server/queue/PresenceServiceTest.java index eccd6a843a..e8530d4bc0 100644 --- a/leshan-server-core/src/test/java/org/eclipse/leshan/server/queue/PresenceServiceTest.java +++ b/leshan-server-core/src/test/java/org/eclipse/leshan/server/queue/PresenceServiceTest.java @@ -31,8 +31,8 @@ * */ public class PresenceServiceTest { - - private PresenceServiceImpl presenceService = new PresenceServiceImpl(); + private ClientAwakeTimeProvider awakeTimeProvider = new StaticClientAwakeTimeProvider(); + private PresenceServiceImpl presenceService = new PresenceServiceImpl(awakeTimeProvider); @Test public void testSetOnlineForNonQueueMode() throws Exception { @@ -63,7 +63,6 @@ public void testIsOnline() throws Exception { private Registration givenASimpleClient() throws UnknownHostException { InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 5683); - Registration.Builder builder = new Registration.Builder("ID", "urn:client", Identity.unsecure(Inet4Address.getLoopbackAddress(), 12354), address); @@ -82,4 +81,4 @@ private Registration givenASimpleClientWithQueueMode() throws UnknownHostExcepti presenceService.setAwake(reg); return reg; } -} \ No newline at end of file +}