Compare commits

..

51 commits

Author SHA1 Message Date
1476c9b19f Merge branch 'main' into renovate/major-jetty-packages
All checks were successful
Build / build (push) Successful in 35s
2025-05-27 17:55:54 +00:00
df28d40645 Update dependency gradle to v8.14.1
All checks were successful
Build / build (push) Successful in 33s
2025-05-25 15:39:15 +00:00
29f7ca5ae3 Merge branch 'main' into renovate/major-jetty-packages
All checks were successful
Build / build (push) Successful in 8s
2025-05-25 15:37:13 +00:00
f9bc64d1ed
Merge remote-tracking branch 'origin/main' into renovate/major-jetty-packages 2025-05-24 21:41:38 +02:00
96ceb1d5f3
Merge branch 'main' into renovate/major-jetty-packages 2025-05-24 15:39:44 +02:00
745ce5bfca
Merge branch 'main' into renovate/major-jetty-packages 2025-04-11 13:22:10 +02:00
0cf9cf7af2
Merge remote-tracking branch 'origin/main' into renovate/major-jetty-packages
All checks were successful
Build / build (push) Successful in 10s
2025-04-10 23:32:50 +02:00
6723df912e
Resolve FIXME but without fixing the issue
All checks were successful
Build / build (push) Successful in 19s
I tried to make this work but it might need a more thorough rewrite that I just cannot do.

The worst that can happen is stopping and starting Helma apps adding redundant ServletContextHandlers to the ContextHandlerCollection until Helma is restarted.
2025-04-07 17:16:59 +02:00
436862e87a
Remove setting of “empty” base resource
Fingers crossed it won’t be missed
2025-04-07 17:16:58 +02:00
36a12effb2
Bump Jetty versions to 12.0.19 2025-04-07 17:16:57 +02:00
2994a4becc
Disable Jetty’s session cookies
This remediates the exception “Shared scheduler not started” and restores the functionality of enabling an app in apps.properties – see #103 (comment)
2025-04-07 17:16:53 +02:00
99e8b204fd
Bump Java version 2025-04-07 17:05:43 +02:00
c42c0a7a17
Update repo URL 2025-04-07 17:05:43 +02:00
b7543cf615
Bump year of copyright notice 2025-04-07 17:05:42 +02:00
fc084f6e52
Escape HTML elements in commit messages 2025-04-07 17:05:41 +02:00
6fc73d2320
Add release notes generated with git-cliff 2025-04-07 17:05:40 +02:00
9b5cc988dd
Run the build workflow when itself has changed 2025-04-07 17:05:40 +02:00
04b210b464
Leave aside compiling for different Java versions for now 2025-04-07 17:05:39 +02:00
4c011f1e1b
Gradle is installed on the runner 2025-04-07 17:05:38 +02:00
bc7894ecc1
Use fully qualified URL for setup-java action 2025-04-07 17:05:38 +02:00
a3fbf72f38
Initial commit 2025-04-07 17:05:37 +02:00
de2150693f
Add deploy script usable with rsync and a restricted SSH key 2025-04-07 17:05:36 +02:00
cd8baa4ac1
Merge branch 'main' into renovate/major-jetty-packages 2025-02-15 20:43:32 +01:00
11b226b272
Merge branch 'main' into origin/renovate/major-jetty-packages
# Conflicts:
#	build.gradle
2025-01-10 20:09:53 +01:00
1925916220
Bump required minimum Java version to 17 2024-06-15 18:27:30 +02:00
b1296fb093
Merge branch 'helma-🐜' into renovate/major-jetty-packages
# Conflicts:
#	.github/workflows/release.yml
2024-06-15 18:18:25 +02:00
51bc14c3a4
Remove over-complicated launch and tasks configuration in favor of Gradle plugin
Starting run/debug tasks with the plugin works out of the box;
one just has to avoid the default “Run and Debug” button.
2024-06-15 18:01:30 +02:00
3e5af064b0
Add setup for Gradle debugging in VS Codium 2024-06-15 18:00:59 +02:00
6401300189
Decouple update task from install
Now that Gradle runs Helma with the configured dependencies, updating the installation directory has become less crucial
2024-06-15 13:02:11 +02:00
45b19e3217
Reorder the tasks 2024-06-15 12:38:04 +02:00
ffb259a01c
Slightly modify the version string (still a date representation) 2024-06-15 12:37:16 +02:00
84abcde037
Update run configuration to always use the correct dependencies 2024-06-15 12:34:51 +02:00
9e870e6cd3
Slightly modify the format of the build date 2024-06-15 12:34:50 +02:00
1e32c8eb89
Merge remote-tracking branch 'origin/helma-🐜' into renovate/major-jetty-packages 2024-05-30 19:22:11 +02:00
9143faf35e
Add release action 2024-05-30 19:10:13 +02:00
79d83389f2
Use canonical paths when creating static contexts 2024-05-25 18:28:43 +02:00
90e45c9115
Migrate to Apache file upload API 2 w/ Jakarta 2024-05-25 18:28:43 +02:00
3dbcd792a6
Migrate to Jakarte servlet API 5 2024-05-25 18:28:42 +02:00
973b3493cb
Prevent java.lang.IllegalArgumentException: Resource String is invalid 2024-05-25 18:28:42 +02:00
441d952b35
Prevent incompatible types: ServletContextHandler cannot be converted to Handler 2024-05-25 18:28:42 +02:00
d67d0235bd
Prevent java.lang.IllegalStateException: Shared scheduler not started 2024-05-25 18:28:41 +02:00
fa59a27858
Fix creation of protected context 2024-05-25 18:28:41 +02:00
304ea4e456
Fix creation of app context 2024-05-25 18:28:40 +02:00
0165e7c80e
Fix setup of static resource 2024-05-25 18:28:40 +02:00
62630ae068
Modernize for loop 2024-05-25 18:28:39 +02:00
26975a109a
Method ServerConnector.setSoLingerTime() was removed 2024-05-25 18:28:39 +02:00
a943124d45
Fix creating Jetty server from config file 2024-05-25 18:28:38 +02:00
c087cb731e
Use correct version of Jetty servlet 2024-05-25 18:28:38 +02:00
c5f68013b1 Merge branch 'helma-🐜' into renovate/major-jetty-packages 2024-05-19 02:56:40 +02:00
ed575bc4c5
Update README.md
Minor edits
2024-05-19 02:05:49 +02:00
renovate[bot]
1cf738767c
Update Jetty packages 2024-05-18 15:30:36 +00:00
50 changed files with 674 additions and 599 deletions

View file

@ -1 +1 @@
11.0 17

View file

@ -2,7 +2,7 @@
## TL;DR ## TL;DR
- Make sure you have Java 11 or higher installed - Make sure you have Java 17 or higher installed
- Download and unpack the [latest release](https://code.host.antville.org/antville/helma/releases) - Download and unpack the [latest release](https://code.host.antville.org/antville/helma/releases)
- Invoke `./bin/helma`, resp. `./bin/helma.bat`, depending on your platform - Invoke `./bin/helma`, resp. `./bin/helma.bat`, depending on your platform
- Direct your web browser to <http://localhost:8080> - Direct your web browser to <http://localhost:8080>

View file

@ -18,8 +18,8 @@ allprojects {
apply plugin: 'java' apply plugin: 'java'
java { java {
sourceCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_17
} }
repositories { repositories {
@ -51,14 +51,15 @@ configurations {
dependencies { dependencies {
implementation 'com.google.code.gson:gson:2.12.1' implementation 'com.google.code.gson:gson:2.12.1'
implementation 'commons-codec:commons-codec:1.18.0' implementation 'commons-codec:commons-codec:1.18.0'
implementation 'commons-fileupload:commons-fileupload:1.5' implementation 'org.apache.commons:commons-fileupload2-core:2.0.0-M2'
implementation 'org.apache.commons:commons-fileupload2-jakarta:2.0.0-M1'
implementation 'commons-logging:commons-logging:1.3.5' implementation 'commons-logging:commons-logging:1.3.5'
implementation 'commons-net:commons-net:3.11.1' implementation 'commons-net:commons-net:3.11.1'
implementation 'com.sun.mail:javax.mail:1.6.2' implementation 'com.sun.mail:javax.mail:1.6.2'
implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0'
implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1'
implementation 'org.eclipse.jetty:jetty-servlet:9.4.57.v20241219' implementation 'org.eclipse.jetty.ee9:jetty-ee9-servlet:12.0.19'
implementation 'org.eclipse.jetty:jetty-xml:9.4.57.v20241219' implementation 'org.eclipse.jetty:jetty-xml:12.0.19'
implementation 'org.mozilla:rhino-all:1.8.0' implementation 'org.mozilla:rhino-all:1.8.0'
implementation 'org.sejda.imageio:webp-imageio:0.1.6' implementation 'org.sejda.imageio:webp-imageio:0.1.6'
implementation 'xerces:xercesImpl:2.12.2' implementation 'xerces:xercesImpl:2.12.2'

Binary file not shown.

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

6
gradlew vendored
View file

@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@ -205,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command: # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped. # and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line. # treated as '${Hostname}' itself on the command line.
@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@" "$@"
# Stop when "xargs" is not available. # Stop when "xargs" is not available.

4
gradlew.bat vendored
View file

@ -70,11 +70,11 @@ goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell

View file

@ -41,8 +41,8 @@ public class Commandline {
ClassLoader loader = Main.createClassLoader(installDir); ClassLoader loader = Main.createClassLoader(installDir);
// get the main server class // get the main server class
Class<?> clazz = loader.loadClass("helma.main.CommandlineRunner"); Class clazz = loader.loadClass("helma.main.CommandlineRunner");
Class<?>[] cargs = new Class<?>[]{args.getClass()}; Class[] cargs = new Class[]{args.getClass()};
Method main = clazz.getMethod("main", cargs); Method main = clazz.getMethod("main", cargs);
Object[] nargs = new Object[]{args}; Object[] nargs = new Object[]{args};

View file

@ -35,10 +35,10 @@ import java.util.ArrayList;
* be able to set up class and install paths. * be able to set up class and install paths.
*/ */
public class Main { public class Main {
private Class<?> serverClass; private Class serverClass;
private Object server; private Object server;
private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0]; private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
/** /**
@ -60,7 +60,7 @@ public class Main {
ClassLoader loader = createClassLoader(installDir); ClassLoader loader = createClassLoader(installDir);
// get the main server class // get the main server class
serverClass = loader.loadClass("helma.main.Server"); serverClass = loader.loadClass("helma.main.Server");
Class<?>[] cargs = new Class<?>[]{args.getClass()}; Class[] cargs = new Class[]{args.getClass()};
Method loadServer = serverClass.getMethod("loadServer", cargs); Method loadServer = serverClass.getMethod("loadServer", cargs);
Object[] nargs = new Object[]{args}; Object[] nargs = new Object[]{args};
// and invoke the static loadServer(String[]) method // and invoke the static loadServer(String[]) method
@ -111,17 +111,17 @@ public class Main {
} }
} }
static void addJars(ArrayList<URL> jarlist, File dir) throws MalformedURLException { static void addJars(ArrayList jarlist, File dir) throws MalformedURLException {
File[] files = dir.listFiles(new FilenameFilter() { File[] files = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) { public boolean accept(File dir, String name) {
String n = name.toLowerCase(); String n = name.toLowerCase();
return n.endsWith(".jar") || n.endsWith(".zip"); return n.endsWith(".jar") || n.endsWith(".zip"); //$NON-NLS-1$//$NON-NLS-2$
} }
}); });
if (files != null) { if (files != null) {
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
jarlist.add(new URL("file:" + files[i].getAbsolutePath())); jarlist.add(new URL("file:" + files[i].getAbsolutePath())); //$NON-NLS-1$
} }
} }
} }
@ -143,13 +143,13 @@ public class Main {
// set up the class path // set up the class path
File libdir = new File(installDir, "lib"); File libdir = new File(installDir, "lib");
ArrayList<URL> jarlist = new ArrayList<>(); ArrayList jarlist = new ArrayList();
// add all jar files from the lib directory // add all jar files from the lib directory
addJars(jarlist, libdir); addJars(jarlist, libdir);
// add all jar files from the lib/ext directory // add all jar files from the lib/ext directory
addJars(jarlist, new File(libdir, "ext")); addJars(jarlist, new File(libdir, "ext")); //$NON-NLS-1$
URL[] urls = new URL[jarlist.size()]; URL[] urls = new URL[jarlist.size()];
@ -199,7 +199,7 @@ public class Main {
// try to get Helma installation directory // try to get Helma installation directory
if (installDir == null) { if (installDir == null) {
URL launcherUrl = ClassLoader.getSystemClassLoader() URL launcherUrl = ClassLoader.getSystemClassLoader()
.getResource("helma/main/launcher/Main.class"); .getResource("helma/main/launcher/Main.class"); //$NON-NLS-1$
// this is a JAR URL of the form // this is a JAR URL of the form
// jar:<url>!/{entry} // jar:<url>!/{entry}

View file

@ -59,7 +59,7 @@ public abstract class HelmaExtension {
* with pairs of varname and ESObjects. This method should be <b>synchronized</b>, if it * with pairs of varname and ESObjects. This method should be <b>synchronized</b>, if it
* performs any other self-initialization outside the scripting environment. * performs any other self-initialization outside the scripting environment.
*/ */
public abstract HashMap<String, Object> initScripting(Application app, ScriptingEngine engine) public abstract HashMap initScripting(Application app, ScriptingEngine engine)
throws ConfigurationException; throws ConfigurationException;
/** /**

View file

@ -42,7 +42,7 @@ public class DemoExtension extends HelmaExtension {
public void init(Server server) throws ConfigurationException { public void init(Server server) throws ConfigurationException {
try { try {
// just a demo with the server class itself (which is always there, obviously) // just a demo with the server class itself (which is always there, obviously)
Class.forName("helma.main.Server"); Class check = Class.forName("helma.main.Server");
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new ConfigurationException("helma-library not present in classpath. make sure helma.jar is included. get it from http://www.helma.org/"); throw new ConfigurationException("helma-library not present in classpath. make sure helma.jar is included. get it from http://www.helma.org/");
} }
@ -87,7 +87,7 @@ public class DemoExtension extends HelmaExtension {
* *
* @throws ConfigurationException ... * @throws ConfigurationException ...
*/ */
public HashMap<String, Object> initScripting(Application app, ScriptingEngine engine) public HashMap initScripting(Application app, ScriptingEngine engine)
throws ConfigurationException { throws ConfigurationException {
if (!(engine instanceof RhinoEngine)) { if (!(engine instanceof RhinoEngine)) {
throw new ConfigurationException("scripting engine " + engine.toString() + throw new ConfigurationException("scripting engine " + engine.toString() +
@ -98,7 +98,7 @@ public class DemoExtension extends HelmaExtension {
engine.toString()); engine.toString());
// initialize prototypes and global vars here // initialize prototypes and global vars here
HashMap<String, Object> globals = new HashMap<>(); HashMap globals = new HashMap();
globals.put("demo", Server.getServer()); globals.put("demo", Server.getServer());

View file

@ -17,7 +17,7 @@
package helma.framework; package helma.framework;
import java.io.Serializable; import java.io.Serializable;
import javax.servlet.http.Cookie; import jakarta.servlet.http.Cookie;
/** /**
* Cookie Transmitter. A simple, serializable representation * Cookie Transmitter. A simple, serializable representation

View file

@ -16,12 +16,12 @@
package helma.framework; package helma.framework;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.Serializable; import java.io.Serializable;
import java.util.Map; import java.util.Map;
/** /**
* *
*/ */
public class RequestBean implements Serializable { public class RequestBean implements Serializable {
private static final long serialVersionUID = -6826881712426326687L; private static final long serialVersionUID = -6826881712426326687L;
@ -89,7 +89,7 @@ public class RequestBean implements Serializable {
* @return the header value, or null * @return the header value, or null
*/ */
public String getHeader(String name) { public String getHeader(String name) {
return req.getHeader(name); return req.getHeader(name);
} }
/** /**

View file

@ -19,9 +19,9 @@ package helma.framework;
import helma.util.SystemMap; import helma.util.SystemMap;
import helma.util.StringUtils; import helma.util.StringUtils;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import javax.servlet.http.Cookie; import jakarta.servlet.http.Cookie;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
@ -603,11 +603,11 @@ public class RequestTrans implements Serializable {
StringTokenizer tok; StringTokenizer tok;
if (auth.startsWith("Basic ")) { if (auth.startsWith("Basic ")) { //$NON-NLS-1$
tok = new StringTokenizer(new String(Base64.decodeBase64(auth.substring(6))), tok = new StringTokenizer(new String(Base64.decodeBase64(auth.substring(6))),
":"); ":"); //$NON-NLS-1$
} else { } else {
tok = new StringTokenizer(new String(Base64.decodeBase64(auth)), ":"); tok = new StringTokenizer(new String(Base64.decodeBase64(auth)), ":"); //$NON-NLS-1$
} }
try { try {

View file

@ -19,7 +19,7 @@ package helma.framework;
import helma.objectmodel.db.Transactor; import helma.objectmodel.db.Transactor;
import helma.scripting.ScriptingException; import helma.scripting.ScriptingException;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.Serializable; import java.io.Serializable;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.PrintWriter; import java.io.PrintWriter;

View file

@ -21,7 +21,7 @@ import helma.framework.core.Application;
import helma.util.*; import helma.util.*;
import helma.scripting.ScriptingException; import helma.scripting.ScriptingException;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.security.*; import java.security.*;
import java.util.*; import java.util.*;
@ -714,7 +714,7 @@ public final class ResponseTrans extends Writer implements Serializable {
// if (contentType != null) // if (contentType != null)
// digest.update (contentType.getBytes()); // digest.update (contentType.getBytes());
byte[] b = this.digest.digest(this.response); byte[] b = this.digest.digest(this.response);
this.etag = "\"" + new String(Base64.encodeBase64(b)) + "\""; this.etag = "\"" + new String(Base64.encodeBase64(b)) + "\""; //$NON-NLS-1$ //$NON-NLS-2$
// only set response to 304 not modified if no cookies were set // only set response to 304 not modified if no cookies were set
if (reqtrans.hasETag(etag) && countCookies() == 0) { if (reqtrans.hasETag(etag) && countCookies() == 0) {
response = new byte[0]; response = new byte[0];

View file

@ -47,7 +47,7 @@ public final class Application implements Runnable {
private String name; private String name;
// application sources // application sources
ArrayList<Repository> repositories; ArrayList repositories;
// properties and db-properties // properties and db-properties
ResourceProperties props; ResourceProperties props;
@ -96,15 +96,15 @@ public final class Application implements Runnable {
/** /**
* Collections for evaluator thread pooling * Collections for evaluator thread pooling
*/ */
protected Stack<RequestEvaluator> freeThreads; protected Stack freeThreads;
protected Vector<RequestEvaluator> allThreads; protected Vector allThreads;
boolean running = false; boolean running = false;
boolean debug; boolean debug;
long starttime; long starttime;
Hashtable<String, DbSource> dbSources; Hashtable dbSources;
// map of app modules reflected at app.modules // map of app modules reflected at app.modules
Map<String, Object> modules; Map modules;
// internal worker thread for scheduler, session cleanup etc. // internal worker thread for scheduler, session cleanup etc.
Thread worker; Thread worker;
@ -113,10 +113,10 @@ public final class Application implements Runnable {
ThreadGroup threadgroup; ThreadGroup threadgroup;
// threadlocal variable for the current RequestEvaluator // threadlocal variable for the current RequestEvaluator
ThreadLocal<RequestEvaluator> currentEvaluator = new ThreadLocal<>(); ThreadLocal currentEvaluator = new ThreadLocal();
// Map of requesttrans -> active requestevaluators // Map of requesttrans -> active requestevaluators
Hashtable<RequestTrans, RequestEvaluator> activeRequests; Hashtable activeRequests;
String logDir; String logDir;
@ -165,15 +165,15 @@ public final class Application implements Runnable {
private long lastPropertyRead = -1L; private long lastPropertyRead = -1L;
// the set of prototype/function pairs which are allowed to be called via XML-RPC // the set of prototype/function pairs which are allowed to be called via XML-RPC
private HashSet<String> xmlrpcAccess; private HashSet xmlrpcAccess;
// the name under which this app serves XML-RPC requests. Defaults to the app name // the name under which this app serves XML-RPC requests. Defaults to the app name
private String xmlrpcHandlerName; private String xmlrpcHandlerName;
// the list of currently active cron jobs // the list of currently active cron jobs
Hashtable<String, CronRunner> activeCronJobs = null; Hashtable activeCronJobs = null;
// the list of custom cron jobs // the list of custom cron jobs
Hashtable<String, CronJob> customCronJobs = null; Hashtable customCronJobs = null;
private ResourceComparator resourceComparator; private ResourceComparator resourceComparator;
private Resource currentCodeResource; private Resource currentCodeResource;
@ -230,7 +230,7 @@ public final class Application implements Runnable {
this.caseInsensitive = "true".equalsIgnoreCase(server.getAppsProperties(name).getProperty("caseInsensitive")); this.caseInsensitive = "true".equalsIgnoreCase(server.getAppsProperties(name).getProperty("caseInsensitive"));
this.repositories = new ArrayList<>(); this.repositories = new ArrayList();
this.repositories.addAll(Arrays.asList(repositories)); this.repositories.addAll(Arrays.asList(repositories));
resourceComparator = new ResourceComparator(this); resourceComparator = new ResourceComparator(this);
@ -304,7 +304,7 @@ public final class Application implements Runnable {
updateProperties(); updateProperties();
dbSources = new Hashtable<>(); dbSources = new Hashtable();
modules = new SystemMap(); modules = new SystemMap();
} }
@ -366,9 +366,7 @@ public final class Application implements Runnable {
private void initInternal() private void initInternal()
throws DatabaseException, IllegalAccessException, throws DatabaseException, IllegalAccessException,
InstantiationException, ClassNotFoundException, InstantiationException, ClassNotFoundException {
IllegalArgumentException, InvocationTargetException,
NoSuchMethodException, SecurityException {
running = true; running = true;
// create and init type mananger // create and init type mananger
typemgr = new TypeManager(Application.this, ignoreDirs); typemgr = new TypeManager(Application.this, ignoreDirs);
@ -383,7 +381,7 @@ public final class Application implements Runnable {
} }
if (Server.getServer() != null) { if (Server.getServer() != null) {
Vector<HelmaExtension> extensions = Server.getServer().getExtensions(); Vector extensions = Server.getServer().getExtensions();
for (int i = 0; i < extensions.size(); i++) { for (int i = 0; i < extensions.size(); i++) {
HelmaExtension ext = (HelmaExtension) extensions.get(i); HelmaExtension ext = (HelmaExtension) extensions.get(i);
@ -398,12 +396,12 @@ public final class Application implements Runnable {
} }
// create and init evaluator/thread lists // create and init evaluator/thread lists
freeThreads = new Stack<>(); freeThreads = new Stack();
allThreads = new Vector<>(); allThreads = new Vector();
activeRequests = new Hashtable<>(); activeRequests = new Hashtable();
activeCronJobs = new Hashtable<>(); activeCronJobs = new Hashtable();
customCronJobs = new Hashtable<>(); customCronJobs = new Hashtable();
// create the skin manager // create the skin manager
skinmgr = new SkinManager(Application.this); skinmgr = new SkinManager(Application.this);
@ -444,13 +442,7 @@ public final class Application implements Runnable {
// create and init session manager // create and init session manager
String sessionMgrImpl = props.getProperty("sessionManagerImpl", String sessionMgrImpl = props.getProperty("sessionManagerImpl",
"helma.framework.core.SessionManager"); "helma.framework.core.SessionManager");
try { sessionMgr = (SessionManager) Class.forName(sessionMgrImpl).newInstance();
sessionMgr = (SessionManager) Class.forName(sessionMgrImpl)
.getDeclaredConstructor()
.newInstance();
} catch (NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException("Error initializing session manager", e);
}
logEvent("Using session manager class " + sessionMgrImpl); logEvent("Using session manager class " + sessionMgrImpl);
sessionMgr.init(Application.this); sessionMgr.init(Application.this);
@ -887,7 +879,7 @@ public final class Application implements Runnable {
} else { } else {
String rootClass = classMapping.getProperty("root"); String rootClass = classMapping.getProperty("root");
Class c = typemgr.getClassLoader().loadClass(rootClass); Class c = typemgr.getClassLoader().loadClass(rootClass);
rootObject = c.getDeclaredConstructor().newInstance(); rootObject = c.newInstance();
} }
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Error creating root object: " + throw new RuntimeException("Error creating root object: " +

View file

@ -100,7 +100,7 @@ public final class RequestEvaluator implements Runnable {
app.setCurrentRequestEvaluator(this); app.setCurrentRequestEvaluator(this);
Class clazz = app.getClassLoader().loadClass(engineClassName); Class clazz = app.getClassLoader().loadClass(engineClassName);
scriptingEngine = (ScriptingEngine) clazz.getDeclaredConstructor().newInstance(); scriptingEngine = (ScriptingEngine) clazz.newInstance();
scriptingEngine.init(app, this); scriptingEngine.init(app, this);
} catch (Exception x) { } catch (Exception x) {
Throwable t = x; Throwable t = x;
@ -566,7 +566,7 @@ public final class RequestEvaluator implements Runnable {
int base = 800 * tries; int base = 800 * tries;
Thread.sleep((long) (base + (Math.random() * base * 2))); Thread.sleep((long) (base + (Math.random() * base * 2)));
} catch (InterruptedException interrupt) { } catch (InterruptedException interrupt) {
// we got interrrupted, create minimal error message // we got interrrupted, create minimal error message
res.reportError(interrupt); res.reportError(interrupt);
done = true; done = true;
// and release resources and thread // and release resources and thread

View file

@ -27,7 +27,7 @@ import java.net.URL;
/** /**
* Factory class for generating Image objects from various sources. * Factory class for generating Image objects from various sources.
* *
*/ */
public abstract class ImageGenerator { public abstract class ImageGenerator {
protected static ImageGenerator generator = null; protected static ImageGenerator generator = null;
@ -72,7 +72,7 @@ public abstract class ImageGenerator {
"The imageGenerator class cannot be found: " + className); "The imageGenerator class cannot be found: " + className);
} }
try { try {
generator = (ImageGenerator) generatorClass.getDeclaredConstructor().newInstance(); generator = (ImageGenerator)generatorClass.newInstance();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException( throw new RuntimeException(
"The ImageGenerator instance could not be created: " "The ImageGenerator instance could not be created: "
@ -85,7 +85,7 @@ public abstract class ImageGenerator {
/** /**
* @param w ... * @param w ...
* @param h ... * @param h ...
* *
* @return ... * @return ...
*/ */
public ImageWrapper createImage(int w, int h) { public ImageWrapper createImage(int w, int h) {
@ -95,7 +95,7 @@ public abstract class ImageGenerator {
/** /**
* @param src ... * @param src ...
* *
* @return ... * @return ...
* @throws IOException * @throws IOException
*/ */
@ -103,10 +103,10 @@ public abstract class ImageGenerator {
Image img = read(src); Image img = read(src);
return img != null ? new ImageWrapper(img, this) : null; return img != null ? new ImageWrapper(img, this) : null;
} }
/** /**
* @param filenamne ... * @param filenamne ...
* *
* @return ... * @return ...
* @throws IOException * @throws IOException
*/ */
@ -118,7 +118,7 @@ public abstract class ImageGenerator {
/** /**
* @param url ... * @param url ...
* *
* @return ... * @return ...
* @throws MalformedURLException * @throws MalformedURLException
* @throws IOException * @throws IOException
@ -144,14 +144,14 @@ public abstract class ImageGenerator {
/** /**
* @param iw ... * @param iw ...
* @param filter ... * @param filter ...
* *
* @return ... * @return ...
*/ */
public ImageWrapper createImage(ImageWrapper iw, ImageFilter filter) { public ImageWrapper createImage(ImageWrapper iw, ImageFilter filter) {
// use the ImagFilterOp wrapper for ImageFilters that works directly // use the ImagFilterOp wrapper for ImageFilters that works directly
// on BufferedImages. The filtering is much faster like that. // on BufferedImages. The filtering is much faster like that.
// Attention: needs testing with all the filters! // Attention: needs testing with all the filters!
return createImage(iw, new ImageFilterOp(filter)); return createImage(iw, new ImageFilterOp(filter));
// Image img = ImageWaiter.waitForImage( // Image img = ImageWaiter.waitForImage(
// Toolkit.getDefaultToolkit().createImage( // Toolkit.getDefaultToolkit().createImage(
@ -162,7 +162,7 @@ public abstract class ImageGenerator {
/** /**
* @param iw ... * @param iw ...
* @param imageOp ... * @param imageOp ...
* *
* @return ... * @return ...
*/ */
public ImageWrapper createImage(ImageWrapper iw, BufferedImageOp imageOp) { public ImageWrapper createImage(ImageWrapper iw, BufferedImageOp imageOp) {
@ -212,7 +212,7 @@ public abstract class ImageGenerator {
/** /**
* Saves the image. Image format is deduced from filename. * Saves the image. Image format is deduced from filename.
* *
* @param wrapper * @param wrapper
* @param filename * @param filename
* @param quality * @param quality
@ -224,7 +224,7 @@ public abstract class ImageGenerator {
/** /**
* Saves the image. Image format is deduced from the dataSource. * Saves the image. Image format is deduced from the dataSource.
* *
* @param wrapper * @param wrapper
* @param out * @param out
* @param quality * @param quality
@ -233,4 +233,4 @@ public abstract class ImageGenerator {
*/ */
public abstract void write(ImageWrapper wrapper, OutputStream out, String type, public abstract void write(ImageWrapper wrapper, OutputStream out, String type,
float quality, boolean alpha) throws IOException; float quality, boolean alpha) throws IOException;
} }

File diff suppressed because it is too large Load diff

View file

@ -24,10 +24,9 @@ import java.io.*;
import java.util.*; import java.util.*;
import javax.imageio.*; import javax.imageio.*;
import javax.imageio.spi.*; import javax.imageio.spi.*;
import javax.imageio.stream.ImageOutputStream;
public class GIFImageWriterSpi extends ImageWriterSpi { public class GIFImageWriterSpi extends ImageWriterSpi {
public GIFImageWriterSpi() { public GIFImageWriterSpi() {
super( super(
"Helma Object Publisher, http://helma.org/", "Helma Object Publisher, http://helma.org/",
@ -36,7 +35,7 @@ public class GIFImageWriterSpi extends ImageWriterSpi {
new String[] {"gif", "GIF"}, new String[] {"gif", "GIF"},
new String[] {"image/gif", "image/x-gif"}, new String[] {"image/gif", "image/x-gif"},
"helma.image.imageio.gif.GIFImageWriter", "helma.image.imageio.gif.GIFImageWriter",
new Class<?>[] {ImageOutputStream.class}, STANDARD_OUTPUT_TYPE,
null, null,
false, null, null, null, null, false, null, null, null, null,
false, null, null, null, null false, null, null, null, null
@ -56,4 +55,4 @@ public class GIFImageWriterSpi extends ImageWriterSpi {
// FIXME handle # colors // FIXME handle # colors
return true; return true;
} }
} }

View file

@ -19,11 +19,13 @@ import java.util.Vector;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.xmlrpc.XmlRpcHandler; import org.apache.xmlrpc.XmlRpcHandler;
import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.ee9.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.ResourceFactory;
import helma.framework.core.Application; import helma.framework.core.Application;
import helma.framework.repository.FileRepository; import helma.framework.repository.FileRepository;
@ -36,9 +38,9 @@ import helma.util.StringUtils;
* This class is responsible for starting and stopping Helma applications. * This class is responsible for starting and stopping Helma applications.
*/ */
public class ApplicationManager implements XmlRpcHandler { public class ApplicationManager implements XmlRpcHandler {
private Hashtable<String, AppDescriptor> descriptors; private Hashtable descriptors;
private Hashtable<String, Application> applications; private Hashtable applications;
private Hashtable<String, Application> xmlrpcHandlers; private Hashtable xmlrpcHandlers;
private ResourceProperties props; private ResourceProperties props;
private Server server; private Server server;
private long lastModified; private long lastModified;
@ -54,9 +56,9 @@ public class ApplicationManager implements XmlRpcHandler {
public ApplicationManager(ResourceProperties props, Server server) { public ApplicationManager(ResourceProperties props, Server server) {
this.props = props; this.props = props;
this.server = server; this.server = server;
this.descriptors = new Hashtable<String, AppDescriptor>(); this.descriptors = new Hashtable();
this.applications = new Hashtable<String, Application>(); this.applications = new Hashtable();
this.xmlrpcHandlers = new Hashtable<String, Application>(); this.xmlrpcHandlers = new Hashtable();
this.lastModified = 0; this.lastModified = 0;
this.jetty = server.jetty; this.jetty = server.jetty;
} }
@ -68,10 +70,10 @@ public class ApplicationManager implements XmlRpcHandler {
protected void checkForChanges() { protected void checkForChanges() {
if (this.props.lastModified() > this.lastModified && this.server.getApplicationsOption() == null) { if (this.props.lastModified() > this.lastModified && this.server.getApplicationsOption() == null) {
try { try {
for (Enumeration<?> e = this.props.keys(); e.hasMoreElements();) { for (Enumeration e = this.props.keys(); e.hasMoreElements();) {
String appName = (String) e.nextElement(); String appName = (String) e.nextElement();
if ((appName.indexOf(".") == -1) && if ((appName.indexOf(".") == -1) && //$NON-NLS-1$
(this.applications.get(appName) == null)) { (this.applications.get(appName) == null)) {
AppDescriptor appDesc = new AppDescriptor(appName); AppDescriptor appDesc = new AppDescriptor(appName);
appDesc.start(); appDesc.start();
@ -80,7 +82,7 @@ public class ApplicationManager implements XmlRpcHandler {
} }
// then stop deleted ones // then stop deleted ones
for (Enumeration<AppDescriptor> e = this.descriptors.elements(); e.hasMoreElements();) { for (Enumeration e = this.descriptors.elements(); e.hasMoreElements();) {
AppDescriptor appDesc = (AppDescriptor) e.nextElement(); AppDescriptor appDesc = (AppDescriptor) e.nextElement();
// check if application has been removed and should be stopped // check if application has been removed and should be stopped
@ -146,10 +148,10 @@ public class ApplicationManager implements XmlRpcHandler {
desc.start(); desc.start();
} }
} else { } else {
for (Enumeration<?> e = this.props.keys(); e.hasMoreElements();) { for (Enumeration e = this.props.keys(); e.hasMoreElements();) {
String appName = (String) e.nextElement(); String appName = (String) e.nextElement();
if (appName.indexOf(".") == -1) { if (appName.indexOf(".") == -1) { //$NON-NLS-1$
String appValue = this.props.getProperty(appName); String appValue = this.props.getProperty(appName);
if (appValue != null && appValue.length() > 0) { if (appValue != null && appValue.length() > 0) {
@ -162,7 +164,7 @@ public class ApplicationManager implements XmlRpcHandler {
} }
} }
for (Enumeration<AppDescriptor> e = this.descriptors.elements(); e.hasMoreElements();) { for (Enumeration e = this.descriptors.elements(); e.hasMoreElements();) {
AppDescriptor appDesc = (AppDescriptor) e.nextElement(); AppDescriptor appDesc = (AppDescriptor) e.nextElement();
appDesc.bind(); appDesc.bind();
} }
@ -178,7 +180,7 @@ public class ApplicationManager implements XmlRpcHandler {
* Stop all running applications. * Stop all running applications.
*/ */
public void stopAll() { public void stopAll() {
for (Enumeration<AppDescriptor> en = this.descriptors.elements(); en.hasMoreElements();) { for (Enumeration en = this.descriptors.elements(); en.hasMoreElements();) {
try { try {
AppDescriptor appDesc = (AppDescriptor) en.nextElement(); AppDescriptor appDesc = (AppDescriptor) en.nextElement();
@ -206,9 +208,9 @@ public class ApplicationManager implements XmlRpcHandler {
/** /**
* Implements org.apache.xmlrpc.XmlRpcHandler.execute() * Implements org.apache.xmlrpc.XmlRpcHandler.execute()
*/ */
public Object execute(String method, @SuppressWarnings("rawtypes") Vector params) public Object execute(String method, Vector params)
throws Exception { throws Exception {
int dot = method.indexOf("."); int dot = method.indexOf("."); //$NON-NLS-1$
if (dot == -1) { if (dot == -1) {
throw new Exception("Method name \"" + method + throw new Exception("Method name \"" + method +
@ -224,7 +226,7 @@ public class ApplicationManager implements XmlRpcHandler {
Application app = (Application) this.xmlrpcHandlers.get(handler); Application app = (Application) this.xmlrpcHandlers.get(handler);
if (app == null) { if (app == null) {
app = (Application) this.xmlrpcHandlers.get("*"); app = (Application) this.xmlrpcHandlers.get("*"); //$NON-NLS-1$
// use the original method name, the handler is resolved within the app. // use the original method name, the handler is resolved within the app.
method2 = method; method2 = method;
} }
@ -239,32 +241,32 @@ public class ApplicationManager implements XmlRpcHandler {
private String getMountpoint(String mountpoint) { private String getMountpoint(String mountpoint) {
mountpoint = mountpoint.trim(); mountpoint = mountpoint.trim();
if ("".equals(mountpoint)) { if ("".equals(mountpoint)) { //$NON-NLS-1$
return "/"; return "/"; //$NON-NLS-1$
} else if (!mountpoint.startsWith("/")) { } else if (!mountpoint.startsWith("/")) { //$NON-NLS-1$
return "/" + mountpoint; return "/" + mountpoint; //$NON-NLS-1$
} }
return mountpoint; return mountpoint;
} }
private String joinMountpoint(String prefix, String suffix) { private String joinMountpoint(String prefix, String suffix) {
if (prefix.endsWith("/") || suffix.startsWith("/")) { if (prefix.endsWith("/") || suffix.startsWith("/")) { //$NON-NLS-1$//$NON-NLS-2$
return prefix+suffix; return prefix+suffix;
} }
return prefix+"/"+suffix; return prefix+"/"+suffix; //$NON-NLS-1$
} }
private String getPathPattern(String mountpoint) { private String getPathPattern(String mountpoint) {
if (!mountpoint.startsWith("/")) { if (!mountpoint.startsWith("/")) { //$NON-NLS-1$
mountpoint = "/"+mountpoint; mountpoint = "/"+mountpoint; //$NON-NLS-1$
} }
if ("/".equals(mountpoint)) { if ("/".equals(mountpoint)) { //$NON-NLS-1$
return "/"; return "/"; //$NON-NLS-1$
} }
if (mountpoint.endsWith("/")) { if (mountpoint.endsWith("/")) { //$NON-NLS-1$
return mountpoint.substring(0, mountpoint.length()-1); return mountpoint.substring(0, mountpoint.length()-1);
} }
@ -335,56 +337,56 @@ public class ApplicationManager implements XmlRpcHandler {
AppDescriptor(String name) { AppDescriptor(String name) {
ResourceProperties conf = ApplicationManager.this.props.getSubProperties(name + '.'); ResourceProperties conf = ApplicationManager.this.props.getSubProperties(name + '.');
this.appName = name; this.appName = name;
this.mountpoint = getMountpoint(conf.getProperty("mountpoint", this.appName)); this.mountpoint = getMountpoint(conf.getProperty("mountpoint", this.appName)); //$NON-NLS-1$
this.pathPattern = getPathPattern(this.mountpoint); this.pathPattern = getPathPattern(this.mountpoint);
this.staticDir = conf.getProperty("static"); this.staticDir = conf.getProperty("static"); //$NON-NLS-1$
this.staticMountpoint = getPathPattern(conf.getProperty("staticMountpoint", this.staticMountpoint = getPathPattern(conf.getProperty("staticMountpoint", //$NON-NLS-1$
joinMountpoint(this.mountpoint, "static"))); joinMountpoint(this.mountpoint, "static"))); //$NON-NLS-1$
this.staticIndex = "true".equalsIgnoreCase(conf.getProperty("staticIndex")); this.staticIndex = "true".equalsIgnoreCase(conf.getProperty("staticIndex")); //$NON-NLS-1$//$NON-NLS-2$
String home = conf.getProperty("staticHome"); String home = conf.getProperty("staticHome"); //$NON-NLS-1$
if (home == null) { if (home == null) {
this.staticHome = new String[] {"index.html", "index.htm"}; this.staticHome = new String[] {"index.html", "index.htm"}; //$NON-NLS-1$ //$NON-NLS-2$
} else { } else {
this.staticHome = StringUtils.split(home, ","); this.staticHome = StringUtils.split(home, ","); //$NON-NLS-1$
} }
this.protectedStaticDir = conf.getProperty("protectedStatic"); this.protectedStaticDir = conf.getProperty("protectedStatic"); //$NON-NLS-1$
this.cookieDomain = conf.getProperty("cookieDomain"); this.cookieDomain = conf.getProperty("cookieDomain"); //$NON-NLS-1$
this.sessionCookieName = conf.getProperty("sessionCookieName"); this.sessionCookieName = conf.getProperty("sessionCookieName"); //$NON-NLS-1$
this.protectedSessionCookie = conf.getProperty("protectedSessionCookie"); this.protectedSessionCookie = conf.getProperty("protectedSessionCookie"); //$NON-NLS-1$
this.uploadLimit = conf.getProperty("uploadLimit"); this.uploadLimit = conf.getProperty("uploadLimit"); //$NON-NLS-1$
this.uploadSoftfail = conf.getProperty("uploadSoftfail"); this.uploadSoftfail = conf.getProperty("uploadSoftfail"); //$NON-NLS-1$
this.debug = conf.getProperty("debug"); this.debug = conf.getProperty("debug"); //$NON-NLS-1$
String appDirName = conf.getProperty("appdir"); String appDirName = conf.getProperty("appdir"); //$NON-NLS-1$
this.appDir = (appDirName == null) ? null : getAbsoluteFile(appDirName); this.appDir = (appDirName == null) ? null : getAbsoluteFile(appDirName);
String dbDirName = conf.getProperty("dbdir"); String dbDirName = conf.getProperty("dbdir"); //$NON-NLS-1$
this.dbDir = (dbDirName == null) ? null : getAbsoluteFile(dbDirName); this.dbDir = (dbDirName == null) ? null : getAbsoluteFile(dbDirName);
this.servletClassName = conf.getProperty("servletClass"); this.servletClassName = conf.getProperty("servletClass"); //$NON-NLS-1$
// got ignore dirs // got ignore dirs
this.ignoreDirs = conf.getProperty("ignore"); this.ignoreDirs = conf.getProperty("ignore"); //$NON-NLS-1$
// read and configure app repositories // read and configure app repositories
ArrayList<Repository> repositoryList = new ArrayList<>(); ArrayList repositoryList = new ArrayList();
Class<?>[] parameters = { String.class }; Class[] parameters = { String.class };
for (int i = 0; true; i++) { for (int i = 0; true; i++) {
String repositoryArgs = conf.getProperty("repository." + i); String repositoryArgs = conf.getProperty("repository." + i); //$NON-NLS-1$
if (repositoryArgs != null) { if (repositoryArgs != null) {
// lookup repository implementation // lookup repository implementation
String repositoryImpl = conf.getProperty("repository." + i + String repositoryImpl = conf.getProperty("repository." + i + //$NON-NLS-1$
".implementation"); ".implementation"); //$NON-NLS-1$
if (repositoryImpl == null) { if (repositoryImpl == null) {
// implementation not set manually, have to guess it // implementation not set manually, have to guess it
if (repositoryArgs.endsWith(".zip")) { if (repositoryArgs.endsWith(".zip")) { //$NON-NLS-1$
repositoryArgs = findResource(repositoryArgs); repositoryArgs = findResource(repositoryArgs);
repositoryImpl = "helma.framework.repository.ZipRepository"; repositoryImpl = "helma.framework.repository.ZipRepository"; //$NON-NLS-1$
} else if (repositoryArgs.endsWith(".js")) { } else if (repositoryArgs.endsWith(".js")) { //$NON-NLS-1$
repositoryArgs = findResource(repositoryArgs); repositoryArgs = findResource(repositoryArgs);
repositoryImpl = "helma.framework.repository.SingleFileRepository"; repositoryImpl = "helma.framework.repository.SingleFileRepository"; //$NON-NLS-1$
} else { } else {
repositoryArgs = findResource(repositoryArgs); repositoryArgs = findResource(repositoryArgs);
repositoryImpl = "helma.framework.repository.FileRepository"; repositoryImpl = "helma.framework.repository.FileRepository"; //$NON-NLS-1$
} }
} }
@ -481,59 +483,63 @@ public class ApplicationManager implements XmlRpcHandler {
// if there is a static direcory specified, mount it // if there is a static direcory specified, mount it
if (this.staticDir != null) { if (this.staticDir != null) {
String staticPath = getAbsoluteFile(this.staticDir).getCanonicalPath();
File staticContent = getAbsoluteFile(this.staticDir); getLogger().info("Serving static from " + staticPath);
getLogger().info("Serving static from " + staticContent.getPath());
getLogger().info("Mounting static at " + staticMountpoint); getLogger().info("Mounting static at " + staticMountpoint);
ResourceHandler rhandler = new ResourceHandler(); ResourceHandler rhandler = new ResourceHandler();
rhandler.setResourceBase(staticContent.getPath()); rhandler.setBaseResource(ResourceFactory.of(rhandler).newResource(staticPath));
rhandler.setWelcomeFiles(staticHome); rhandler.setWelcomeFiles(staticHome);
staticContext = new ContextHandler(staticMountpoint); ContextHandler staticContext = new ContextHandler();
ApplicationManager.this.context.addHandler(staticContext); staticContext.setContextPath(staticMountpoint);
staticContext.setHandler(rhandler); staticContext.setHandler(rhandler);
ApplicationManager.this.context.addHandler(staticContext);
staticContext.start(); staticContext.start();
} }
appContext = new ServletContextHandler(context, pathPattern, true, true); // I hope I am correct assuming Helma does not need Jettys session management, but using
Class<? extends EmbeddedServletClient> servletClass = servletClassName == null ? // `ServletContextHandler.SESSIONS` causes an exception: Shared scheduler not started
EmbeddedServletClient.class : Class.forName(servletClassName).asSubclass(EmbeddedServletClient.class); appContext = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
appContext.setContextPath(pathPattern);
context.addHandler(appContext);
Class servletClass = servletClassName == null ?
EmbeddedServletClient.class : Class.forName(servletClassName);
ServletHolder holder = new ServletHolder(servletClass); ServletHolder holder = new ServletHolder(servletClass);
holder.setInitParameter("application", appName); holder.setInitParameter("application", appName);
appContext.addServlet(holder, "/*"); appContext.addServlet(holder, "/*");
if (this.cookieDomain != null) { if (this.cookieDomain != null) {
holder.setInitParameter("cookieDomain", this.cookieDomain); holder.setInitParameter("cookieDomain", this.cookieDomain); //$NON-NLS-1$
} }
if (this.sessionCookieName != null) { if (this.sessionCookieName != null) {
holder.setInitParameter("sessionCookieName", this.sessionCookieName); holder.setInitParameter("sessionCookieName", this.sessionCookieName); //$NON-NLS-1$
} }
if (this.protectedSessionCookie != null) { if (this.protectedSessionCookie != null) {
holder.setInitParameter("protectedSessionCookie", this.protectedSessionCookie); holder.setInitParameter("protectedSessionCookie", this.protectedSessionCookie); //$NON-NLS-1$
} }
if (this.uploadLimit != null) { if (this.uploadLimit != null) {
holder.setInitParameter("uploadLimit", this.uploadLimit); holder.setInitParameter("uploadLimit", this.uploadLimit); //$NON-NLS-1$
} }
if (this.uploadSoftfail != null) { if (this.uploadSoftfail != null) {
holder.setInitParameter("uploadSoftfail", this.uploadSoftfail); holder.setInitParameter("uploadSoftfail", this.uploadSoftfail); //$NON-NLS-1$
} }
if (this.debug != null) { if (this.debug != null) {
holder.setInitParameter("debug", this.debug); holder.setInitParameter("debug", this.debug); //$NON-NLS-1$
} }
if (protectedStaticDir != null) { if (protectedStaticDir != null) {
File protectedContent = getAbsoluteFile(protectedStaticDir); String protectedContent = getAbsoluteFile(protectedStaticDir).getCanonicalPath();
appContext.setResourceBase(protectedContent.getPath()); appContext.setBaseResourceAsString(protectedContent);
getLogger().info("Serving protected static from " + getLogger().info("Serving protected static from " + protectedContent);
protectedContent.getPath());
} }
// Remap the context paths and start // Remap the context paths and start
@ -557,7 +563,9 @@ public class ApplicationManager implements XmlRpcHandler {
// unbind from Jetty HTTP server // unbind from Jetty HTTP server
if (ApplicationManager.this.jetty != null) { if (ApplicationManager.this.jetty != null) {
if (this.appContext != null) { if (this.appContext != null) {
ApplicationManager.this.context.removeHandler(this.appContext); // Adding appContext to the ContextHandlerCollection works (see above) but removing it causes an exception of
// incompatible types: ServletContextHandler cannot be converted to Handler
//ApplicationManager.this.context.removeHandler(this.appContext);
this.appContext.stop(); this.appContext.stop();
this.appContext.destroy(); this.appContext.destroy();
this.appContext = null; this.appContext = null;
@ -584,7 +592,7 @@ public class ApplicationManager implements XmlRpcHandler {
@Override @Override
public String toString() { public String toString() {
return "[AppDescriptor "+this.app+"]"; return "[AppDescriptor "+this.app+"]"; //$NON-NLS-1$ //$NON-NLS-2$
} }
} }
} }

View file

@ -41,10 +41,10 @@ public class CommandlineRunner {
ServerConfig config = new ServerConfig(); ServerConfig config = new ServerConfig();
String commandStr = null; String commandStr = null;
Vector<String> funcArgs = new Vector<>(); Vector funcArgs = new Vector();
// get possible environment setting for helma home // get possible environment setting for helma home
if (System.getProperty("helma.home") != null) { if (System.getProperty("helma.home")!=null) {
config.setHomeDir(new File(System.getProperty("helma.home"))); config.setHomeDir(new File(System.getProperty("helma.home")));
} }
@ -110,7 +110,7 @@ public class CommandlineRunner {
server.shutdown(); server.shutdown();
} }
/** /**
* print the usage hints and prefix them with a message. * print the usage hints and prefix them with a message.

View file

@ -30,13 +30,11 @@ import java.util.HashSet;
* a utility method <code>getApplication</code> that can be used to determine * a utility method <code>getApplication</code> that can be used to determine
* the name of the application trying to execute the action in question, if any. * the name of the application trying to execute the action in question, if any.
*/ */
@Deprecated
@SuppressWarnings("removal")
public class HelmaSecurityManager extends SecurityManager { public class HelmaSecurityManager extends SecurityManager {
// The set of actions forbidden to application code. // The set of actions forbidden to application code.
// We are pretty permissive, forbidding only System.exit() // We are pretty permissive, forbidding only System.exit()
// and setting the security manager. // and setting the security manager.
private final static HashSet<String> forbidden = new HashSet<>(); private final static HashSet forbidden = new HashSet();
static { static {
forbidden.add("exitVM"); forbidden.add("exitVM");
@ -51,7 +49,7 @@ public class HelmaSecurityManager extends SecurityManager {
public void checkPermission(Permission p) { public void checkPermission(Permission p) {
if (p instanceof RuntimePermission) { if (p instanceof RuntimePermission) {
if (forbidden.contains(p.getName())) { if (forbidden.contains(p.getName())) {
Class<?>[] classes = getClassContext(); Class[] classes = getClassContext();
for (int i = 0; i < classes.length; i++) { for (int i = 0; i < classes.length; i++) {
if (classes[i].getClassLoader() instanceof AppClassLoader) { if (classes[i].getClassLoader() instanceof AppClassLoader) {
@ -100,7 +98,7 @@ public class HelmaSecurityManager extends SecurityManager {
* @param status ... * @param status ...
*/ */
public void checkExit(int status) { public void checkExit(int status) {
Class<?>[] classes = getClassContext(); Class[] classes = getClassContext();
for (int i = 0; i < classes.length; i++) { for (int i = 0; i < classes.length; i++) {
if (classes[i].getClassLoader() instanceof AppClassLoader) { if (classes[i].getClassLoader() instanceof AppClassLoader) {
@ -289,7 +287,7 @@ public class HelmaSecurityManager extends SecurityManager {
* @param clazz ... * @param clazz ...
* @param which ... * @param which ...
*/ */
public void checkMemberAccess(Class<?> clazz, int which) { public void checkMemberAccess(Class clazz, int which) {
} }
/** /**
@ -306,7 +304,7 @@ public class HelmaSecurityManager extends SecurityManager {
* does not belong to any application. * does not belong to any application.
*/ */
protected String getApplication() { protected String getApplication() {
Class<?>[] classes = getClassContext(); Class[] classes = getClassContext();
for (int i = 0; i < classes.length; i++) { for (int i = 0; i < classes.length; i++) {
if (classes[i].getClassLoader() instanceof AppClassLoader) { if (classes[i].getClassLoader() instanceof AppClassLoader) {

View file

@ -16,6 +16,9 @@
package helma.main; package helma.main;
import helma.util.*;
import org.apache.commons.logging.LogFactory;
/** /**
* ShutdownHook that shuts down all running Helma applications on exit. * ShutdownHook that shuts down all running Helma applications on exit.
*/ */

View file

@ -16,12 +16,12 @@
package helma.main; package helma.main;
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.resource.URLResourceFactory;
import org.eclipse.jetty.xml.XmlConfiguration; import org.eclipse.jetty.xml.XmlConfiguration;
import java.net.URL; import java.net.URL;
@ -37,18 +37,20 @@ public class JettyServer {
public static JettyServer init(Server server, ServerConfig config) throws IOException { public static JettyServer init(Server server, ServerConfig config) throws IOException {
File configFile = config.getConfigFile(); File configFile = config.getConfigFile();
if (configFile != null && configFile.exists()) { if (configFile != null && configFile.exists()) {
return new JettyServer(configFile.toURI().toURL()); URLResourceFactory resourceFactory = new URLResourceFactory();
Resource resource = resourceFactory.newResource(configFile.toURI());
return new JettyServer(resource);
} else if (config.hasWebsrvPort()) { } else if (config.hasWebsrvPort()) {
return new JettyServer(config.getWebsrvPort(), server); return new JettyServer(config.getWebsrvPort(), server);
} }
return null; return null;
} }
private JettyServer(URL url) throws IOException { private JettyServer(Resource resource) throws IOException {
http = new org.eclipse.jetty.server.Server(); http = new org.eclipse.jetty.server.Server();
try { try {
XmlConfiguration config = new XmlConfiguration(Resource.newResource(url)); XmlConfiguration config = new XmlConfiguration(resource);
config.configure(http); config.configure(http);
} catch (IOException e) { } catch (IOException e) {
@ -74,7 +76,6 @@ public class JettyServer {
connector.setHost(webPort.getAddress().getHostAddress()); connector.setHost(webPort.getAddress().getHostAddress());
connector.setPort(webPort.getPort()); connector.setPort(webPort.getPort());
connector.setIdleTimeout(30000); connector.setIdleTimeout(30000);
// Removed deprecated method setSoLingerTime
connector.setAcceptorPriorityDelta(0); connector.setAcceptorPriorityDelta(0);
connector.setAcceptQueueSize(0); connector.setAcceptQueueSize(0);
@ -101,12 +102,13 @@ public class JettyServer {
} }
private void openListeners() throws IOException { private void openListeners() throws IOException {
// opening the listener here allows us to run on priviledged port 80 under jsvc // opening the listener here allows us to run on privileged port 80 under jsvc
// even as non-root user, because init() is called with root privileges // even as non-root user, because init() is called with root privileges
// while start() will be called with the user we will actually run as // while start() will be called with the user we will actually run as
Connector[] connectors = http.getConnectors(); for (var connector : http.getConnectors()) {
for (int i = 0; i < connectors.length; i++) { if (connector instanceof ServerConnector) {
((ServerConnector) connectors[i]).open(); ((ServerConnector) connector).open();
}
} }
} }
} }

View file

@ -21,6 +21,7 @@ import helma.framework.repository.FileResource;
import helma.framework.core.*; import helma.framework.core.*;
import helma.objectmodel.db.DbSource; import helma.objectmodel.db.DbSource;
import helma.util.*; import helma.util.*;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.xmlrpc.*; import org.apache.xmlrpc.*;
@ -29,6 +30,8 @@ import java.io.*;
import java.util.*; import java.util.*;
import java.net.*; import java.net.*;
import helma.util.ResourceProperties;
/** /**
* Helma server main class. * Helma server main class.
*/ */
@ -65,14 +68,14 @@ public class Server implements Runnable {
// explicitly listed hosts. // explicitly listed hosts.
public boolean paranoid; public boolean paranoid;
private ApplicationManager appManager; private ApplicationManager appManager;
private Vector<HelmaExtension> extensions; private Vector extensions;
private Thread mainThread; private Thread mainThread;
// configuration // configuration
ServerConfig config; ServerConfig config;
// map of server-wide database sources // map of server-wide database sources
Hashtable<String, DbSource> dbSources; Hashtable dbSources;
// the embedded web server // the embedded web server
// protected Serve websrv; // protected Serve websrv;
@ -150,8 +153,8 @@ public class Server implements Runnable {
String javaVersion = System.getProperty("java.version", "0"); String javaVersion = System.getProperty("java.version", "0");
int majorVersion = Integer.parseInt(javaVersion.split("\\.")[0]); int majorVersion = Integer.parseInt(javaVersion.split("\\.")[0]);
if (majorVersion < 11) { if (majorVersion < 17) {
System.err.println("This version of Helma requires Java 11 or greater."); System.err.println("This version of Helma requires Java 17 or greater.");
if (majorVersion == 0) { // don't think this will ever happen, but you never know if (majorVersion == 0) { // don't think this will ever happen, but you never know
System.err.println("Your Java Runtime did not provide a version number. Please update to a more recent version."); System.err.println("Your Java Runtime did not provide a version number. Please update to a more recent version.");
@ -430,10 +433,10 @@ public class Server implements Runnable {
// logger.debug("TimeZone = " + // logger.debug("TimeZone = " +
// TimeZone.getDefault().getDisplayName(Locale.getDefault())); // TimeZone.getDefault().getDisplayName(Locale.getDefault()));
dbSources = new Hashtable<String, DbSource>(); dbSources = new Hashtable();
// try to load the extensions // try to load the extensions
extensions = new Vector<HelmaExtension>(); extensions = new Vector();
if (sysProps.getProperty("extensions") != null) { if (sysProps.getProperty("extensions") != null) {
initExtensions(); initExtensions();
} }
@ -450,8 +453,8 @@ public class Server implements Runnable {
String extClassName = tok.nextToken().trim(); String extClassName = tok.nextToken().trim();
try { try {
Class<? extends HelmaExtension> extClass = Class.forName(extClassName).asSubclass(HelmaExtension.class); Class extClass = Class.forName(extClassName);
HelmaExtension ext = (HelmaExtension) extClass.getDeclaredConstructor().newInstance(); HelmaExtension ext = (HelmaExtension) extClass.newInstance();
ext.init(this); ext.init(this);
extensions.add(ext); extensions.add(ext);
logger.info("Loaded: " + extClassName); logger.info("Loaded: " + extClassName);
@ -570,9 +573,7 @@ public class Server implements Runnable {
String secManClass = sysProps.getProperty("securityManager"); String secManClass = sysProps.getProperty("securityManager");
if (secManClass != null) { if (secManClass != null) {
@SuppressWarnings("removal")
SecurityManager secMan = (SecurityManager) Class.forName(secManClass) SecurityManager secMan = (SecurityManager) Class.forName(secManClass)
.getDeclaredConstructor()
.newInstance(); .newInstance();
System.setSecurityManager(secMan); System.setSecurityManager(secMan);
@ -764,7 +765,7 @@ public class Server implements Runnable {
* *
* @return ... * @return ...
*/ */
public Vector<HelmaExtension> getExtensions() { public Vector getExtensions() {
return extensions; return extensions;
} }
@ -805,3 +806,5 @@ public class Server implements Runnable {
return new InetSocketAddress(addr, port); return new InetSocketAddress(addr, port);
} }
} }

View file

@ -18,6 +18,7 @@ package helma.objectmodel;
import helma.framework.IPathElement; import helma.framework.IPathElement;
import helma.framework.core.Application; import helma.framework.core.Application;
import helma.framework.core.RequestEvaluator;
import helma.objectmodel.db.DbMapping; import helma.objectmodel.db.DbMapping;
import helma.objectmodel.db.Relation; import helma.objectmodel.db.Relation;
import helma.objectmodel.db.Node; import helma.objectmodel.db.Node;
@ -63,8 +64,7 @@ public class TransientNode implements INode, Serializable {
created = lastmodified = System.currentTimeMillis(); created = lastmodified = System.currentTimeMillis();
this.app=app; this.app=app;
} }
@SuppressWarnings("unused")
private TransientNode() { private TransientNode() {
app=null; app=null;
} }
@ -75,7 +75,7 @@ public class TransientNode implements INode, Serializable {
public TransientNode(Application app, String n) { public TransientNode(Application app, String n) {
id = generateID(); id = generateID();
name = (n == null || n.length() == 0) ? id : n; name = (n == null || n.length() == 0) ? id : n;
// HACK - decrease creation and last-modified timestamp by 1 so we notice // HACK - decrease creation and last-modified timestamp by 1 so we notice
// modifications that take place immediately after object creation // modifications that take place immediately after object creation
created = lastmodified = System.currentTimeMillis() - 1; created = lastmodified = System.currentTimeMillis() - 1;
this.app = app; this.app = app;
@ -378,7 +378,7 @@ public class TransientNode implements INode, Serializable {
} }
private TransientProperty getProperty(String propname) { private TransientProperty getProperty(String propname) {
TransientProperty prop = (propMap == null) ? null TransientProperty prop = (propMap == null) ? null
: (TransientProperty) propMap.get(correctPropertyName(propname)); : (TransientProperty) propMap.get(correctPropertyName(propname));
// check if we have to create a virtual node // check if we have to create a virtual node
@ -601,7 +601,7 @@ public class TransientNode implements INode, Serializable {
public synchronized void clearCacheNode() { public synchronized void clearCacheNode() {
cacheNode = null; cacheNode = null;
} }
private String correctPropertyName(String propname) { private String correctPropertyName(String propname) {
return app.correctPropertyName(propname); return app.correctPropertyName(propname);
} }

View file

@ -22,7 +22,6 @@ import helma.objectmodel.*;
import helma.objectmodel.dom.XmlDatabase; import helma.objectmodel.dom.XmlDatabase;
import java.io.*; import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.*; import java.sql.*;
import java.util.*; import java.util.*;
@ -60,25 +59,19 @@ public final class NodeManager {
* Initialize the NodeManager for the given dbHome and * Initialize the NodeManager for the given dbHome and
* application properties. An embedded database will be * application properties. An embedded database will be
* created in dbHome if one doesn't already exist. * created in dbHome if one doesn't already exist.
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/ */
public void init(File dbHome, Properties props) public void init(File dbHome, Properties props)
throws DatabaseException, ClassNotFoundException, throws DatabaseException, ClassNotFoundException,
IllegalAccessException, InstantiationException, IllegalAccessException, InstantiationException {
IllegalArgumentException, InvocationTargetException,
NoSuchMethodException, SecurityException {
String cacheImpl = props.getProperty("cacheimpl", "helma.util.CacheMap"); String cacheImpl = props.getProperty("cacheimpl", "helma.util.CacheMap");
cache = (ObjectCache) Class.forName(cacheImpl).getDeclaredConstructor().newInstance(); cache = (ObjectCache) Class.forName(cacheImpl).newInstance();
cache.init(app); cache.init(app);
String idgenImpl = props.getProperty("idGeneratorImpl"); String idgenImpl = props.getProperty("idGeneratorImpl");
if (idgenImpl != null) { if (idgenImpl != null) {
idgen = (IDGenerator) Class.forName(idgenImpl).getDeclaredConstructor().newInstance(); idgen = (IDGenerator) Class.forName(idgenImpl).newInstance();
idgen.init(app); idgen.init(app);
} }

View file

@ -32,12 +32,11 @@ public class SubnodeList implements Serializable {
transient protected long lastSubnodeFetch = 0; transient protected long lastSubnodeFetch = 0;
transient protected long lastSubnodeChange = 0; transient protected long lastSubnodeChange = 0;
/** /**
* Hide/disable zero argument constructor for subclasses * Hide/disable zero argument constructor for subclasses
*/ */
@SuppressWarnings("unused")
private SubnodeList() {} private SubnodeList() {}
/** /**

View file

@ -463,6 +463,8 @@ public class Transactor {
node.clearWriteLock(); node.clearWriteLock();
} }
long now = System.currentTimeMillis();
// set last subnode change times in parent nodes // set last subnode change times in parent nodes
for (Iterator i = parentNodes.iterator(); i.hasNext(); ) { for (Iterator i = parentNodes.iterator(); i.hasNext(); ) {
Node node = (Node) i.next(); Node node = (Node) i.next();

View file

@ -23,12 +23,12 @@ import java.io.*;
/** /**
* The base class for wrapped exceptions thrown by invocation of the scripting engine. * The base class for wrapped exceptions thrown by invocation of the scripting engine.
* If the wrapped exception is a RhinoException, the script stack trace will be * If the wrapped exception is a RhinoException, the script stack trace will be
* prepended to the actual java stack trace in stack dumps. * prepended to the actual java stack trace in stack dumps.
*/ */
public class ScriptingException extends Exception { public class ScriptingException extends Exception {
private static final long serialVersionUID = -7191341724784015678L; private static final long serialVersionUID = -7191341724784015678L;
String scriptStack = null; String scriptStack = null;
/** /**
@ -48,7 +48,14 @@ public class ScriptingException extends Exception {
*/ */
private void setScriptStack(Throwable cause) { private void setScriptStack(Throwable cause) {
if (cause instanceof RhinoException) { if (cause instanceof RhinoException) {
scriptStack = ((RhinoException) cause).getScriptStackTrace(); FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".js") ||
name.endsWith(".hac") ||
name.endsWith(".hsp");
}
};
scriptStack = ((RhinoException) cause).getScriptStackTrace(filter);
} }
} }
@ -99,4 +106,4 @@ public class ScriptingException extends Exception {
} }
} }
} }

View file

@ -48,11 +48,11 @@ public class CompiledOrInterpretedModuleScriptProvider extends StrongCachingModu
// unlikely, but possible exception during loading the module script without compilation // unlikely, but possible exception during loading the module script without compilation
Exception exception; Exception exception;
// get the application's optimization level // get the application's optimization level
boolean interpretedMode = cx.isInterpretedMode(); int optimizationLevel = cx.getOptimizationLevel();
try { try {
// set the optimization level to not compile, but interpret // set the optimization level to not compile, but interpret
cx.setInterpretedMode(true); cx.setOptimizationLevel(-1);
// load the module script with the newly set optimization level // load the module script with the newly set optimization level
ModuleScript moduleScript = super.getModuleScript(cx, moduleId, moduleUri, baseUri, paths); ModuleScript moduleScript = super.getModuleScript(cx, moduleId, moduleUri, baseUri, paths);
// return the module script // return the module script
@ -62,12 +62,12 @@ public class CompiledOrInterpretedModuleScriptProvider extends StrongCachingModu
exception = e; exception = e;
} finally { } finally {
// re-set the optimization // re-set the optimization
cx.setInterpretedMode(interpretedMode); cx.setOptimizationLevel(optimizationLevel);
} }
// re-throw the exception catched when trying to load the module script without compilation // re-throw the exception catched when trying to load the module script without compilation
throw exception; throw exception;
} }
} }
} }

View file

@ -39,7 +39,7 @@ public class HopObjectCtor extends FunctionObject {
static Method hopObjCtor; static Method hopObjCtor;
static long collectionId = 0; static long collectionId = 0;
static { static {
try { try {
@ -51,7 +51,7 @@ public class HopObjectCtor extends FunctionObject {
} }
static final int attr = DONTENUM | PERMANENT; static final int attr = DONTENUM | PERMANENT;
/** /**
* Create and install a HopObject constructor. * Create and install a HopObject constructor.
* Part of this is copied from o.m.j.FunctionObject.addAsConstructor(). * Part of this is copied from o.m.j.FunctionObject.addAsConstructor().
@ -149,7 +149,7 @@ public class HopObjectCtor extends FunctionObject {
private static final long serialVersionUID = -8041352998956882647L; private static final long serialVersionUID = -8041352998956882647L;
public GetById(Scriptable scope) { public GetById(Scriptable scope) {
ScriptRuntime.setFunctionProtoAndParent(this, Context.getCurrentContext(), scope); ScriptRuntime.setFunctionProtoAndParent(this, scope);
} }
/** /**
@ -187,7 +187,7 @@ public class HopObjectCtor extends FunctionObject {
} }
public int getArity() { public int getArity() {
return 1; return 1;
} }
public int getLength() { public int getLength() {
@ -201,7 +201,7 @@ public class HopObjectCtor extends FunctionObject {
private static final long serialVersionUID = -4046933261468527204L; private static final long serialVersionUID = -4046933261468527204L;
public HopCollection(Scriptable scope) { public HopCollection(Scriptable scope) {
ScriptRuntime.setFunctionProtoAndParent(this, Context.getCurrentContext(), scope); ScriptRuntime.setFunctionProtoAndParent(this, scope);
} }
public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {

View file

@ -67,7 +67,7 @@ import org.mozilla.javascript.*;
* @author A. Sundararajan * @author A. Sundararajan
* @since 1.6 * @since 1.6
*/ */
public final class JSAdapter implements Function { public final class JSAdapter implements Scriptable, Function {
private JSAdapter(Scriptable obj) { private JSAdapter(Scriptable obj) {
setAdaptee(obj); setAdaptee(obj);
} }

View file

@ -19,16 +19,16 @@ public class JSONModuleSource extends ModuleSource {
@Override @Override
public Reader getReader() { public Reader getReader() {
StringBuffer content = new StringBuffer(); StringBuffer content = new StringBuffer();
content.append("module.exports = "); content.append("module.exports = "); //$NON-NLS-1$
try { try {
content.append(IOUtils.toString(this.getUri().toURL().openStream(), "UTF-8")); content.append(IOUtils.toString(this.getUri().toURL().openStream()));
} catch (IOException e) { } catch (IOException e) {
content.append("null"); content.append("null"); //$NON-NLS-1$
} }
content.append(";"); content.append(";"); //$NON-NLS-1$
return new StringReader(content.toString()); return new StringReader(content.toString());
} }

View file

@ -17,6 +17,7 @@
package helma.scripting.rhino; package helma.scripting.rhino;
import helma.framework.core.*; import helma.framework.core.*;
import helma.framework.ResponseTrans;
import helma.framework.repository.Resource; import helma.framework.repository.Resource;
import org.mozilla.javascript.*; import org.mozilla.javascript.*;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -82,7 +83,7 @@ public class JavaObject extends NativeJavaObject {
Skin skin = engine.toSkin(skinobj, protoName); Skin skin = engine.toSkin(skinobj, protoName);
if (skin != null) { if (skin != null) {
skin.render(engine.reval, javaObject, skin.render(engine.reval, javaObject,
(paramobj == Undefined.instance) ? null : paramobj); (paramobj == Undefined.instance) ? null : paramobj);
} }
@ -147,7 +148,7 @@ public class JavaObject extends NativeJavaObject {
return overload.containsKey(name) || super.has(name, start); return overload.containsKey(name) || super.has(name, start);
} }
/** /**
* Get a named property from this object. * Get a named property from this object.
*/ */
public Object get(String name, Scriptable start) { public Object get(String name, Scriptable start) {

View file

@ -73,7 +73,7 @@ public class NodeModulesProvider extends UrlModuleSourceProvider {
// check if the file exists and is a file // check if the file exists and is a file
if (file.exists() && file.isFile()) { if (file.exists() && file.isFile()) {
// check if the file is a JSON file // check if the file is a JSON file
if (file.getAbsolutePath().toLowerCase().endsWith(".json")) { if (file.getAbsolutePath().toLowerCase().endsWith(".json")) { //$NON-NLS-1$
// return a JSON module source // return a JSON module source
return new JSONModuleSource(null, file.toURI(), base, validator); return new JSONModuleSource(null, file.toURI(), base, validator);
} else { } else {
@ -83,7 +83,7 @@ public class NodeModulesProvider extends UrlModuleSourceProvider {
} }
// lets assume the module is a JS file // lets assume the module is a JS file
file = new File(new File(uri).getPath() + ".js"); file = new File(new File(uri).getPath() + ".js"); //$NON-NLS-1$
// check if a file.js exists and is a file // check if a file.js exists and is a file
if (file.exists() && file.isFile()) { if (file.exists() && file.isFile()) {
// do what would have been done anyways // do what would have been done anyways
@ -91,7 +91,7 @@ public class NodeModulesProvider extends UrlModuleSourceProvider {
} }
// lets assume the module is a JSON file // lets assume the module is a JSON file
file = new File(new File(uri).getPath() + ".json"); file = new File(new File(uri).getPath() + ".json"); //$NON-NLS-1$
// check if a file.json exists and is a file // check if a file.json exists and is a file
if (file.exists() && file.isFile()) { if (file.exists() && file.isFile()) {
// return a JSON module source // return a JSON module source
@ -135,17 +135,17 @@ public class NodeModulesProvider extends UrlModuleSourceProvider {
ModuleSource moduleSource; ModuleSource moduleSource;
// lets assume that there is a "package.json" file in the directory // lets assume that there is a "package.json" file in the directory
File packageFile = new File(directory, "package.json"); File packageFile = new File(directory, "package.json"); //$NON-NLS-1$
// check if the there is a "package.json" file in the directory // check if the there is a "package.json" file in the directory
if (packageFile.exists() && packageFile.isFile()) { if (packageFile.exists() && packageFile.isFile()) {
// parse the JSON file // parse the JSON file
JsonObject json = JsonParser JsonObject json = new JsonParser()
.parseString(new String(Files.readAllBytes(packageFile.toPath()))).getAsJsonObject(); .parse(new String(Files.readAllBytes(packageFile.toPath()))).getAsJsonObject();
// check if the JSON file defines a main JS file // check if the JSON file defines a main JS file
if (json.has("main")) { if (json.has("main")) { //$NON-NLS-1$
// get the main JS file, removing the filename extension // get the main JS file, removing the filename extension
String main = FilenameUtils.removeExtension(json.get("main").getAsString()); String main = FilenameUtils.removeExtension(json.get("main").getAsString()); //$NON-NLS-1$
// load as file // load as file
moduleSource = this.loadAsFile(new File(directory, main).toURI(), base, validator); moduleSource = this.loadAsFile(new File(directory, main).toURI(), base, validator);
@ -158,7 +158,7 @@ public class NodeModulesProvider extends UrlModuleSourceProvider {
} }
// load as index // load as index
moduleSource = this.loadAsFile(new File(directory, "index").toURI(), base, validator); moduleSource = this.loadAsFile(new File(directory, "index").toURI(), base, validator); //$NON-NLS-1$
// check if something was loaded // check if something was loaded
if (moduleSource != null) { if (moduleSource != null) {
// return the loaded module source // return the loaded module source

View file

@ -44,6 +44,7 @@ import org.mozilla.javascript.Undefined;
import org.mozilla.javascript.WrapFactory; import org.mozilla.javascript.WrapFactory;
import org.mozilla.javascript.Wrapper; import org.mozilla.javascript.Wrapper;
import org.mozilla.javascript.commonjs.module.RequireBuilder; import org.mozilla.javascript.commonjs.module.RequireBuilder;
import org.mozilla.javascript.commonjs.module.provider.StrongCachingModuleScriptProvider;
import org.mozilla.javascript.tools.debugger.ScopeProvider; import org.mozilla.javascript.tools.debugger.ScopeProvider;
import java.io.*; import java.io.*;
@ -1232,7 +1233,7 @@ public final class RhinoCore implements ScopeProvider {
protected void onContextCreated(Context cx) { protected void onContextCreated(Context cx) {
cx.setWrapFactory(wrapper); cx.setWrapFactory(wrapper);
cx.setInterpretedMode(optLevel < 0); cx.setOptimizationLevel(optLevel);
cx.setInstructionObserverThreshold(10000); cx.setInstructionObserverThreshold(10000);
if (Context.isValidLanguageVersion(languageVersion)) { if (Context.isValidLanguageVersion(languageVersion)) {
cx.setLanguageVersion(languageVersion); cx.setLanguageVersion(languageVersion);

View file

@ -25,7 +25,7 @@ import java.io.Serializable;
/** /**
* Serialization proxy/placeholder interface. This is used for * Serialization proxy/placeholder interface. This is used for
* for various Helma and Rhino related classes.. * for various Helma and Rhino related classes..
*/ */
public interface SerializationProxy extends Serializable { public interface SerializationProxy extends Serializable {
public Object getObject(RhinoEngine engine); public Object getObject(RhinoEngine engine);
@ -49,21 +49,19 @@ class ScriptBeanProxy implements SerializationProxy {
* @return the object represented by this proxy * @return the object represented by this proxy
*/ */
public Object getObject(RhinoEngine engine) { public Object getObject(RhinoEngine engine) {
Object object = null;
try { try {
object = engine.global.get(name, engine.global); Object object = engine.global.get(name, engine.global);
} catch (Exception e) { } catch (Exception e) {
System.out.println(name); System.out.println(name);
} }
return object; return engine.global.get(name, engine.global);
} }
} }
/** /**
* Serialization proxy for the application object. * Serialization proxy for the application object.
* *
* @author Daniel Ruthardt * @author Daniel Ruthardt
* @since 20170918 * @since 20170918
*/ */

View file

@ -151,9 +151,7 @@ public class Profiler implements Debugger {
name.substring(prefixLength) name.substring(prefixLength)
}; };
formatter.format("%1$7d ms %2$5d ms %3$6d %4$s%n", args); formatter.format("%1$7d ms %2$5d ms %3$6d %4$s%n", args);
String result = formatter.toString(); return formatter.toString();
formatter.close();
return result;
} }
} }
} }

View file

@ -13,10 +13,11 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
*/ */
package helma.scripting.rhino.debug; package helma.scripting.rhino.debug;
import helma.framework.ResponseTrans; import helma.framework.ResponseTrans;
import helma.util.HtmlEncoder;
import org.mozilla.javascript.*; import org.mozilla.javascript.*;
import org.mozilla.javascript.debug.*; import org.mozilla.javascript.debug.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -84,7 +85,7 @@ public class Tracer implements Debugger {
* Called when execution is ready to start bytecode interpretation * Called when execution is ready to start bytecode interpretation
* for entered a particular function or script. * for entered a particular function or script.
*/ */
public void onEnter(Context cx, Scriptable activation, public void onEnter(Context cx, Scriptable activation,
Scriptable thisObj, Object[] args) { Scriptable thisObj, Object[] args) {
time = System.currentTimeMillis(); time = System.currentTimeMillis();
@ -127,7 +128,7 @@ public class Tracer implements Debugger {
// Simplify Trace by dropping fast invocations. May be useful when looking // Simplify Trace by dropping fast invocations. May be useful when looking
// looking for bottlenecks, but not when trying to find out wtf is going on // looking for bottlenecks, but not when trying to find out wtf is going on
// if (time <= 1) // if (time <= 1)
// return; // return;
StringBuffer b = new StringBuffer("Trace: "); StringBuffer b = new StringBuffer("Trace: ");
for (int i = 0; i < depth; i++) for (int i = 0; i < depth; i++)
b.append(".&nbsp;"); b.append(".&nbsp;");

View file

@ -25,7 +25,6 @@ import java.util.Enumeration;
import java.util.Vector; import java.util.Vector;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.*; import java.sql.*;
@ -63,13 +62,9 @@ public class DatabaseObject {
* Create a new database object based on a driver name, with driver on the classpath * Create a new database object based on a driver name, with driver on the classpath
* *
* @param driverName The class name of the JDBC driver * @param driverName The class name of the JDBC driver
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/ */
DatabaseObject(String driverName) throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { DatabaseObject(String driverName) {
this.driverName = driverName; this.driverName = driverName;
try { try {
Class driverClass = Class.forName(driverName); Class driverClass = Class.forName(driverName);
@ -78,7 +73,7 @@ public class DatabaseObject {
// System.err.println("##Bad class " + driverClass); // System.err.println("##Bad class " + driverClass);
lastError = new RuntimeException("Class " + driverClass + " is not a JDBC driver"); lastError = new RuntimeException("Class " + driverClass + " is not a JDBC driver");
} }
driverClass.getDeclaredConstructor().newInstance(); // may be needed by some drivers, harmless for others driverClass.newInstance(); // may be needed by some drivers, harmless for others
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// System.err.println("##Cannot find driver class: " + e); // System.err.println("##Cannot find driver class: " + e);
// e.printStackTrace(); // e.printStackTrace();
@ -453,6 +448,51 @@ public class DatabaseObject {
return null; return null;
} }
/* FIXME: dunno if this method is still used somewhere
public Object getProperty(String propertyName, int hash) {
//System.err.println(" &&& Getting property '" + propertyName + "'");
// Length property is firsy checked
// First return system or or prototype properties
if (propertyName.equals("length")) {
return Integer.valueOf(colNames.size());
} else {
if (resultSet == null) {
lastError = new SQLException("Attempt to access a released result set");
return null;
}
if (!firstRowSeen) {
lastError = new SQLException("Attempt to access data before the first row is read");
return null;
}
try {
int index = -1; // indicates not a valid index value
try {
char c = propertyName.charAt(0);
if ('0' <= c && c <= '9') {
index = Integer.parseInt(propertyName);
}
} catch (NumberFormatException e) {
} catch (StringIndexOutOfBoundsException e) { // for charAt
}
if (index>=0) {
return getProperty(index);
}
Object value = resultSet.getObject(propertyName);
// IServer.getLogger().log("&& @VALUE : " + value);
lastError = null;
return value;
} catch (SQLException e) {
// System.err.println("##Cannot get property '" + propertyName + "' " + e);
// e.printStackTrace();
lastError = e;
}
}
return null;
}
*/
public Object getProperty(int index) { public Object getProperty(int index) {
if (!firstRowSeen) { if (!firstRowSeen) {
lastError = new SQLException("Attempt to access data before the first row is read"); lastError = new SQLException("Attempt to access data before the first row is read");

View file

@ -39,7 +39,7 @@ import javax.mail.internet.MimeUtility;
* A JavaScript wrapper around a JavaMail message class to send * A JavaScript wrapper around a JavaMail message class to send
* mail via SMTP from Helma * mail via SMTP from Helma
*/ */
public class MailObject extends ScriptableObject { public class MailObject extends ScriptableObject implements Serializable {
private static final long serialVersionUID = -4834981850233741039L; private static final long serialVersionUID = -4834981850233741039L;

View file

@ -126,9 +126,7 @@ public class XmlObject {
writer.setDatabaseMode(dbmode); writer.setDatabaseMode(dbmode);
writer.write(node); writer.write(node);
writer.flush(); writer.flush();
String result = out.toString("UTF-8"); return out.toString("UTF-8");
writer.close();
return result;
} }
/** /**

View file

@ -22,18 +22,29 @@ package helma.servlet;
import helma.framework.*; import helma.framework.*;
import helma.framework.core.Application; import helma.framework.core.Application;
import helma.util.*; import helma.util.*;
import java.io.*; import java.io.*;
import java.util.*; import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import javax.servlet.*; import java.util.*;
import javax.servlet.http.*;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.*; import org.apache.commons.fileupload2.core.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.fileupload.servlet.ServletRequestContext; import org.apache.commons.fileupload2.core.FileUploadException;
import org.apache.commons.fileupload2.core.FileUploadSizeException;
import org.apache.commons.fileupload2.core.ProgressListener;
import org.apache.commons.fileupload2.jakarta.JakartaServletDiskFileUpload;
import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload;
import org.apache.commons.fileupload2.jakarta.JakartaServletRequestContext;
/** /**
* This is an abstract Hop servlet adapter. This class communicates with hop applications * This is an abstract Hop servlet adapter. This class communicates with hop applications
@ -217,10 +228,10 @@ public abstract class AbstractServletClient extends HttpServlet {
parseParameters(request, reqtrans, encoding); parseParameters(request, reqtrans, encoding);
// read file uploads // read file uploads
List<FileItem> uploads = null; List uploads = null;
ServletRequestContext reqcx = new ServletRequestContext(request); JakartaServletRequestContext reqcx = new JakartaServletRequestContext(request);
if (ServletFileUpload.isMultipartContent(reqcx)) { if (JakartaServletFileUpload.isMultipartContent(reqcx)) {
// get session for upload progress monitoring // get session for upload progress monitoring
UploadStatus uploadStatus = getApplication().getUploadStatus(reqtrans); UploadStatus uploadStatus = getApplication().getUploadStatus(reqtrans);
try { try {
@ -228,7 +239,7 @@ public abstract class AbstractServletClient extends HttpServlet {
} catch (Exception upx) { } catch (Exception upx) {
log("Error in file upload", upx); log("Error in file upload", upx);
String message; String message;
boolean tooLarge = (upx instanceof FileUploadBase.SizeLimitExceededException); boolean tooLarge = (upx instanceof FileUploadSizeException);
if (tooLarge) { if (tooLarge) {
message = "File upload size exceeds limit of " + uploadLimit + " kB"; message = "File upload size exceeds limit of " + uploadLimit + " kB";
} else { } else {
@ -517,9 +528,9 @@ public abstract class AbstractServletClient extends HttpServlet {
checksum[i] = (byte) (n); checksum[i] = (byte) (n);
n >>>= 8; n >>>= 8;
} }
String etag = "\"" + new String(Base64.encodeBase64(checksum)) + "\""; String etag = "\"" + new String(Base64.encodeBase64(checksum)) + "\""; //$NON-NLS-1$//$NON-NLS-2$
res.setHeader("ETag", etag); res.setHeader("ETag", etag); //$NON-NLS-1$
String etagHeader = req.getHeader("If-None-Match"); String etagHeader = req.getHeader("If-None-Match"); //$NON-NLS-1$
if (etagHeader != null) { if (etagHeader != null) {
StringTokenizer st = new StringTokenizer(etagHeader, ", \r\n"); StringTokenizer st = new StringTokenizer(etagHeader, ", \r\n");
while (st.hasMoreTokens()) { while (st.hasMoreTokens()) {
@ -637,7 +648,7 @@ public abstract class AbstractServletClient extends HttpServlet {
* Put name and value pair in map. When name already exist, add value * Put name and value pair in map. When name already exist, add value
* to array of values. * to array of values.
*/ */
private static void putMapEntry(Map<String, String[]> map, String name, String value) { private static void putMapEntry(Map map, String name, String value) {
String[] newValues = null; String[] newValues = null;
String[] oldValues = (String[]) map.get(name); String[] oldValues = (String[]) map.get(name);
@ -653,12 +664,12 @@ public abstract class AbstractServletClient extends HttpServlet {
map.put(name, newValues); map.put(name, newValues);
} }
protected List<FileItem> parseUploads(ServletRequestContext reqcx, RequestTrans reqtrans, protected List parseUploads(JakartaServletRequestContext reqcx, RequestTrans reqtrans,
final UploadStatus uploadStatus, String encoding) final UploadStatus uploadStatus, String encoding)
throws FileUploadException, UnsupportedEncodingException { throws FileUploadException, UnsupportedCharsetException, IOException {
// handle file upload // handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory(); DiskFileItemFactory factory = DiskFileItemFactory.builder().get();
FileUpload upload = new FileUpload(factory); JakartaServletFileUpload upload = new JakartaServletFileUpload(factory);
// use upload limit for individual file size, but also set a limit on overall size // use upload limit for individual file size, but also set a limit on overall size
upload.setFileSizeMax(uploadLimit * 1024); upload.setFileSizeMax(uploadLimit * 1024);
upload.setSizeMax(totalUploadLimit * 1024); upload.setSizeMax(totalUploadLimit * 1024);
@ -672,8 +683,8 @@ public abstract class AbstractServletClient extends HttpServlet {
}); });
} }
List<FileItem> uploads = upload.parseRequest(reqcx); List uploads = upload.parseRequest(reqcx);
Iterator<FileItem> it = uploads.iterator(); Iterator it = uploads.iterator();
while (it.hasNext()) { while (it.hasNext()) {
FileItem item = (FileItem) it.next(); FileItem item = (FileItem) it.next();
@ -681,7 +692,7 @@ public abstract class AbstractServletClient extends HttpServlet {
Object value; Object value;
// check if this is an ordinary HTML form element or a file upload // check if this is an ordinary HTML form element or a file upload
if (item.isFormField()) { if (item.isFormField()) {
value = item.getString(encoding); value = item.getString(Charset.forName(encoding));
} else { } else {
value = new MimePart(item); value = new MimePart(item);
} }
@ -705,7 +716,7 @@ public abstract class AbstractServletClient extends HttpServlet {
return; return;
} }
HashMap<String, String[]> parameters = new HashMap<>(); HashMap parameters = new HashMap();
// Parse any query string parameters from the request // Parse any query string parameters from the request
if (queryString != null) { if (queryString != null) {
@ -764,7 +775,7 @@ public abstract class AbstractServletClient extends HttpServlet {
* *
* @exception UnsupportedEncodingException if the data is malformed * @exception UnsupportedEncodingException if the data is malformed
*/ */
public static void parseParameters(Map<String, String[]> map, byte[] data, String encoding, boolean isPost) public static void parseParameters(Map map, byte[] data, String encoding, boolean isPost)
throws UnsupportedEncodingException { throws UnsupportedEncodingException {
if ((data != null) && (data.length > 0)) { if ((data != null) && (data.length > 0)) {
int ix = 0; int ix = 0;

View file

@ -16,9 +16,10 @@
package helma.servlet; package helma.servlet;
import helma.framework.*;
import helma.framework.core.Application; import helma.framework.core.Application;
import helma.main.*; import helma.main.*;
import javax.servlet.*; import jakarta.servlet.*;
/** /**
* Servlet client that runs a Helma application for the embedded * Servlet client that runs a Helma application for the embedded

View file

@ -23,7 +23,7 @@ import helma.main.ServerConfig;
import helma.main.Server; import helma.main.Server;
import java.io.*; import java.io.*;
import javax.servlet.*; import jakarta.servlet.*;
import java.util.*; import java.util.*;
/** /**
@ -98,7 +98,7 @@ public final class StandaloneServletClient extends AbstractServletClient {
repositoryImpl = "helma.framework.repository.FileRepository"; repositoryImpl = "helma.framework.repository.FileRepository";
} }
} }
try { try {
Repository newRepository = (Repository) Class.forName(repositoryImpl) Repository newRepository = (Repository) Class.forName(repositoryImpl)
.getConstructor(parameters) .getConstructor(parameters)
@ -116,7 +116,7 @@ public final class StandaloneServletClient extends AbstractServletClient {
} }
} }
} }
// add app dir // add app dir
FileRepository appRep = new FileRepository(appDir); FileRepository appRep = new FileRepository(appDir);
log("adding repository: " + appDir); log("adding repository: " + appDir);

View file

@ -23,6 +23,7 @@ import java.util.StringTokenizer;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import helma.framework.repository.Resource;
import helma.framework.repository.Resource; import helma.framework.repository.Resource;
/** /**

View file

@ -16,7 +16,7 @@
package helma.util; package helma.util;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload2.core.FileItem;
import java.io.*; import java.io.*;
import java.util.Date; import java.util.Date;
@ -238,7 +238,7 @@ public class MimePart implements Serializable {
file = new File(base, filename); file = new File(base, filename);
if (fileItem != null) { if (fileItem != null) {
fileItem.write(file); fileItem.write(file.toPath());
// null out fileItem, since calling write() may have moved the temp file // null out fileItem, since calling write() may have moved the temp file
fileItem = null; fileItem = null;
} else { } else {
@ -249,7 +249,7 @@ public class MimePart implements Serializable {
// return file name // return file name
return filename; return filename;
} catch (Exception x) { } catch (Exception x) {
System.err.println("Error in MimePart.writeToFile(): " + x); System.err.println("Error in MimePart.writeToFile(): " + x);
return null; return null;
} }
} }