- * ClassLoader is applicable for use when we are in NPM mode and are serving
- * from the VAADIN/build folder with no folder changes in path.
- *
- * @param filenameWithPath requested filename containing path
- * @return true if we are ok to try serving the file
- */
- private boolean isAllowedVAADINBuildOrStaticUrl(String filenameWithPath) {
- // Check that we target VAADIN/build | VAADIN/static | themes/theme-name
- return filenameWithPath.startsWith("/" + VAADIN_BUILD_FILES_PATH)
- || filenameWithPath.startsWith("/" + VAADIN_STATIC_FILES_PATH)
- || APP_THEME_PATTERN.matcher(filenameWithPath).find();
- }
-
private boolean resourceIsDirectory(URL resource) {
if (resource.getPath().endsWith("/")) {
return true;
@@ -418,6 +432,68 @@ private boolean resourceIsDirectory(URL resource) {
return "file".equals(resource.getProtocol()) && Files.isDirectory(Paths.get(resourceURI));
}
+
+ private static URL findAssetInFrontendThemesOrDevBundle(
+ VaadinService vaadinService, String assetPath) throws IOException {
+ DeploymentConfiguration deploymentConfiguration = vaadinService
+ .getDeploymentConfiguration();
+ // First, look for the theme assets in the {project.root}/frontend/
+ // themes/my-theme folder
+ File frontendFolder = new File(
+ deploymentConfiguration.getProjectFolder(),
+ FrontendUtils.FRONTEND);
+ File assetInFrontendThemes = new File(frontendFolder, assetPath);
+ if (assetInFrontendThemes.exists()) {
+ return assetInFrontendThemes.toURI().toURL();
+ }
+
+ // Also look into jar-resources for a packaged theme
+ File jarResourcesFolder = FrontendUtils
+ .getJarResourcesFolder(frontendFolder);
+ assetInFrontendThemes = new File(jarResourcesFolder, assetPath);
+
+ if (assetInFrontendThemes.exists()) {
+ return assetInFrontendThemes.toURI().toURL();
+ }
+
+ // Second, look into default dev bundle
+ Matcher matcher = StaticFileServer.APP_THEME_ASSETS_PATTERN.matcher(assetPath);
+ if (!matcher.find()) {
+ throw new IllegalStateException(
+ "Asset path should match the theme pattern");
+ }
+
+ final String themeName = matcher.group(1);
+ String defaultBundleAssetPath = assetPath.replaceFirst(themeName,
+ Constants.DEV_BUNDLE_NAME);
+ URL assetInDevBundleUrl = vaadinService.getClassLoader()
+ .getResource(Constants.DEV_BUNDLE_JAR_PATH + Constants.ASSETS
+ + defaultBundleAssetPath);
+
+ // Or search in the application dev-bundle (if the assets come from
+ // node_modules)
+ if (assetInDevBundleUrl == null) {
+ String assetInDevBundle = "/" + Constants.ASSETS + "/" + assetPath;
+ assetInDevBundleUrl = DevBundleUtils.findBundleFile(
+ deploymentConfiguration.getProjectFolder(),
+ deploymentConfiguration.getBuildFolder(), assetInDevBundle);
+ }
+
+ if (assetInDevBundleUrl == null) {
+ String assetName = assetPath.substring(
+ assetPath.indexOf(themeName) + themeName.length());
+ throw new IllegalStateException(String.format(
+ "Asset '%1$s' is not found in project frontend directory"
+ + ", default development bundle or in the application "
+ + "bundle '{build}/%2$s/assets/'. \n"
+ + "Verify that the asset is available in "
+ + "'frontend/themes/%3$s/' directory and is added into the "
+ + "'assets' block of the 'theme.json' file.",
+ assetName, Constants.DEV_BUNDLE_LOCATION, themeName));
+ }
+ return assetInDevBundleUrl;
+ }
+
/**
* Get the file URI for the resource jar file. Returns give URI if
* URI.scheme is not of type jar.
@@ -556,9 +632,12 @@ class ResponseWriter implements Serializable {
*/
private static final int MAX_OVERLAPPING_RANGE_COUNT = 2;
+ private static final FileResolver FILE_RESOLVER = new FileResolverImpl();
+
private final int bufferSize;
private final boolean brotliEnabled;
+
/**
* Create a response writer with the given deployment configuration.
*
@@ -837,10 +916,9 @@ private boolean verifyRangeLimits(List Component: ${productAndMessage.product.name} ${productAndMessage.product.version} Component: ${productAndMessage.product.name} ${productAndMessage.product.version} Component: ${productAndMessage.product.name} ${productAndMessage.product.version} Component: ${productAndMessage.product.name} ${productAndMessage.product.version}
* Dependent beans are instantiated without any warning, but do not get
- * destroyed properly. {@link javax.annotation.PreDestroy} won't run.
+ * destroyed properly. {@link jakarta.annotation.PreDestroy} won't run.
*
* @param true
if the reference has been collected,
+ * false
if the reference is still reachable
+ * @throws InterruptedException
+ * if interrupted while waiting for garbage collection to finish
+ */
+ public static boolean isGarbageCollected(WeakReference> ref) throws InterruptedException {
+ for (int i = 0; i < 5; i++) {
+ System.gc();
+ if (ref.get() == null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void createIndexHtmlStub(File projectRootFolder) throws IOException {
+ createStubFileInFrontend(projectRootFolder, INDEX_HTML);
+ }
+
+ public static void createWebComponentHtmlStub(File projectRootFolder) throws IOException {
+ createStubFileInFrontend(projectRootFolder, WEB_COMPONENT_HTML);
+ }
+
+ public static void createStubFileInFrontend(File projectRootFolder, String stubFileName) throws IOException {
+ try (InputStream indexStream =
+ TestUtil.class.getClassLoader().getResourceAsStream("frontend/" + stubFileName)) {
+ String indexHtmlContent = IOUtils.toString(Objects.requireNonNull(indexStream), UTF_8);
+ File indexHtml = new File(new File(projectRootFolder, "frontend"), stubFileName);
+ FileUtils.forceMkdirParent(indexHtml);
+ FileUtils.writeStringToFile(indexHtml, indexHtmlContent, UTF_8);
+ }
+ }
+
+ public static void createStatsJsonStub(File projectRootFolder) throws IOException {
+ String content = "{\"npmModules\": {}, "
+ + "\"entryScripts\": [\"foo.js\"], "
+ + "\"packageJsonHash\": \"42\","
+ + "\"indexHtmlGenerated\": []}";
+ createStubFile(projectRootFolder, "target/" + Constants.DEV_BUNDLE_LOCATION + "/config/stats.json", content);
+ }
+
+ public static void createStylesCssStubInBundle(File projectRootFolder, String themeName, String content)
+ throws IOException {
+ createStubFile(
+ projectRootFolder,
+ "target/" + Constants.DEV_BUNDLE_LOCATION + "/assets/themes/" + themeName + "/styles.css",
+ content);
+ }
+
+ public static void createThemeJs(File projectRootFolder) throws IOException {
+ String content = "import {applyTheme as _applyTheme} from './theme-my-theme.generated.js';"
+ + "export const applyTheme = _applyTheme;";
+ createStubFile(projectRootFolder, "frontend/generated/" + THEME_IMPORTS_NAME, content);
+ }
+
+ public static void createStyleCssStubInFrontend(File projectRootFolder, String themeName, String content)
+ throws IOException {
+ createStubFile(projectRootFolder, "frontend/themes/" + themeName + "/styles.css", content);
+ }
+
+ public static void createStubFile(File projectRootFolder, String relativePath, String content) throws IOException {
+ File stub = new File(projectRootFolder, relativePath);
+ FileUtils.forceMkdirParent(stub);
+ FileUtils.writeStringToFile(stub, content, UTF_8);
+ }
+}
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VaadinVerticleUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VaadinVerticleUT.java
index a0fc1a3e..1993376f 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VaadinVerticleUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VaadinVerticleUT.java
@@ -26,7 +26,7 @@
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
-import javax.servlet.ServletException;
+import jakarta.servlet.ServletException;
import com.vaadin.flow.i18n.I18NProvider;
import com.vaadin.flow.server.InitParameters;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxStaticFileServerTest.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxStaticFileServerTest.java
index 89e7cf68..728b9d2b 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxStaticFileServerTest.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxStaticFileServerTest.java
@@ -22,6 +22,9 @@
*/
package com.github.mcollovati.vertx.vaadin;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.WriteListener;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -47,13 +50,11 @@
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.WriteListener;
-import javax.servlet.http.HttpServletResponse;
import com.vaadin.flow.function.DeploymentConfiguration;
import com.vaadin.flow.internal.CurrentInstance;
import com.vaadin.flow.server.HttpStatusCode;
+import com.vaadin.flow.server.Mode;
import com.vaadin.flow.server.VaadinService;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpHeaders;
@@ -66,6 +67,7 @@
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mockito;
@@ -80,8 +82,14 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.matches;
+/*
+ * NOTE: this code has been copy/pasted and adapted from vaadin-quarkus extension, credit goes to Vaadin Ltd.
+ */
public class VertxStaticFileServerTest implements Serializable {
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
private OverrideableStaticFileServer fileServer;
private RoutingContext routingContext;
private HttpServerRequest request;
@@ -204,6 +212,15 @@ public boolean matches(Object item) {
configuration = Mockito.mock(DeploymentConfiguration.class);
Mockito.when(configuration.isProductionMode()).thenReturn(true);
+ Mockito.when(configuration.getMode()).thenAnswer(q -> {
+ if (configuration.isProductionMode()) {
+ return Mode.PRODUCTION_CUSTOM;
+ } else if (configuration.frontendHotdeploy()) {
+ return Mode.DEVELOPMENT_FRONTEND_LIVERELOAD;
+ } else {
+ return Mode.DEVELOPMENT_BUNDLE;
+ }
+ });
Mockito.when(vaadinService.getDeploymentConfiguration()).thenReturn(configuration);
@@ -1104,6 +1121,54 @@ public void getStaticResource_delegateToVaadinService() throws MalformedURLExcep
Assert.assertSame(url, result);
}
+ @Test
+ public void serveStaticResource_projectThemeResourceRequest_serveFromFrontend() throws IOException {
+ File projectRootFolder = temporaryFolder.newFolder();
+ final String styles = "body { background: black; }";
+ TestUtil.createStyleCssStubInFrontend(projectRootFolder, "my-theme", styles);
+
+ Mockito.when(configuration.frontendHotdeploy()).thenReturn(false);
+ Mockito.when(configuration.isProductionMode()).thenReturn(false);
+ Mockito.when(configuration.getProjectFolder()).thenReturn(projectRootFolder);
+ Mockito.when(configuration.getBuildFolder()).thenReturn("target");
+
+ setupRequestURI("", "/VAADIN/themes/my-theme/styles.css");
+ Assert.assertTrue(fileServer.serveStaticResource(routingContext));
+ Assert.assertArrayEquals(styles.getBytes(StandardCharsets.UTF_8), responseOutput.getBytes());
+ }
+
+ @Test
+ public void serveStaticResource_externalThemeResourceRequest_serveFromBundle() throws IOException {
+ File projectRootFolder = temporaryFolder.newFolder();
+ final String styles = "body { background: black; }";
+ TestUtil.createStylesCssStubInBundle(projectRootFolder, "my-theme", styles);
+
+ Mockito.when(configuration.frontendHotdeploy()).thenReturn(false);
+ Mockito.when(configuration.isProductionMode()).thenReturn(false);
+ Mockito.when(configuration.getProjectFolder()).thenReturn(projectRootFolder);
+ Mockito.when(configuration.getBuildFolder()).thenReturn("target");
+
+ setupRequestURI("", "/VAADIN/themes/my-theme/styles.css");
+ Assert.assertTrue(fileServer.serveStaticResource(routingContext));
+ Assert.assertArrayEquals(styles.getBytes(StandardCharsets.UTF_8), responseOutput.getBytes());
+ }
+
+ @Test
+ public void serveStaticResource_themeResourceRequest_productionMode_notServeFromBundleNorFromFrontend()
+ throws IOException {
+ File projectRootFolder = temporaryFolder.newFolder();
+ final String styles = "body { background: black; }";
+ TestUtil.createStylesCssStubInBundle(projectRootFolder, "my-theme", styles);
+
+ Mockito.when(configuration.frontendHotdeploy()).thenReturn(false);
+ Mockito.when(configuration.isProductionMode()).thenReturn(true);
+ Mockito.when(configuration.getProjectFolder()).thenReturn(projectRootFolder);
+ Mockito.when(configuration.getBuildFolder()).thenReturn("target");
+
+ setupRequestURI("", "/themes/my-theme/styles.css");
+ Assert.assertFalse(fileServer.serveStaticResource(routingContext));
+ }
+
private static class CapturingServletOutputStream extends ServletOutputStream {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinRequestUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinRequestUT.java
index dd6e2f98..60663682 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinRequestUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinRequestUT.java
@@ -331,7 +331,7 @@ public void shouldDelegateGetCookies() {
when(routingContext.cookieMap())
.thenReturn(Stream.of(cookie1, cookie2).collect(Collectors.toMap(Cookie::getName, identity())));
assertThat(vaadinRequest.getCookies()).isNull();
- javax.servlet.http.Cookie[] cookies = vaadinRequest.getCookies();
+ jakarta.servlet.http.Cookie[] cookies = vaadinRequest.getCookies();
assertThat(cookies).hasSize(2);
assertThat(cookies[0])
.extracting("name", "value", "domain", "httpOnly", "maxAge", "path", "secure")
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinResponseUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinResponseUT.java
index 007ad5ca..ef8e7e56 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinResponseUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinResponseUT.java
@@ -28,7 +28,7 @@
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
-import javax.servlet.http.Cookie;
+import jakarta.servlet.http.Cookie;
import com.pholser.junit.quickcheck.From;
import com.pholser.junit.quickcheck.Property;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinServiceUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinServiceUT.java
index 79d3bfd3..791b0cdf 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinServiceUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxVaadinServiceUT.java
@@ -25,8 +25,6 @@
import java.net.MalformedURLException;
import java.net.URL;
-import com.vaadin.flow.internal.UsageStatistics;
-import com.vaadin.flow.server.Constants;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.net.SocketAddress;
import io.vertx.core.net.impl.SocketAddressImpl;
@@ -80,14 +78,6 @@ public void resolveResourceNPM_production() {
Assert.assertEquals("/foo", service.resolveResource("context://foo"));
}
- @Test
- public void should_report_flow_bootstrapHandler() {
- mocks.getDeploymentConfiguration().useDeprecatedV14Bootstrapping(true);
-
- Assert.assertTrue(UsageStatistics.getEntries()
- .anyMatch(e -> Constants.STATISTIC_FLOW_BOOTSTRAPHANDLER.equals(e.getName())));
- }
-
private String testLocation(String base, String contextPath, String pathInfo) throws Exception {
RoutingContext routingContext = createRequest(base, contextPath, pathInfo);
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionUT.java
index ee1f8a12..27b3d047 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionUT.java
@@ -25,8 +25,8 @@
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionBindingListener;
+import jakarta.servlet.http.HttpSessionBindingEvent;
+import jakarta.servlet.http.HttpSessionBindingListener;
import org.assertj.core.api.ThrowableAssert;
import org.junit.Before;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithClusteredSessionStoreUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithClusteredSessionStoreUT.java
index 6a699682..73507683 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithClusteredSessionStoreUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithClusteredSessionStoreUT.java
@@ -22,8 +22,8 @@
*/
package com.github.mcollovati.vertx.vaadin;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionBindingListener;
+import jakarta.servlet.http.HttpSessionBindingEvent;
+import jakarta.servlet.http.HttpSessionBindingListener;
import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithLocalSessionStoreUT.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithLocalSessionStoreUT.java
index cc2dc94d..6b817e79 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithLocalSessionStoreUT.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/VertxWrappedSessionWithLocalSessionStoreUT.java
@@ -22,8 +22,8 @@
*/
package com.github.mcollovati.vertx.vaadin;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionBindingListener;
+import jakarta.servlet.http.HttpSessionBindingEvent;
+import jakarta.servlet.http.HttpSessionBindingListener;
import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/VertxVaadinConnectEndpointServiceTest.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/VertxVaadinConnectEndpointServiceTest.java
index 353c94d1..45a0326e 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/VertxVaadinConnectEndpointServiceTest.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/VertxVaadinConnectEndpointServiceTest.java
@@ -31,11 +31,11 @@
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
-import javax.annotation.security.DenyAll;
-import javax.annotation.security.PermitAll;
-import javax.annotation.security.RolesAllowed;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.annotation.security.DenyAll;
+import jakarta.annotation.security.PermitAll;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/auth/VertxConnectAccessCheckerTest.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/auth/VertxConnectAccessCheckerTest.java
index 1c48702c..798851bb 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/auth/VertxConnectAccessCheckerTest.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/connect/auth/VertxConnectAccessCheckerTest.java
@@ -23,9 +23,9 @@
package com.github.mcollovati.vertx.vaadin.connect.auth;
import java.lang.reflect.Method;
-import javax.annotation.security.DenyAll;
-import javax.annotation.security.PermitAll;
-import javax.annotation.security.RolesAllowed;
+import jakarta.annotation.security.DenyAll;
+import jakarta.annotation.security.PermitAll;
+import jakarta.annotation.security.RolesAllowed;
import com.vaadin.flow.server.VaadinService;
import com.vaadin.flow.server.auth.AnonymousAllowed;
diff --git a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/startup/testdata/AnotherTestInstantiatorFactory.java b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/startup/testdata/AnotherTestInstantiatorFactory.java
index f0d78faf..c82ef24f 100644
--- a/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/startup/testdata/AnotherTestInstantiatorFactory.java
+++ b/vertx-vaadin-flow/src/test/java/com/github/mcollovati/vertx/vaadin/startup/testdata/AnotherTestInstantiatorFactory.java
@@ -34,11 +34,6 @@ public class AnotherTestInstantiatorFactory implements InstantiatorFactory {
public static class TestInstantiator implements Instantiator {
- @Override
- public boolean init(VaadinService service) {
- return false;
- }
-
@Override
public Stream
-
- \n
\n
-
- \n
\n