From c3e27396c62f191b4343df151e5a86bfa63a32f3 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 5 Oct 2021 00:36:47 +0200 Subject: chore: change package name --- language-web/build.gradle | 2 +- language-web/package.json | 2 +- .../solver/language/web/CacheControlFilter.java | 53 -------- .../viatra/solver/language/web/ProblemServlet.java | 38 ------ .../solver/language/web/ProblemWebModule.java | 11 -- .../solver/language/web/ProblemWebSetup.java | 23 ---- .../viatra/solver/language/web/ServerLauncher.java | 141 --------------------- .../refinery/language/web/CacheControlFilter.java | 53 ++++++++ .../refinery/language/web/ProblemServlet.java | 38 ++++++ .../refinery/language/web/ProblemWebModule.java | 11 ++ .../refinery/language/web/ProblemWebSetup.java | 25 ++++ .../refinery/language/web/ServerLauncher.java | 141 +++++++++++++++++++++ 12 files changed, 270 insertions(+), 268 deletions(-) delete mode 100644 language-web/src/main/java/org/eclipse/viatra/solver/language/web/CacheControlFilter.java delete mode 100644 language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemServlet.java delete mode 100644 language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebModule.java delete mode 100644 language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebSetup.java delete mode 100644 language-web/src/main/java/org/eclipse/viatra/solver/language/web/ServerLauncher.java create mode 100644 language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java create mode 100644 language-web/src/main/java/tools/refinery/language/web/ProblemServlet.java create mode 100644 language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java create mode 100644 language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java create mode 100644 language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java (limited to 'language-web') diff --git a/language-web/build.gradle b/language-web/build.gradle index 888cbb5c..0403bb3d 100644 --- a/language-web/build.gradle +++ b/language-web/build.gradle @@ -22,7 +22,7 @@ for (taskName in ['compileJava', 'processResources']) { def webpackOutputDir = "${buildDir}/webpack" def productionResources = "${webpackOutputDir}/production" -def serverMainClass = 'org.eclipse.viatra.solver.language.web.ServerLauncher' +def serverMainClass = 'tools.refinery.language.web.ServerLauncher' apply plugin: 'org.siouan.frontend-jdk11' import org.siouan.frontendgradleplugin.infrastructure.gradle.RunNpmYarn diff --git a/language-web/package.json b/language-web/package.json index 5084df8a..2dfc6325 100644 --- a/language-web/package.json +++ b/language-web/package.json @@ -20,7 +20,7 @@ "bugs": { "url": "https://github.com/graphs4value/issues" }, - "homepage": "https://github.com/graphs4value/refinery#readme", + "homepage": "https://refinery.tools", "devDependencies": { "@babel/core": "^7.15.5", "@babel/preset-env": "^7.15.6", diff --git a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/CacheControlFilter.java b/language-web/src/main/java/org/eclipse/viatra/solver/language/web/CacheControlFilter.java deleted file mode 100644 index a1d086c4..00000000 --- a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/CacheControlFilter.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.eclipse.viatra.solver.language.web; - -import java.io.IOException; -import java.util.regex.Pattern; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class CacheControlFilter implements Filter { - - private static final String CACHE_CONTROL_HEADER = "Cache-Control"; - - private static final String EXPIRES_HEADER = "Expires"; - - private static final Pattern CACHE_URI_PATTERN = Pattern.compile(".*\\.(css|gif|js|map|png|svg|woff2)"); - - private static final long EXPIRY = 31536000; - - private static final String CACHE_CONTROL_CACHE_VALUE = "public, max-age: " + EXPIRY + ", immutable"; - - private static final String CACHE_CONTROL_NO_CACHE_VALUE = "no-cache, no-store, max-age: 0, must-revalidate"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - // Nothing to initialize. - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - if (request instanceof HttpServletRequest httpRequest && response instanceof HttpServletResponse httpResponse) { - if (CACHE_URI_PATTERN.matcher(httpRequest.getRequestURI()).matches()) { - httpResponse.setHeader(CACHE_CONTROL_HEADER, CACHE_CONTROL_CACHE_VALUE); - httpResponse.setDateHeader(EXPIRES_HEADER, System.currentTimeMillis() + EXPIRY * 1000L); - } else { - httpResponse.setHeader(CACHE_CONTROL_HEADER, CACHE_CONTROL_NO_CACHE_VALUE); - httpResponse.setDateHeader(EXPIRES_HEADER, 0); - } - } - chain.doFilter(request, response); - } - - @Override - public void destroy() { - // Nothing to dispose. - } -} diff --git a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemServlet.java b/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemServlet.java deleted file mode 100644 index 18b86ade..00000000 --- a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemServlet.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * generated by Xtext 2.25.0 - */ -package org.eclipse.viatra.solver.language.web; - -import javax.servlet.ServletException; - -import org.eclipse.xtext.util.DisposableRegistry; -import org.eclipse.xtext.web.servlet.XtextServlet; - -/** - * Deploy this class into a servlet container to enable DSL-specific services. - */ -public class ProblemServlet extends XtextServlet { - - private static final long serialVersionUID = 1L; - - // Xtext requires a mutable servlet instance field. - @SuppressWarnings("squid:S2226") - private DisposableRegistry disposableRegistry; - - @Override - public void init() throws ServletException { - super.init(); - var injector = new ProblemWebSetup().createInjectorAndDoEMFRegistration(); - this.disposableRegistry = injector.getInstance(DisposableRegistry.class); - } - - @Override - public void destroy() { - if (disposableRegistry != null) { - disposableRegistry.dispose(); - disposableRegistry = null; - } - super.destroy(); - } - -} diff --git a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebModule.java b/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebModule.java deleted file mode 100644 index 0eea7f1e..00000000 --- a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebModule.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * generated by Xtext 2.25.0 - */ -package org.eclipse.viatra.solver.language.web; - - -/** - * Use this class to register additional components to be used within the web application. - */ -public class ProblemWebModule extends AbstractProblemWebModule { -} diff --git a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebSetup.java b/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebSetup.java deleted file mode 100644 index 8d5778af..00000000 --- a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ProblemWebSetup.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * generated by Xtext 2.25.0 - */ -package org.eclipse.viatra.solver.language.web; - -import com.google.inject.Guice; -import com.google.inject.Injector; -import org.eclipse.viatra.solver.language.ProblemRuntimeModule; -import org.eclipse.viatra.solver.language.ProblemStandaloneSetup; -import org.eclipse.viatra.solver.language.ide.ProblemIdeModule; -import org.eclipse.xtext.util.Modules2; - -/** - * Initialization support for running Xtext languages in web applications. - */ -public class ProblemWebSetup extends ProblemStandaloneSetup { - - @Override - public Injector createInjector() { - return Guice.createInjector(Modules2.mixin(new ProblemRuntimeModule(), new ProblemIdeModule(), new ProblemWebModule())); - } - -} diff --git a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ServerLauncher.java b/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ServerLauncher.java deleted file mode 100644 index a6d58f95..00000000 --- a/language-web/src/main/java/org/eclipse/viatra/solver/language/web/ServerLauncher.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * generated by Xtext 2.25.0 - */ -package org.eclipse.viatra.solver.language.web; - -import java.io.File; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.EnumSet; -import java.util.Set; - -import javax.servlet.DispatcherType; -import javax.servlet.SessionTrackingMode; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.session.SessionHandler; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.log.Slf4jLog; -import org.eclipse.jetty.util.resource.Resource; - -public class ServerLauncher { - public static final String DEFAULT_LISTEN_ADDRESS = "localhost"; - - public static final int DEFAULT_LISTEN_PORT = 1312; - - // Use this cookie name for load balancing. - public static final String SESSION_COOKIE_NAME = "JSESSIONID"; - - private static final Slf4jLog LOG = new Slf4jLog(ServerLauncher.class.getName()); - - private final Server server; - - public ServerLauncher(InetSocketAddress bindAddress, Resource baseResource) { - server = new Server(bindAddress); - var handler = new ServletContextHandler(); - addSessionHandler(handler); - addProblemServlet(handler); - if (baseResource != null) { - handler.setBaseResource(baseResource); - handler.setWelcomeFiles(new String[] { "index.html" }); - addDefaultServlet(handler); - } - handler.addFilter(CacheControlFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); - server.setHandler(handler); - } - - private void addSessionHandler(ServletContextHandler handler) { - var sessionHandler = new SessionHandler(); - sessionHandler.setSessionTrackingModes(Set.of(SessionTrackingMode.COOKIE)); - sessionHandler.setSessionCookie(SESSION_COOKIE_NAME); - handler.setSessionHandler(sessionHandler); - } - - private void addProblemServlet(ServletContextHandler handler) { - handler.addServlet(ProblemServlet.class, "/xtext-service/*"); - } - - private void addDefaultServlet(ServletContextHandler handler) { - var defaultServletHolder = new ServletHolder(DefaultServlet.class); - var isWindows = System.getProperty("os.name").toLowerCase().contains("win"); - // Avoid file locking on Windows: https://stackoverflow.com/a/4985717 - // See also the related Jetty ticket: - // https://github.com/eclipse/jetty.project/issues/2925 - defaultServletHolder.setInitParameter("useFileMappedBuffer", isWindows ? "false" : "true"); - handler.addServlet(defaultServletHolder, "/"); - } - - public void start() throws Exception { - server.start(); - LOG.info("Server started " + server.getURI() + "..."); - LOG.info("Press enter to stop the server..."); - int key = System.in.read(); - if (key != -1) { - server.stop(); - } else { - LOG.warn("Console input is not available. " - + "In order to stop the server, you need to cancel process manually."); - } - } - - public static void main(String[] args) { - try { - var bindAddress = getBindAddress(); - var baseResource = getBaseResource(); - var serverLauncher = new ServerLauncher(bindAddress, baseResource); - serverLauncher.start(); - } catch (Exception exception) { - LOG.warn(exception); - System.exit(1); - } - } - - private static String getListenAddress() { - var listenAddress = System.getenv("LISTEN_ADDRESS"); - if (listenAddress == null) { - return DEFAULT_LISTEN_ADDRESS; - } - return listenAddress; - } - - private static int getListenPort() { - var portStr = System.getenv("LISTEN_PORT"); - if (portStr != null) { - return Integer.parseInt(portStr); - } - return DEFAULT_LISTEN_PORT; - } - - private static InetSocketAddress getBindAddress() { - var listenAddress = getListenAddress(); - var listenPort = getListenPort(); - return new InetSocketAddress(listenAddress, listenPort); - } - - private static Resource getBaseResource() throws IOException, URISyntaxException { - var baseResourceOverride = System.getenv("BASE_RESOURCE"); - if (baseResourceOverride != null) { - // If a user override is provided, use it. - return Resource.newResource(baseResourceOverride); - } - var indexUrlInJar = ServerLauncher.class.getResource("/webapp/index.html"); - if (indexUrlInJar != null) { - // If the app is packaged in the jar, serve it. - var webRootUri = URI.create(indexUrlInJar.toURI().toASCIIString().replaceFirst("/index.html$", "/")); - return Resource.newResource(webRootUri); - } - // Look for unpacked production artifacts (convenience for running from IDE). - var unpackedResourcePathComponents = new String[] { System.getProperty("user.dir"), "build", "webpack", - "production" }; - var unpackedResourceDir = new File(String.join(File.separator, unpackedResourcePathComponents)); - if (unpackedResourceDir.isDirectory()) { - return Resource.newResource(unpackedResourceDir); - } - // Fall back to just serving a 404. - return null; - } -} diff --git a/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java b/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java new file mode 100644 index 00000000..e39ce54c --- /dev/null +++ b/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java @@ -0,0 +1,53 @@ +package tools.refinery.language.web; + +import java.io.IOException; +import java.util.regex.Pattern; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class CacheControlFilter implements Filter { + + private static final String CACHE_CONTROL_HEADER = "Cache-Control"; + + private static final String EXPIRES_HEADER = "Expires"; + + private static final Pattern CACHE_URI_PATTERN = Pattern.compile(".*\\.(css|gif|js|map|png|svg|woff2)"); + + private static final long EXPIRY = 31536000; + + private static final String CACHE_CONTROL_CACHE_VALUE = "public, max-age: " + EXPIRY + ", immutable"; + + private static final String CACHE_CONTROL_NO_CACHE_VALUE = "no-cache, no-store, max-age: 0, must-revalidate"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // Nothing to initialize. + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + if (request instanceof HttpServletRequest httpRequest && response instanceof HttpServletResponse httpResponse) { + if (CACHE_URI_PATTERN.matcher(httpRequest.getRequestURI()).matches()) { + httpResponse.setHeader(CACHE_CONTROL_HEADER, CACHE_CONTROL_CACHE_VALUE); + httpResponse.setDateHeader(EXPIRES_HEADER, System.currentTimeMillis() + EXPIRY * 1000L); + } else { + httpResponse.setHeader(CACHE_CONTROL_HEADER, CACHE_CONTROL_NO_CACHE_VALUE); + httpResponse.setDateHeader(EXPIRES_HEADER, 0); + } + } + chain.doFilter(request, response); + } + + @Override + public void destroy() { + // Nothing to dispose. + } +} diff --git a/language-web/src/main/java/tools/refinery/language/web/ProblemServlet.java b/language-web/src/main/java/tools/refinery/language/web/ProblemServlet.java new file mode 100644 index 00000000..d249525f --- /dev/null +++ b/language-web/src/main/java/tools/refinery/language/web/ProblemServlet.java @@ -0,0 +1,38 @@ +/* + * generated by Xtext 2.25.0 + */ +package tools.refinery.language.web; + +import javax.servlet.ServletException; + +import org.eclipse.xtext.util.DisposableRegistry; +import org.eclipse.xtext.web.servlet.XtextServlet; + +/** + * Deploy this class into a servlet container to enable DSL-specific services. + */ +public class ProblemServlet extends XtextServlet { + + private static final long serialVersionUID = 1L; + + // Xtext requires a mutable servlet instance field. + @SuppressWarnings("squid:S2226") + private DisposableRegistry disposableRegistry; + + @Override + public void init() throws ServletException { + super.init(); + var injector = new ProblemWebSetup().createInjectorAndDoEMFRegistration(); + this.disposableRegistry = injector.getInstance(DisposableRegistry.class); + } + + @Override + public void destroy() { + if (disposableRegistry != null) { + disposableRegistry.dispose(); + disposableRegistry = null; + } + super.destroy(); + } + +} diff --git a/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java b/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java new file mode 100644 index 00000000..799a9c64 --- /dev/null +++ b/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java @@ -0,0 +1,11 @@ +/* + * generated by Xtext 2.25.0 + */ +package tools.refinery.language.web; + + +/** + * Use this class to register additional components to be used within the web application. + */ +public class ProblemWebModule extends AbstractProblemWebModule { +} diff --git a/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java b/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java new file mode 100644 index 00000000..4738bc80 --- /dev/null +++ b/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java @@ -0,0 +1,25 @@ +/* + * generated by Xtext 2.25.0 + */ +package tools.refinery.language.web; + +import org.eclipse.xtext.util.Modules2; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +import tools.refinery.language.ProblemRuntimeModule; +import tools.refinery.language.ProblemStandaloneSetup; +import tools.refinery.language.ide.ProblemIdeModule; + +/** + * Initialization support for running Xtext languages in web applications. + */ +public class ProblemWebSetup extends ProblemStandaloneSetup { + + @Override + public Injector createInjector() { + return Guice.createInjector(Modules2.mixin(new ProblemRuntimeModule(), new ProblemIdeModule(), new ProblemWebModule())); + } + +} diff --git a/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java b/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java new file mode 100644 index 00000000..c6ee94dc --- /dev/null +++ b/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java @@ -0,0 +1,141 @@ +/* + * generated by Xtext 2.25.0 + */ +package tools.refinery.language.web; + +import java.io.File; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.EnumSet; +import java.util.Set; + +import javax.servlet.DispatcherType; +import javax.servlet.SessionTrackingMode; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.log.Slf4jLog; +import org.eclipse.jetty.util.resource.Resource; + +public class ServerLauncher { + public static final String DEFAULT_LISTEN_ADDRESS = "localhost"; + + public static final int DEFAULT_LISTEN_PORT = 1312; + + // Use this cookie name for load balancing. + public static final String SESSION_COOKIE_NAME = "JSESSIONID"; + + private static final Slf4jLog LOG = new Slf4jLog(ServerLauncher.class.getName()); + + private final Server server; + + public ServerLauncher(InetSocketAddress bindAddress, Resource baseResource) { + server = new Server(bindAddress); + var handler = new ServletContextHandler(); + addSessionHandler(handler); + addProblemServlet(handler); + if (baseResource != null) { + handler.setBaseResource(baseResource); + handler.setWelcomeFiles(new String[] { "index.html" }); + addDefaultServlet(handler); + } + handler.addFilter(CacheControlFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); + server.setHandler(handler); + } + + private void addSessionHandler(ServletContextHandler handler) { + var sessionHandler = new SessionHandler(); + sessionHandler.setSessionTrackingModes(Set.of(SessionTrackingMode.COOKIE)); + sessionHandler.setSessionCookie(SESSION_COOKIE_NAME); + handler.setSessionHandler(sessionHandler); + } + + private void addProblemServlet(ServletContextHandler handler) { + handler.addServlet(ProblemServlet.class, "/xtext-service/*"); + } + + private void addDefaultServlet(ServletContextHandler handler) { + var defaultServletHolder = new ServletHolder(DefaultServlet.class); + var isWindows = System.getProperty("os.name").toLowerCase().contains("win"); + // Avoid file locking on Windows: https://stackoverflow.com/a/4985717 + // See also the related Jetty ticket: + // https://github.com/eclipse/jetty.project/issues/2925 + defaultServletHolder.setInitParameter("useFileMappedBuffer", isWindows ? "false" : "true"); + handler.addServlet(defaultServletHolder, "/"); + } + + public void start() throws Exception { + server.start(); + LOG.info("Server started " + server.getURI() + "..."); + LOG.info("Press enter to stop the server..."); + int key = System.in.read(); + if (key != -1) { + server.stop(); + } else { + LOG.warn("Console input is not available. " + + "In order to stop the server, you need to cancel process manually."); + } + } + + public static void main(String[] args) { + try { + var bindAddress = getBindAddress(); + var baseResource = getBaseResource(); + var serverLauncher = new ServerLauncher(bindAddress, baseResource); + serverLauncher.start(); + } catch (Exception exception) { + LOG.warn(exception); + System.exit(1); + } + } + + private static String getListenAddress() { + var listenAddress = System.getenv("LISTEN_ADDRESS"); + if (listenAddress == null) { + return DEFAULT_LISTEN_ADDRESS; + } + return listenAddress; + } + + private static int getListenPort() { + var portStr = System.getenv("LISTEN_PORT"); + if (portStr != null) { + return Integer.parseInt(portStr); + } + return DEFAULT_LISTEN_PORT; + } + + private static InetSocketAddress getBindAddress() { + var listenAddress = getListenAddress(); + var listenPort = getListenPort(); + return new InetSocketAddress(listenAddress, listenPort); + } + + private static Resource getBaseResource() throws IOException, URISyntaxException { + var baseResourceOverride = System.getenv("BASE_RESOURCE"); + if (baseResourceOverride != null) { + // If a user override is provided, use it. + return Resource.newResource(baseResourceOverride); + } + var indexUrlInJar = ServerLauncher.class.getResource("/webapp/index.html"); + if (indexUrlInJar != null) { + // If the app is packaged in the jar, serve it. + var webRootUri = URI.create(indexUrlInJar.toURI().toASCIIString().replaceFirst("/index.html$", "/")); + return Resource.newResource(webRootUri); + } + // Look for unpacked production artifacts (convenience for running from IDE). + var unpackedResourcePathComponents = new String[] { System.getProperty("user.dir"), "build", "webpack", + "production" }; + var unpackedResourceDir = new File(String.join(File.separator, unpackedResourcePathComponents)); + if (unpackedResourceDir.isDirectory()) { + return Resource.newResource(unpackedResourceDir); + } + // Fall back to just serving a 404. + return null; + } +} -- cgit v1.2.3-70-g09d2