From bf3216004607b0f18e88b032367a6a185d08210c Mon Sep 17 00:00:00 2001 From: wjonassen Date: Wed, 3 Jan 2024 15:32:41 -0500 Subject: [PATCH 01/13] Bug Fixes on start script for rest api jetty. Updates to get each sub project building and running properly, except for web-client-jetty. --- gradle/libs.versions.toml | 12 ++++----- opendcs-rest-api-jetty/build.gradle | 18 +++++++------ .../java/org/opendcs/odcsapi/jetty/Start.java | 25 ++++++------------- opendcs-rest-api/build.gradle | 4 ++- opendcs-web-client-jetty/build.gradle | 2 +- 5 files changed, 27 insertions(+), 34 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd8db1be..a6e7673e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] -opendcs = "7.0.10" +opendcs = "7.0.11" jetty = "9.4.53.v20231009" -servlet-api = "3.1.0" -slf4j = "2.0.0" +servlet-api = "4.0.1" +slf4j = "2.0.10" jersey = "2.40" -postgresql = "42.6.0" -swagger = "2.2.15" -swagger-ui = "5.9.0" +postgresql = "42.7.1" +swagger = "2.2.20" +swagger-ui = "5.10.3" glassfish-jaxb = "2.3.3" websocket = "1.1" diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 6bf349dc..32d7eb96 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -1,5 +1,3 @@ -import org.apache.tools.ant.filters.ReplaceTokens - plugins { id "opendcs-rest-api.java-conventions" id "opendcs-rest-api.deps-conventions" @@ -46,15 +44,19 @@ task startJetty(type: JavaExec) { -> "-s") } -task prepareStartScript(type: Copy) { - from './bin/start.sh' - into "${buildDir}/odcsapi-jetty-standalone/bin/" - filter(ReplaceTokens, tokens: ['jarName': jar.archiveFileName.get()]) +task createStartScript() { + doLast { + new File("${buildDir}/bin", "start.sh").text = """ +#!/bin/bash +cd `dirname \$0`/.. +java \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS + """ + } } task bundle(type: Tar) { dependsOn jar - dependsOn prepareStartScript + dependsOn createStartScript archiveExtension = 'tar.gz' into('libs') { @@ -64,6 +66,6 @@ task bundle(type: Tar) { from jar } into('bin') { - from "${buildDir}/odcsapi-jetty-standalone/bin/start.sh" + from "${project.buildDir}/bin/start.sh" } } diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 6851bb6b..7ee6036f 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -33,11 +33,9 @@ import javax.servlet.DispatcherType; -import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.SecureRequestCustomizer; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.servlet.DefaultServlet; @@ -107,7 +105,8 @@ public static void main(String[] args) appLogger.info("================ Starting ==============="); // Initialize the JETTY server and servlet holders. - Server server = new Server(); + org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(); + //Server server = new Server(); ServletContextHandler ctx = new ServletContextHandler(ServletContextHandler.SESSIONS); ctx.setContextPath("/"); server.setHandler(ctx); @@ -157,8 +156,8 @@ public static void main(String[] args) } } } - - ServletHolder serHol = ctx.addServlet(ServletContainer.class, + + ServletHolder serHol = ctx.addServlet(ServletContainer.class, "/" + apiCmdLineArgs.getContext() + "/*"); serHol.setInitOrder(1); serHol.setInitParameter("jersey.config.server.provider.packages", @@ -224,7 +223,7 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) ctx.addServlet(new ServletHolder(new DefaultServlet()), "/*"); ServerConnector connector = new ServerConnector(server); - ArrayList connectors = new ArrayList(); + ArrayList connectors = new ArrayList(); if (apiCmdLineArgs.getHttpPort() >= 0) { connector.setPort(apiCmdLineArgs.getHttpPort()); @@ -246,20 +245,10 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) connectors.add(sslConnector); } - server.setConnectors(connectors.toArray(new Connector[connectors.size()])); + server.setConnectors(connectors.toArray(new ServerConnector[connectors.size()])); /******* Controlling Headers ******************/ - /* - System.out.println("Removing server header."); - for(Connector y : server.getConnectors()) { - for(ConnectionFactory x : y.getConnectionFactories()) { - if(x instanceof HttpConnectionFactory) { - //Removes Server Header from each connector - ((HttpConnectionFactory)x).getHttpConfiguration().setSendServerVersion(false); - } - } - } - */ + // Start the server. server.start(); server.join(); diff --git a/opendcs-rest-api/build.gradle b/opendcs-rest-api/build.gradle index 057d3a6c..af78b901 100644 --- a/opendcs-rest-api/build.gradle +++ b/opendcs-rest-api/build.gradle @@ -15,10 +15,12 @@ dependencies { implementation(libs.jersey.client) implementation(libs.jersey.server) implementation(libs.json.jackson) + implementation(libs.jersey.container.servlet) implementation(libs.jersey.common) implementation(libs.jersey.hk2) implementation(libs.swagger.ui) - implementation(libs.jaxb.runtime) + runtimeOnly(libs.jaxb.runtime) + runtimeOnly(libs.postgresql) } publishing { diff --git a/opendcs-web-client-jetty/build.gradle b/opendcs-web-client-jetty/build.gradle index 2ebf4b2d..f0779e79 100644 --- a/opendcs-web-client-jetty/build.gradle +++ b/opendcs-web-client-jetty/build.gradle @@ -55,4 +55,4 @@ task bundle(type: Tar) { into('bin') { from "${buildDir}/odcsapi-jetty-standalone/bin/start.sh" } -} +} \ No newline at end of file From 05a0f3ae09c1725651212802918c4a97246169cb Mon Sep 17 00:00:00 2001 From: wjonassen Date: Thu, 4 Jan 2024 16:43:01 -0500 Subject: [PATCH 02/13] Cleaning up code and bug fix in build.gradle. Reducing servlet-api back to 3.1.0, updating build.gradle to create the bin directory if it does not exist, removing unnecessary comment in Start.java. --- gradle/libs.versions.toml | 2 +- opendcs-rest-api-jetty/build.gradle | 12 ++++++++++-- .../main/java/org/opendcs/odcsapi/jetty/Start.java | 11 ++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a6e7673e..a151d00b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ opendcs = "7.0.11" jetty = "9.4.53.v20231009" -servlet-api = "4.0.1" +servlet-api = "3.1.0" slf4j = "2.0.10" jersey = "2.40" postgresql = "42.7.1" diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 32d7eb96..0bc18298 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -46,7 +46,14 @@ task startJetty(type: JavaExec) { -> task createStartScript() { doLast { - new File("${buildDir}/bin", "start.sh").text = """ + + //Make bin directory if it does not exist already. buildDir is now deprecated. + File buildDir = project.layout.getBuildDirectory().get().getAsFile(); + File binDir = new File(buildDir.toString(), "bin"); + project.mkdir(binDir); + + //Make the start.sh file. + new File(binDir, "start.sh").text = """ #!/bin/bash cd `dirname \$0`/.. java \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS @@ -66,6 +73,7 @@ task bundle(type: Tar) { from jar } into('bin') { - from "${project.buildDir}/bin/start.sh" + //from "${project.buildDir}/bin/start.sh" + from new File(project.layout.getBuildDirectory().get().getAsFile(), "bin/start.sh"); } } diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 7ee6036f..29f50aca 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -61,8 +61,7 @@ public class Start { private static ApiCmdLineArgs apiCmdLineArgs = new ApiCmdLineArgs(); - - + public static void main(String[] args) throws Exception { @@ -106,7 +105,6 @@ public static void main(String[] args) // Initialize the JETTY server and servlet holders. org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(); - //Server server = new Server(); ServletContextHandler ctx = new ServletContextHandler(ServletContextHandler.SESSIONS); ctx.setContextPath("/"); server.setHandler(ctx); @@ -191,7 +189,10 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) ds.setURL(dbUrl); String afn = ApiEnvExpander.expand(dbAuthFile); AuthFileReader afr = new AuthFileReader(afn); - try { afr.read(); } + try + { + afr.read(); + } catch(Exception ex) { String msg = String.format("Cannot read DB auth from file '%s': %s", afn, ex); @@ -253,4 +254,4 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) server.start(); server.join(); } -} \ No newline at end of file +} From 25cca49db3fe91571171f1bbd1f6560f88d3c58b Mon Sep 17 00:00:00 2001 From: wjonassen Date: Wed, 10 Jan 2024 13:55:37 -0500 Subject: [PATCH 03/13] Code changes for building via gradle, along with usability enhancements for the user to run these projects once it has been built. Also, the beginnings of using slf4j alongside logback. --- gradle/libs.versions.toml | 18 ++++- opendcs-rest-api-jetty/build.gradle | 2 + .../java/org/opendcs/odcsapi/jetty/Start.java | 80 ++++++++++--------- .../src/main/resources/logback.xml | 26 ++++++ opendcs-web-client-jetty/build.gradle | 62 ++++++++++++-- .../opendcs/odcswebclient/jetty/Start.java | 32 +++++++- opendcs-web-client/build.gradle | 4 +- .../src/main/java/api/Gateway.java | 52 +++++++----- .../src/main/webapp/conf/api.conf | 6 +- 9 files changed, 209 insertions(+), 73 deletions(-) create mode 100644 opendcs-rest-api/src/main/resources/logback.xml diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a151d00b..d17e3960 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,13 @@ opendcs = "7.0.11" jetty = "9.4.53.v20231009" +jetty-jsp = "9.2.30.v20200428" +javax-servlet-jsp = "2.3.0" +jasper-runtime = "5.5.23" +#jetty = "9.0.0.v20130308" +logback = "1.3.14" +apache-tomcat = "9.0.84" +tomcat-embed = "9.0.84" servlet-api = "3.1.0" slf4j = "2.0.10" jersey = "2.40" @@ -17,14 +24,23 @@ mockito = "3.12.4" [libraries] opendcs = { module = "org.opendcs:opendcs", version.ref = "opendcs" } - +apache-tomcat = { module = "org.apache.tomcat:tomcat-catalina", version.ref = "apache-tomcat"} +jetty-jsp = { module = "org.eclipse.jetty:jetty-jsp", version.ref = "jetty-jsp" } +jetty-plus = { module = "org.eclipse.jetty:jetty-plus", version.ref = "jetty" } +jetty-annotations = { module = "org.eclipse.jetty:jetty-annotations", version.ref = "jetty" } jetty-server = { module = "org.eclipse.jetty:jetty-server", version.ref = "jetty" } jetty-servlets = { module = "org.eclipse.jetty:jetty-servlets", version.ref = "jetty" } jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jetty" } jetty-webapp = { module = "org.eclipse.jetty:jetty-webapp", version.ref = "jetty" } +jasper-runtime = { module = "tomcat:jasper-runtime", version.ref = "jasper-runtime" } +tomcat-embed = { module = "org.apache.tomcat.embed:tomcat-embed-jasper", version.ref = "tomcat-embed" } + + +javax-servlet-jsp = { module = "javax.servlet.jsp:javax.servlet.jsp-api", version.ref= "javax-servlet-jsp" } servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "servlet-api" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } +logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } jersey-client = { module = "org.glassfish.jersey.core:jersey-client", version.ref = "jersey" } jersey-server = { module = "org.glassfish.jersey.core:jersey-server", version.ref = "jersey" } json-jackson = { module = "org.glassfish.jersey.media:jersey-media-json-jackson", version.ref = "jersey" } diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 0bc18298..7f88aaff 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -12,6 +12,8 @@ dependencies { implementation(libs.jersey.container.servlet) implementation(libs.postgresql) implementation(libs.swagger.jaxrs2) + implementation(libs.slf4j.api) + implementation(libs.logback) } jar { diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 29f50aca..e32eb670 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -25,11 +25,17 @@ import java.util.EnumSet; import java.util.Properties; import java.util.Scanner; -import java.util.logging.FileHandler; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; + + +//import java.util.logging.FileHandler; +//import java.util.logging.Handler; +//import java.util.logging.Level; +//import java.util.logging.Logger; +//import java.util.logging.SimpleFormatter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.DispatcherType; @@ -70,38 +76,40 @@ public static void main(String[] args) corsList.add(new String[] { "Access-Control-Allow-Headers", CrossOriginFilter.ALLOWED_HEADERS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Methods", CrossOriginFilter.ALLOWED_METHODS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Credentials", CrossOriginFilter.ALLOW_CREDENTIALS_PARAM }); - + // Set up logging - String rootlogfile = ApiEnvExpander.expand("$DCSTOOL_USERDIR/jetty.log"); - System.out.println("root logger goes to " + rootlogfile); - Logger rootLogger = Logger.getLogger(""); - rootLogger.setLevel(Level.INFO); - while (rootLogger.getHandlers().length > 0) - rootLogger.removeHandler(rootLogger.getHandlers()[0]); - Handler rootHandler = new FileHandler(rootlogfile, 10000000, 5); - rootHandler.setFormatter(new SimpleFormatter()); - rootLogger.addHandler(rootHandler); + Logger rootLogger = LoggerFactory.getLogger(""); + + + //rootLogger.setLevel(Level.INFO); + //while (rootLogger.getHandlers().length > 0) + // rootLogger.removeHandler(rootLogger.getHandlers()[0]); + //Handler rootHandler = new FileHandler(rootlogfile, 10000000, 5); + //rootHandler.setFormatter(new SimpleFormatter()); + //rootLogger.addHandler(rootHandler); rootLogger.info("================ Starting ==============="); - String applogfile = ApiEnvExpander.expand("$DCSTOOL_USERDIR/odcsapi.log"); - System.out.println("app logger goes to " + applogfile); - Logger appLogger = Logger.getLogger(ApiConstants.loggerName); - appLogger.setLevel(Level.INFO); - while (appLogger.getHandlers().length > 0) - appLogger.removeHandler(appLogger.getHandlers()[0]); - Handler appHandler = new FileHandler(applogfile, 10000000, 5); - appHandler.setFormatter(new LogFormatter()); - appLogger.addHandler(appHandler); + //String applogfile = ApiEnvExpander.expand("$DCSTOOL_USERDIR/odcsapi.log"); + //System.out.println("app logger goes to " + applogfile); + Logger appLogger = LoggerFactory.getLogger(ApiConstants.loggerName); + //appLogger.setLevel(Level.INFO); + //while (appLogger.getHandlers().length > 0) + // appLogger.removeHandler(appLogger.getHandlers()[0]); + //Handler appHandler = new FileHandler(applogfile, 10000000, 5); + //appHandler.setFormatter(new LogFormatter()); + //appLogger.addHandler(appHandler); // Parse args - appLogger.config("DCSTOOL_USERDIR=" + System.getProperty("DCSTOOL_USERDIR") + ", parsing args..."); + //appLogger.config("DCSTOOL_USERDIR=" + System.getProperty("DCSTOOL_USERDIR") + ", parsing args..."); + appLogger.info("DCSTOOL_USERDIR={}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); + apiCmdLineArgs.parseArgs(args); - appLogger.config(" Listening Http Port=" + apiCmdLineArgs.getHttpPort()); - appLogger.config(" Listening Https Port=" + apiCmdLineArgs.getHttpsPort()); - appLogger.config(" Top Context=" + apiCmdLineArgs.getContext()); - appLogger.config(" Cors File=" + apiCmdLineArgs.getCorsFile()); - appLogger.config(" Secure Mode=" + apiCmdLineArgs.isSecureMode()); - appLogger.info("================ Starting ==============="); + + appLogger.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); + appLogger.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); + appLogger.info("Top Context={}", apiCmdLineArgs.getContext()); + appLogger.info("Cors File={}", apiCmdLineArgs.getCorsFile()); + appLogger.info("Secure Mode={}", apiCmdLineArgs.isSecureMode()); // Initialize the JETTY server and servlet holders. org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(); @@ -115,12 +123,12 @@ public static void main(String[] args) boolean fExists = Files.exists(corsPath); if (!fExists) { - appLogger.config(" Cors File=" + corsFile + " does not exist. Doing nothing with CORS for now."); + appLogger.warn("Cors File={} does not exist. Doing nothing with CORS for now.", corsFile); } else { try { - System.out.println("Looking for Cors Filters."); + appLogger.info("Looking for Cors Filters."); Scanner scanner = new Scanner(new File(corsFile)); FilterHolder cors = null; while (scanner.hasNextLine()) { @@ -137,9 +145,7 @@ public static void main(String[] args) { cors = ctx.addFilter(CrossOriginFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); } - String msg = String.format("Adding the following cors filter: %s : %s", corsList.get(x)[1], corsValue); - System.out.println(msg); - appLogger.config(msg); + appLogger.info("Adding the following cors filter: {} : {}", corsList.get(x)[1], corsValue); cors.setInitParameter(corsList.get(x)[1], corsValue); } } @@ -197,7 +203,7 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) { String msg = String.format("Cannot read DB auth from file '%s': %s", afn, ex); System.err.println(msg); - appLogger.severe(msg); + appLogger.error(msg); throw new StartException(String.format("Cannot read auth file: %s", ex)); } ds.setUser(afr.getUsername()); diff --git a/opendcs-rest-api/src/main/resources/logback.xml b/opendcs-rest-api/src/main/resources/logback.xml new file mode 100644 index 00000000..87a4a3e9 --- /dev/null +++ b/opendcs-rest-api/src/main/resources/logback.xml @@ -0,0 +1,26 @@ + + + + + %date %level [%thread] %logger %msg%n + + + + + odcsapi.log + + info + + + + %date %level [%thread] %logger{10} [%file:%line] -\t%msg%n + + + + + + + + + + \ No newline at end of file diff --git a/opendcs-web-client-jetty/build.gradle b/opendcs-web-client-jetty/build.gradle index f0779e79..1974bfca 100644 --- a/opendcs-web-client-jetty/build.gradle +++ b/opendcs-web-client-jetty/build.gradle @@ -4,12 +4,20 @@ plugins { id "opendcs-rest-api.java-conventions" id "opendcs-rest-api.deps-conventions" id "opendcs-rest-api.publishing-conventions" + id "war" } dependencies { - implementation(project(":opendcs-web-client")) + implementation(libs.jetty.jsp) implementation(libs.jetty.server) + implementation(libs.javax.servlet.jsp) + implementation(libs.servlet.api) + implementation(libs.jetty.annotations) implementation(libs.jetty.webapp) + implementation(libs.jersey.container.servlet) + implementation(libs.tomcat.embed) + implementation(libs.slf4j.api) + implementation(libs.logback) } jar { @@ -35,15 +43,51 @@ task startJetty(type: JavaExec) { -> mainClass = "org.opendcs.odcswebclient.jetty.Start" } -task prepareStartScript(type: Copy) { - from './bin/start.sh' - into "${buildDir}/odcsapi-jetty-standalone/bin/" - filter(ReplaceTokens, tokens: ['jarName': jar.archiveFileName.get()]) +task copyWar(type: Copy) { + dependsOn ':opendcs-web-client:war' // depends on war task in this project + from project(':opendcs-web-client').tasks['war'] // get the war task from this project + into "${project.layout.getBuildDirectory().get().getAsFile().toString()}/bin" +} + +task createStartScript() { + doLast { + //Make bin directory if it does not exist already. buildDir is now deprecated. + File curBuildDir = project.layout.getBuildDirectory().get().getAsFile(); + File binDir = new File(curBuildDir.toString(), "bin"); + project.mkdir(binDir); + //Make the start.sh file. + new File(binDir, "start.sh").text = """ +#!/bin/bash +cd `dirname \$0`/.. +java \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS + """ + + //Make a config directory for config files to be built. + File configDir = new File(curBuildDir.toString(), "config"); + project.mkdir(configDir); + //Make sample api config file. + new File(configDir, "sample_api.conf").text = """ +url=http://127.0.0.1 +port=8080 +context=odcsapi +""" + } +} + +task filepermission() { + doLast { + String start_path = "${buildDir}\\bin\\start.sh" + System.out.println("Here: " + start_path) + project.exec { + commandLine('chmod', '+x', start_path) + } + } } task bundle(type: Tar) { dependsOn jar - dependsOn prepareStartScript + dependsOn copyWar + dependsOn createStartScript archiveExtension = 'tar.gz' into('libs') { @@ -52,7 +96,11 @@ task bundle(type: Tar) { into('libs') { from jar } + into('/') { + from new File(project.layout.getBuildDirectory().get().getAsFile().toString(), "config/sample_api.conf") + } into('bin') { - from "${buildDir}/odcsapi-jetty-standalone/bin/start.sh" + from new File(project.layout.getBuildDirectory().get().getAsFile(), "bin/${project(':opendcs-web-client').name}-${project(':opendcs-web-client').version}.war") + from new File(project.layout.getBuildDirectory().get().getAsFile(), "bin/start.sh") } } \ No newline at end of file diff --git a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java index 0166544c..9dceb160 100644 --- a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java +++ b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java @@ -24,7 +24,8 @@ import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; - +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.StdErrLog; /** * Represents a Start. This will start a jetty server. @@ -37,13 +38,16 @@ public class Start public static void main(String[] args) throws Exception { + Log.setLog(new StdErrLog()); + String warFilePath = null; int port = 8080; String contextPath = "/"; + String apiFileDetailsPath = null; // Initialize the JETTY server and servlet holders. //Server server = new Server(apiCmdLineArgs.getPort()); ArgParser argParse = new ArgParser(args); - String portString = argParse.switchValue("-p", "8080"); + String portString = argParse.switchValue("-p", "8083"); System.out.println("Using Port: " + portString); try { warFilePath = argParse.switchValue("-w", null); @@ -53,14 +57,36 @@ public static void main(String[] args) System.out.println("War File Not Provided!"); System.exit(1); } + + try { + apiFileDetailsPath = argParse.switchValue("-f", null); + } + catch (Exception e) + { + System.out.println("No Api File Details Path File Provided. Using defaults."); + } + contextPath = argParse.switchValue("-c", "/"); if (!contextPath.startsWith("/")) { contextPath = "/" + contextPath; } port = Integer.parseInt(portString); + + contextPath = argParse.switchValue("-c", "/"); + if (!contextPath.startsWith("/")) + { + contextPath = "/" + contextPath; + } + + + + Server server = new Server(port); + + + /******* Controlling Headers ******************/ for(Connector y : server.getConnectors()) { for(ConnectionFactory x : y.getConnectionFactories()) { @@ -92,6 +118,7 @@ public static void main(String[] args) webapp.setWar(warFilePath); server.setHandler(webapp); + webapp.setAttribute("api_details_file_path", apiFileDetailsPath); //This code is to make sure JSP's work. webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/[^/]*jstl.*\\.jar$"); webapp.setExtractWAR( true ); @@ -99,7 +126,6 @@ public static void main(String[] args) classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration"); classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration"); - // Start the server! server.start(); server.join(); diff --git a/opendcs-web-client/build.gradle b/opendcs-web-client/build.gradle index fa5dc0fc..1bf9553e 100644 --- a/opendcs-web-client/build.gradle +++ b/opendcs-web-client/build.gradle @@ -6,8 +6,10 @@ plugins { } dependencies { - implementation(libs.servlet.api) + implementation(libs.jetty.jsp) implementation(libs.websocket) + implementation(libs.slf4j.api) + implementation(libs.logback) testImplementation(libs.mockito.core) testImplementation(libs.mockito.junit.jupiter) } diff --git a/opendcs-web-client/src/main/java/api/Gateway.java b/opendcs-web-client/src/main/java/api/Gateway.java index db83ae38..8386be19 100644 --- a/opendcs-web-client/src/main/java/api/Gateway.java +++ b/opendcs-web-client/src/main/java/api/Gateway.java @@ -124,16 +124,27 @@ protected void doDelete(HttpServletRequest request, HttpServletResponse response */ public void setApiDetails(ServletContext sc) throws IOException { - //Gets the initialization details from the conf file. - String apiConfigFilePath; - if (sc == null) - { - apiConfigFilePath = this.getServletContext().getRealPath("/conf/api.conf"); + //this.baseUrl = "http://108.20.179.32:9876"; + //this.context = "odcsapi"; + if (sc == null) { + sc = this.getServletContext(); } - else + Object configAttr = sc.getAttribute("api_details_file_path"); + String apiConfigFilePath = (configAttr == null) ? null : configAttr.toString(); + + if (apiConfigFilePath == null) { + //Use the config file within WAR file. + //default api file location. + //if (sc == null) { + // apiConfigFilePath = this.getServletContext().getRealPath("/conf/api.conf"); + //} else { apiConfigFilePath = sc.getRealPath("/conf/api.conf"); + //} } + + //Gets the initialization details from the conf file. + System.out.println("API Config File Path: " + apiConfigFilePath.toString()); File cf = new File(apiConfigFilePath); // Creating an object of BufferedReader class @@ -147,22 +158,20 @@ public void setApiDetails(ServletContext sc) throws IOException { System.out.println(line); String nameValue[] = line.split("="); - String name = nameValue[0].trim(); - String value = nameValue[1].trim(); - if (name.equalsIgnoreCase("url")) + if (nameValue.length > 1) { - tempUrl = value; - System.out.println("Setting Base Url to " + tempUrl); - } - else if (name.equalsIgnoreCase("port")) - { - tempPort = ":" + value; - System.out.println("Setting Port to " + tempPort); - } - else if (name.equalsIgnoreCase("context")) - { - tempContext = value; - System.out.println("Setting Context to " + tempContext); + String name = nameValue[0].trim(); + String value = nameValue[1].trim(); + if (name.equalsIgnoreCase("url")) { + tempUrl = value; + System.out.println("Setting Base Url to " + tempUrl); + } else if (name.equalsIgnoreCase("port")) { + tempPort = ":" + value; + System.out.println("Setting Port to " + tempPort); + } else if (name.equalsIgnoreCase("context")) { + tempContext = value; + System.out.println("Setting Context to " + tempContext); + } } // read next line line = br.readLine(); @@ -172,6 +181,7 @@ else if (name.equalsIgnoreCase("context")) this.baseUrl = tempUrl + tempPort; this.context = tempContext; System.out.println(String.format("API base url: %s.", this.baseUrl)); + } /** diff --git a/opendcs-web-client/src/main/webapp/conf/api.conf b/opendcs-web-client/src/main/webapp/conf/api.conf index 640a4642..e86e376f 100644 --- a/opendcs-web-client/src/main/webapp/conf/api.conf +++ b/opendcs-web-client/src/main/webapp/conf/api.conf @@ -1,3 +1,3 @@ -url= http://192.168.99.23 - port =8081 - context=odcsapi \ No newline at end of file +url=http://127.0.0.1 +port=8081 +context=odcsapi \ No newline at end of file From bc6f8eab837045fcc232ef35b54beb2f35221551 Mon Sep 17 00:00:00 2001 From: wjonassen Date: Sat, 13 Jan 2024 15:07:36 -0500 Subject: [PATCH 04/13] cleaning up biuld scripts, gradle scripts, and swaggerui files. --- gradle/libs.versions.toml | 19 +++---------------- .../java/org/opendcs/odcsapi/jetty/Start.java | 14 +------------- opendcs-rest-api/build.gradle | 4 ---- .../src/main/resources/swaggerui/index.html | 2 +- .../swaggerui/{swagger.json => open_api.json} | 6 ++++++ .../swaggerui/swagger-initializer.js | 2 +- 6 files changed, 12 insertions(+), 35 deletions(-) rename opendcs-rest-api/src/main/resources/swaggerui/{swagger.json => open_api.json} (99%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d17e3960..8d868e60 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,17 +4,13 @@ opendcs = "7.0.11" jetty = "9.4.53.v20231009" jetty-jsp = "9.2.30.v20200428" javax-servlet-jsp = "2.3.0" -jasper-runtime = "5.5.23" -#jetty = "9.0.0.v20130308" logback = "1.3.14" -apache-tomcat = "9.0.84" tomcat-embed = "9.0.84" -servlet-api = "3.1.0" +servlet-api = "4.0.1" slf4j = "2.0.10" jersey = "2.40" postgresql = "42.7.1" -swagger = "2.2.20" -swagger-ui = "5.10.3" +swagger = "2.2.19" glassfish-jaxb = "2.3.3" websocket = "1.1" @@ -24,32 +20,23 @@ mockito = "3.12.4" [libraries] opendcs = { module = "org.opendcs:opendcs", version.ref = "opendcs" } -apache-tomcat = { module = "org.apache.tomcat:tomcat-catalina", version.ref = "apache-tomcat"} jetty-jsp = { module = "org.eclipse.jetty:jetty-jsp", version.ref = "jetty-jsp" } -jetty-plus = { module = "org.eclipse.jetty:jetty-plus", version.ref = "jetty" } jetty-annotations = { module = "org.eclipse.jetty:jetty-annotations", version.ref = "jetty" } jetty-server = { module = "org.eclipse.jetty:jetty-server", version.ref = "jetty" } jetty-servlets = { module = "org.eclipse.jetty:jetty-servlets", version.ref = "jetty" } jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jetty" } jetty-webapp = { module = "org.eclipse.jetty:jetty-webapp", version.ref = "jetty" } -jasper-runtime = { module = "tomcat:jasper-runtime", version.ref = "jasper-runtime" } tomcat-embed = { module = "org.apache.tomcat.embed:tomcat-embed-jasper", version.ref = "tomcat-embed" } - - javax-servlet-jsp = { module = "javax.servlet.jsp:javax.servlet.jsp-api", version.ref= "javax-servlet-jsp" } servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "servlet-api" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } -jersey-client = { module = "org.glassfish.jersey.core:jersey-client", version.ref = "jersey" } -jersey-server = { module = "org.glassfish.jersey.core:jersey-server", version.ref = "jersey" } json-jackson = { module = "org.glassfish.jersey.media:jersey-media-json-jackson", version.ref = "jersey" } -jersey-common = { module = "org.glassfish.jersey.core:jersey-common", version.ref = "jersey" } jersey-container-servlet = { module = "org.glassfish.jersey.containers:jersey-container-servlet", version.ref = "jersey" } jersey-hk2 = { module = "org.glassfish.jersey.inject:jersey-hk2", version.ref = "jersey" } postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" } -swagger-jaxrs2 = { module = "io.swagger.core.v3:swagger-jaxrs2", version.ref = "swagger" } -swagger-ui = { module = "org.webjars:swagger-ui", version.ref = "swagger-ui" } +swagger-jaxrs2 = { module = "io.swagger.core.v3:swagger-jaxrs2-jakarta", version.ref = "swagger" } jaxb-runtime = { module = "org.glassfish.jaxb:jaxb-runtime", version.ref = "glassfish-jaxb" } websocket = { module = "javax.websocket:javax.websocket-api", version.ref = "websocket" } diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index e32eb670..b93dc657 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -210,19 +210,7 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) ds.setPassword(afr.getPassword()); DbInterface.setDataSource(ds); DbInterface.setDatabaseType(dbType); - - - - // Setup API resources - ServletHolder jersey = ctx.addServlet(ServletContainer.class, "/api/*"); - jersey.setInitOrder(1); - jersey.setInitParameter("jersey.config.server.provider.packages", - "com.cloudian.hfs.handlers;io.swagger.v3.jaxrs2.integration.resources"); - // Expose API definition independently into yaml/json - ServletHolder openApi = ctx.addServlet(OpenApiServlet.class, "/openapi/*"); - openApi.setInitOrder(2); - openApi.setInitParameter("openApi.configuration.resourcePackages", - "com.cloudian.hfs.handlers"); + // Setup Swagger-UI static resources String resourceBasePath = Start.class.getResource("/swaggerui").toExternalForm(); ctx.setWelcomeFiles(new String[] {"index.html"}); diff --git a/opendcs-rest-api/build.gradle b/opendcs-rest-api/build.gradle index af78b901..3ae3101d 100644 --- a/opendcs-rest-api/build.gradle +++ b/opendcs-rest-api/build.gradle @@ -12,13 +12,9 @@ dependencies { } implementation(libs.servlet.api) implementation(libs.slf4j.api) - implementation(libs.jersey.client) - implementation(libs.jersey.server) implementation(libs.json.jackson) implementation(libs.jersey.container.servlet) - implementation(libs.jersey.common) implementation(libs.jersey.hk2) - implementation(libs.swagger.ui) runtimeOnly(libs.jaxb.runtime) runtimeOnly(libs.postgresql) } diff --git a/opendcs-rest-api/src/main/resources/swaggerui/index.html b/opendcs-rest-api/src/main/resources/swaggerui/index.html index 84ae62d3..f72fb04d 100644 --- a/opendcs-rest-api/src/main/resources/swaggerui/index.html +++ b/opendcs-rest-api/src/main/resources/swaggerui/index.html @@ -5,7 +5,7 @@ Swagger UI - + diff --git a/opendcs-rest-api/src/main/resources/swaggerui/swagger.json b/opendcs-rest-api/src/main/resources/swaggerui/open_api.json similarity index 99% rename from opendcs-rest-api/src/main/resources/swaggerui/swagger.json rename to opendcs-rest-api/src/main/resources/swaggerui/open_api.json index 98f857ac..34a3f7fa 100644 --- a/opendcs-rest-api/src/main/resources/swaggerui/swagger.json +++ b/opendcs-rest-api/src/main/resources/swaggerui/open_api.json @@ -6,6 +6,12 @@ "version": "0.0.3" }, "servers": [ + { + "url": "" + }, + { + "url": "/opendcs-rest-api-99.bugfix-lib-updates-SNAPSHOT" + }, { "url": "odcsapi" } diff --git a/opendcs-rest-api/src/main/resources/swaggerui/swagger-initializer.js b/opendcs-rest-api/src/main/resources/swaggerui/swagger-initializer.js index 05500b37..400b388c 100644 --- a/opendcs-rest-api/src/main/resources/swaggerui/swagger-initializer.js +++ b/opendcs-rest-api/src/main/resources/swaggerui/swagger-initializer.js @@ -3,7 +3,7 @@ window.onload = function() { // the following lines will be replaced by docker/configurator, when it runs in a docker-container window.ui = SwaggerUIBundle({ - url: "swagger.json", + url: "open_api.json", dom_id: '#swagger-ui', deepLinking: true, presets: [ From c46ffd652aa38e49f70eb303a760a4cedeb2f1e4 Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 02:23:47 -0500 Subject: [PATCH 05/13] Cleaning up code. Added logging using slf4j in Start.java. This includes parsing user entered logging.properties file, as well as having a default file. One security issue was fixed in Start.java as well, no more printStackTrace. --- gradle/libs.versions.toml | 9 ++- opendcs-rest-api-jetty/build.gradle | 5 +- .../opendcs/odcsapi/jetty/ApiCmdLineArgs.java | 46 ++++++----- .../java/org/opendcs/odcsapi/jetty/Start.java | 80 +++++++------------ opendcs-rest-api/build.gradle | 1 - .../src/main/resources/logging.properties | 10 +++ opendcs-web-client-jetty/build.gradle | 2 - opendcs-web-client/build.gradle | 2 - 8 files changed, 75 insertions(+), 80 deletions(-) create mode 100644 opendcs-rest-api/src/main/resources/logging.properties diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8d868e60..336a4e82 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,6 @@ opendcs = "7.0.11" jetty = "9.4.53.v20231009" jetty-jsp = "9.2.30.v20200428" javax-servlet-jsp = "2.3.0" -logback = "1.3.14" tomcat-embed = "9.0.84" servlet-api = "4.0.1" slf4j = "2.0.10" @@ -13,7 +12,7 @@ postgresql = "42.7.1" swagger = "2.2.19" glassfish-jaxb = "2.3.3" websocket = "1.1" - +javax-validation = "2.0.1.Final" #Test Dependencies junit = "5.10.1" mockito = "3.12.4" @@ -28,10 +27,12 @@ jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jet jetty-webapp = { module = "org.eclipse.jetty:jetty-webapp", version.ref = "jetty" } tomcat-embed = { module = "org.apache.tomcat.embed:tomcat-embed-jasper", version.ref = "tomcat-embed" } +javax-validation = { module = "javax.validation:validation-api", version.ref = "javax-validation" } + javax-servlet-jsp = { module = "javax.servlet.jsp:javax.servlet.jsp-api", version.ref= "javax-servlet-jsp" } servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "servlet-api" } -slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } -logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } +slf4j-jdk = { module = "org.slf4j:slf4j-jdk14", version.ref = "slf4j" } + json-jackson = { module = "org.glassfish.jersey.media:jersey-media-json-jackson", version.ref = "jersey" } jersey-container-servlet = { module = "org.glassfish.jersey.containers:jersey-container-servlet", version.ref = "jersey" } jersey-hk2 = { module = "org.glassfish.jersey.inject:jersey-hk2", version.ref = "jersey" } diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 7f88aaff..5af3414b 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -12,8 +12,8 @@ dependencies { implementation(libs.jersey.container.servlet) implementation(libs.postgresql) implementation(libs.swagger.jaxrs2) - implementation(libs.slf4j.api) - implementation(libs.logback) + implementation(libs.javax.validation) + implementation(libs.slf4j.jdk) } jar { @@ -75,7 +75,6 @@ task bundle(type: Tar) { from jar } into('bin') { - //from "${project.buildDir}/bin/start.sh" from new File(project.layout.getBuildDirectory().get().getAsFile(), "bin/start.sh"); } } diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java index 30db59a2..7457731a 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java @@ -29,12 +29,13 @@ public class ApiCmdLineArgs private int httpsPort = -1; private String keyStorePath; private String keyStorePassword; - + + private String loggingPropertiesFile; private String decodesPropFile = "$DCSTOOL_USERDIR/user.properties"; private boolean secureMode = false; private String corsFile = "$DCSTOOL_HOME/opendcs_api_cors.cfg"; - private enum State { IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS }; + private enum State { IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_LOGFILE, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS }; private State state = State.IDLE; private String splitArg = null; @@ -43,15 +44,11 @@ public void parseArgs(String[] args) { state = State.IDLE; splitArg = null; - System.out.println("ALL Args: " + args.toString()); for(String arg : args) { - System.out.println("First Arg: " + arg); parseArg(arg); - System.out.println("Arg after parse: " + arg); if (splitArg != null) { - System.out.println("Split Arg Before Parse: " + splitArg); parseArg(splitArg); splitArg = null; } @@ -66,24 +63,17 @@ private void parseArg(String arg) switch(state) { case IDLE: - System.out.println("IDLE: Arg: " + arg); if (arg.startsWith("-cors")) { - System.out.println("-cors argument found."); state = State.EXPECT_CORS; - System.out.println("Arg: " + arg); if (arg.length() > 5) splitArg = arg.substring(5); - System.out.println("Split Arg: " + splitArg); } else if (arg.startsWith("-c")) { - System.out.println("-c argument found."); state = State.EXPECT_CONTEXT; - System.out.println("Arg: " + arg); if (arg.length() > 2) splitArg = arg.substring(2); - System.out.println("Split Arg: " + splitArg); } else if (arg.startsWith("-p")) { @@ -115,6 +105,12 @@ else if (arg.startsWith("-P")) if (arg.length() > 2) splitArg = arg.substring(2); } + else if (arg.startsWith("-l")) + { + state = State.EXPECT_LOGFILE; + if (arg.length() > 2) + splitArg = arg.substring(2); + } else if (arg.startsWith("-s")) secureMode = true; else @@ -171,12 +167,16 @@ else if (arg.startsWith("-s")) } state = State.IDLE; break; + case EXPECT_LOGFILE: + loggingPropertiesFile = arg.trim(); + if (loggingPropertiesFile.length() <= 0) + { + throw new StartException("You must enter a logging.properties file after -l."); + } + state = State.IDLE; + break; case EXPECT_CORS: - System.out.println("Cors File!!!"); - System.out.println("Whole Arg: " + arg); - System.out.println("Split Arg: " + splitArg); corsFile = arg.trim(); - System.out.println("Cors File: " + corsFile); Path corsPath = Paths.get(corsFile); boolean fExists = Files.exists(corsPath); if (!fExists) @@ -244,7 +244,17 @@ public void setKeyStorePassword(String keyStorePassword) { this.keyStorePassword = keyStorePassword; } - + + public String getLoggingPropertiesFile() + { + return loggingPropertiesFile; + } + + public void setLoggingPropertiesFile(String logPropFile) + { + this.loggingPropertiesFile = logPropFile; + } + public String getDecodesPropFile() { return decodesPropFile; diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index b93dc657..e9133c69 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -15,9 +15,7 @@ package org.opendcs.odcsapi.jetty; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -25,18 +23,11 @@ import java.util.EnumSet; import java.util.Properties; import java.util.Scanner; - - -//import java.util.logging.FileHandler; -//import java.util.logging.Handler; -//import java.util.logging.Level; -//import java.util.logging.Logger; -//import java.util.logging.SimpleFormatter; +import java.util.logging.LogManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import javax.servlet.DispatcherType; import org.eclipse.jetty.server.HttpConfiguration; @@ -56,14 +47,8 @@ import org.opendcs.odcsapi.util.ApiConstants; import org.opendcs.odcsapi.util.ApiEnvExpander; import org.opendcs.odcsapi.util.ApiPropertiesUtil; -import org.opendcs.odcsapi.util.LogFormatter; import org.postgresql.ds.PGSimpleDataSource; -import io.swagger.v3.jaxrs2.integration.OpenApiServlet; - -/** - * EasyPack Jetty Start - */ public class Start { private static ApiCmdLineArgs apiCmdLineArgs = new ApiCmdLineArgs(); @@ -77,39 +62,34 @@ public static void main(String[] args) corsList.add(new String[] { "Access-Control-Allow-Methods", CrossOriginFilter.ALLOWED_METHODS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Credentials", CrossOriginFilter.ALLOW_CREDENTIALS_PARAM }); + apiCmdLineArgs.parseArgs(args); + String loggingFile = apiCmdLineArgs.getLoggingPropertiesFile(); + InputStream is = null; + if (loggingFile == null) { + System.out.println("No log file passed. Using defauts."); + is = Start.class.getClassLoader(). + getResourceAsStream("logging.properties"); + } + else + { + System.out.println("Logging File Passed: " + apiCmdLineArgs.getLoggingPropertiesFile()); + File lf = new File(loggingFile); + is = new FileInputStream(lf); + } + LogManager.getLogManager().readConfiguration(is); // Set up logging - Logger rootLogger = LoggerFactory.getLogger(""); - - - //rootLogger.setLevel(Level.INFO); - //while (rootLogger.getHandlers().length > 0) - // rootLogger.removeHandler(rootLogger.getHandlers()[0]); - //Handler rootHandler = new FileHandler(rootlogfile, 10000000, 5); - //rootHandler.setFormatter(new SimpleFormatter()); - //rootLogger.addHandler(rootHandler); - rootLogger.info("================ Starting ==============="); - - //String applogfile = ApiEnvExpander.expand("$DCSTOOL_USERDIR/odcsapi.log"); - //System.out.println("app logger goes to " + applogfile); - Logger appLogger = LoggerFactory.getLogger(ApiConstants.loggerName); - //appLogger.setLevel(Level.INFO); - //while (appLogger.getHandlers().length > 0) - // appLogger.removeHandler(appLogger.getHandlers()[0]); - //Handler appHandler = new FileHandler(applogfile, 10000000, 5); - //appHandler.setFormatter(new LogFormatter()); - //appLogger.addHandler(appHandler); + Logger logger = LoggerFactory.getLogger(ApiConstants.loggerName); // Parse args - //appLogger.config("DCSTOOL_USERDIR=" + System.getProperty("DCSTOOL_USERDIR") + ", parsing args..."); - appLogger.info("DCSTOOL_USERDIR={}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); + logger.info("DCSTOOL_USERDIR={}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); - apiCmdLineArgs.parseArgs(args); - appLogger.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); - appLogger.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); - appLogger.info("Top Context={}", apiCmdLineArgs.getContext()); - appLogger.info("Cors File={}", apiCmdLineArgs.getCorsFile()); - appLogger.info("Secure Mode={}", apiCmdLineArgs.isSecureMode()); + logger.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); + logger.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); + logger.info("Top Context={}", apiCmdLineArgs.getContext()); + logger.info("Cors File={}", apiCmdLineArgs.getCorsFile()); + logger.info("Secure Mode={}", apiCmdLineArgs.isSecureMode()); + logger.info("logging.properties file={}", apiCmdLineArgs.getLoggingPropertiesFile()); // Initialize the JETTY server and servlet holders. org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(); @@ -123,12 +103,12 @@ public static void main(String[] args) boolean fExists = Files.exists(corsPath); if (!fExists) { - appLogger.warn("Cors File={} does not exist. Doing nothing with CORS for now.", corsFile); + logger.warn("Cors File={} does not exist. Doing nothing with CORS for now.", corsFile); } else { try { - appLogger.info("Looking for Cors Filters."); + logger.info("Looking for Cors Filters."); Scanner scanner = new Scanner(new File(corsFile)); FilterHolder cors = null; while (scanner.hasNextLine()) { @@ -145,7 +125,7 @@ public static void main(String[] args) { cors = ctx.addFilter(CrossOriginFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); } - appLogger.info("Adding the following cors filter: {} : {}", corsList.get(x)[1], corsValue); + logger.info("Adding the following cors filter: {} : {}", corsList.get(x)[1], corsValue); cors.setInitParameter(corsList.get(x)[1], corsValue); } } @@ -156,7 +136,7 @@ public static void main(String[] args) } scanner.close(); } catch (FileNotFoundException e) { - e.printStackTrace(); + logger.error("There was an error loading file.", e); } } } @@ -203,7 +183,7 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) { String msg = String.format("Cannot read DB auth from file '%s': %s", afn, ex); System.err.println(msg); - appLogger.error(msg); + logger.error(msg); throw new StartException(String.format("Cannot read auth file: %s", ex)); } ds.setUser(afr.getUsername()); diff --git a/opendcs-rest-api/build.gradle b/opendcs-rest-api/build.gradle index 3ae3101d..94fa0b93 100644 --- a/opendcs-rest-api/build.gradle +++ b/opendcs-rest-api/build.gradle @@ -11,7 +11,6 @@ dependencies { exclude group: '*', module: '*' } implementation(libs.servlet.api) - implementation(libs.slf4j.api) implementation(libs.json.jackson) implementation(libs.jersey.container.servlet) implementation(libs.jersey.hk2) diff --git a/opendcs-rest-api/src/main/resources/logging.properties b/opendcs-rest-api/src/main/resources/logging.properties new file mode 100644 index 00000000..8145ba3e --- /dev/null +++ b/opendcs-rest-api/src/main/resources/logging.properties @@ -0,0 +1,10 @@ +handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler +java.util.logging.ConsoleHandler.level=INFO +java.util.logging.FileHandler.level=INFO +java.util.logging.FileHandler.pattern=odcsapi.log +java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter +java.util.logging.SimpleFormatter.format=[%1$tc] %4$s: %5$s %n +java.util.logging.FileHandler.limit=10000000 +java.util.logging.FileHandler.count=4 +java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter +.level=INFO \ No newline at end of file diff --git a/opendcs-web-client-jetty/build.gradle b/opendcs-web-client-jetty/build.gradle index 1974bfca..1f6c10c1 100644 --- a/opendcs-web-client-jetty/build.gradle +++ b/opendcs-web-client-jetty/build.gradle @@ -16,8 +16,6 @@ dependencies { implementation(libs.jetty.webapp) implementation(libs.jersey.container.servlet) implementation(libs.tomcat.embed) - implementation(libs.slf4j.api) - implementation(libs.logback) } jar { diff --git a/opendcs-web-client/build.gradle b/opendcs-web-client/build.gradle index 1bf9553e..ed6bca6b 100644 --- a/opendcs-web-client/build.gradle +++ b/opendcs-web-client/build.gradle @@ -8,8 +8,6 @@ plugins { dependencies { implementation(libs.jetty.jsp) implementation(libs.websocket) - implementation(libs.slf4j.api) - implementation(libs.logback) testImplementation(libs.mockito.core) testImplementation(libs.mockito.junit.jupiter) } From 72a0739280d0c0439d71d423ccaecc6efd6a8417 Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 02:28:53 -0500 Subject: [PATCH 06/13] Deleted logback.xml, it was added unintentionally. --- .../src/main/resources/logback.xml | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 opendcs-rest-api/src/main/resources/logback.xml diff --git a/opendcs-rest-api/src/main/resources/logback.xml b/opendcs-rest-api/src/main/resources/logback.xml deleted file mode 100644 index 87a4a3e9..00000000 --- a/opendcs-rest-api/src/main/resources/logback.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - %date %level [%thread] %logger %msg%n - - - - - odcsapi.log - - info - - - - %date %level [%thread] %logger{10} [%file:%line] -\t%msg%n - - - - - - - - - - \ No newline at end of file From 487d810ed8911846e253e34ce41bc39ff08260bf Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 02:45:22 -0500 Subject: [PATCH 07/13] Cleaning up some of the sonarcloud issues found. --- .../org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java | 5 ++++- .../main/java/org/opendcs/odcsapi/jetty/Start.java | 14 +++++++++----- .../org/opendcs/odcswebclient/jetty/Start.java | 6 ++++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java index 7457731a..9061d9d0 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java @@ -35,7 +35,10 @@ public class ApiCmdLineArgs private boolean secureMode = false; private String corsFile = "$DCSTOOL_HOME/opendcs_api_cors.cfg"; - private enum State { IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_LOGFILE, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS }; + private enum State + { + IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_LOGFILE, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS + }; private State state = State.IDLE; private String splitArg = null; diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index e9133c69..5a3342c8 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -15,7 +15,11 @@ package org.opendcs.odcsapi.jetty; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.FileReader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -65,14 +69,13 @@ public static void main(String[] args) apiCmdLineArgs.parseArgs(args); String loggingFile = apiCmdLineArgs.getLoggingPropertiesFile(); InputStream is = null; - if (loggingFile == null) { - System.out.println("No log file passed. Using defauts."); + if (loggingFile == null) + { is = Start.class.getClassLoader(). getResourceAsStream("logging.properties"); } else { - System.out.println("Logging File Passed: " + apiCmdLineArgs.getLoggingPropertiesFile()); File lf = new File(loggingFile); is = new FileInputStream(lf); } @@ -107,7 +110,8 @@ public static void main(String[] args) } else { - try { + try + { logger.info("Looking for Cors Filters."); Scanner scanner = new Scanner(new File(corsFile)); FilterHolder cors = null; diff --git a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java index 9dceb160..0ade4634 100644 --- a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java +++ b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java @@ -49,7 +49,8 @@ public static void main(String[] args) ArgParser argParse = new ArgParser(args); String portString = argParse.switchValue("-p", "8083"); System.out.println("Using Port: " + portString); - try { + try + { warFilePath = argParse.switchValue("-w", null); } catch (Exception e) @@ -58,7 +59,8 @@ public static void main(String[] args) System.exit(1); } - try { + try + { apiFileDetailsPath = argParse.switchValue("-f", null); } catch (Exception e) From fc3da9dd0e1914ab66e056820fe98d6de8f1858e Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 06:28:51 -0500 Subject: [PATCH 08/13] Removing some commenting. --- .../src/main/java/org/opendcs/odcswebclient/jetty/Start.java | 1 - 1 file changed, 1 deletion(-) diff --git a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java index 0ade4634..88d46c43 100644 --- a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java +++ b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java @@ -45,7 +45,6 @@ public static void main(String[] args) String contextPath = "/"; String apiFileDetailsPath = null; // Initialize the JETTY server and servlet holders. - //Server server = new Server(apiCmdLineArgs.getPort()); ArgParser argParse = new ArgParser(args); String portString = argParse.switchValue("-p", "8083"); System.out.println("Using Port: " + portString); From 44fa84e7ba6bdb905e9c807ed89712a91de6f337 Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 20:17:06 -0500 Subject: [PATCH 09/13] Removing some commenting. --- gradle/libs.versions.toml | 4 +- opendcs-rest-api-jetty/build.gradle | 80 ++++++++++++++++++- .../opendcs/odcsapi/jetty/ApiCmdLineArgs.java | 27 +------ .../java/org/opendcs/odcsapi/jetty/Start.java | 17 +--- .../src/main/resources/logging.properties | 10 --- .../main/resources/swaggerui/open_api.json | 3 - opendcs-web-client-jetty/build.gradle | 11 --- opendcs-web-client/build.gradle | 1 + .../src/main/java/api/Gateway.java | 6 -- .../src/main/webapp/WEB-INF/web.xml | 10 --- 10 files changed, 83 insertions(+), 86 deletions(-) delete mode 100644 opendcs-rest-api/src/main/resources/logging.properties diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 336a4e82..9d91eb5b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,8 +4,7 @@ opendcs = "7.0.11" jetty = "9.4.53.v20231009" jetty-jsp = "9.2.30.v20200428" javax-servlet-jsp = "2.3.0" -tomcat-embed = "9.0.84" -servlet-api = "4.0.1" +servlet-api = "4.0.1" #Updating this further will require a change to the jakarta namespace. slf4j = "2.0.10" jersey = "2.40" postgresql = "42.7.1" @@ -25,7 +24,6 @@ jetty-server = { module = "org.eclipse.jetty:jetty-server", version.ref = "jetty jetty-servlets = { module = "org.eclipse.jetty:jetty-servlets", version.ref = "jetty" } jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jetty" } jetty-webapp = { module = "org.eclipse.jetty:jetty-webapp", version.ref = "jetty" } -tomcat-embed = { module = "org.apache.tomcat.embed:tomcat-embed-jasper", version.ref = "tomcat-embed" } javax-validation = { module = "javax.validation:validation-api", version.ref = "javax-validation" } diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 5af3414b..6f60f6d6 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -58,16 +58,94 @@ task createStartScript() { new File(binDir, "start.sh").text = """ #!/bin/bash cd `dirname \$0`/.. -java \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS +java -Djava.util.logging.config.file=logging.properties \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS """ } } +task createLoggingPropertiesFile() { + doLast { + File targetBuildDir = project.layout.getBuildDirectory().get().getAsFile(); + //File binDir = new File(buildDir.toString(), "bin"); + + //Make the logging.properties file. + new File(targetBuildDir, "logging.properties").text = """ +############################################################ +# \tDefault Logging Configuration File +# +# You can use a different file by specifying a filename +# with the java.util.logging.config.file system property. +# For example java -Djava.util.logging.config.file=myfile +# or: -Djava.util.logging.config.file=./config/properties/logging.properties +############################################################ + +############################################################ +# \tGlobal properties +############################################################ + +# "handlers" specifies a comma separated list of log Handler +# classes. These handlers will be installed during VM startup. +# Note that these classes must be on the system classpath. +# Additional handlers can be added to the list +handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler + +# Default global logging level. +# This specifies which kinds of events are logged across +# all loggers. For any given facility this global level +# can be overriden by a facility specific level +# Note that the ConsoleHandler also has a separate level +# setting to limit messages printed to the console. +.level= CONFIG + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +# Individual handlers filter messages by level. +# Messages at or above this level get output by the handler being configured. + +# Setting this level = CONFIG causes CONFIG, INFO, WARNING, and SEVERE messages to be +# output by this handler. +java.util.logging.ConsoleHandler.level = CONFIG +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + +# The following special tokens can be used in the FileHandler pattern property +# which specifies the location and name of the log file. +# / - standard path separator +# %t - system temporary directory +# %h - value of the user.home system property +# %g - generation number for rotating logs +# %u - unique number to avoid conflicts +# FileHandler writes to %h/demo0.log by default. +java.util.logging.FileHandler.pattern = %t/opendcs_rest_logging_%g.log +java.util.logging.FileHandler.level = ALL +java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter + +# Formats the messages with a timestamp at the beginning. +java.util.logging.SimpleFormatter.format=[%1\$tc] %4\$s: %5\$s %n + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +# Specify logging levels for specific namespaces. +# org.opendcs.odcsapi.level = FINEST + """ + } +} + task bundle(type: Tar) { dependsOn jar dependsOn createStartScript + dependsOn createLoggingPropertiesFile + archiveExtension = 'tar.gz' + into('') { + from new File(project.layout.getBuildDirectory().get().getAsFile(), "logging.properties"); + } into('libs') { from configurations.runtimeClasspath } diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java index 9061d9d0..d4750af3 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java @@ -30,14 +30,13 @@ public class ApiCmdLineArgs private String keyStorePath; private String keyStorePassword; - private String loggingPropertiesFile; private String decodesPropFile = "$DCSTOOL_USERDIR/user.properties"; private boolean secureMode = false; private String corsFile = "$DCSTOOL_HOME/opendcs_api_cors.cfg"; private enum State { - IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_LOGFILE, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS + IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS }; private State state = State.IDLE; private String splitArg = null; @@ -108,12 +107,6 @@ else if (arg.startsWith("-P")) if (arg.length() > 2) splitArg = arg.substring(2); } - else if (arg.startsWith("-l")) - { - state = State.EXPECT_LOGFILE; - if (arg.length() > 2) - splitArg = arg.substring(2); - } else if (arg.startsWith("-s")) secureMode = true; else @@ -170,14 +163,6 @@ else if (arg.startsWith("-s")) } state = State.IDLE; break; - case EXPECT_LOGFILE: - loggingPropertiesFile = arg.trim(); - if (loggingPropertiesFile.length() <= 0) - { - throw new StartException("You must enter a logging.properties file after -l."); - } - state = State.IDLE; - break; case EXPECT_CORS: corsFile = arg.trim(); Path corsPath = Paths.get(corsFile); @@ -248,16 +233,6 @@ public void setKeyStorePassword(String keyStorePassword) this.keyStorePassword = keyStorePassword; } - public String getLoggingPropertiesFile() - { - return loggingPropertiesFile; - } - - public void setLoggingPropertiesFile(String logPropFile) - { - this.loggingPropertiesFile = logPropFile; - } - public String getDecodesPropFile() { return decodesPropFile; diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 5a3342c8..489fa953 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -16,7 +16,6 @@ package org.opendcs.odcsapi.jetty; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.FileReader; @@ -27,7 +26,6 @@ import java.util.EnumSet; import java.util.Properties; import java.util.Scanner; -import java.util.logging.LogManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,32 +65,19 @@ public static void main(String[] args) corsList.add(new String[] { "Access-Control-Allow-Credentials", CrossOriginFilter.ALLOW_CREDENTIALS_PARAM }); apiCmdLineArgs.parseArgs(args); - String loggingFile = apiCmdLineArgs.getLoggingPropertiesFile(); InputStream is = null; - if (loggingFile == null) - { - is = Start.class.getClassLoader(). - getResourceAsStream("logging.properties"); - } - else - { - File lf = new File(loggingFile); - is = new FileInputStream(lf); - } - LogManager.getLogManager().readConfiguration(is); + // Set up logging Logger logger = LoggerFactory.getLogger(ApiConstants.loggerName); // Parse args logger.info("DCSTOOL_USERDIR={}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); - logger.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); logger.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); logger.info("Top Context={}", apiCmdLineArgs.getContext()); logger.info("Cors File={}", apiCmdLineArgs.getCorsFile()); logger.info("Secure Mode={}", apiCmdLineArgs.isSecureMode()); - logger.info("logging.properties file={}", apiCmdLineArgs.getLoggingPropertiesFile()); // Initialize the JETTY server and servlet holders. org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(); diff --git a/opendcs-rest-api/src/main/resources/logging.properties b/opendcs-rest-api/src/main/resources/logging.properties deleted file mode 100644 index 8145ba3e..00000000 --- a/opendcs-rest-api/src/main/resources/logging.properties +++ /dev/null @@ -1,10 +0,0 @@ -handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler -java.util.logging.ConsoleHandler.level=INFO -java.util.logging.FileHandler.level=INFO -java.util.logging.FileHandler.pattern=odcsapi.log -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter -java.util.logging.SimpleFormatter.format=[%1$tc] %4$s: %5$s %n -java.util.logging.FileHandler.limit=10000000 -java.util.logging.FileHandler.count=4 -java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter -.level=INFO \ No newline at end of file diff --git a/opendcs-rest-api/src/main/resources/swaggerui/open_api.json b/opendcs-rest-api/src/main/resources/swaggerui/open_api.json index 34a3f7fa..f876f1df 100644 --- a/opendcs-rest-api/src/main/resources/swaggerui/open_api.json +++ b/opendcs-rest-api/src/main/resources/swaggerui/open_api.json @@ -9,9 +9,6 @@ { "url": "" }, - { - "url": "/opendcs-rest-api-99.bugfix-lib-updates-SNAPSHOT" - }, { "url": "odcsapi" } diff --git a/opendcs-web-client-jetty/build.gradle b/opendcs-web-client-jetty/build.gradle index 1f6c10c1..d14f699d 100644 --- a/opendcs-web-client-jetty/build.gradle +++ b/opendcs-web-client-jetty/build.gradle @@ -15,7 +15,6 @@ dependencies { implementation(libs.jetty.annotations) implementation(libs.jetty.webapp) implementation(libs.jersey.container.servlet) - implementation(libs.tomcat.embed) } jar { @@ -72,16 +71,6 @@ context=odcsapi } } -task filepermission() { - doLast { - String start_path = "${buildDir}\\bin\\start.sh" - System.out.println("Here: " + start_path) - project.exec { - commandLine('chmod', '+x', start_path) - } - } -} - task bundle(type: Tar) { dependsOn jar dependsOn copyWar diff --git a/opendcs-web-client/build.gradle b/opendcs-web-client/build.gradle index ed6bca6b..6c8092e9 100644 --- a/opendcs-web-client/build.gradle +++ b/opendcs-web-client/build.gradle @@ -7,6 +7,7 @@ plugins { dependencies { implementation(libs.jetty.jsp) + implementation(libs.servlet.api) implementation(libs.websocket) testImplementation(libs.mockito.core) testImplementation(libs.mockito.junit.jupiter) diff --git a/opendcs-web-client/src/main/java/api/Gateway.java b/opendcs-web-client/src/main/java/api/Gateway.java index 8386be19..89296a15 100644 --- a/opendcs-web-client/src/main/java/api/Gateway.java +++ b/opendcs-web-client/src/main/java/api/Gateway.java @@ -124,8 +124,6 @@ protected void doDelete(HttpServletRequest request, HttpServletResponse response */ public void setApiDetails(ServletContext sc) throws IOException { - //this.baseUrl = "http://108.20.179.32:9876"; - //this.context = "odcsapi"; if (sc == null) { sc = this.getServletContext(); } @@ -136,11 +134,7 @@ public void setApiDetails(ServletContext sc) throws IOException { //Use the config file within WAR file. //default api file location. - //if (sc == null) { - // apiConfigFilePath = this.getServletContext().getRealPath("/conf/api.conf"); - //} else { apiConfigFilePath = sc.getRealPath("/conf/api.conf"); - //} } //Gets the initialization details from the conf file. diff --git a/opendcs-web-client/src/main/webapp/WEB-INF/web.xml b/opendcs-web-client/src/main/webapp/WEB-INF/web.xml index 37395fb4..0defc3fd 100644 --- a/opendcs-web-client/src/main/webapp/WEB-INF/web.xml +++ b/opendcs-web-client/src/main/webapp/WEB-INF/web.xml @@ -179,16 +179,6 @@ ApiGateway /api/gateway - - - httpHeaderSecurity - org.apache.catalina.filters.HttpHeaderSecurityFilter - true - - - httpHeaderSecurity - /* - 404 /error.jsp From 95d677d022d650bd37f9ae4274642cef475808ac Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 21:15:35 -0500 Subject: [PATCH 10/13] Fixed/updated many sonarcloud findings, mainly maintainability findings. --- .../opendcs/odcsapi/jetty/ApiCmdLineArgs.java | 2 +- .../java/org/opendcs/odcsapi/jetty/Start.java | 59 +++++++++---------- .../src/main/java/api/Gateway.java | 13 ++-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java index d4750af3..5088b543 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/ApiCmdLineArgs.java @@ -37,7 +37,7 @@ public class ApiCmdLineArgs private enum State { IDLE, EXPECT_CONTEXT, EXPECT_HTTPPORT, EXPECT_HTTPSPORT, EXPECT_KEYSTOREPATH, EXPECT_KEYSTOREPASSWORD, EXPECT_PROPFILE, EXPECT_CORS - }; + } private State state = State.IDLE; private String splitArg = null; diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 489fa953..489f92e7 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -17,9 +17,7 @@ import java.io.File; import java.io.FileNotFoundException; -import java.io.InputStream; import java.io.FileReader; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -54,53 +52,50 @@ public class Start { private static ApiCmdLineArgs apiCmdLineArgs = new ApiCmdLineArgs(); + private static final Logger LOGGER = LoggerFactory.getLogger(ApiConstants.loggerName); - public static void main(String[] args) + public static void main(String[] args) throws Exception { - ArrayList corsList = new ArrayList(); + ArrayList corsList = new ArrayList<>(); corsList.add(new String[] { "Access-Control-Allow-Origin", CrossOriginFilter.ALLOWED_ORIGINS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Headers", CrossOriginFilter.ALLOWED_HEADERS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Methods", CrossOriginFilter.ALLOWED_METHODS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Credentials", CrossOriginFilter.ALLOW_CREDENTIALS_PARAM }); apiCmdLineArgs.parseArgs(args); - InputStream is = null; - // Set up logging - Logger logger = LoggerFactory.getLogger(ApiConstants.loggerName); - - // Parse args - logger.info("DCSTOOL_USERDIR={}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); - - logger.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); - logger.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); - logger.info("Top Context={}", apiCmdLineArgs.getContext()); - logger.info("Cors File={}", apiCmdLineArgs.getCorsFile()); - logger.info("Secure Mode={}", apiCmdLineArgs.isSecureMode()); + LOGGER.info("DCSTOOL_USERDIR={0}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); + LOGGER.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); + LOGGER.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); + LOGGER.info("Top Context={}", apiCmdLineArgs.getContext()); + LOGGER.info("Cors File={}", apiCmdLineArgs.getCorsFile()); + LOGGER.info("Secure Mode={}", apiCmdLineArgs.isSecureMode()); // Initialize the JETTY server and servlet holders. org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(); ServletContextHandler ctx = new ServletContextHandler(ServletContextHandler.SESSIONS); ctx.setContextPath("/"); server.setHandler(ctx); + String corsFile = apiCmdLineArgs.getCorsFile(); if (corsFile != null) { Path corsPath = Paths.get(corsFile); - boolean fExists = Files.exists(corsPath); + boolean fExists = corsPath.toFile().exists(); if (!fExists) { - logger.warn("Cors File={} does not exist. Doing nothing with CORS for now.", corsFile); + LOGGER.warn("Cors File={} does not exist. Doing nothing with CORS for now.", corsFile); } else { try { - logger.info("Looking for Cors Filters."); + LOGGER.info("Looking for Cors Filters."); Scanner scanner = new Scanner(new File(corsFile)); FilterHolder cors = null; - while (scanner.hasNextLine()) { + while (scanner.hasNextLine()) + { String curLine = scanner.nextLine(); String[] splitString = curLine.split(":"); String corsId = splitString[0].trim().toLowerCase(); @@ -114,7 +109,8 @@ public static void main(String[] args) { cors = ctx.addFilter(CrossOriginFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); } - logger.info("Adding the following cors filter: {} : {}", corsList.get(x)[1], corsValue); + String corsFilter = corsList.get(x)[1]; + LOGGER.info("Adding the following cors filter: {} : {}", corsFilter, corsValue); cors.setInitParameter(corsList.get(x)[1], corsValue); } } @@ -124,8 +120,10 @@ public static void main(String[] args) server.setHandler(ctx); } scanner.close(); - } catch (FileNotFoundException e) { - logger.error("There was an error loading file.", e); + } + catch (FileNotFoundException e) + { + LOGGER.error("There was an error loading file.", e); } } } @@ -148,13 +146,13 @@ public static void main(String[] args) for (Object key : decodesProps.keySet()) { String n = (String)key; - if (n.equalsIgnoreCase("editDatabaseType")) + if ("editDatabaseType".equalsIgnoreCase(n)) dbType = decodesProps.getProperty(n); - else if (n.equalsIgnoreCase("editDatabaseLocation")) + else if ("editDatabaseLocation".equalsIgnoreCase(n)) dbUrl = decodesProps.getProperty(n); - else if (n.equalsIgnoreCase("DbAuthFile")) + else if ("DbAuthFile".equalsIgnoreCase(n)) dbAuthFile = decodesProps.getProperty(n); - else if (n.equalsIgnoreCase("siteNameTypePreference")) + else if ("siteNameTypePreference".equalsIgnoreCase(n)) DbInterface.siteNameTypePreference = n; } ApiPropertiesUtil.copyProps(DbInterface.decodesProperties, decodesProps); @@ -171,8 +169,7 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) catch(Exception ex) { String msg = String.format("Cannot read DB auth from file '%s': %s", afn, ex); - System.err.println(msg); - logger.error(msg); + LOGGER.error(msg); throw new StartException(String.format("Cannot read auth file: %s", ex)); } ds.setUser(afr.getUsername()); @@ -187,7 +184,7 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) ctx.addServlet(new ServletHolder(new DefaultServlet()), "/*"); ServerConnector connector = new ServerConnector(server); - ArrayList connectors = new ArrayList(); + ArrayList connectors = new ArrayList<>(); if (apiCmdLineArgs.getHttpPort() >= 0) { connector.setPort(apiCmdLineArgs.getHttpPort()); @@ -210,8 +207,6 @@ else if (n.equalsIgnoreCase("siteNameTypePreference")) } server.setConnectors(connectors.toArray(new ServerConnector[connectors.size()])); - - /******* Controlling Headers ******************/ // Start the server. server.start(); diff --git a/opendcs-web-client/src/main/java/api/Gateway.java b/opendcs-web-client/src/main/java/api/Gateway.java index 89296a15..e53b8a6d 100644 --- a/opendcs-web-client/src/main/java/api/Gateway.java +++ b/opendcs-web-client/src/main/java/api/Gateway.java @@ -124,7 +124,8 @@ protected void doDelete(HttpServletRequest request, HttpServletResponse response */ public void setApiDetails(ServletContext sc) throws IOException { - if (sc == null) { + if (sc == null) + { sc = this.getServletContext(); } Object configAttr = sc.getAttribute("api_details_file_path"); @@ -138,7 +139,7 @@ public void setApiDetails(ServletContext sc) throws IOException } //Gets the initialization details from the conf file. - System.out.println("API Config File Path: " + apiConfigFilePath.toString()); + System.out.println("API Config File Path: " + apiConfigFilePath); File cf = new File(apiConfigFilePath); // Creating an object of BufferedReader class @@ -159,10 +160,14 @@ public void setApiDetails(ServletContext sc) throws IOException if (name.equalsIgnoreCase("url")) { tempUrl = value; System.out.println("Setting Base Url to " + tempUrl); - } else if (name.equalsIgnoreCase("port")) { + } + else if ("port".equalsIgnoreCase(name)) + { tempPort = ":" + value; System.out.println("Setting Port to " + tempPort); - } else if (name.equalsIgnoreCase("context")) { + } + else if ("context".equalsIgnoreCase(name)) + { tempContext = value; System.out.println("Setting Context to " + tempContext); } From fc5c06d5440235db0a06fdb88768fb523de52659 Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 23:09:17 -0500 Subject: [PATCH 11/13] More updates to sonarcloud findings for maintainability. --- opendcs-rest-api-jetty/build.gradle | 77 ++----------------- .../java/org/opendcs/odcsapi/jetty/Start.java | 55 +++++++++---- opendcs-web-client-jetty/build.gradle | 1 + .../opendcs/odcswebclient/jetty/Start.java | 68 ++++++++-------- 4 files changed, 83 insertions(+), 118 deletions(-) diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 6f60f6d6..a01ca7b7 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -63,83 +63,16 @@ java -Djava.util.logging.config.file=logging.properties \$JAVA_OPTS -jar libs/$ } } -task createLoggingPropertiesFile() { - doLast { - File targetBuildDir = project.layout.getBuildDirectory().get().getAsFile(); - //File binDir = new File(buildDir.toString(), "bin"); - - //Make the logging.properties file. - new File(targetBuildDir, "logging.properties").text = """ -############################################################ -# \tDefault Logging Configuration File -# -# You can use a different file by specifying a filename -# with the java.util.logging.config.file system property. -# For example java -Djava.util.logging.config.file=myfile -# or: -Djava.util.logging.config.file=./config/properties/logging.properties -############################################################ - -############################################################ -# \tGlobal properties -############################################################ - -# "handlers" specifies a comma separated list of log Handler -# classes. These handlers will be installed during VM startup. -# Note that these classes must be on the system classpath. -# Additional handlers can be added to the list -handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler - -# Default global logging level. -# This specifies which kinds of events are logged across -# all loggers. For any given facility this global level -# can be overriden by a facility specific level -# Note that the ConsoleHandler also has a separate level -# setting to limit messages printed to the console. -.level= CONFIG - -############################################################ -# Handler specific properties. -# Describes specific configuration info for Handlers. -############################################################ - -# Individual handlers filter messages by level. -# Messages at or above this level get output by the handler being configured. - -# Setting this level = CONFIG causes CONFIG, INFO, WARNING, and SEVERE messages to be -# output by this handler. -java.util.logging.ConsoleHandler.level = CONFIG -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - -# The following special tokens can be used in the FileHandler pattern property -# which specifies the location and name of the log file. -# / - standard path separator -# %t - system temporary directory -# %h - value of the user.home system property -# %g - generation number for rotating logs -# %u - unique number to avoid conflicts -# FileHandler writes to %h/demo0.log by default. -java.util.logging.FileHandler.pattern = %t/opendcs_rest_logging_%g.log -java.util.logging.FileHandler.level = ALL -java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter - -# Formats the messages with a timestamp at the beginning. -java.util.logging.SimpleFormatter.format=[%1\$tc] %4\$s: %5\$s %n - -############################################################ -# Facility specific properties. -# Provides extra control for each logger. -############################################################ - -# Specify logging levels for specific namespaces. -# org.opendcs.odcsapi.level = FINEST - """ - } +task copyLoggingPropertiesFile(type: Copy) { + dependsOn jar + from 'src/main/resources/logging.properties' + into project.layout.getBuildDirectory().get().getAsFile() } task bundle(type: Tar) { dependsOn jar dependsOn createStartScript - dependsOn createLoggingPropertiesFile + dependsOn copyLoggingPropertiesFile archiveExtension = 'tar.gz' diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 489f92e7..7c4144f1 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -43,7 +43,6 @@ import org.eclipse.jetty.util.ssl.SslContextFactory; import org.glassfish.jersey.servlet.ServletContainer; import org.opendcs.odcsapi.hydrojson.DbInterface; -import org.opendcs.odcsapi.start.StartException; import org.opendcs.odcsapi.util.ApiConstants; import org.opendcs.odcsapi.util.ApiEnvExpander; import org.opendcs.odcsapi.util.ApiPropertiesUtil; @@ -55,7 +54,7 @@ public class Start private static final Logger LOGGER = LoggerFactory.getLogger(ApiConstants.loggerName); public static void main(String[] args) - throws Exception + //throws Exception { ArrayList corsList = new ArrayList<>(); corsList.add(new String[] { "Access-Control-Allow-Origin", CrossOriginFilter.ALLOWED_ORIGINS_PARAM }); @@ -63,9 +62,16 @@ public static void main(String[] args) corsList.add(new String[] { "Access-Control-Allow-Methods", CrossOriginFilter.ALLOWED_METHODS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Credentials", CrossOriginFilter.ALLOW_CREDENTIALS_PARAM }); - apiCmdLineArgs.parseArgs(args); + try + { + apiCmdLineArgs.parseArgs(args); + } + catch (Exception e) + { + LOGGER.error("Error parsing arguments. Exiting now. {}", e.getMessage()); + System.exit(1); + } - LOGGER.info("DCSTOOL_USERDIR={0}, parsing args...", System.getProperty("DCSTOOL_USERDIR")); LOGGER.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); LOGGER.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); LOGGER.info("Top Context={}", apiCmdLineArgs.getContext()); @@ -140,6 +146,10 @@ public static void main(String[] args) { decodesProps.load(fr); } + catch (Exception e) + { + LOGGER.error("There was an error loading the decodes property file. {}", e.getMessage()); + } String dbUrl = null; String dbType = null; String dbAuthFile = null; @@ -166,31 +176,42 @@ else if ("siteNameTypePreference".equalsIgnoreCase(n)) { afr.read(); } - catch(Exception ex) + catch(Exception e) { - String msg = String.format("Cannot read DB auth from file '%s': %s", afn, ex); + String msg = String.format("Cannot read DB auth from file '%s': %s", afn, e); LOGGER.error(msg); - throw new StartException(String.format("Cannot read auth file: %s", ex)); } ds.setUser(afr.getUsername()); ds.setPassword(afr.getPassword()); DbInterface.setDataSource(ds); - DbInterface.setDatabaseType(dbType); + try + { + DbInterface.setDatabaseType(dbType); + } + catch (Exception e) + { + LOGGER.error("There was an issue setting database type. {}", e.getMessage()); + if (dbType != null) + { + LOGGER.error("The attempted database type to be set is {}", dbType); + } + } // Setup Swagger-UI static resources String resourceBasePath = Start.class.getResource("/swaggerui").toExternalForm(); ctx.setWelcomeFiles(new String[] {"index.html"}); ctx.setResourceBase(resourceBasePath); ctx.addServlet(new ServletHolder(new DefaultServlet()), "/*"); + ServerConnector connector = new ServerConnector(server); - ArrayList connectors = new ArrayList<>(); + if (apiCmdLineArgs.getHttpPort() >= 0) { connector.setPort(apiCmdLineArgs.getHttpPort()); connectors.add(connector); } - + if (apiCmdLineArgs.getHttpsPort() >= 0) { HttpConfiguration https = new HttpConfiguration(); @@ -205,11 +226,19 @@ else if ("siteNameTypePreference".equalsIgnoreCase(n)) sslConnector.setPort(apiCmdLineArgs.getHttpsPort()); connectors.add(sslConnector); } - + server.setConnectors(connectors.toArray(new ServerConnector[connectors.size()])); // Start the server. - server.start(); - server.join(); + try + { + server.start(); + server.join(); + } + catch (Exception e) + { + LOGGER.warn("Interrupted!", e); + Thread.currentThread().interrupt(); + } } } diff --git a/opendcs-web-client-jetty/build.gradle b/opendcs-web-client-jetty/build.gradle index d14f699d..9741ced4 100644 --- a/opendcs-web-client-jetty/build.gradle +++ b/opendcs-web-client-jetty/build.gradle @@ -15,6 +15,7 @@ dependencies { implementation(libs.jetty.annotations) implementation(libs.jetty.webapp) implementation(libs.jersey.container.servlet) + implementation(libs.slf4j.jdk) } jar { diff --git a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java index 88d46c43..bbbd3101 100644 --- a/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java +++ b/opendcs-web-client-jetty/src/main/java/org/opendcs/odcswebclient/jetty/Start.java @@ -15,7 +15,6 @@ package org.opendcs.odcswebclient.jetty; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -27,6 +26,9 @@ import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.StdErrLog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Represents a Start. This will start a jetty server. * @@ -35,26 +37,26 @@ */ public class Start { - public static void main(String[] args) - throws Exception + private static final Logger LOGGER = LoggerFactory.getLogger(Start.class); + public static void main(String[] args) { Log.setLog(new StdErrLog()); String warFilePath = null; - int port = 8080; - String contextPath = "/"; + int port; + String contextPath; String apiFileDetailsPath = null; // Initialize the JETTY server and servlet holders. ArgParser argParse = new ArgParser(args); - String portString = argParse.switchValue("-p", "8083"); - System.out.println("Using Port: " + portString); + String portString = argParse.switchValue("-p", "8080"); + LOGGER.info("Using Port: {}", portString); try { warFilePath = argParse.switchValue("-w", null); } catch (Exception e) { - System.out.println("War File Not Provided!"); + LOGGER.error("War file not provided: {}", e.getMessage()); System.exit(1); } @@ -64,14 +66,9 @@ public static void main(String[] args) } catch (Exception e) { - System.out.println("No Api File Details Path File Provided. Using defaults."); + LOGGER.warn("No Api File Details Path File Provided. Using defaults {}.", e.getMessage()); } - contextPath = argParse.switchValue("-c", "/"); - if (!contextPath.startsWith("/")) - { - contextPath = "/" + contextPath; - } port = Integer.parseInt(portString); contextPath = argParse.switchValue("-c", "/"); @@ -80,18 +77,15 @@ public static void main(String[] args) contextPath = "/" + contextPath; } - - - Server server = new Server(port); - - - /******* Controlling Headers ******************/ - for(Connector y : server.getConnectors()) { - for(ConnectionFactory x : y.getConnectionFactories()) { - if(x instanceof HttpConnectionFactory) { + for(Connector y : server.getConnectors()) + { + for(ConnectionFactory x : y.getConnectionFactories()) + { + if(x instanceof HttpConnectionFactory) + { //Removes Server Header ((HttpConnectionFactory)x).getHttpConfiguration().setSendServerVersion(false); } @@ -101,17 +95,17 @@ public static void main(String[] args) WebAppContext webapp = new WebAppContext(); webapp.setContextPath(contextPath); - System.out.println("Setting context path to : " + contextPath); + LOGGER.info("Setting context path to {}", contextPath); Path warPath = Paths.get(warFilePath); - boolean fExists = Files.exists(warPath); - System.out.println("============================="); - System.out.println("Ware File: " + warFilePath); - System.out.println("War File Exists: " + fExists); - System.out.println("============================="); + boolean fExists = warPath.toFile().exists(); + LOGGER.info("============================="); + LOGGER.info("Ware File: {}", warFilePath); + LOGGER.info("War File Exists: {}", fExists); + LOGGER.info("============================="); if (!fExists) { - System.out.println("War file does not exist. Please try again and make sure to provide a valid war file."); + LOGGER.error("War file does not exist. Please try again and make sure to provide a valid war file."); System.exit(1); } // Configure JSP support. @@ -128,7 +122,15 @@ public static void main(String[] args) classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration"); // Start the server! - server.start(); - server.join(); + try + { + server.start(); + server.join(); + } + catch (Exception e) + { + LOGGER.warn("Interrupted!", e); + Thread.currentThread().interrupt(); + } } -} \ No newline at end of file +} From 47b0e83a1452a8f9813254da1d74281c5c9ee52e Mon Sep 17 00:00:00 2001 From: Adam Korynta Date: Tue, 16 Jan 2024 20:20:41 -0800 Subject: [PATCH 12/13] move logging.properties out of resources --- opendcs-rest-api-jetty/build.gradle | 14 +--- .../config/logging.properties | 77 +++++++++++++++++++ 2 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 opendcs-rest-api-jetty/config/logging.properties diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index a01ca7b7..38a66827 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -58,26 +58,20 @@ task createStartScript() { new File(binDir, "start.sh").text = """ #!/bin/bash cd `dirname \$0`/.. -java -Djava.util.logging.config.file=logging.properties \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS +java -Djava.util.logging.config.file=config/logging.properties \$JAVA_OPTS -jar libs/${project.name}-${project.version}.jar \$JAVA_ARGS """ } } -task copyLoggingPropertiesFile(type: Copy) { - dependsOn jar - from 'src/main/resources/logging.properties' - into project.layout.getBuildDirectory().get().getAsFile() -} - task bundle(type: Tar) { dependsOn jar dependsOn createStartScript - dependsOn copyLoggingPropertiesFile + compression Compression.GZIP archiveExtension = 'tar.gz' - into('') { - from new File(project.layout.getBuildDirectory().get().getAsFile(), "logging.properties"); + into('config') { + from project.file("bin/logging.properties") } into('libs') { from configurations.runtimeClasspath diff --git a/opendcs-rest-api-jetty/config/logging.properties b/opendcs-rest-api-jetty/config/logging.properties new file mode 100644 index 00000000..44c83d85 --- /dev/null +++ b/opendcs-rest-api-jetty/config/logging.properties @@ -0,0 +1,77 @@ +# +# Copyright 2024 OpenDCS Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License") +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################ +# Default Logging Configuration File +# +# You can use a different file by specifying a filename +# with the java.util.logging.config.file system property. +# For example java -Djava.util.logging.config.file=myfile +# or: -Djava.util.logging.config.file=./config/properties/logging.properties +############################################################ + +############################################################ +# Global properties +############################################################ + +# "handlers" specifies a comma separated list of log Handler +# classes. These handlers will be installed during VM startup. +# Note that these classes must be on the system classpath. +# Additional handlers can be added to the list +handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler + +# Default global logging level. +# This specifies which kinds of events are logged across +# all loggers. For any given facility this global level +# can be overriden by a facility specific level +# Note that the ConsoleHandler also has a separate level +# setting to limit messages printed to the console. +.level= CONFIG + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +# Individual handlers filter messages by level. +# Messages at or above this level get output by the handler being configured. + +# Setting this level = CONFIG causes CONFIG, INFO, WARNING, and SEVERE messages to be +# output by this handler. +java.util.logging.ConsoleHandler.level = CONFIG +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + +# The following special tokens can be used in the FileHandler pattern property +# which specifies the location and name of the log file. +# / - standard path separator +# %t - system temporary directory +# %h - value of the user.home system property +# %g - generation number for rotating logs +# %u - unique number to avoid conflicts +# FileHandler writes to %h/demo0.log by default. +java.util.logging.FileHandler.pattern = %t/opendcs_rest_logging_%g.log +java.util.logging.FileHandler.level = ALL +java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter + +# Formats the messages with a timestamp at the beginning. +java.util.logging.SimpleFormatter.format=[%1$tc] %4$s: %5$s %n + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +# Specify logging levels for specific namespaces. +# org.opendcs.odcsapi.level = FINEST \ No newline at end of file From ac8d90c07eeff8ee219a50d91fc62222b29eaa6a Mon Sep 17 00:00:00 2001 From: wjonassen Date: Tue, 16 Jan 2024 23:53:58 -0500 Subject: [PATCH 13/13] Updating for maintainability. Added back some of the exit and throws functionality into Start.java. --- opendcs-rest-api-jetty/build.gradle | 2 +- .../java/org/opendcs/odcsapi/jetty/Start.java | 73 +++++++------------ .../src/main/java/api/Gateway.java | 3 +- 3 files changed, 29 insertions(+), 49 deletions(-) diff --git a/opendcs-rest-api-jetty/build.gradle b/opendcs-rest-api-jetty/build.gradle index 38a66827..87a5faf9 100644 --- a/opendcs-rest-api-jetty/build.gradle +++ b/opendcs-rest-api-jetty/build.gradle @@ -71,7 +71,7 @@ task bundle(type: Tar) { archiveExtension = 'tar.gz' into('config') { - from project.file("bin/logging.properties") + from project.file("config/logging.properties") } into('libs') { from configurations.runtimeClasspath diff --git a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java index 7c4144f1..37260f08 100644 --- a/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java +++ b/opendcs-rest-api-jetty/src/main/java/org/opendcs/odcsapi/jetty/Start.java @@ -25,6 +25,7 @@ import java.util.Properties; import java.util.Scanner; +import org.opendcs.odcsapi.start.StartException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +55,16 @@ public class Start private static final Logger LOGGER = LoggerFactory.getLogger(ApiConstants.loggerName); public static void main(String[] args) - //throws Exception + { + try + { + run(args); + } catch (Exception e) + { + LOGGER.atError().setCause(e).log("There was an error running the opendcs-rest-api-jetty start script."); + } + } + private static void run(String[] args) throws Exception { ArrayList corsList = new ArrayList<>(); corsList.add(new String[] { "Access-Control-Allow-Origin", CrossOriginFilter.ALLOWED_ORIGINS_PARAM }); @@ -62,15 +72,7 @@ public static void main(String[] args) corsList.add(new String[] { "Access-Control-Allow-Methods", CrossOriginFilter.ALLOWED_METHODS_PARAM }); corsList.add(new String[] { "Access-Control-Allow-Credentials", CrossOriginFilter.ALLOW_CREDENTIALS_PARAM }); - try - { - apiCmdLineArgs.parseArgs(args); - } - catch (Exception e) - { - LOGGER.error("Error parsing arguments. Exiting now. {}", e.getMessage()); - System.exit(1); - } + apiCmdLineArgs.parseArgs(args); LOGGER.info("Listening Http Port={}", apiCmdLineArgs.getHttpPort()); LOGGER.info("Listening Https Port={}", apiCmdLineArgs.getHttpsPort()); @@ -135,21 +137,17 @@ public static void main(String[] args) } ServletHolder serHol = ctx.addServlet(ServletContainer.class, - "/" + apiCmdLineArgs.getContext() + "/*"); + "/" + apiCmdLineArgs.getContext() + "/*"); serHol.setInitOrder(1); - serHol.setInitParameter("jersey.config.server.provider.packages", - "org.opendcs.odcsapi.res"); - + serHol.setInitParameter("jersey.config.server.provider.packages", + "org.opendcs.odcsapi.res"); + // Get whatever is needed from decodes properties. Properties decodesProps = new Properties(); try (FileReader fr = new FileReader(ApiEnvExpander.expand(apiCmdLineArgs.getDecodesPropFile()))) { decodesProps.load(fr); } - catch (Exception e) - { - LOGGER.error("There was an error loading the decodes property file. {}", e.getMessage()); - } String dbUrl = null; String dbType = null; String dbAuthFile = null; @@ -167,7 +165,7 @@ else if ("siteNameTypePreference".equalsIgnoreCase(n)) } ApiPropertiesUtil.copyProps(DbInterface.decodesProperties, decodesProps); DbInterface.secureMode = apiCmdLineArgs.isSecureMode(); - + PGSimpleDataSource ds = new PGSimpleDataSource(); ds.setURL(dbUrl); String afn = ApiEnvExpander.expand(dbAuthFile); @@ -176,36 +174,25 @@ else if ("siteNameTypePreference".equalsIgnoreCase(n)) { afr.read(); } - catch(Exception e) + catch(Exception ex) { - String msg = String.format("Cannot read DB auth from file '%s': %s", afn, e); + String msg = String.format("Cannot read DB auth from file '%s': %s", afn, ex); LOGGER.error(msg); + throw new StartException(String.format("Cannot read auth file: %s", ex)); } ds.setUser(afr.getUsername()); ds.setPassword(afr.getPassword()); DbInterface.setDataSource(ds); - try - { - DbInterface.setDatabaseType(dbType); - } - catch (Exception e) - { - LOGGER.error("There was an issue setting database type. {}", e.getMessage()); - if (dbType != null) - { - LOGGER.error("The attempted database type to be set is {}", dbType); - } - } + DbInterface.setDatabaseType(dbType); // Setup Swagger-UI static resources String resourceBasePath = Start.class.getResource("/swaggerui").toExternalForm(); ctx.setWelcomeFiles(new String[] {"index.html"}); ctx.setResourceBase(resourceBasePath); ctx.addServlet(new ServletHolder(new DefaultServlet()), "/*"); - ServerConnector connector = new ServerConnector(server); - ArrayList connectors = new ArrayList<>(); + ArrayList connectors = new ArrayList<>(); if (apiCmdLineArgs.getHttpPort() >= 0) { connector.setPort(apiCmdLineArgs.getHttpPort()); @@ -221,8 +208,8 @@ else if ("siteNameTypePreference".equalsIgnoreCase(n)) sslContextFactory.setKeyStorePath(apiCmdLineArgs.getKeyStorePath()); sslContextFactory.setKeyStorePassword(apiCmdLineArgs.getKeyStorePassword()); ServerConnector sslConnector = new ServerConnector(server, - new SslConnectionFactory(sslContextFactory, "http/1.1"), - new HttpConnectionFactory(https)); + new SslConnectionFactory(sslContextFactory, "http/1.1"), + new HttpConnectionFactory(https)); sslConnector.setPort(apiCmdLineArgs.getHttpsPort()); connectors.add(sslConnector); } @@ -230,15 +217,7 @@ else if ("siteNameTypePreference".equalsIgnoreCase(n)) server.setConnectors(connectors.toArray(new ServerConnector[connectors.size()])); // Start the server. - try - { - server.start(); - server.join(); - } - catch (Exception e) - { - LOGGER.warn("Interrupted!", e); - Thread.currentThread().interrupt(); - } + server.start(); + server.join(); } } diff --git a/opendcs-web-client/src/main/java/api/Gateway.java b/opendcs-web-client/src/main/java/api/Gateway.java index e53b8a6d..b2cfffe8 100644 --- a/opendcs-web-client/src/main/java/api/Gateway.java +++ b/opendcs-web-client/src/main/java/api/Gateway.java @@ -157,7 +157,8 @@ public void setApiDetails(ServletContext sc) throws IOException { String name = nameValue[0].trim(); String value = nameValue[1].trim(); - if (name.equalsIgnoreCase("url")) { + if ("url".equalsIgnoreCase(name)) + { tempUrl = value; System.out.println("Setting Base Url to " + tempUrl); }