From 18c893562705b225a6e53934f0e8aaa4d9a35123 Mon Sep 17 00:00:00 2001 From: Kai Kreuzer Date: Sat, 3 Sep 2016 00:11:51 +0200 Subject: [PATCH] allow setting the current page on the initial request and added logging Signed-off-by: Kai Kreuzer --- .../rest/sitemap/SitemapSubscriptionService.java | 16 +++++++++++++--- .../sitemap/internal/SitemapEventOutput.java | 8 ++++++++ .../rest/sitemap/internal/SitemapResource.java | 8 ++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java index 5b1332635c2..ccbb0cff9c9 100644 --- a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java +++ b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java @@ -21,6 +21,8 @@ import org.eclipse.smarthome.model.sitemap.SitemapProvider; import org.eclipse.smarthome.model.sitemap.Widget; import org.eclipse.smarthome.ui.items.ItemUIRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * This is a service that provides the possibility to manage subscriptions to sitemaps. @@ -34,6 +36,10 @@ */ public class SitemapSubscriptionService { + private static final String SITEMAP_PAGE_SEPARATOR = "#"; + + private final Logger logger = LoggerFactory.getLogger(SitemapSubscriptionService.class); + public interface SitemapSubscriptionCallback { void onEvent(SitemapEvent event); @@ -85,6 +91,7 @@ protected void removeSitemapProvider(SitemapProvider provider) { public String createSubscription(SitemapSubscriptionCallback callback) { String subscriptionId = UUID.randomUUID().toString(); callbacks.put(subscriptionId, callback); + logger.debug("Created new subscription with id {}", subscriptionId); return subscriptionId; } @@ -100,6 +107,7 @@ public void removeSubscription(String subscriptionId) { if (listener != null) { listener.dispose(); } + logger.debug("Removed subscription with id {}", subscriptionId); } /** @@ -119,7 +127,7 @@ public boolean exists(String subscriptionId) { * @return the id of the currently active page */ public String getPageId(String subscriptionId) { - return pageOfSubscriptionMap.get(subscriptionId).split("-")[1]; + return pageOfSubscriptionMap.get(subscriptionId).split(SITEMAP_PAGE_SEPARATOR)[1]; } /** @@ -129,7 +137,7 @@ public String getPageId(String subscriptionId) { * @return the name of the current sitemap */ public String getSitemapName(String subscriptionId) { - return pageOfSubscriptionMap.get(subscriptionId).split("-")[0]; + return pageOfSubscriptionMap.get(subscriptionId).split(SITEMAP_PAGE_SEPARATOR)[0]; } /** @@ -144,6 +152,8 @@ public void setPageId(String subscriptionId, String sitemapName, String pageId) pageOfSubscriptionMap.put(subscriptionId, getValue(sitemapName, pageId)); removeOldListener(subscriptionId); initNewListener(subscriptionId, sitemapName, pageId); + logger.debug("Subscription {} changed to page {} of sitemap {}", + new Object[] { subscriptionId, pageId, sitemapName }); } else { throw new IllegalArgumentException("Subscription " + subscriptionId + " does not exist!"); } @@ -177,7 +187,7 @@ private void removeOldListener(String subscriptionId) { } private String getValue(String sitemapName, String pageId) { - return sitemapName + "-" + pageId; + return sitemapName + SITEMAP_PAGE_SEPARATOR + pageId; } private Sitemap getSitemap(String sitemapName) { diff --git a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapEventOutput.java b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapEventOutput.java index 5a8f3a6782d..7e6e7be3324 100644 --- a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapEventOutput.java +++ b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapEventOutput.java @@ -12,6 +12,8 @@ import org.eclipse.smarthome.io.rest.sitemap.SitemapSubscriptionService; import org.glassfish.jersey.media.sse.EventOutput; import org.glassfish.jersey.media.sse.OutboundEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * {@link EventOutput} implementation that takes a subscription id parameter and only writes out events that match the @@ -24,6 +26,8 @@ */ public class SitemapEventOutput extends EventOutput { + private final Logger logger = LoggerFactory.getLogger(SitemapSubscriptionService.class); + private final String subscriptionId; private final SitemapSubscriptionService subscriptions; @@ -44,6 +48,10 @@ public void write(OutboundEvent chunk) throws IOException { if (sitemapName != null && sitemapName.equals(subscriptions.getSitemapName(subscriptionId)) && pageId != null && pageId.equals(subscriptions.getPageId(subscriptionId))) { super.write(chunk); + if (logger.isDebugEnabled() && event instanceof SitemapWidgetEvent) { + logger.debug("Sent sitemap event for widget {} to subscription {}.", + ((SitemapWidgetEvent) event).widgetId, subscriptionId); + } } } } diff --git a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapResource.java b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapResource.java index 3195f8aff4a..dd18ca4d329 100644 --- a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapResource.java +++ b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/SitemapResource.java @@ -207,7 +207,6 @@ public Response getPageData(@Context HttpHeaders headers, public Object createEventSubscription() { String subscriptionId = subscriptions.createSubscription(this); URI uri = uriInfo.getBaseUriBuilder().path(PATH_SITEMAPS).path(SEGMENT_EVENTS).path(subscriptionId).build(); - logger.debug("Created sitemap event subscription {}.", subscriptionId); return Response.created(uri); } @@ -224,11 +223,16 @@ public Object createEventSubscription() { @ApiResponses(value = { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 404, message = "Subscription not found.") }) public Object getSitemapEvents( - @PathParam("subscriptionid") @ApiParam(value = "subscription id") String subscriptionId) { + @PathParam("subscriptionid") @ApiParam(value = "subscription id") String subscriptionId, + @QueryParam("sitemap") @ApiParam(value = "sitemap name", required = false) String sitemapname, + @QueryParam("pageid") @ApiParam(value = "page id", required = false) String pageId) { if (!subscriptions.exists(subscriptionId)) { return JSONResponse.createResponse(Status.NOT_FOUND, null, "Subscription id " + subscriptionId + " does not exist."); } + if (sitemapname != null && pageId != null) { + subscriptions.setPageId(subscriptionId, sitemapname, pageId); + } final EventOutput eventOutput = new SitemapEventOutput(subscriptions, subscriptionId); broadcaster.add(eventOutput); logger.debug("Client requested sitemap event stream for subscription {}.", subscriptionId);