From 0c2f28ae96bf1f89f944b9a7d901e34861d85633 Mon Sep 17 00:00:00 2001 From: jansupol Date: Fri, 16 Sep 2022 23:22:11 +0200 Subject: [PATCH] Fix Container#reload Signed-off-by: jansupol --- .../httpserver/GrizzlyHttpContainer.java | 4 +- .../jdkhttp/JdkHttpHandlerContainer.java | 4 +- .../jersey/servlet/ServletContainer.java | 2 +- .../jersey/jetty/JettyHttpContainer.java | 4 +- .../netty/httpserver/NettyHttpContainer.java | 4 +- .../jersey/simple/SimpleContainer.java | 4 +- .../internal/inject/InjectionManager.java | 8 ++- .../jersey/server/ServerRuntime.java | 69 ++++++++++--------- .../cdi1x/internal/CdiComponentProvider.java | 4 +- ext/microprofile/mp-rest-client/pom.xml | 1 + .../managed/BinderRegisterExtension.java | 7 +- .../internal/managed/CdiInjectionManager.java | 7 +- .../managed/WrappingInjectionManager.java | 7 +- .../inject/cdi/se/CdiSeInjectionManager.java | 7 +- .../hk2/AbstractHk2InjectionManager.java | 9 ++- pom.xml | 2 +- .../jersey/tests/cdi/gf/GFTestApp.java | 29 ++++++++ .../jersey/tests/cdi/gf/GFTestResource.java | 10 +++ .../glassfish/jersey/tests/cdi/gf/GFTest.java | 19 ++++- 19 files changed, 148 insertions(+), 53 deletions(-) diff --git a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java index 3519624652..5bd8b1f68d 100644 --- a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java +++ b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -370,7 +370,7 @@ public ResourceConfig getConfiguration() { @Override public void reload() { - reload(appHandler.getConfiguration()); + reload(new ResourceConfig(appHandler.getConfiguration())); } @Override diff --git a/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java b/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java index 4f6cb30260..d1ebf61fa6 100644 --- a/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java +++ b/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -201,7 +201,7 @@ public ResourceConfig getConfiguration() { @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java index 522ba333d8..a454d61162 100644 --- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java +++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java @@ -640,7 +640,7 @@ public ResourceConfig getConfiguration() { @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override diff --git a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java index 06687ec48b..ccc2fe7a7a 100644 --- a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java +++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -417,7 +417,7 @@ public ResourceConfig getConfiguration() { @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override diff --git a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java index ac4bf4ef03..f21bd7ebef 100644 --- a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java +++ b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -53,7 +53,7 @@ public ApplicationHandler getApplicationHandler() { @Override public void reload() { - reload(appHandler.getConfiguration()); + reload(new ResourceConfig(appHandler.getConfiguration())); } @Override diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java index 3561eab14f..04e7f2ca58 100644 --- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java +++ b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -407,7 +407,7 @@ public ResourceConfig getConfiguration() { @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java index 36fc6103b8..4d5fd1c2ee 100644 --- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java +++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -50,6 +50,12 @@ public interface InjectionManager { */ void shutdown(); + /** + * Returns {@code true} when the {@link InjectionManager} has been shutdown, {@code false} otherwise. + * @return Whether the {@code InjectionManager} has been shutdown. + */ + boolean isShutdown(); + /** * Registers one bean represented using fields in the provided descriptor. The final bean can be direct bean or * factory object which will create the bean at the time of injection. {@code InjectionManager} is able to register a bean diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java b/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java index 981514c585..086bcda208 100644 --- a/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java +++ b/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -231,43 +231,50 @@ public void process(final ContainerRequest request) { requestScopeInstance, externalRequestScope.open(injectionManager)); context.initAsyncContext(asyncResponderHolder); - requestScope.runInScope(requestScopeInstance, new Runnable() { - @Override - public void run() { - try { - // set base URI into response builder thread-local variable - // for later resolving of relative location URIs - if (!disableLocationHeaderRelativeUriResolution) { - final URI uriToUse = - rfc7231LocationHeaderRelativeUriResolution ? request.getRequestUri() : request.getBaseUri(); - OutboundJaxrsResponse.Builder.setBaseUri(uriToUse); - } + try { + requestScope.runInScope(requestScopeInstance, new Runnable() { + @Override + public void run() { + try { + // set base URI into response builder thread-local variable + // for later resolving of relative location URIs + if (!disableLocationHeaderRelativeUriResolution) { + final URI uriToUse = + rfc7231LocationHeaderRelativeUriResolution ? request.getRequestUri() : request.getBaseUri(); + OutboundJaxrsResponse.Builder.setBaseUri(uriToUse); + } - final Ref endpointRef = Refs.emptyRef(); - final RequestProcessingContext data = Stages.process(context, requestProcessingRoot, endpointRef); + final Ref endpointRef = Refs.emptyRef(); + final RequestProcessingContext data = Stages.process(context, requestProcessingRoot, endpointRef); - final Endpoint endpoint = endpointRef.get(); - if (endpoint == null) { - // not found - throw new NotFoundException(); - } + final Endpoint endpoint = endpointRef.get(); + if (endpoint == null) { + // not found + throw new NotFoundException(); + } - final ContainerResponse response = endpoint.apply(data); + final ContainerResponse response = endpoint.apply(data); - if (!asyncResponderHolder.isAsync()) { - responder.process(response); - } else { - externalRequestScope.suspend(asyncResponderHolder.externalContext, injectionManager); + if (!asyncResponderHolder.isAsync()) { + responder.process(response); + } else { + externalRequestScope.suspend(asyncResponderHolder.externalContext, injectionManager); + } + } catch (final Throwable throwable) { + responder.process(throwable); + } finally { + asyncResponderHolder.release(); + // clear base URI from the thread + OutboundJaxrsResponse.Builder.clearBaseUri(); } - } catch (final Throwable throwable) { - responder.process(throwable); - } finally { - asyncResponderHolder.release(); - // clear base URI from the thread - OutboundJaxrsResponse.Builder.clearBaseUri(); } + }); + } catch (RuntimeException illegalStateException) { + if (!IllegalStateException.class.isInstance(illegalStateException.getCause()) || !injectionManager.isShutdown()) { + // consume the IllegalStateException: InjectionManager has been closed. + throw illegalStateException; } - }); + } } /** diff --git a/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java b/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java index 6ff37b4c94..ff63759604 100644 --- a/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java +++ b/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java @@ -671,7 +671,7 @@ public InjectionManagerInjectedCdiTarget(InjectionTarget delegate) { @Override public void inject(final Object t, final CreationalContext cc) { InjectionManager injectingManager = getEffectiveInjectionManager(); - if (injectingManager == null) { + if (injectingManager == null || /* reload */ injectingManager.isShutdown()) { injectingManager = effectiveInjectionManager; threadInjectionManagers.set(injectingManager); } @@ -737,7 +737,7 @@ public boolean isNullable() { @Override public Object create(final CreationalContext creationalContext) { InjectionManager injectionManager = getEffectiveInjectionManager(); - if (injectionManager == null) { + if (injectionManager == null || /* reload */ injectionManager.isShutdown()) { injectionManager = threadInjectionManagers.get(); } diff --git a/ext/microprofile/mp-rest-client/pom.xml b/ext/microprofile/mp-rest-client/pom.xml index 6265c0776a..a07cb3012e 100644 --- a/ext/microprofile/mp-rest-client/pom.xml +++ b/ext/microprofile/mp-rest-client/pom.xml @@ -116,6 +116,7 @@ ${cdi.osgi.version}, org.eclipse.microprofile.rest.client.*;version="[1,3)", + org.eclipse.microprofile.config;version="!", * diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java index da291dfd43..9787cfe432 100644 --- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java +++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -597,6 +597,11 @@ public void shutdown() { //noop } + @Override + public boolean isShutdown() { + return false; + } + @Override public void register(Binding binding) { BinderRegisterExtension.this.register(runtimeType, binding); diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java index e3746abec0..3c00646137 100644 --- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java +++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -333,6 +333,11 @@ public void shutdown() { } + @Override + public boolean isShutdown() { + return false; + } + protected Binder getBindings() { return bindings; } diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java index a3bea1ae43..5d40bfaa87 100644 --- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java +++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -50,6 +50,11 @@ public void shutdown() { injectionManager.shutdown(); } + @Override + public boolean isShutdown() { + return injectionManager.isShutdown(); + } + @Override public void register(Binding binding) { injectionManager.register(binding); diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java index 3a8d44d40f..6411310ba7 100644 --- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java +++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -289,6 +289,11 @@ public void shutdown() { } } + @Override + public boolean isShutdown() { + return !container.isRunning(); + } + @Override public void inject(Object injectMe, String classAnalyzer) { // TODO: Used only in legacy CDI integration. diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java index 5a71084448..3a46d60f4f 100644 --- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java +++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -51,6 +51,7 @@ abstract class AbstractHk2InjectionManager implements InjectionManager { private static final ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance(); private ServiceLocator locator; + private Boolean isShutdown = Boolean.FALSE; // TODO replace by getServiceLocator().isShutDown() in 3.x /** * Private constructor. @@ -182,6 +183,12 @@ public void shutdown() { } else { getServiceLocator().shutdown(); } + isShutdown = Boolean.TRUE; + } + + @Override + public boolean isShutdown() { + return isShutdown; } @Override diff --git a/pom.xml b/pom.xml index 0f08664574..1fe9764aae 100644 --- a/pom.xml +++ b/pom.xml @@ -448,7 +448,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.1.2 + 3.3.0 org.apache.maven.plugins diff --git a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java index 0d77c95489..dc4aa36f6f 100644 --- a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java +++ b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java @@ -16,13 +16,42 @@ package org.glassfish.jersey.tests.cdi.gf; +import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.server.spi.Container; +import org.glassfish.jersey.server.spi.ContainerLifecycleListener; import javax.ws.rs.ApplicationPath; @ApplicationPath("/test") public class GFTestApp extends ResourceConfig { + public static final String RELOADER = "RELOADER"; + private Reloader reloader = new Reloader(); + public GFTestApp() { super(GFTestResource.class); + register(reloader); + + property(CommonProperties.PROVIDER_DEFAULT_DISABLE, "ALL"); + property(RELOADER, reloader); + } + + static class Reloader implements ContainerLifecycleListener { + Container container; + + @Override + public void onStartup(Container container) { + this.container = container; + } + + @Override + public void onReload(Container container) { + + } + + @Override + public void onShutdown(Container container) { + + } } } diff --git a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java index 8e39cc8aea..d7a0c8f493 100644 --- a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java +++ b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java @@ -20,6 +20,8 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; @@ -34,4 +36,12 @@ public class GFTestResource { public String info() { return uriInfo.getBaseUri().toASCIIString(); } + + @GET + @Path("reload") + public String reload(@Context Application application) { + GFTestApp.Reloader reloader = (GFTestApp.Reloader) application.getProperties().get(GFTestApp.RELOADER); + reloader.container.reload(); + return GFTestApp.RELOADER; + } } diff --git a/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java b/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java index da49a8b447..078cf64a75 100644 --- a/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java +++ b/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java @@ -47,12 +47,27 @@ private static WebArchive createDeployment(String archiveName, Class...classe @Test public void testUriInfo() { - int port = Integer.parseInt(System.getProperty("webServerPort")); - try (Response response = ClientBuilder.newClient().target("http://localhost:" + port).path("gf-test/test/info").request().get()) { + try (Response response = ClientBuilder.newClient().target("http://localhost:" + port()) + .path("gf-test/test/info").request().get()) { String entity = response.readEntity(String.class); System.out.println(entity); Assertions.assertEquals(200, response.getStatus()); Assertions.assertTrue(entity.contains("gf-test/test")); } } + + @Test + public void testReload() { + try (Response response = ClientBuilder.newClient().target("http://localhost:" + port()) + .path("gf-test/test/reload").request().get()) { + Assertions.assertEquals(200, response.getStatus()); + Assertions.assertEquals(GFTestApp.RELOADER, response.readEntity(String.class)); + } + testUriInfo(); + } + + private static int port() { + int port = Integer.parseInt(System.getProperty("webServerPort")); + return port; + } }