Upgrade to Karaf 4.4.3 (#14040)

* Rework Servlets to use Http Whiteboard annotations in favor of proprietary `org.openhab.core.io.http.servlet` classes
* Resolve itest runbundles
* Fix dependency issues
* Catch proper exception when starting hueemulation UpnpServer

Also-by: Jan N. Klug <github@klug.nrw>
Signed-off-by: Wouter Born <github@maindrain.net>
This commit is contained in:
Wouter Born
2023-03-01 18:33:50 +01:00
committed by GitHub
parent db436a1dad
commit b2bf7256db
25 changed files with 325 additions and 361 deletions

View File

@@ -104,7 +104,7 @@ public class WundergroundUpdateReceiverDiscoveryService extends AbstractDiscover
setScanning(true);
if (servletControls != null && !servletControls.isActive()) {
servletWasInactive = true;
servletControls.activate();
servletControls.enable();
}
thinglessStationIds.keySet().forEach(this::createDiscoveryResult);
}
@@ -114,7 +114,7 @@ public class WundergroundUpdateReceiverDiscoveryService extends AbstractDiscover
super.stopScan();
thinglessStationIds.keySet().forEach(this::createDiscoveryResult);
if (!isBackgroundDiscoveryEnabled() && servletControls != null && servletWasInactive) {
servletControls.deactivate();
servletControls.disable();
}
setScanning(false);
}

View File

@@ -42,24 +42,21 @@ public class WundergroundUpdateReceiverHandlerFactory extends BaseThingHandlerFa
private final WundergroundUpdateReceiverDiscoveryService discoveryService;
private final ChannelTypeRegistry channelTypeRegistry;
private final WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider;
private final WundergroundUpdateReceiverServlet wunderGroundUpdateReceiverServlet;
private final ManagedThingProvider managedThingProvider;
private final WundergroundUpdateReceiverServlet wunderGroundUpdateReceiverServlet;
@Activate
public WundergroundUpdateReceiverHandlerFactory(@Reference HttpService httpService,
@Reference WundergroundUpdateReceiverDiscoveryService discoveryService,
@Reference WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider,
@Reference ChannelTypeRegistry channelTypeRegistry, @Reference ManagedThingProvider managedThingProvider) {
@Reference ChannelTypeRegistry channelTypeRegistry, @Reference ManagedThingProvider managedThingProvider,
@Reference WundergroundUpdateReceiverServlet wunderGroundUpdateReceiverServlet) {
this.discoveryService = discoveryService;
this.channelTypeRegistry = channelTypeRegistry;
this.channelTypeProvider = channelTypeProvider;
this.managedThingProvider = managedThingProvider;
this.wunderGroundUpdateReceiverServlet = new WundergroundUpdateReceiverServlet(httpService,
this.discoveryService);
this.discoveryService.servletControls = this.wunderGroundUpdateReceiverServlet;
if (this.discoveryService.isBackgroundDiscoveryEnabled()) {
this.wunderGroundUpdateReceiverServlet.activate();
}
this.wunderGroundUpdateReceiverServlet = wunderGroundUpdateReceiverServlet;
this.discoveryService.servletControls = wunderGroundUpdateReceiverServlet;
}
@Override
@@ -82,8 +79,7 @@ public class WundergroundUpdateReceiverHandlerFactory extends BaseThingHandlerFa
@Override
protected void deactivate(ComponentContext componentContext) {
this.wunderGroundUpdateReceiverServlet.deactivate();
this.wunderGroundUpdateReceiverServlet.dispose();
this.wunderGroundUpdateReceiverServlet.disable();
super.deactivate(componentContext);
}
}

View File

@@ -20,25 +20,26 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.time.Instant;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.Servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.io.http.servlet.BaseOpenHABServlet;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletName;
import org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,7 +50,10 @@ import org.slf4j.LoggerFactory;
* @author Daniel Demus - Initial contribution
*/
@NonNullByDefault
public class WundergroundUpdateReceiverServlet extends BaseOpenHABServlet
@HttpWhiteboardServletName(WundergroundUpdateReceiverServlet.SERVLET_URL)
@HttpWhiteboardServletPattern(WundergroundUpdateReceiverServlet.SERVLET_URL)
@Component(immediate = true, service = { Servlet.class, WundergroundUpdateReceiverServlet.class })
public class WundergroundUpdateReceiverServlet extends HttpServlet
implements WundergroundUpdateReceiverServletControls {
public static final String SERVLET_URL = "/weatherstation/updateweatherstation.php";
@@ -65,10 +69,12 @@ public class WundergroundUpdateReceiverServlet extends BaseOpenHABServlet
private boolean active = false;
private String errorDetail = "";
public WundergroundUpdateReceiverServlet(HttpService httpService,
WundergroundUpdateReceiverDiscoveryService discoveryService) {
super(httpService);
@Activate
public WundergroundUpdateReceiverServlet(
final @Reference WundergroundUpdateReceiverDiscoveryService discoveryService) {
this.discoveryService = discoveryService;
errorDetail = "";
active = discoveryService.isBackgroundDiscoveryEnabled();
}
public boolean isActive() {
@@ -87,10 +93,6 @@ public class WundergroundUpdateReceiverServlet extends BaseOpenHABServlet
return this.handlers.keySet();
}
public void activate() {
activate(SERVLET_URL, httpService.createDefaultHttpContext());
}
public void addHandler(WundergroundUpdateReceiverHandler handler) {
synchronized (this.handlers) {
if (this.handlers.containsKey(handler.getStationId())) {
@@ -102,7 +104,7 @@ public class WundergroundUpdateReceiverServlet extends BaseOpenHABServlet
this.handlers.put(handler.getStationId(), handler);
errorDetail = "";
if (!isActive()) {
activate();
enable();
}
}
}
@@ -114,22 +116,20 @@ public class WundergroundUpdateReceiverServlet extends BaseOpenHABServlet
this.handlers.remove(stationId);
}
if (this.handlers.isEmpty() && !this.discoveryService.isBackgroundDiscoveryEnabled()) {
deactivate();
disable();
}
}
}
public void deactivate() {
synchronized (LOCK) {
logger.debug("Stopping servlet {} at {}", getClass().getSimpleName(), SERVLET_URL);
try {
super.deactivate(SERVLET_URL);
} catch (IllegalArgumentException ignored) {
// SERVLET_URL is already unregistered
}
errorDetail = "";
active = false;
}
@Override
public void enable() {
active = true;
}
@Deactivate
public void disable() {
errorDetail = "";
active = false;
}
public void handlerConfigUpdated(WundergroundUpdateReceiverHandler handler) {
@@ -150,28 +150,7 @@ public class WundergroundUpdateReceiverServlet extends BaseOpenHABServlet
synchronized (this.handlers) {
Set<String> stationIds = new HashSet<>(getStationIds());
stationIds.forEach(this::removeHandler);
deactivate();
}
}
@Override
protected void activate(String alias, HttpContext httpContext) {
synchronized (LOCK) {
try {
logger.debug("Starting servlet {} at {}", getClass().getSimpleName(), alias);
Dictionary<String, String> props = new Hashtable<>(1, 10);
httpService.registerServlet(alias, this, props, httpContext);
errorDetail = "";
active = true;
} catch (NamespaceException e) {
active = false;
errorDetail = "Servlet couldn't be registered - alias " + alias + " already in use";
logger.warn("Error during servlet registration - alias {} already in use", alias, e);
} catch (ServletException e) {
active = false;
errorDetail = "Servlet couldn't be registered - " + e.getMessage();
logger.warn("Error during servlet registration", e);
}
disable();
}
}

View File

@@ -20,9 +20,9 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
@NonNullByDefault
public interface WundergroundUpdateReceiverServletControls {
void activate();
void enable();
void deactivate();
void disable();
boolean isActive();
}

View File

@@ -89,7 +89,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
WundergroundUpdateReceiverDiscoveryService discoveryService = new WundergroundUpdateReceiverDiscoveryService(
true);
HttpService httpService = mock(HttpService.class);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
discoveryService.addUnhandledStationId(REQ_STATION_ID, sut.normalizeParameterMap(req.getParameterMap()));
Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
.withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
@@ -138,15 +138,13 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
+ "action=updateraw&" + "realtime=1&" + "rtfreq=5";
WundergroundUpdateReceiverDiscoveryService discoveryService = mock(
WundergroundUpdateReceiverDiscoveryService.class);
HttpService httpService = mock(HttpService.class);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler = mock(WundergroundUpdateReceiverHandler.class);
when(handler.getStationId()).thenReturn(STATION_ID_1);
sut.addHandler(handler);
when(discoveryService.isBackgroundDiscoveryEnabled()).thenReturn(false);
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
HttpChannel httpChannel = mock(HttpChannel.class);
@@ -182,7 +180,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
WundergroundUpdateReceiverDiscoveryService discoveryService = new WundergroundUpdateReceiverDiscoveryService(
false);
HttpService httpService = mock(HttpService.class);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
discoveryService.addUnhandledStationId(REQ_STATION_ID, sut.normalizeParameterMap(req.getParameterMap()));
Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
.withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
@@ -196,7 +194,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
sut.addHandler(handler);
// When
sut.activate();
sut.enable();
// Then
assertThat(sut.isActive(), is(true));
@@ -228,7 +226,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
WundergroundUpdateReceiverDiscoveryService discoveryService = new WundergroundUpdateReceiverDiscoveryService(
true);
HttpService httpService = mock(HttpService.class);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
discoveryService.addUnhandledStationId(REQ_STATION_ID, sut.normalizeParameterMap(req1.getParameterMap()));
Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
.withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
@@ -261,7 +259,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
HttpVersion.HTTP_1_1, new HttpFields());
Request req2 = new Request(httpChannel, null);
req2.setMetaData(request);
sut.activate();
sut.enable();
// Then
assertThat(sut.isActive(), is(true));
@@ -295,7 +293,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
WundergroundUpdateReceiverDiscoveryService discoveryService = new WundergroundUpdateReceiverDiscoveryService(
true);
HttpService httpService = mock(HttpService.class);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
discoveryService.addUnhandledStationId(REQ_STATION_ID, sut.normalizeParameterMap(req1.getParameterMap()));
Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
.withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
@@ -328,7 +326,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
HttpVersion.HTTP_1_1, new HttpFields());
Request req2 = new Request(httpChannel, null);
req2.setMetaData(request);
sut.activate();
sut.enable();
// Then
assertThat(sut.isActive(), is(true));
@@ -359,7 +357,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
WundergroundUpdateReceiverDiscoveryService discoveryService = new WundergroundUpdateReceiverDiscoveryService(
true);
HttpService httpService = mock(HttpService.class);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
discoveryService.addUnhandledStationId(REQ_STATION_ID, sut.normalizeParameterMap(req1.getParameterMap()));
Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
.withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
@@ -403,7 +401,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
HttpVersion.HTTP_1_1, new HttpFields());
Request req2 = new Request(httpChannel, null);
req2.setMetaData(request);
sut.activate();
sut.enable();
// Then
assertThat(sut.isActive(), is(true));

View File

@@ -19,7 +19,6 @@ import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.openMocks;
@@ -75,7 +74,6 @@ import org.openhab.core.thing.binding.builder.ThingBuilder;
import org.openhab.core.thing.type.ChannelKind;
import org.openhab.core.thing.type.ChannelTypeBuilder;
import org.openhab.core.thing.type.ChannelTypeRegistry;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
/**
@@ -90,7 +88,6 @@ class WundergroundUpdateReceiverServletTest {
private static final ThingUID TEST_THING_UID = new ThingUID(
WundergroundUpdateReceiverBindingConstants.THING_TYPE_UPDATE_RECEIVER, "test-receiver");
private @Mock HttpService httpService;
private @Mock ChannelTypeRegistry channelTypeRegistry;
private @Mock WundergroundUpdateReceiverDiscoveryService discoveryService;
private @Mock ManagedThingProvider managedThingProvider;
@@ -103,7 +100,7 @@ class WundergroundUpdateReceiverServletTest {
@Test
void theServletIsActiveAfterTheFirstHandlerIsAdded() throws ServletException, NamespaceException {
// Given
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler = mock(WundergroundUpdateReceiverHandler.class);
when(handler.getStationId()).thenReturn(STATION_ID_1);
@@ -111,7 +108,6 @@ class WundergroundUpdateReceiverServletTest {
sut.addHandler(handler);
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
}
@@ -119,7 +115,7 @@ class WundergroundUpdateReceiverServletTest {
void theServletIsInactiveAfterTheLastHandlerIsRemovedAndBackgroundDiscoveryIsDisabled()
throws ServletException, NamespaceException {
// Given
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler = mock(WundergroundUpdateReceiverHandler.class);
when(handler.getStationId()).thenReturn(STATION_ID_1);
when(discoveryService.isBackgroundDiscoveryEnabled()).thenReturn(false);
@@ -128,14 +124,12 @@ class WundergroundUpdateReceiverServletTest {
sut.addHandler(handler);
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
// When
sut.removeHandler(handler.getStationId());
// Then
verify(httpService).unregister(WundergroundUpdateReceiverServlet.SERVLET_URL);
assertThat(sut.isActive(), is(false));
}
@@ -143,7 +137,7 @@ class WundergroundUpdateReceiverServletTest {
void theServletIsActiveAfterTheLastHandlerIsRemovedButBackgroundDiscoveryIsEnabled()
throws ServletException, NamespaceException {
// Given
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler = mock(WundergroundUpdateReceiverHandler.class);
when(handler.getStationId()).thenReturn(STATION_ID_1);
when(discoveryService.isBackgroundDiscoveryEnabled()).thenReturn(true);
@@ -152,21 +146,19 @@ class WundergroundUpdateReceiverServletTest {
sut.addHandler(handler);
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
// When
sut.removeHandler(handler.getStationId());
// Then
verify(httpService, never()).unregister(WundergroundUpdateReceiverServlet.SERVLET_URL);
assertThat(sut.isActive(), is(true));
}
@Test
void onDisposeAllHandlersAreRemovedAndServletIsInactive() throws ServletException, NamespaceException {
// Given
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler1 = mock(WundergroundUpdateReceiverHandler.class);
when(handler1.getStationId()).thenReturn(STATION_ID_1);
WundergroundUpdateReceiverHandler handler2 = mock(WundergroundUpdateReceiverHandler.class);
@@ -177,14 +169,12 @@ class WundergroundUpdateReceiverServletTest {
sut.addHandler(handler2);
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
// When
sut.dispose();
// Then
verify(httpService, times(2)).unregister(WundergroundUpdateReceiverServlet.SERVLET_URL);
assertThat(sut.isActive(), is(false));
}
@@ -192,7 +182,7 @@ class WundergroundUpdateReceiverServletTest {
void OnDisposeAllHandlersAreRemovedAndServletIsInactiveEvenThoughBackgroundDiscoveryIsEnabled()
throws ServletException, NamespaceException {
// Given
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler1 = mock(WundergroundUpdateReceiverHandler.class);
when(handler1.getStationId()).thenReturn(STATION_ID_1);
WundergroundUpdateReceiverHandler handler2 = mock(WundergroundUpdateReceiverHandler.class);
@@ -204,14 +194,12 @@ class WundergroundUpdateReceiverServletTest {
sut.addHandler(handler2);
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
// When
sut.dispose();
// Then
verify(httpService).unregister(WundergroundUpdateReceiverServlet.SERVLET_URL);
assertThat(sut.isActive(), is(false));
}
@@ -231,7 +219,7 @@ class WundergroundUpdateReceiverServletTest {
.thenReturn(ChannelTypeBuilder.state(LAST_QUERY_STATE_CHANNELTYPEUID, "Label", "String").build());
when(this.channelTypeRegistry.getChannelType(LAST_QUERY_TRIGGER_CHANNELTYPEUID))
.thenReturn(ChannelTypeBuilder.trigger(LAST_QUERY_TRIGGER_CHANNELTYPEUID, "Label").build());
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(thing, sut, discoveryService,
new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry, managedThingProvider);
ThingHandlerCallback mockCallback = mock(ThingHandlerCallback.class);
@@ -241,7 +229,6 @@ class WundergroundUpdateReceiverServletTest {
handler.initialize();
// Then
verify(httpService).registerServlet(eq(WundergroundUpdateReceiverServlet.SERVLET_URL), eq(sut), any(), any());
assertThat(sut.isActive(), is(true));
assertThat(sut.getStationIds(), hasItems(STATION_ID_1));
@@ -263,7 +250,7 @@ class WundergroundUpdateReceiverServletTest {
ThingUID testThingUID = new ThingUID(WundergroundUpdateReceiverBindingConstants.THING_TYPE_UPDATE_RECEIVER,
"test-receiver");
final String queryString = "ID=dfggger&PASSWORD=XXXXXX&tempf=26.1&humidity=74&dewptf=18.9&windchillf=26.1&winddir=14&windspeedmph=1.34&windgustmph=2.46&rainin=0.00&dailyrainin=0.00&weeklyrainin=0.00&monthlyrainin=0.08&yearlyrainin=3.06&solarradiation=42.24&UV=1&indoortempf=69.3&indoorhumidity=32&baromin=30.39&AqNOX=21&lowbatt=1&dateutc=2021-02-07%2014:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5";
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
List<Channel> channels = List.of(
ChannelBuilder
.create(new ChannelUID(testThingUID, METADATA_GROUP,
@@ -407,7 +394,7 @@ class WundergroundUpdateReceiverServletTest {
ThingUID testThingUID = new ThingUID(WundergroundUpdateReceiverBindingConstants.THING_TYPE_UPDATE_RECEIVER,
"test-receiver");
final String queryString = "ID=dfggger&PASSWORD=XXXXXX&temp1f=26.1&humidity=74&temp2f=25.1&lowbatt=1&soilmoisture1=78&soilmoisture2=73&dateutc=2021-02-07%2014:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5";
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
List<Channel> channels = List.of(
ChannelBuilder
.create(new ChannelUID(testThingUID, METADATA_GROUP,

View File

@@ -194,7 +194,7 @@ public class UpnpServer extends HttpServlet implements Consumer<HueEmulationConf
try {
httpService.unregister(DISCOVERY_FILE);
} catch (IllegalArgumentException ignore) {
} catch (RuntimeException ignore) {
}
try {

View File

@@ -32,6 +32,11 @@
<artifactId>derby</artifactId>
<version>10.14.2.0</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>