Clean up code with Copilot #134

Open
tobi wants to merge 2 commits from clean-up-code-with-copilot into main
38 changed files with 537 additions and 587 deletions

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 jarlist, File dir) throws MalformedURLException { static void addJars(ArrayList<URL> 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"); //$NON-NLS-1$//$NON-NLS-2$ return n.endsWith(".jar") || n.endsWith(".zip");
} }
}); });
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())); //$NON-NLS-1$ jarlist.add(new URL("file:" + files[i].getAbsolutePath()));
} }
} }
} }
@ -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 jarlist = new ArrayList(); ArrayList<URL> 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")); //$NON-NLS-1$ addJars(jarlist, new File(libdir, "ext"));
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"); //$NON-NLS-1$ .getResource("helma/main/launcher/Main.class");
// 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 initScripting(Application app, ScriptingEngine engine) public abstract HashMap<String, Object> 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 check = Class.forName("helma.main.Server"); 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 initScripting(Application app, ScriptingEngine engine) public HashMap<String, Object> 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 globals = new HashMap(); HashMap<String, Object> globals = new HashMap<>();
globals.put("demo", Server.getServer()); globals.put("demo", Server.getServer());

View file

@ -603,11 +603,11 @@ public class RequestTrans implements Serializable {
StringTokenizer tok; StringTokenizer tok;
if (auth.startsWith("Basic ")) { //$NON-NLS-1$ if (auth.startsWith("Basic ")) {
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)), ":"); //$NON-NLS-1$ tok = new StringTokenizer(new String(Base64.decodeBase64(auth)), ":");
} }
try { try {

View file

@ -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)) + "\""; //$NON-NLS-1$ //$NON-NLS-2$ this.etag = "\"" + new String(Base64.encodeBase64(b)) + "\"";
// 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 repositories; ArrayList<Repository> 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 freeThreads; protected Stack<RequestEvaluator> freeThreads;
protected Vector allThreads; protected Vector<RequestEvaluator> allThreads;
boolean running = false; boolean running = false;
boolean debug; boolean debug;
long starttime; long starttime;
Hashtable dbSources; Hashtable<String, DbSource> dbSources;
// map of app modules reflected at app.modules // map of app modules reflected at app.modules
Map modules; Map<String, Object> 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 currentEvaluator = new ThreadLocal(); ThreadLocal<RequestEvaluator> currentEvaluator = new ThreadLocal<>();
// Map of requesttrans -> active requestevaluators // Map of requesttrans -> active requestevaluators
Hashtable activeRequests; Hashtable<RequestTrans, RequestEvaluator> 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 xmlrpcAccess; private HashSet<String> 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 activeCronJobs = null; Hashtable<String, CronRunner> activeCronJobs = null;
// the list of custom cron jobs // the list of custom cron jobs
Hashtable customCronJobs = null; Hashtable<String, CronJob> 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,7 +366,9 @@ 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);
@ -381,7 +383,7 @@ public final class Application implements Runnable {
} }
if (Server.getServer() != null) { if (Server.getServer() != null) {
Vector extensions = Server.getServer().getExtensions(); Vector<HelmaExtension> 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);
@ -396,12 +398,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);
@ -442,7 +444,13 @@ 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");
sessionMgr = (SessionManager) Class.forName(sessionMgrImpl).newInstance(); try {
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);
@ -879,7 +887,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.newInstance(); rootObject = c.getDeclaredConstructor().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.newInstance(); scriptingEngine = (ScriptingEngine) clazz.getDeclaredConstructor().newInstance();
scriptingEngine.init(app, this); scriptingEngine.init(app, this);
} catch (Exception x) { } catch (Exception x) {
Throwable t = x; Throwable t = x;

View file

@ -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.newInstance(); generator = (ImageGenerator) generatorClass.getDeclaredConstructor().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: "

View file

@ -30,6 +30,7 @@ import java.util.Vector;
* (or input streams). * (or input streams).
* <p> * <p>
* Use the class like this: * Use the class like this:
*
* <pre> * <pre>
* ImageInfo ii = new ImageInfo(); * ImageInfo ii = new ImageInfo();
* ii.setInput(in); // in can be InputStream or RandomAccessFile * ii.setInput(in); // in can be InputStream or RandomAccessFile
@ -45,12 +46,16 @@ import java.util.Vector;
* " image(s), " + ii.getNumberOfComments() + " comment(s)."); * " image(s), " + ii.getNumberOfComments() + " comment(s).");
* // there are other properties, check out the API documentation * // there are other properties, check out the API documentation
* </pre> * </pre>
*
* You can also use this class as a command line program. * You can also use this class as a command line program.
* Call it with a number of image file names and URLs as parameters: * Call it with a number of image file names and URLs as parameters:
*
* <pre> * <pre>
* java ImageInfo *.jpg *.png *.gif http://somesite.tld/image.jpg * java ImageInfo *.jpg *.png *.gif http://somesite.tld/image.jpg
* </pre> * </pre>
*
* or call it without parameters and pipe data to it: * or call it without parameters and pipe data to it:
*
* <pre> * <pre>
* java ImageInfo &lt; image.jpg * java ImageInfo &lt; image.jpg
* </pre> * </pre>
@ -64,7 +69,8 @@ import java.util.Vector;
* setDetermineImageNumber(true) before calling check(). * setDetermineImageNumber(true) before calling check().
* The complete scan over the GIF file will take additional time.</li> * The complete scan over the GIF file will take additional time.</li>
* <li>Transparency information is not included in the bits per pixel count. * <li>Transparency information is not included in the bits per pixel count.
* Actually, it was my decision not to include those bits, so it's a feature! ;-)</li> * Actually, it was my decision not to include those bits, so it's a feature!
* ;-)</li>
* </ul> * </ul>
* <p> * <p>
* Requirements: * Requirements:
@ -72,9 +78,12 @@ import java.util.Vector;
* <li>Java 1.1 or higher</li> * <li>Java 1.1 or higher</li>
* </ul> * </ul>
* <p> * <p>
* The latest version can be found at <a href="http://www.geocities.com/marcoschmidt.geo/image-info.html">http://www.geocities.com/marcoschmidt.geo/image-info.html</a>. * The latest version can be found at <a href=
* "http://www.geocities.com/marcoschmidt.geo/image-info.html">http://www.geocities.com/marcoschmidt.geo/image-info.html</a>.
* <p> * <p>
* Written by <a href="http://www.geocities.com/marcoschmidt.geo/contact.html">Marco Schmidt</a>. * Written by
* <a href="http://www.geocities.com/marcoschmidt.geo/contact.html">Marco
* Schmidt</a>.
* <p> * <p>
* This class is contributed to the Public Domain. * This class is contributed to the Public Domain.
* Use it at your own risk. * Use it at your own risk.
@ -84,35 +93,53 @@ import java.util.Vector;
* History: * History:
* <ul> * <ul>
* <li><strong>2001-08-24</strong> Initial version.</li> * <li><strong>2001-08-24</strong> Initial version.</li>
* <li><strong>2001-10-13</strong> Added support for the file formats BMP and PCX.</li> * <li><strong>2001-10-13</strong> Added support for the file formats BMP and
* <li><strong>2001-10-16</strong> Fixed bug in read(int[], int, int) that returned * PCX.</li>
* <li><strong>2002-01-22</strong> Added support for file formats Amiga IFF and Sun Raster (RAS).</li> * <li><strong>2001-10-16</strong> Fixed bug in read(int[], int, int) that
* <li><strong>2002-01-24</strong> Added support for file formats Portable Bitmap / Graymap / Pixmap (PBM, PGM, PPM) and Adobe Photoshop (PSD). * returned
* Added new method getMimeType() to return the MIME type associated with a particular file format.</li> * <li><strong>2002-01-22</strong> Added support for file formats Amiga IFF and
* <li><strong>2002-03-15</strong> Added support to recognize number of images in file. Only works with GIF. * Sun Raster (RAS).</li>
* Use {@link #setDetermineImageNumber} with <code>true</code> as argument to identify animated GIFs * <li><strong>2002-01-24</strong> Added support for file formats Portable
* ({@link #getNumberOfImages()} will return a value larger than <code>1</code>).</li> * Bitmap / Graymap / Pixmap (PBM, PGM, PPM) and Adobe Photoshop (PSD).
* <li><strong>2002-04-10</strong> Fixed a bug in the feature 'determine number of images in animated GIF' introduced with version 1.1. * Added new method getMimeType() to return the MIME type associated with a
* particular file format.</li>
* <li><strong>2002-03-15</strong> Added support to recognize number of images
* in file. Only works with GIF.
* Use {@link #setDetermineImageNumber} with <code>true</code> as argument to
* identify animated GIFs
* ({@link #getNumberOfImages()} will return a value larger than
* <code>1</code>).</li>
* <li><strong>2002-04-10</strong> Fixed a bug in the feature 'determine number
* of images in animated GIF' introduced with version 1.1.
* Thanks to Marcelo P. Lima for sending in the bug report. * Thanks to Marcelo P. Lima for sending in the bug report.
* Released as 1.1.1.</li> * Released as 1.1.1.</li>
* <li><strong>2002-04-18</strong> Added {@link #setCollectComments(boolean)}. * <li><strong>2002-04-18</strong> Added {@link #setCollectComments(boolean)}.
* That new method lets the user specify whether textual comments are to be * That new method lets the user specify whether textual comments are to be
* stored in an internal list when encountered in an input image file / stream. * stored in an internal list when encountered in an input image file / stream.
* Added two methods to return the physical width and height of the image in dpi: * Added two methods to return the physical width and height of the image in
* dpi:
* {@link #getPhysicalWidthDpi()} and {@link #getPhysicalHeightDpi()}. * {@link #getPhysicalWidthDpi()} and {@link #getPhysicalHeightDpi()}.
* If the physical resolution could not be retrieved, these methods return <code>-1</code>. * If the physical resolution could not be retrieved, these methods return
* <code>-1</code>.
* </li> * </li>
* <li><strong>2002-04-23</strong> Added support for the new properties physical resolution and * <li><strong>2002-04-23</strong> Added support for the new properties physical
* resolution and
* comments for some formats. Released as 1.2.</li> * comments for some formats. Released as 1.2.</li>
* <li><strong>2002-06-17</strong> Added support for SWF, sent in by Michael Aird. * <li><strong>2002-06-17</strong> Added support for SWF, sent in by Michael
* Changed checkJpeg() so that other APP markers than APP0 will not lead to a failure anymore. * Aird.
* Changed checkJpeg() so that other APP markers than APP0 will not lead to a
* failure anymore.
* Released as 1.3.</li> * Released as 1.3.</li>
* <li><strong>2003-07-28</strong> Bug fix - skip method now takes return values into consideration. * <li><strong>2003-07-28</strong> Bug fix - skip method now takes return values
* Less bytes than necessary may have been skipped, leading to flaws in the retrieved information in some cases. * into consideration.
* Less bytes than necessary may have been skipped, leading to flaws in the
* retrieved information in some cases.
* Thanks to Bernard Bernstein for pointing that out. * Thanks to Bernard Bernstein for pointing that out.
* Released as 1.4.</li> * Released as 1.4.</li>
* <li><strong>2004-02-29</strong> Added support for recognizing progressive JPEG and * <li><strong>2004-02-29</strong> Added support for recognizing progressive
* interlaced PNG and GIF. A new method {@link #isProgressive()} returns whether ImageInfo * JPEG and
* interlaced PNG and GIF. A new method {@link #isProgressive()} returns whether
* ImageInfo
* has found that the storage type is progressive (or interlaced). * has found that the storage type is progressive (or interlaced).
* Thanks to Joe Germuska for suggesting the feature. * Thanks to Joe Germuska for suggesting the feature.
* Bug fix: BMP physical resolution is now correctly determined. * Bug fix: BMP physical resolution is now correctly determined.
@ -136,8 +163,10 @@ public class ImageInfo {
* of images (GIFs with more than one image are animations). * of images (GIFs with more than one image are animations).
* If you know of a place where GIFs store the physical resolution * If you know of a place where GIFs store the physical resolution
* of an image, please * of an image, please
* <a href="http://www.geocities.com/marcoschmidt.geo/contact.html">send me a mail</a>! * <a href="http://www.geocities.com/marcoschmidt.geo/contact.html">send me a
* It is determined whether the GIF stream is interlaced (see {@link #isProgressive()}). * mail</a>!
* It is determined whether the GIF stream is interlaced (see
* {@link #isProgressive()}).
*/ */
public static final int FORMAT_GIF = 1; public static final int FORMAT_GIF = 1;
@ -146,7 +175,8 @@ public class ImageInfo {
* PNG only supports one image per file. * PNG only supports one image per file.
* Both physical resolution and comments can be stored with PNG, * Both physical resolution and comments can be stored with PNG,
* but ImageInfo is currently not able to extract those. * but ImageInfo is currently not able to extract those.
* It is determined whether the PNG stream is interlaced (see {@link #isProgressive()}). * It is determined whether the PNG stream is interlaced (see
* {@link #isProgressive()}).
*/ */
public static final int FORMAT_PNG = 2; public static final int FORMAT_PNG = 2;
@ -203,8 +233,7 @@ public class ImageInfo {
* The FORMAT_xyz int constants can be used as index values for * The FORMAT_xyz int constants can be used as index values for
* this array. * this array.
*/ */
private static final String[] FORMAT_NAMES = private static final String[] FORMAT_NAMES = { "JPEG", "GIF", "PNG", "BMP", "PCX",
{"JPEG", "GIF", "PNG", "BMP", "PCX",
"IFF", "RAS", "PBM", "PGM", "PPM", "IFF", "RAS", "PBM", "PGM", "PPM",
"PSD", "SWF" }; "PSD", "SWF" };
@ -213,8 +242,8 @@ public class ImageInfo {
* The FORMAT_xyz int constants can be used as index values for * The FORMAT_xyz int constants can be used as index values for
* this array. * this array.
*/ */
private static final String[] MIME_TYPE_STRINGS = private static final String[] MIME_TYPE_STRINGS = { "image/jpeg", "image/gif", "image/png", "image/bmp",
{"image/jpeg", "image/gif", "image/png", "image/bmp", "image/pcx", "image/pcx",
"image/iff", "image/ras", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap", "image/iff", "image/ras", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap",
"image/psd", "application/x-shockwave-flash" }; "image/psd", "application/x-shockwave-flash" };
@ -222,13 +251,12 @@ public class ImageInfo {
private int height; private int height;
private int bitsPerPixel; private int bitsPerPixel;
private int numColors; private int numColors;
private int colorType = COLOR_TYPE_UNKNOWN;
private boolean progressive; private boolean progressive;
private int format; private int format;
private InputStream in; private InputStream in;
private DataInput din; private DataInput din;
private boolean collectComments = true; private boolean collectComments = true;
private Vector comments; private Vector<String> comments;
private boolean determineNumberOfImages; private boolean determineNumberOfImages;
private int numberOfImages; private int numberOfImages;
private int physicalHeightDpi; private int physicalHeightDpi;
@ -238,7 +266,7 @@ public class ImageInfo {
private void addComment(String s) { private void addComment(String s) {
if (comments == null) { if (comments == null) {
comments = new Vector(); comments = new Vector<String>();
} }
comments.addElement(s); comments.addElement(s);
} }
@ -248,6 +276,7 @@ public class ImageInfo {
* using {@link #setInput(InputStream)} or {@link #setInput(DataInput)}. * using {@link #setInput(InputStream)} or {@link #setInput(DataInput)}.
* If true is returned, the file format was known and information * If true is returned, the file format was known and information
* on the file's content can be retrieved using the various getXyz methods. * on the file's content can be retrieved using the various getXyz methods.
*
* @return if information could be retrieved from input * @return if information could be retrieved from input
*/ */
public boolean check() { public boolean check() {
@ -265,44 +294,25 @@ public class ImageInfo {
int b2 = read() & 0xff; int b2 = read() & 0xff;
if (b1 == 0x47 && b2 == 0x49) { if (b1 == 0x47 && b2 == 0x49) {
return checkGif(); return checkGif();
} } else if (b1 == 0x89 && b2 == 0x50) {
else
if (b1 == 0x89 && b2 == 0x50) {
return checkPng(); return checkPng();
} } else if (b1 == 0xff && b2 == 0xd8) {
else
if (b1 == 0xff && b2 == 0xd8) {
return checkJpeg(); return checkJpeg();
} } else if (b1 == 0x42 && b2 == 0x4d) {
else
if (b1 == 0x42 && b2 == 0x4d) {
return checkBmp(); return checkBmp();
} } else if (b1 == 0x0a && b2 < 0x06) {
else
if (b1 == 0x0a && b2 < 0x06) {
return checkPcx(); return checkPcx();
} } else if (b1 == 0x46 && b2 == 0x4f) {
else
if (b1 == 0x46 && b2 == 0x4f) {
return checkIff(); return checkIff();
} } else if (b1 == 0x59 && b2 == 0xa6) {
else
if (b1 == 0x59 && b2 == 0xa6) {
return checkRas(); return checkRas();
} } else if (b1 == 0x50 && b2 >= 0x31 && b2 <= 0x36) {
else
if (b1 == 0x50 && b2 >= 0x31 && b2 <= 0x36) {
return checkPnm(b2 - '0'); return checkPnm(b2 - '0');
} } else if (b1 == 0x38 && b2 == 0x42) {
else
if (b1 == 0x38 && b2 == 0x42) {
return checkPsd(); return checkPsd();
} } else if (b1 == 0x46 && b2 == 0x57) {
else
if (b1 == 0x46 && b2 == 0x57) {
return checkSwf(); return checkSwf();
} } else {
else {
return false; return false;
} }
} catch (IOException ioe) { } catch (IOException ioe) {
@ -365,11 +375,9 @@ public class ImageInfo {
} }
numberOfImages = 0; numberOfImages = 0;
int blockType; int blockType;
do do {
{
blockType = read(); blockType = read();
switch(blockType) switch (blockType) {
{
case (0x2c): // image separator case (0x2c): // image separator
{ {
if (read(a, 0, 9) != 9) { if (read(a, 0, 9) != 9) {
@ -389,18 +397,14 @@ public class ImageInfo {
} }
skip(1); // initial code length skip(1); // initial code length
int n; int n;
do do {
{
n = read(); n = read();
if (n > 0) { if (n > 0) {
skip(n); skip(n);
} } else if (n == -1) {
else
if (n == -1) {
return false; return false;
} }
} } while (n > 0);
while (n > 0);
numberOfImages++; numberOfImages++;
break; break;
} }
@ -410,8 +414,7 @@ public class ImageInfo {
if (collectComments && extensionType == 0xfe) { if (collectComments && extensionType == 0xfe) {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
int n; int n;
do do {
{
n = read(); n = read();
if (n == -1) { if (n == -1) {
return false; return false;
@ -425,22 +428,17 @@ public class ImageInfo {
sb.append((char) ch); sb.append((char) ch);
} }
} }
} } while (n > 0);
while (n > 0);
} else { } else {
int n; int n;
do do {
{
n = read(); n = read();
if (n > 0) { if (n > 0) {
skip(n); skip(n);
} } else if (n == -1) {
else
if (n == -1) {
return false; return false;
} }
} } while (n > 0);
while (n > 0);
} }
break; break;
} }
@ -448,13 +446,11 @@ public class ImageInfo {
{ {
break; break;
} }
default: default: {
{
return false; return false;
} }
} }
} } while (blockType != 0x3b);
while (blockType != 0x3b);
return true; return true;
} }
@ -523,9 +519,7 @@ public class ImageInfo {
if (data[7] == 1) { if (data[7] == 1) {
setPhysicalWidthDpi(getShortBigEndian(data, 8)); setPhysicalWidthDpi(getShortBigEndian(data, 8));
setPhysicalHeightDpi(getShortBigEndian(data, 10)); setPhysicalHeightDpi(getShortBigEndian(data, 10));
} } else if (data[7] == 2) {
else
if (data[7] == 2) {
int x = getShortBigEndian(data, 8); int x = getShortBigEndian(data, 8);
int y = getShortBigEndian(data, 10); int y = getShortBigEndian(data, 10);
setPhysicalWidthDpi((int) (x * 2.54f)); setPhysicalWidthDpi((int) (x * 2.54f));
@ -533,9 +527,7 @@ public class ImageInfo {
} }
} }
skip(size - 14); skip(size - 14);
} } else if (collectComments && size > 2 && marker == 0xfffe) { // comment
else
if (collectComments && size > 2 && marker == 0xfffe) { // comment
size -= 2; size -= 2;
byte[] chars = new byte[size]; byte[] chars = new byte[size];
if (read(chars, 0, size) != size) { if (read(chars, 0, size) != size) {
@ -544,9 +536,7 @@ public class ImageInfo {
String comment = new String(chars, "iso-8859-1"); String comment = new String(chars, "iso-8859-1");
comment = comment.trim(); comment = comment.trim();
addComment(comment); addComment(comment);
} } else if (marker >= 0xffc0 && marker <= 0xffcf && marker != 0xffc4 && marker != 0xffc8) {
else
if (marker >= 0xffc0 && marker <= 0xffcf && marker != 0xffc4 && marker != 0xffc8) {
if (read(data, 0, 6) != 6) { if (read(data, 0, 6) != 6) {
return false; return false;
} }
@ -588,8 +578,7 @@ public class ImageInfo {
(bits == 1 || bits == 2 || bits == 4 || bits == 8)) { (bits == 1 || bits == 2 || bits == 4 || bits == 8)) {
// paletted // paletted
bitsPerPixel = bits; bitsPerPixel = bits;
} else } else if (planes == 3 && bits == 8) {
if (planes == 3 && bits == 8) {
// RGB truecolor // RGB truecolor
bitsPerPixel = 24; bitsPerPixel = 24;
} else { } else {
@ -630,8 +619,7 @@ public class ImageInfo {
format = PNM_FORMATS[(id - 1) % 3]; format = PNM_FORMATS[(id - 1) % 3];
boolean hasPixelResolution = false; boolean hasPixelResolution = false;
String s; String s;
while (true) while (true) {
{
s = readLine(); s = readLine();
if (s != null) { if (s != null) {
s = s.trim(); s = s.trim();
@ -670,9 +658,7 @@ public class ImageInfo {
return true; return true;
} }
hasPixelResolution = true; hasPixelResolution = true;
} } else {
else
{
int maxSample; int maxSample;
try { try {
maxSample = Integer.parseInt(s); maxSample = Integer.parseInt(s);
@ -732,16 +718,15 @@ public class ImageInfo {
// Written by Michael Aird. // Written by Michael Aird.
private boolean checkSwf() throws IOException { private boolean checkSwf() throws IOException {
//get rid of the last byte of the signature, the byte of the version and 4 bytes of the size // get rid of the last byte of the signature, the byte of the version and 4
// bytes of the size
byte[] a = new byte[6]; byte[] a = new byte[6];
if (read(a) != a.length) { if (read(a) != a.length) {
return false; return false;
} }
format = FORMAT_SWF; format = FORMAT_SWF;
int bitSize = (int) readUBits(5); int bitSize = (int) readUBits(5);
int minX = (int)readSBits( bitSize );
int maxX = (int) readSBits(bitSize); int maxX = (int) readSBits(bitSize);
int minY = (int)readSBits( bitSize );
int maxY = (int) readSBits(bitSize); int maxY = (int) readSBits(bitSize);
width = maxX / 20; // cause we're in twips width = maxX / 20; // cause we're in twips
height = maxY / 20; // cause we're in twips height = maxY / 20; // cause we're in twips
@ -775,8 +760,10 @@ public class ImageInfo {
} }
/** /**
* If {@link #check()} was successful, returns the image's number of bits per pixel. * If {@link #check()} was successful, returns the image's number of bits per
* pixel.
* Does not include transparency information like the alpha channel. * Does not include transparency information like the alpha channel.
*
* @return number of bits per image pixel * @return number of bits per image pixel
*/ */
public int getBitsPerPixel() { public int getBitsPerPixel() {
@ -792,7 +779,9 @@ public class ImageInfo {
/** /**
* Returns the index'th comment retrieved from the image. * Returns the index'th comment retrieved from the image.
* @throws IllegalArgumentException if index is smaller than 0 or larger than or equal *
* @throws IllegalArgumentException if index is smaller than 0 or larger than or
* equal
* to the number of comments retrieved * to the number of comments retrieved
* @see #getNumberOfComments * @see #getNumberOfComments
*/ */
@ -807,6 +796,7 @@ public class ImageInfo {
* If {@link #check()} was successful, returns the image format as one * If {@link #check()} was successful, returns the image format as one
* of the FORMAT_xyz constants from this class. * of the FORMAT_xyz constants from this class.
* Use {@link #getFormatName()} to get a textual description of the file format. * Use {@link #getFormatName()} to get a textual description of the file format.
*
* @return file format as a FORMAT_xyz constant * @return file format as a FORMAT_xyz constant
*/ */
public int getFormat() { public int getFormat() {
@ -816,6 +806,7 @@ public class ImageInfo {
/** /**
* If {@link #check()} was successful, returns the image format's name. * If {@link #check()} was successful, returns the image format's name.
* Use {@link #getFormat()} to get a unique number. * Use {@link #getFormat()} to get a unique number.
*
* @return file format name * @return file format name
*/ */
public String getFormatName() { public String getFormatName() {
@ -829,6 +820,7 @@ public class ImageInfo {
/** /**
* If {@link #check()} was successful, returns one the image's vertical * If {@link #check()} was successful, returns one the image's vertical
* resolution in pixels. * resolution in pixels.
*
* @return image height in pixels * @return image height in pixels
*/ */
public int getHeight() { public int getHeight() {
@ -836,16 +828,14 @@ public class ImageInfo {
} }
private int getIntBigEndian(byte[] a, int offs) { private int getIntBigEndian(byte[] a, int offs) {
return return (a[offs] & 0xff) << 24 |
(a[offs] & 0xff) << 24 |
(a[offs + 1] & 0xff) << 16 | (a[offs + 1] & 0xff) << 16 |
(a[offs + 2] & 0xff) << 8 | (a[offs + 2] & 0xff) << 8 |
a[offs + 3] & 0xff; a[offs + 3] & 0xff;
} }
private int getIntLittleEndian(byte[] a, int offs) { private int getIntLittleEndian(byte[] a, int offs) {
return return (a[offs + 3] & 0xff) << 24 |
(a[offs + 3] & 0xff) << 24 |
(a[offs + 2] & 0xff) << 16 | (a[offs + 2] & 0xff) << 16 |
(a[offs + 1] & 0xff) << 8 | (a[offs + 1] & 0xff) << 8 |
a[offs] & 0xff; a[offs] & 0xff;
@ -854,12 +844,12 @@ public class ImageInfo {
/** /**
* If {@link #check()} was successful, returns a String with the * If {@link #check()} was successful, returns a String with the
* MIME type of the format. * MIME type of the format.
*
* @return MIME type, e.g. <code>image/jpeg</code> * @return MIME type, e.g. <code>image/jpeg</code>
*/ */
public String getMimeType() { public String getMimeType() {
if (format >= 0 && format < MIME_TYPE_STRINGS.length) { if (format >= 0 && format < MIME_TYPE_STRINGS.length) {
if (format == FORMAT_JPEG && progressive) if (format == FORMAT_JPEG && progressive) {
{
return "image/pjpeg"; return "image/pjpeg";
} }
return MIME_TYPE_STRINGS[format]; return MIME_TYPE_STRINGS[format];
@ -869,15 +859,16 @@ public class ImageInfo {
} }
/** /**
* If {@link #check()} was successful and {@link #setCollectComments(boolean)} was called with * If {@link #check()} was successful and {@link #setCollectComments(boolean)}
* was called with
* <code>true</code> as argument, returns the number of comments retrieved * <code>true</code> as argument, returns the number of comments retrieved
* from the input image stream / file. * from the input image stream / file.
* Any number &gt;= 0 and smaller than this number of comments is then a * Any number &gt;= 0 and smaller than this number of comments is then a
* valid argument for the {@link #getComment(int)} method. * valid argument for the {@link #getComment(int)} method.
*
* @return number of comments retrieved from input image * @return number of comments retrieved from input image
*/ */
public int getNumberOfComments() public int getNumberOfComments() {
{
if (comments == null) { if (comments == null) {
return 0; return 0;
} else { } else {
@ -889,11 +880,12 @@ public class ImageInfo {
* Returns the number of images in the examined file. * Returns the number of images in the examined file.
* Assumes that <code>setDetermineImageNumber(true);</code> was called before * Assumes that <code>setDetermineImageNumber(true);</code> was called before
* a successful call to {@link #check()}. * a successful call to {@link #check()}.
* This value can currently be only different from <code>1</code> for GIF images. * This value can currently be only different from <code>1</code> for GIF
* images.
*
* @return number of images in file * @return number of images in file
*/ */
public int getNumberOfImages() public int getNumberOfImages() {
{
return numberOfImages; return numberOfImages;
} }
@ -901,6 +893,7 @@ public class ImageInfo {
* Returns the physical height of this image in dots per inch (dpi). * Returns the physical height of this image in dots per inch (dpi).
* Assumes that {@link #check()} was successful. * Assumes that {@link #check()} was successful.
* Returns <code>-1</code> on failure. * Returns <code>-1</code> on failure.
*
* @return physical height (in dpi) * @return physical height (in dpi)
* @see #getPhysicalWidthDpi() * @see #getPhysicalWidthDpi()
* @see #getPhysicalHeightInch() * @see #getPhysicalHeightInch()
@ -910,8 +903,10 @@ public class ImageInfo {
} }
/** /**
* If {@link #check()} was successful, returns the physical width of this image in dpi (dots per inch) * If {@link #check()} was successful, returns the physical width of this image
* in dpi (dots per inch)
* or -1 if no value could be found. * or -1 if no value could be found.
*
* @return physical height (in dpi) * @return physical height (in dpi)
* @see #getPhysicalHeightDpi() * @see #getPhysicalHeightDpi()
* @see #getPhysicalWidthDpi() * @see #getPhysicalWidthDpi()
@ -928,8 +923,10 @@ public class ImageInfo {
} }
/** /**
* If {@link #check()} was successful, returns the physical width of this image in dpi (dots per inch) * If {@link #check()} was successful, returns the physical width of this image
* in dpi (dots per inch)
* or -1 if no value could be found. * or -1 if no value could be found.
*
* @return physical width (in dpi) * @return physical width (in dpi)
* @see #getPhysicalHeightDpi() * @see #getPhysicalHeightDpi()
* @see #getPhysicalWidthInch() * @see #getPhysicalWidthInch()
@ -943,6 +940,7 @@ public class ImageInfo {
* Returns the physical width of an image in inches, or * Returns the physical width of an image in inches, or
* <code>-1.0f</code> if width information is not available. * <code>-1.0f</code> if width information is not available.
* Assumes that {@link #check} has been called successfully. * Assumes that {@link #check} has been called successfully.
*
* @return physical width in inches or <code>-1.0f</code> on failure * @return physical width in inches or <code>-1.0f</code> on failure
* @see #getPhysicalWidthDpi * @see #getPhysicalWidthDpi
* @see #getPhysicalHeightInch * @see #getPhysicalHeightInch
@ -958,8 +956,7 @@ public class ImageInfo {
} }
private int getShortBigEndian(byte[] a, int offs) { private int getShortBigEndian(byte[] a, int offs) {
return return (a[offs] & 0xff) << 8 |
(a[offs] & 0xff) << 8 |
(a[offs + 1] & 0xff); (a[offs + 1] & 0xff);
} }
@ -970,6 +967,7 @@ public class ImageInfo {
/** /**
* If {@link #check()} was successful, returns one the image's horizontal * If {@link #check()} was successful, returns one the image's horizontal
* resolution in pixels. * resolution in pixels.
*
* @return image width in pixels * @return image width in pixels
*/ */
public int getWidth() { public int getWidth() {
@ -977,11 +975,12 @@ public class ImageInfo {
} }
/** /**
* Returns whether the image is stored in a progressive (also called: interlaced) way. * Returns whether the image is stored in a progressive (also called:
* interlaced) way.
*
* @return true for progressive/interlaced, false otherwise * @return true for progressive/interlaced, false otherwise
*/ */
public boolean isProgressive() public boolean isProgressive() {
{
return progressive; return progressive;
} }
@ -991,6 +990,7 @@ public class ImageInfo {
* printed to standard output, one line per file) or call * printed to standard output, one line per file) or call
* it with no parameters. It will then check data given to it * it with no parameters. It will then check data given to it
* via standard input. * via standard input.
*
* @param args the program arguments which must be file names * @param args the program arguments which must be file names
*/ */
public static void main(String[] args) { public static void main(String[] args) {
@ -1044,8 +1044,7 @@ public class ImageInfo {
imageInfo.getPhysicalHeightDpi() + ";" + imageInfo.getPhysicalHeightDpi() + ";" +
imageInfo.getPhysicalWidthInch() + ";" + imageInfo.getPhysicalWidthInch() + ";" +
imageInfo.getPhysicalHeightInch() + ";" + imageInfo.getPhysicalHeightInch() + ";" +
imageInfo.isProgressive() imageInfo.isProgressive());
);
} }
private static void printLine(int indentLevels, String text, float value, float minValidValue) { private static void printLine(int indentLevels, String text, float value, float minValidValue) {
@ -1139,8 +1138,7 @@ public class ImageInfo {
return sb.toString(); return sb.toString();
} }
private long readUBits( int numBits ) throws IOException private long readUBits(int numBits) throws IOException {
{
if (numBits == 0) { if (numBits == 0) {
return 0; return 0;
} }
@ -1155,11 +1153,9 @@ public class ImageInfo {
bitPos = 8; bitPos = 8;
} }
while( true ) while (true) {
{
int shift = bitsLeft - bitPos; int shift = bitsLeft - bitPos;
if( shift > 0 ) if (shift > 0) {
{
// Consume the entire buffer // Consume the entire buffer
result |= bitBuf << shift; result |= bitBuf << shift;
bitsLeft -= bitPos; bitsLeft -= bitPos;
@ -1171,9 +1167,7 @@ public class ImageInfo {
bitBuf = din.readByte(); bitBuf = din.readByte();
} }
bitPos = 8; bitPos = 8;
} } else {
else
{
// Consume a portion of the buffer // Consume a portion of the buffer
result |= bitBuf >> -shift; result |= bitBuf >> -shift;
bitPos -= bitsLeft; bitPos -= bitsLeft;
@ -1187,14 +1181,12 @@ public class ImageInfo {
/** /**
* Read a signed value from the given number of bits * Read a signed value from the given number of bits
*/ */
private int readSBits( int numBits ) throws IOException private int readSBits(int numBits) throws IOException {
{
// Get the number as an unsigned value. // Get the number as an unsigned value.
long uBits = readUBits(numBits); long uBits = readUBits(numBits);
// Is the number negative? // Is the number negative?
if( ( uBits & (1L << (numBits - 1))) != 0 ) if ((uBits & (1L << (numBits - 1))) != 0) {
{
// Yes. Extend the sign. // Yes. Extend the sign.
uBits |= -1L << numBits; uBits |= -1L << numBits;
} }
@ -1202,18 +1194,6 @@ public class ImageInfo {
return (int) uBits; return (int) uBits;
} }
private void synchBits()
{
bitBuf = 0;
bitPos = 0;
}
private String readLine(int firstChar) throws IOException {
StringBuffer result = new StringBuffer();
result.append((char)firstChar);
return readLine(result);
}
private static void run(String sourceName, InputStream in, ImageInfo imageInfo, boolean verbose) { private static void run(String sourceName, InputStream in, ImageInfo imageInfo, boolean verbose) {
imageInfo.setInput(in); imageInfo.setInput(in);
imageInfo.setDetermineImageNumber(false); imageInfo.setDetermineImageNumber(false);
@ -1227,12 +1207,12 @@ public class ImageInfo {
* Specify whether textual comments are supposed to be extracted from input. * Specify whether textual comments are supposed to be extracted from input.
* Default is <code>false</code>. * Default is <code>false</code>.
* If enabled, comments will be added to an internal list. * If enabled, comments will be added to an internal list.
*
* @param newValue if <code>true</code>, this class will read comments * @param newValue if <code>true</code>, this class will read comments
* @see #getNumberOfComments * @see #getNumberOfComments
* @see #getComment * @see #getComment
*/ */
public void setCollectComments(boolean newValue) public void setCollectComments(boolean newValue) {
{
collectComments = newValue; collectComments = newValue;
} }
@ -1247,11 +1227,11 @@ public class ImageInfo {
* the actual number of images can be queried via * the actual number of images can be queried via
* {@link #getNumberOfImages()} after a successful call to * {@link #getNumberOfImages()} after a successful call to
* {@link #check()}. * {@link #check()}.
*
* @param newValue will the number of images be determined? * @param newValue will the number of images be determined?
* @see #getNumberOfImages * @see #getNumberOfImages
*/ */
public void setDetermineImageNumber(boolean newValue) public void setDetermineImageNumber(boolean newValue) {
{
determineNumberOfImages = newValue; determineNumberOfImages = newValue;
} }
@ -1259,6 +1239,7 @@ public class ImageInfo {
* Set the input stream to the argument stream (or file). * Set the input stream to the argument stream (or file).
* Note that {@link java.io.RandomAccessFile} implements * Note that {@link java.io.RandomAccessFile} implements
* {@link java.io.DataInput}. * {@link java.io.DataInput}.
*
* @param dataInput the input stream to read from * @param dataInput the input stream to read from
*/ */
public void setInput(DataInput dataInput) { public void setInput(DataInput dataInput) {
@ -1268,6 +1249,7 @@ public class ImageInfo {
/** /**
* Set the input stream to the argument stream (or file). * Set the input stream to the argument stream (or file).
*
* @param inputStream the input stream to read from * @param inputStream the input stream to read from
*/ */
public void setInput(InputStream inputStream) { public void setInput(InputStream inputStream) {

View file

@ -24,6 +24,7 @@ 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 {
@ -35,7 +36,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",
STANDARD_OUTPUT_TYPE, new Class<?>[] {ImageOutputStream.class},
null, null,
false, null, null, null, null, false, null, null, null, null,
false, null, null, null, null false, null, null, null, null

View file

@ -36,9 +36,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 descriptors; private Hashtable<String, AppDescriptor> descriptors;
private Hashtable applications; private Hashtable<String, Application> applications;
private Hashtable xmlrpcHandlers; private Hashtable<String, Application> xmlrpcHandlers;
private ResourceProperties props; private ResourceProperties props;
private Server server; private Server server;
private long lastModified; private long lastModified;
@ -54,9 +54,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(); this.descriptors = new Hashtable<String, AppDescriptor>();
this.applications = new Hashtable(); this.applications = new Hashtable<String, Application>();
this.xmlrpcHandlers = new Hashtable(); this.xmlrpcHandlers = new Hashtable<String, Application>();
this.lastModified = 0; this.lastModified = 0;
this.jetty = server.jetty; this.jetty = server.jetty;
} }
@ -68,10 +68,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) && //$NON-NLS-1$ if ((appName.indexOf(".") == -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 +80,7 @@ public class ApplicationManager implements XmlRpcHandler {
} }
// then stop deleted ones // then stop deleted ones
for (Enumeration e = this.descriptors.elements(); e.hasMoreElements();) { for (Enumeration<AppDescriptor> 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 +146,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) { //$NON-NLS-1$ if (appName.indexOf(".") == -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 +162,7 @@ public class ApplicationManager implements XmlRpcHandler {
} }
} }
for (Enumeration e = this.descriptors.elements(); e.hasMoreElements();) { for (Enumeration<AppDescriptor> e = this.descriptors.elements(); e.hasMoreElements();) {
AppDescriptor appDesc = (AppDescriptor) e.nextElement(); AppDescriptor appDesc = (AppDescriptor) e.nextElement();
appDesc.bind(); appDesc.bind();
} }
@ -178,7 +178,7 @@ public class ApplicationManager implements XmlRpcHandler {
* Stop all running applications. * Stop all running applications.
*/ */
public void stopAll() { public void stopAll() {
for (Enumeration en = this.descriptors.elements(); en.hasMoreElements();) { for (Enumeration<AppDescriptor> en = this.descriptors.elements(); en.hasMoreElements();) {
try { try {
AppDescriptor appDesc = (AppDescriptor) en.nextElement(); AppDescriptor appDesc = (AppDescriptor) en.nextElement();
@ -206,9 +206,9 @@ public class ApplicationManager implements XmlRpcHandler {
/** /**
* Implements org.apache.xmlrpc.XmlRpcHandler.execute() * Implements org.apache.xmlrpc.XmlRpcHandler.execute()
*/ */
public Object execute(String method, Vector params) public Object execute(String method, @SuppressWarnings("rawtypes") Vector params)
throws Exception { throws Exception {
int dot = method.indexOf("."); //$NON-NLS-1$ int dot = method.indexOf(".");
if (dot == -1) { if (dot == -1) {
throw new Exception("Method name \"" + method + throw new Exception("Method name \"" + method +
@ -224,7 +224,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("*"); //$NON-NLS-1$ app = (Application) this.xmlrpcHandlers.get("*");
// 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 +239,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)) { //$NON-NLS-1$ if ("".equals(mountpoint)) {
return "/"; //$NON-NLS-1$ return "/";
} else if (!mountpoint.startsWith("/")) { //$NON-NLS-1$ } else if (!mountpoint.startsWith("/")) {
return "/" + mountpoint; //$NON-NLS-1$ return "/" + mountpoint;
} }
return mountpoint; return mountpoint;
} }
private String joinMountpoint(String prefix, String suffix) { private String joinMountpoint(String prefix, String suffix) {
if (prefix.endsWith("/") || suffix.startsWith("/")) { //$NON-NLS-1$//$NON-NLS-2$ if (prefix.endsWith("/") || suffix.startsWith("/")) {
return prefix+suffix; return prefix+suffix;
} }
return prefix+"/"+suffix; //$NON-NLS-1$ return prefix+"/"+suffix;
} }
private String getPathPattern(String mountpoint) { private String getPathPattern(String mountpoint) {
if (!mountpoint.startsWith("/")) { //$NON-NLS-1$ if (!mountpoint.startsWith("/")) {
mountpoint = "/"+mountpoint; //$NON-NLS-1$ mountpoint = "/"+mountpoint;
} }
if ("/".equals(mountpoint)) { //$NON-NLS-1$ if ("/".equals(mountpoint)) {
return "/"; //$NON-NLS-1$ return "/";
} }
if (mountpoint.endsWith("/")) { //$NON-NLS-1$ if (mountpoint.endsWith("/")) {
return mountpoint.substring(0, mountpoint.length()-1); return mountpoint.substring(0, mountpoint.length()-1);
} }
@ -335,56 +335,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)); //$NON-NLS-1$ this.mountpoint = getMountpoint(conf.getProperty("mountpoint", this.appName));
this.pathPattern = getPathPattern(this.mountpoint); this.pathPattern = getPathPattern(this.mountpoint);
this.staticDir = conf.getProperty("static"); //$NON-NLS-1$ this.staticDir = conf.getProperty("static");
this.staticMountpoint = getPathPattern(conf.getProperty("staticMountpoint", //$NON-NLS-1$ this.staticMountpoint = getPathPattern(conf.getProperty("staticMountpoint",
joinMountpoint(this.mountpoint, "static"))); //$NON-NLS-1$ joinMountpoint(this.mountpoint, "static")));
this.staticIndex = "true".equalsIgnoreCase(conf.getProperty("staticIndex")); //$NON-NLS-1$//$NON-NLS-2$ this.staticIndex = "true".equalsIgnoreCase(conf.getProperty("staticIndex"));
String home = conf.getProperty("staticHome"); //$NON-NLS-1$ String home = conf.getProperty("staticHome");
if (home == null) { if (home == null) {
this.staticHome = new String[] {"index.html", "index.htm"}; //$NON-NLS-1$ //$NON-NLS-2$ this.staticHome = new String[] {"index.html", "index.htm"};
} else { } else {
this.staticHome = StringUtils.split(home, ","); //$NON-NLS-1$ this.staticHome = StringUtils.split(home, ",");
} }
this.protectedStaticDir = conf.getProperty("protectedStatic"); //$NON-NLS-1$ this.protectedStaticDir = conf.getProperty("protectedStatic");
this.cookieDomain = conf.getProperty("cookieDomain"); //$NON-NLS-1$ this.cookieDomain = conf.getProperty("cookieDomain");
this.sessionCookieName = conf.getProperty("sessionCookieName"); //$NON-NLS-1$ this.sessionCookieName = conf.getProperty("sessionCookieName");
this.protectedSessionCookie = conf.getProperty("protectedSessionCookie"); //$NON-NLS-1$ this.protectedSessionCookie = conf.getProperty("protectedSessionCookie");
this.uploadLimit = conf.getProperty("uploadLimit"); //$NON-NLS-1$ this.uploadLimit = conf.getProperty("uploadLimit");
this.uploadSoftfail = conf.getProperty("uploadSoftfail"); //$NON-NLS-1$ this.uploadSoftfail = conf.getProperty("uploadSoftfail");
this.debug = conf.getProperty("debug"); //$NON-NLS-1$ this.debug = conf.getProperty("debug");
String appDirName = conf.getProperty("appdir"); //$NON-NLS-1$ String appDirName = conf.getProperty("appdir");
this.appDir = (appDirName == null) ? null : getAbsoluteFile(appDirName); this.appDir = (appDirName == null) ? null : getAbsoluteFile(appDirName);
String dbDirName = conf.getProperty("dbdir"); //$NON-NLS-1$ String dbDirName = conf.getProperty("dbdir");
this.dbDir = (dbDirName == null) ? null : getAbsoluteFile(dbDirName); this.dbDir = (dbDirName == null) ? null : getAbsoluteFile(dbDirName);
this.servletClassName = conf.getProperty("servletClass"); //$NON-NLS-1$ this.servletClassName = conf.getProperty("servletClass");
// got ignore dirs // got ignore dirs
this.ignoreDirs = conf.getProperty("ignore"); //$NON-NLS-1$ this.ignoreDirs = conf.getProperty("ignore");
// read and configure app repositories // read and configure app repositories
ArrayList repositoryList = new ArrayList(); ArrayList<Repository> 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); //$NON-NLS-1$ String repositoryArgs = conf.getProperty("repository." + i);
if (repositoryArgs != null) { if (repositoryArgs != null) {
// lookup repository implementation // lookup repository implementation
String repositoryImpl = conf.getProperty("repository." + i + //$NON-NLS-1$ String repositoryImpl = conf.getProperty("repository." + i +
".implementation"); //$NON-NLS-1$ ".implementation");
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")) { //$NON-NLS-1$ if (repositoryArgs.endsWith(".zip")) {
repositoryArgs = findResource(repositoryArgs); repositoryArgs = findResource(repositoryArgs);
repositoryImpl = "helma.framework.repository.ZipRepository"; //$NON-NLS-1$ repositoryImpl = "helma.framework.repository.ZipRepository";
} else if (repositoryArgs.endsWith(".js")) { //$NON-NLS-1$ } else if (repositoryArgs.endsWith(".js")) {
repositoryArgs = findResource(repositoryArgs); repositoryArgs = findResource(repositoryArgs);
repositoryImpl = "helma.framework.repository.SingleFileRepository"; //$NON-NLS-1$ repositoryImpl = "helma.framework.repository.SingleFileRepository";
} else { } else {
repositoryArgs = findResource(repositoryArgs); repositoryArgs = findResource(repositoryArgs);
repositoryImpl = "helma.framework.repository.FileRepository"; //$NON-NLS-1$ repositoryImpl = "helma.framework.repository.FileRepository";
} }
} }
@ -491,41 +491,42 @@ public class ApplicationManager implements XmlRpcHandler {
rhandler.setResourceBase(staticContent.getPath()); rhandler.setResourceBase(staticContent.getPath());
rhandler.setWelcomeFiles(staticHome); rhandler.setWelcomeFiles(staticHome);
staticContext = ApplicationManager.this.context.addContext(staticMountpoint, ""); //$NON-NLS-1$ staticContext = new ContextHandler(staticMountpoint);
ApplicationManager.this.context.addHandler(staticContext);
staticContext.setHandler(rhandler); staticContext.setHandler(rhandler);
staticContext.start(); staticContext.start();
} }
appContext = new ServletContextHandler(context, pathPattern, true, true); appContext = new ServletContextHandler(context, pathPattern, true, true);
Class servletClass = servletClassName == null ? Class<? extends EmbeddedServletClient> servletClass = servletClassName == null ?
EmbeddedServletClient.class : Class.forName(servletClassName); EmbeddedServletClient.class : Class.forName(servletClassName).asSubclass(EmbeddedServletClient.class);
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); //$NON-NLS-1$ holder.setInitParameter("cookieDomain", this.cookieDomain);
} }
if (this.sessionCookieName != null) { if (this.sessionCookieName != null) {
holder.setInitParameter("sessionCookieName", this.sessionCookieName); //$NON-NLS-1$ holder.setInitParameter("sessionCookieName", this.sessionCookieName);
} }
if (this.protectedSessionCookie != null) { if (this.protectedSessionCookie != null) {
holder.setInitParameter("protectedSessionCookie", this.protectedSessionCookie); //$NON-NLS-1$ holder.setInitParameter("protectedSessionCookie", this.protectedSessionCookie);
} }
if (this.uploadLimit != null) { if (this.uploadLimit != null) {
holder.setInitParameter("uploadLimit", this.uploadLimit); //$NON-NLS-1$ holder.setInitParameter("uploadLimit", this.uploadLimit);
} }
if (this.uploadSoftfail != null) { if (this.uploadSoftfail != null) {
holder.setInitParameter("uploadSoftfail", this.uploadSoftfail); //$NON-NLS-1$ holder.setInitParameter("uploadSoftfail", this.uploadSoftfail);
} }
if (this.debug != null) { if (this.debug != null) {
holder.setInitParameter("debug", this.debug); //$NON-NLS-1$ holder.setInitParameter("debug", this.debug);
} }
if (protectedStaticDir != null) { if (protectedStaticDir != null) {
@ -583,7 +584,7 @@ public class ApplicationManager implements XmlRpcHandler {
@Override @Override
public String toString() { public String toString() {
return "[AppDescriptor "+this.app+"]"; //$NON-NLS-1$ //$NON-NLS-2$ return "[AppDescriptor "+this.app+"]";
} }
} }
} }

View file

@ -41,7 +41,7 @@ public class CommandlineRunner {
ServerConfig config = new ServerConfig(); ServerConfig config = new ServerConfig();
String commandStr = null; String commandStr = null;
Vector funcArgs = new Vector(); Vector<String> 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) {

View file

@ -30,11 +30,13 @@ 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 forbidden = new HashSet(); private final static HashSet<String> forbidden = new HashSet<>();
static { static {
forbidden.add("exitVM"); forbidden.add("exitVM");
@ -49,7 +51,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) {
@ -98,7 +100,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) {
@ -287,7 +289,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) {
} }
/** /**
@ -304,7 +306,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,9 +16,6 @@
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

@ -21,6 +21,7 @@ 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.xml.XmlConfiguration; import org.eclipse.jetty.xml.XmlConfiguration;
import java.net.URL; import java.net.URL;
@ -47,7 +48,7 @@ public class JettyServer {
http = new org.eclipse.jetty.server.Server(); http = new org.eclipse.jetty.server.Server();
try { try {
XmlConfiguration config = new XmlConfiguration(url); XmlConfiguration config = new XmlConfiguration(Resource.newResource(url));
config.configure(http); config.configure(http);
} catch (IOException e) { } catch (IOException e) {
@ -73,7 +74,7 @@ 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);
connector.setSoLingerTime(-1); // Removed deprecated method setSoLingerTime
connector.setAcceptorPriorityDelta(0); connector.setAcceptorPriorityDelta(0);
connector.setAcceptQueueSize(0); connector.setAcceptQueueSize(0);

View file

@ -29,8 +29,6 @@ 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.
*/ */
@ -67,14 +65,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 extensions; private Vector<HelmaExtension> 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 dbSources; Hashtable<String, DbSource> dbSources;
// the embedded web server // the embedded web server
// protected Serve websrv; // protected Serve websrv;
@ -432,10 +430,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(); dbSources = new Hashtable<String, DbSource>();
// try to load the extensions // try to load the extensions
extensions = new Vector(); extensions = new Vector<HelmaExtension>();
if (sysProps.getProperty("extensions") != null) { if (sysProps.getProperty("extensions") != null) {
initExtensions(); initExtensions();
} }
@ -452,8 +450,8 @@ public class Server implements Runnable {
String extClassName = tok.nextToken().trim(); String extClassName = tok.nextToken().trim();
try { try {
Class extClass = Class.forName(extClassName); Class<? extends HelmaExtension> extClass = Class.forName(extClassName).asSubclass(HelmaExtension.class);
HelmaExtension ext = (HelmaExtension) extClass.newInstance(); HelmaExtension ext = (HelmaExtension) extClass.getDeclaredConstructor().newInstance();
ext.init(this); ext.init(this);
extensions.add(ext); extensions.add(ext);
logger.info("Loaded: " + extClassName); logger.info("Loaded: " + extClassName);
@ -572,7 +570,9 @@ 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 +764,7 @@ public class Server implements Runnable {
* *
* @return ... * @return ...
*/ */
public Vector getExtensions() { public Vector<HelmaExtension> getExtensions() {
return extensions; return extensions;
} }
@ -805,5 +805,3 @@ public class Server implements Runnable {
return new InetSocketAddress(addr, port); return new InetSocketAddress(addr, port);
} }
} }

View file

@ -18,7 +18,6 @@ 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;
@ -65,6 +64,7 @@ public class TransientNode implements INode, Serializable {
this.app=app; this.app=app;
} }
@SuppressWarnings("unused")
private TransientNode() { private TransientNode() {
app=null; app=null;
} }

View file

@ -22,6 +22,7 @@ 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.*;
@ -59,19 +60,25 @@ 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).newInstance(); cache = (ObjectCache) Class.forName(cacheImpl).getDeclaredConstructor().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).newInstance(); idgen = (IDGenerator) Class.forName(idgenImpl).getDeclaredConstructor().newInstance();
idgen.init(app); idgen.init(app);
} }

View file

@ -37,6 +37,7 @@ public class SubnodeList implements Serializable {
/** /**
* Hide/disable zero argument constructor for subclasses * Hide/disable zero argument constructor for subclasses
*/ */
@SuppressWarnings("unused")
private SubnodeList() {} private SubnodeList() {}
/** /**

View file

@ -463,8 +463,6 @@ 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

@ -48,14 +48,7 @@ public class ScriptingException extends Exception {
*/ */
private void setScriptStack(Throwable cause) { private void setScriptStack(Throwable cause) {
if (cause instanceof RhinoException) { if (cause instanceof RhinoException) {
FilenameFilter filter = new FilenameFilter() { scriptStack = ((RhinoException) cause).getScriptStackTrace();
public boolean accept(File dir, String name) {
return name.endsWith(".js") ||
name.endsWith(".hac") ||
name.endsWith(".hsp");
}
};
scriptStack = ((RhinoException) cause).getScriptStackTrace(filter);
} }
} }

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
int optimizationLevel = cx.getOptimizationLevel(); boolean interpretedMode = cx.isInterpretedMode();
try { try {
// set the optimization level to not compile, but interpret // set the optimization level to not compile, but interpret
cx.setOptimizationLevel(-1); cx.setInterpretedMode(true);
// 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,7 +62,7 @@ public class CompiledOrInterpretedModuleScriptProvider extends StrongCachingModu
exception = e; exception = e;
} finally { } finally {
// re-set the optimization // re-set the optimization
cx.setOptimizationLevel(optimizationLevel); cx.setInterpretedMode(interpretedMode);
} }
// 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

View file

@ -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, scope); ScriptRuntime.setFunctionProtoAndParent(this, Context.getCurrentContext(), scope);
} }
/** /**
@ -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, scope); ScriptRuntime.setFunctionProtoAndParent(this, Context.getCurrentContext(), 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 Scriptable, Function { public final class JSAdapter implements Function {
private JSAdapter(Scriptable obj) { private JSAdapter(Scriptable obj) {
setAdaptee(obj); setAdaptee(obj);
} }

View file

@ -19,15 +19,15 @@ 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 = "); //$NON-NLS-1$ content.append("module.exports = ");
try { try {
content.append(IOUtils.toString(this.getUri().toURL().openStream())); content.append(IOUtils.toString(this.getUri().toURL().openStream(), "UTF-8"));
} catch (IOException e) { } catch (IOException e) {
content.append("null"); //$NON-NLS-1$ content.append("null");
} }
content.append(";"); //$NON-NLS-1$ content.append(";");
return new StringReader(content.toString()); return new StringReader(content.toString());
} }

View file

@ -17,7 +17,6 @@
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;

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")) { //$NON-NLS-1$ if (file.getAbsolutePath().toLowerCase().endsWith(".json")) {
// 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"); //$NON-NLS-1$ file = new File(new File(uri).getPath() + ".js");
// 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"); //$NON-NLS-1$ file = new File(new File(uri).getPath() + ".json");
// 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"); //$NON-NLS-1$ File packageFile = new File(directory, "package.json");
// 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 = new JsonParser() JsonObject json = JsonParser
.parse(new String(Files.readAllBytes(packageFile.toPath()))).getAsJsonObject(); .parseString(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")) { //$NON-NLS-1$ if (json.has("main")) {
// 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()); //$NON-NLS-1$ String main = FilenameUtils.removeExtension(json.get("main").getAsString());
// 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); //$NON-NLS-1$ moduleSource = this.loadAsFile(new File(directory, "index").toURI(), base, validator);
// 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,7 +44,6 @@ 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.*;
@ -1233,7 +1232,7 @@ public final class RhinoCore implements ScopeProvider {
protected void onContextCreated(Context cx) { protected void onContextCreated(Context cx) {
cx.setWrapFactory(wrapper); cx.setWrapFactory(wrapper);
cx.setOptimizationLevel(optLevel); cx.setInterpretedMode(optLevel < 0);
cx.setInstructionObserverThreshold(10000); cx.setInstructionObserverThreshold(10000);
if (Context.isValidLanguageVersion(languageVersion)) { if (Context.isValidLanguageVersion(languageVersion)) {
cx.setLanguageVersion(languageVersion); cx.setLanguageVersion(languageVersion);

View file

@ -49,13 +49,15 @@ 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 object = engine.global.get(name, engine.global); object = engine.global.get(name, engine.global);
} catch (Exception e) { } catch (Exception e) {
System.out.println(name); System.out.println(name);
} }
return engine.global.get(name, engine.global); return object;
} }
} }

View file

@ -151,7 +151,9 @@ 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);
return formatter.toString(); String result = formatter.toString();
formatter.close();
return result;
} }
} }
} }

View file

@ -17,7 +17,6 @@
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;

View file

@ -25,6 +25,7 @@ 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.*;
@ -62,9 +63,13 @@ 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) { DatabaseObject(String driverName) throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
this.driverName = driverName; this.driverName = driverName;
try { try {
Class driverClass = Class.forName(driverName); Class driverClass = Class.forName(driverName);
@ -73,7 +78,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.newInstance(); // may be needed by some drivers, harmless for others driverClass.getDeclaredConstructor().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();
@ -448,51 +453,6 @@ 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 implements Serializable { public class MailObject extends ScriptableObject {
private static final long serialVersionUID = -4834981850233741039L; private static final long serialVersionUID = -4834981850233741039L;

View file

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

View file

@ -217,7 +217,7 @@ public abstract class AbstractServletClient extends HttpServlet {
parseParameters(request, reqtrans, encoding); parseParameters(request, reqtrans, encoding);
// read file uploads // read file uploads
List uploads = null; List<FileItem> uploads = null;
ServletRequestContext reqcx = new ServletRequestContext(request); ServletRequestContext reqcx = new ServletRequestContext(request);
if (ServletFileUpload.isMultipartContent(reqcx)) { if (ServletFileUpload.isMultipartContent(reqcx)) {
@ -517,9 +517,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)) + "\""; //$NON-NLS-1$//$NON-NLS-2$ String etag = "\"" + new String(Base64.encodeBase64(checksum)) + "\"";
res.setHeader("ETag", etag); //$NON-NLS-1$ res.setHeader("ETag", etag);
String etagHeader = req.getHeader("If-None-Match"); //$NON-NLS-1$ String etagHeader = req.getHeader("If-None-Match");
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 +637,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 map, String name, String value) { private static void putMapEntry(Map<String, String[]> map, String name, String value) {
String[] newValues = null; String[] newValues = null;
String[] oldValues = (String[]) map.get(name); String[] oldValues = (String[]) map.get(name);
@ -653,7 +653,7 @@ public abstract class AbstractServletClient extends HttpServlet {
map.put(name, newValues); map.put(name, newValues);
} }
protected List parseUploads(ServletRequestContext reqcx, RequestTrans reqtrans, protected List<FileItem> parseUploads(ServletRequestContext reqcx, RequestTrans reqtrans,
final UploadStatus uploadStatus, String encoding) final UploadStatus uploadStatus, String encoding)
throws FileUploadException, UnsupportedEncodingException { throws FileUploadException, UnsupportedEncodingException {
// handle file upload // handle file upload
@ -672,8 +672,8 @@ public abstract class AbstractServletClient extends HttpServlet {
}); });
} }
List uploads = upload.parseRequest(reqcx); List<FileItem> uploads = upload.parseRequest(reqcx);
Iterator it = uploads.iterator(); Iterator<FileItem> it = uploads.iterator();
while (it.hasNext()) { while (it.hasNext()) {
FileItem item = (FileItem) it.next(); FileItem item = (FileItem) it.next();
@ -705,7 +705,7 @@ public abstract class AbstractServletClient extends HttpServlet {
return; return;
} }
HashMap parameters = new HashMap(); HashMap<String, String[]> 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 +764,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 map, byte[] data, String encoding, boolean isPost) public static void parseParameters(Map<String, String[]> 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,7 +16,6 @@
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 javax.servlet.*;

View file

@ -23,7 +23,6 @@ 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;
/** /**