Revision History

Here's a rolling list of updates made to the javaxt-core library.

Version 2.1.7 (Current Release) 3/26/2024

  • Improved support for arrays [] in the JSONObject class.
  • Added toArray() method to the JSONArray class.
  • Added new JSON write() methods in the File class.

Version 2.1.6 2/7/2024

  • Added new getPHash(), isSimilarTo() and getHammingDistance() methods to the Image class.
  • Replaced HashMap with LinkedHashMap in the URL class.
  • Updated how byte arrays are represented in the toString() method in the JSONObject. Byte arrays are now Base64 encoded.
  • Updated the toByteArray() method in the Value class to check for Base64 encoded strings.
  • Fixed NPE when dealing with null dates in the update() method in the Recordset class.

Version 2.1.5 12/20/2023

  • Added new getReservedKeywords() method to the Database class.
  • Added new getValue() method to the Console class.

Version 2.1.4 12/10/2023

  • Updated the JSON write() methods in the HTTP Request class to encode the JSON to UTF-8.
  • Added new getTableNames() method to the Database class.
  • Fixed bug retrieving generated keys after insert that was introduced in the previous release.
  • Updated call to get generated keys on insert in the Model class.

Version 2.1.3 11/13/2023

  • Fixed bug closing prepared statements when inserting and updating records in the Recordset class.

Version 2.1.2 10/29/2023

  • SQL Package
    • Fixed bug closing Recordset in the RecordIterator returned by the getRecords() method.
    • Fixed NPE in the getTables() method in the Database class.
    • Updated implementation of the Table class to fetch columns and keys in the constructor.
    • Updated logic used to identify primary keys when updating records in the Recordset class.
    • Added static list of PostgreSQL reserved keywords in the Database class.
    • Updated SQL classes to improve compatibility with the 2.x releases of H2.
    • Added support for OpenSearch JDBC driver.
  • HTTP Package
    • Added new write() methods to send JSON data in the http Request class.
    • Added new getJSONArray() and getJSONObject() methods to the Response class.
    • Fixed bug setting request method over non-ssl HTTP connections in the Request class.
    • Minor code clean-up in the HTTP Request class and updated default "User-Agent".
  • Misc
    • Added new getJSONObject() and getJSONArray() methods to the File class.
    • Added new hashpw() method to BCrypt to simplify hashing passwords.
    • Added ability to restart a ThreadPool (i.e. calling start after calling done and join). Also added new getActiveThreadCount() method.

Version 2.1.1 8/9/2023

  • Fixed bug in the getRecords() method in the Connection class.

Version 2.1.0 8/7/2023

  • Updated getRecords() methods in the Connection, Database, and Field classes to return an Iterable instead of a Generator. This may require a clean build.
  • Added new get() method with an optional setter to the ThreadPool.
  • Fixed bug getting/setting variables from a thread inside a thread in the ThreadPool.

Version 2.0.2 6/11/2023

  • Implemented optional metadata caching in the Database class.
  • Implemented optimization in the Recordset class to bypass table lookups when inserting or updating records if a fully qualified table name is given in the select statement (i.e. use schema+tableName whenever possible).
  • Removed debug/print statements in the Recordset class introduced in the last commit.

Version 2.0.16/9/2023

  • Fixed bug identifying tables when creating/updating records in the Recordset class.

Version 2.0.05/21/2023

Major new release with a few breaking API changes.

Warning: Multiple Interface Changes.
  • JDK Support
    • Dropping support for older versions Java.
    • Requires Java 1.8 to compile.
    • Will run on all versions of Java from 1.8 and up.
  • SQL Package
    • Connection Class
      • Added new getRecord() and getRecords() methods.
      • Updated getRecordset() to return an open Recordset instead of a Generator. This is a breaking change. Use the new getRecords() method instead.
      • Updated the Connection class to implement AutoCloseable.
    • Database Class
      • Added new getRecord(), getRecords(), and getRecordset() methods.
      • Added new addModel() method to simplify Model registration.
    • Recordset Class
      • Added new getRecord() and next() methods.
      • Updated the Recordset class to be AutoCloseable.
      • Removed all but 1 public property in the Recordset class. Only the EOF remains for legacy applications.
    • Misc
      • Removed deprecated constructor and fixed bug in the init() method in the Model class.
      • Fixed bug in the init() method in the Model class to handle idle prepared statements.
      • Added new Record class.
  • JSON Package
    • Updated JSONArray class definition to implement Iterable<JSONValue> instead of Iterable<Object>.
    • Updated remove() method in the JSONObject to return a JSONValue.
    • Removed the keys() method from the JSONObject class.
  • Utils Package
    • Added new Record class.
    • Updated the javaxt.utils.Date class to return javaxt.utils.Date in all getter and setter methods.
    • Updated Generator class to be AutoCloseable.
    • Added new hashpw() and hasSalt() methods to BCrypt.

Version 1.12.3 3/12/2023

  • Added option to use an instance of a javaxt.sql.ConnectionPool in the initConnectionPool() method in the Database class.
  • Added support for offset and limit clauses in the SQL Parser.

Version 1.12.2 2/5/2023

  • Added support for Oracle in the sql package.
  • Fixed Java compiler issues for Java 1.8 and Java 17

Version 1.12.1 11/13/2022

  • Refactored html parser.
  • Added isClosed attribute to the Element class.

Version 1.12.0 10/11/2022

  • Consolidated log() methods in the Console class. This may require a clean build.
  • Fixed bug in the html Parser class.
  • Changed visibility of the LnkParser class in the File class to private.
  • Moved FileFilter, DirectorySearch, and FileSystemWatcher inside the Directory class and changed visibility to private.
  • Moved JSONTokener inside the JSONObject class and changed visibility to protected.
  • Changed visibility of crypt_raw() method in the BCrypt class to private.
  • Updated documentation.

Version 1.11.2 9/14/2022

  • Updated core HTML Parser and added new getElements() method to the Parser class.
  • Updated the constructor of the html Element class to be public and added new getAttributes(), getChildNodes(), and getParser() methods.
  • Minor optimization in the toDouble() and toLong() methods in the javaxt.utils.Value class.
  • Added new get() method to the JSONObject class.

Version 1.11.1 5/17/2022

  • Fixed bug in the URL.getQueryString() method. It was combining parameters with the same key into a comma-delimited list of values.
  • Updated encode/decode methods in the URL class to handle "+" characters correctly

Version 1.11.0 1/26/2022

  • Updated interface to the Model constructor to accept any Map (not just HashMap). This may require a clean build.

Version 1.10.6 6/22/2021

  • Standardized logic used to identify the Java version associated with the JVM.
  • Add new main() method to the Console to print the JavaXT version number via command line.

Version 1.10.5 6/7/2021

  • Updated the resize() method in the Image class so that if the maintainRatio parameter is true, the output image will never be larger than the requested width and height.
  • Updated URL parseQueryString() method which was incorrectly decoding the entire query string before parsing individual key/value pairs. Also added new parseJDBCParams() and getExtendedParameters() methods.
  • Fixed bug in the javaxt.http.Request class when using setRequestMethod() over unsecure HTTP connections.

Version 1.10.4 12/23/2020

  • Added blur() method to the Image class.
  • Fixed bug in the Jar.getClasses() method.

Version 1.10.3 8/26/2020

  • Refactored how the JVM shutdown hook is instantiated in the Recordset class yielding significant performance improvements in multithreaded applications.
  • Improved logging in the Console class.

Version 1.10.2 7/24/2020

  • Updated the Image.copy() method to return a true clone of the current image.
  • Fixed bug in the toInteger() method in the Value class.
  • Added new create() method to the File class.
  • Updated default fetch size in the getRecordset() method in the Connection class.
  • Added support for newer versions of JTS ("org.locationtech.jts") in the Model and Recordset classes.
  • Updated the find and get methods in the Model class to throw an Exception if it fails to instantiate a Model.
  • Added limit and offset keywords to the SQL Parser.

Version 1.10.1 5/21/2020

  • Reduced default timeout in the ConnectionPool from 60 seconds to 20. Also, updated the getConnection() method to call getValidConnection() if the java version >1.5.
  • Added optimization in the Recordset class yeilding faster inserts and updates.
  • Added new setSchemaName() method to the Model class.

Version 1.10.0 3/19/2020

  • Combined run() methods in the Shell class. The new run() method has been modified to throw a RuntimeException.
  • Added new JSONArray.set() method. Also updated the JSONArray.remove() method to return a JSONValue object.
  • Fixed sorting bug in the Directory class (compatibility issue with newer versions of Java).
  • Fixed bug in the Directory and File classes introduced in the 1.9.1. Starting with 1.9.1 both classes attempted to get the canonical path for a given file. This is WRONG. The changes have been reverted and the classes no longer use canonical paths.
  • Added logic to call commit() when closing a rw Recordset.
  • Fixed bug saving Models with Models and Models with no data. Also improved error messages when saving and deleting Models.
  • Updated the add() method in the ThreadPool class to return an int and added a new getQueue() method.
  • Added svg mime type to the File class.

Version 1.9.3 12/29/2019

  • Added new exit(), get() and set() methods to the javaxt.utils.ThreadPool class.
  • Updated logic used to instantiate the Shutdown listener in the javaxt.sql.Recordset class.
  • Fixed bug parsing empty query string in the javaxt.utils.URL class.

Version 1.9.2 11/3/2019

  • Utils Package
    • Added new ThreadPool class.
    • Fixed bug printing arrays and added new getInput() method to the Console class.
    • Fixed NPE in the isBefore() and isAfter() methods in the Date class.
    • Updated the way query string parameters are managed in the URL class. The getParameters() method now returns unaltered keys.
  • SQL Package
    • Added H2 reserved keywords to the Database class.
    • Added new setOrderBy() and setGroupBy() methods and fixed bug in the setWhere() method in the Parser class.
  • JSON Package
    • Added support for java.sql.Clob types in the in the JSONObject.toString() method.
  • File IO
    • Added new mime type for mp4.

Version 1.9.1 7/23/2019

  • IO Package
    • Improved support for relative paths used to instantiate the File and Directory classes. Both classes will attempt to get the canonical path.
    • Added new getClasses method to the Jar class.
  • HTTP Package
    • Fixed bug encoding long usernames/passwords in the javaxt.http.Request class.
  • SQL Package
    • Refactored Model class to make it easier to use (e.g. new constructor and init() method, added new save() and toJson() methods so individual implementations don't have to, implemented equals and hashCode methods, etc).
    • Added new Recordset.open() method that accepts a standard Java ResultSet. This allows users to leverage advanced JDBC features such as Prepared Statements.
    • Fixed bug inserting/updating records in tables with a schema prefix.
    • Added new setUpdateKey and setUpdateKeys method to the Recordset class.
    • Updated Recordset.close() method. An attempt is made to cancel statement before closing.
    • Added shutdown hook to the Recordset to cancel and close any queries when the JVM is terminated.
    • Added new clone() method to the Field and Parser classes.
  • JSON Package
    • Updated implementation of the toString() method in the JSONValue class. Will return a null if the value contains a empty string.
    • Added support for javaxt.sql.Models
  • Utils Package
    • Added encoding options to the Base64.encode() method.
    • Improved support for Arrays and Doubles in the Console.log() method. Fixed bug extracting class name.

Version 1.9.0 12/31/2018

  • SQL Package
    • Added new methods to instantiate and terminate a connection pool directly from the Database class. See initConnectionPool, terminateConnectionPool, setConnectionPoolSize, getConnectionPoolSize, and getConnectionPool methods.
    • Added getRecordset() method to the Connection class to simplify using the Recordset object.
    • Added support for CLOB values in the Value.toString() method. Also fixed NPE in the Value.toTimeStamp() method.
    • Added new getField() and isFunction() methods to the Parser.SelectStatement class.
    • Added new javaxt.sql.Model base class used by javaxt-orm.
    • Updated default port value in the Database class. Previously it was -1. The class no longer accepts negative values and defaults to null.
    • Updated Recordset.getRecordCount() to return long instead of int.
    • Minor bug fixes in the Recordset class. Updated logic used to wrap reserved table and column names in quotes during updates. Also added logic to handle exceptions thrown when retrieving auto generated keys by unsupported databases.
  • JSON Package
    • Updated interfaces to the JSONObject and JSONArray classes. Previous methods were obtuse and not user friendly.
    • Updated implementation of the equals method.
    • Improved support for dates in the toString() methods.
    • Added isEmpty() method to JSONObject.
    • Updated JSONObject constructor to accept null Strings.
  • Encryption Package
    • Added new javaxt.encryption.AES256 class used to encrypt/decrypt data using AES-256.
    • Added new javaxt.encryption.BCrypt used to encrypt passwords.
  • Utils Package
    • Removed Array, Compiler, and string classes.
    • Updated Timer to catch Throwable exceptions.
    • Replaced implementation of the Generator class. The previous version was not yielding correctly.
    • Minor optimizations to the Value class.
    • Added new Console class.
  • Date Utils
    • Critical bug fix adding/subtracting dates. Previous implementation was ignoring timezone offsets.
    • Added new setDate() method.
  • File IO
    • Removed JAX-B dependency used to generate SHA-1 and MD5 hashes. Required for Java 11 support.
  • Image IO
    • Added IllegalArgumentException to the Image(java.io.File file) and Image(String PathToImageFile) constructor if the file does not exist.
    • Updated documentation for the setOutputQuality() method.

Version 1.8.2 6/6/2018

  • Added JSON support.
  • Added methods to compute the SHA-1 and MD5 hashes for a file in the javaxt.io.File class.
  • Fixed bug used to encode url query string parameters in the URL class.
  • Fixed bug setting url port in the html parser MapPath() method.

Version 1.8.1 2/14/2018

  • Fixed bug updating records with the javaxt.sql.Recordset.
  • Updated Date parser. Added support for timezone offsets is specified in "+/-HH:mm". Example: "2018-01-17T01:00:35+07:00". Also added support for "EEE, dd MMM yyyy HH:mm:ss" date format.
  • Updated the HTML parser classes to more closely resemble JavaScript DOM methods. For example, stripHTMLTags() is now called getInnerText() and getAttributeValue() is now getAttribute(). The original methods still exist but they have been marked as deprecated and may be removed in the future.

Version 1.8.0 11/15/2017

  • Updated the javaxt.http.Request class so that all SSL certificates are now validated by default. To bypass validation, simply call Request.validateSSLCertificates(false) before executing the HTTP Request.
  • Added JSON MIME type to the File.getContentType() method.
  • Implemented logic used to save metadata for JPEG images in the javaxt.io.Image class. Use the Image.getIIOMetadata() method to retrieve image metadata and use the Image.setIIOMetadata() to save metadata.
  • Fixed bug resizing transparent GIFs (images were coming out black and white after resize). Tweaked logic in the getImageType() method to return ARGB if the native Java BufferedImage.getType() returns 0 or TYPE_BYTE_BINARY (12).

Version 1.7.9 10/11/2017

  • Fixed bug in the Directory.getEvents() method to allow clients to safely monitor multiple directories in the same JVM instance.
  • Fixed bug calculating histogram in the Image.getHistogram() method.
  • Minor bug fixes in the checksum() and MapPath() methods in the javaxt.io.File class.
  • Added new setAttributeValue() method to the javaxt.xml.DOM class.
  • Updated the Http Request class to use both TLSv1 and SSLv3 for Java 1.6. Note that newer releases of Java 1.6 support TLSv1.1 (updated 111) and TLSv1.2 (update 121). You can use one of these newer protocols by calling System.setProperty("https.protocols", "TLSv1.1,TLSv1.2,TLSv1,SSLv3"). Also updated default "User-Agent" request header.

Version 1.7.8 9/30/2016

  • Added new setRequestMethod() method to the javaxt.http.Request class to allow users to specify the request method ("GET", "POST", "PUT", "DELETE", etc).

Version 1.7.7 9/13/2016

  • SQL Package
    • Fixed Null Pointer Exceptions and recursion errors raised when instantiating a javaxt.sql.Driver with an unknown java.sql.Driver.
    • Fixed Null Pointer Exceptions when using the javaxt.sql.Recordset class with a Connection that was created using a java.sql.Connection.
    • Implemented clone method in the javaxt.sql.Database class.

Version 1.7.6 8/31/2016

  • SQL Package
    • Added logic to escape reserved keywords when inserting or updating records in a database. Tested with SQLServer and PostgreSQL.
    • Updated the equals() method in the javaxt.utils.Value class to better handle BigDecimals.
    • Fixed bug retrieving list of tables from the database. Previous implementation relied on a TreeSet instead of an ArrayList.
    • Fixed bug extracting primary keys.

Version 1.7.5 1/18/2016

  • File/Directory IO
    • Fixed several bugs returning file attributes on linux and unix file systems (file size, exists, last modified, etc).
    • Updated the File.getFileAttributes() and Directory.getFileAttributes() methods to throw a java.io.FileNotFoundException if the file does not exist on the file system.
    • Updated the Directory.getSize() method to return the total size of all the files and folders in a directory. Previous versions were simply reporting 4096.
    • Updated the File.getContentType() method to return "text/csv" MIME type for CSV files.
  • SQL Package
    • Added getConnectionPoolDataSource() and getTimeout() methods to the ConnectionPool class.
    • Added getType() and getClassName() to the Field class.
    • Updated logic when inserting records with a unknown column types. Previously, these fields were ignored. Now, an attempt is made to set a value with stmt.setObject(id, FieldValue.toObject());
    • Updated sql used to insert and update records. There is now an escape function. Column names with whitespaces are wrapped in "[]" and column names with reserved keywords are wrapped in quotes.
    • Fixed bug determining how many records will be affected by an update.
  • Misc
    • Fixed bug in the Date.getDayOfWeek() method

Version 1.7.4 8/24/2015

  • Date Utils
    • Fixed bug in the setTimeZone method when preserveTimeStamp=true
    • Added default TimeZone so getTimeZone always returns a valid TimeZone
  • Web Services
    • Fixed several bugs stemming from the 1.6.0 release. These include missing namespaces in the XML used to execute SOAP requests, broken Parameters.setValue(Parameter p) method, and WSDL parsing errors.
    • Added new SoapRequest.getBody() method.

Version 1.7.3 7/24/2015

  • SQL Package
    • Fixed bug parsing field names returned by SQLite UNION queries.
    • Fixed bug updating Recordset without a primary key on SQLServer.
    • Fixed bug inserting/updating database records with byte arrays.
    • Upgraded the ConnectionPool to use the 2012 version of the MiniConnectionPoolManager.
    • Added new setConnectionPoolDataSource to the Database class.
    • Cleaned up the open and close methods in the Recordset class.
    • Added more detailed error messages whenever a SQLException exception is thrown when updating a Recordset.
  • Misc
    • Fixed bug in the HTML Parser.
    • Fixed bug parsing dates.
    • Added new Jar.Entry.getSize() method to return the size of a JAR entry.
    • Added new javaxt.utils.Generator class.

Version 1.7.2 2/6/2015

  • Fixed critical bug in the javaxt.sql.Recordset class retrieving records from a PostgreSQL database with the setFetchSize() method.
  • Added new javaxt.sql.Value.toArray() method to make it easier to retrieve arrays.
  • Updated logic in the javaxt.util.Value.toDate() to improve performance.

Version 1.7.1 1/31/2015

  • Added option to overwrite files in the javaxt.io.File moveTo() method.
  • Added new static getJars() method to the javaxt.io.Jar class to return a list of all the JAR files available to the current thread. Also added new getName() method to the Jar.Entry class.
  • Added 2 new methods to the javaxt.http.Request class to retrieve the original URL after a redirect and to set the URL.
  • Added logic in the javaxt.http.Response class to enforce readTimeout.
  • Added 2 new methods javaxt.utils.Timer class to check whether the timer has been initialized and to cancel the timer task.
  • Updated constructors in the javaxt.utils.Date to throw an IllegalArgumentException if a null value is passed in.
  • Fixed bug setting fetchSize for PostgreSQL databases in the javaxt.sql.Recordset class.

Version 1.7.0 12/15/2014

  • File/Directory IO
    • Updated logic in the constructors for the Directory class. For performance reasons, particularly on Windows, directories are no longer serialized to a java.io.File.
    • Added new isEmpty() method to the Directory class to determine whether a directory has any files or folders.
    • Updated logic in the copyTo() method to the Directory class to use the getChildren() method. This should reduce memory when processing large directories.
    • Added new copyTo() method with a fileFilter parameter to the Directory class. This allows users to specify which files to copy.
    • Fixed several logical errors related to file attributes.
    • Interface changes: setDate() now returns a boolean and getDate() will now return a null value if the file does not exist (vs. Jan 1, 1970).
    • Removed the deprecated useCache() method.
  • Image IO
    • Added new getHistogram() method used compute the number of red, green, and blue pixels in an image. Also computes an rgb average for each pixel. This information is vital for performing histogram stretches and equalization.
    • Updated logic used to subset images (e.g. crop and copyRect methods). The new logic allows users to specify coordinates outside the image bounds.
  • SQL Package
    • Added ability to perform batch inserts via the Recordset class. By setting the batch size, inserts are now 10-30x faster. See setBatchSize() for more info.
    • Added support for SQL functions.
    • Added support for JTS geometries.
    • Updated logic in the Recordset class to use Prepared Statements for both inserts and updates.
    • Added new getMaxConnections() method to the ConnectionPool class.
    • Fixed bug inserting/updating null values in the Recordset class.
    • Fixed critical bug inserting/updating records in a PostgreSQL database.
  • HTTP Client
    • Added new methods to set the connection timeout and a read timeout in the Request class.
    • Implemented a clone() method used to replicate HTTP Requests.
    • Added new getHeader() and getProxy() methods to the Request class.
    • Updated default headers in the HTTP Request class.
  • Misc
    • Fixed several bugs in the HTML parser class.
    • Added new methods to the HTML Element class to find child nodes.

Version 1.6.2 4/15/2014

  • Added new public static method to the java.io.File class to return the mime type associated with a file extension.
  • Fixed bug in the Jar.Entry.getText() method. Previous versions ignored user defined charsetName.
  • Updated logic used to compress jpeg images in the javaxt.io.Image class. Added check to see if the sun classes are available. If so, it uses the sun jpeg codec. If not, it uses the more generic ImageIO and JPEGImageWriteParam classes.

Version 1.6.1 3/15/2014

  • Fixed bug copying folders/directories using the Directory.copyTo() method.
  • Implemented clone() method in the File and Directory classes.

Version 1.6.02/24/2014

  • Web Services
    • Fixed bug downloading WSDLs and XML schemas via an HTTP Proxy.
    • Removed several constructors that made it difficult or ambigous to use with an HTTP proxy.
    • Fixed bug parsing WSDLs with web methods and parameters that share the same name.
    • Consolidated the setValue() methods in the Parameter and Parameters classes into just one method that accepts Objects.
    • Updated the getValue() methods in the Parameter and Parameters classes to return raw Objects instead of strings.
    • Updated xml used to generate SOAP requests as a workaround for Glassfish 3.1 JEE 6 servers.
    • Fixed bug parsing SOAP responses with nested XML.
  • DOM Parser
    • Fixed bug parsing the encoding/characterset when the name was in a single quotes (e.g. 'UTF-8').
  • Jar Class
    • Updated the getText() method in the Jar class to allow users to specify character encoding.
  • Misc
    • Added new Timer class.
    • Added new isArray() method to the Value class.

Version 1.5.19 9/4/2013

  • Fixed bug in the recursive directory search to return all directories in a tree. Previously versions did not return parent directories associated with empty subdirectories.

Version 1.5.18 7/8/2013

  • Fixed bug extracting the javaxt-core.dll on Windows file systems. In certain build environments, the javaxt-core.jar file was not being found by a "standard" class loader. As a result, a null pointer exception was raised and the javaxt-core.dll was not deployed correctly. This caused errors extracting extended file attributes, directory search, etc.
  • Fixed bug finding jar files/directories associated with a class when the class's package name is used in multiple jar files.
  • Added new static Jar.getJars() method to returns an array of jars associated with a Package. This method should be used instead of new Jar(java.lang.Package).

Version 1.5.17 5/29/2013

  • Commented out the updateFields method in the javaxt.sql.Recordset class to improve performance. Unfortunately, field metadata such as table and schema names may be limited for some database providers.
  • Updated logic used to assign Field names in the javaxt.sql.Field class. Field.getName() will return null instead of empty strings if the field name is unknown. Watch for null pointer exceptions!
  • Updated the javaxt.utils.Date parser to support strings with commonly used timezones including UTC offsets, GMT offsets without a colon (e.g. "Fri Jan 04 2013 00:00:00 GMT-0500 (Eastern Standard Time)", and commonly used offsets like "America/New York", "Eastern Standard Time", and "(UTC-05:00) Eastern Time (US & Canada)".
  • Added new method to the SQL Parser to set/update the "where" statement.
  • Fixed bug in the SQL Parser getSelectStatements() method. Wasn't returning the correct values after calling setSelect().

Version 1.5.16 5/14/2013

  • Added ability to set connection properties using a java.util.Properties list in the javaxt.sql.Database class.
  • Updated the Recordset.close() method to free additional memory. Also, added optimization for SQLite. Queries are now significantly faster than previous versions.
  • Fixed bug adding/subtracting seconds in the javaxt.utils.Date class.

Version 1.5.15 4/27/2013

  • Fixed bug in the javaxt.http.Request class used to follow HTTP redirects. Now supports relative paths specified in the "Location" response header.
  • Added support for relative paths in the javaxt.utils.URL.setPath() method.

Version 1.5.14 4/25/2013

  • Fixed bug in the HTTP Request class. The class was automatically following HTTP redirects (e.g. 302 status code) and thus ignoring the setNumRedirects directive.
  • Refactored the HTML Parser class by moving the Element class out of the Parser class and into a separate class. Added new methods to the Element class including getAttributeValue(), getInnerHTML(), and getOuterHTML().

Version 1.5.13 4/13/2013

  • Fixed bug executing webservices. The javaxt.webservices.Method.getParameters() method was incorrectly caching values.
  • Updated logic used to sort dates in the Date class. Previous versions had special logic for dates without timestamps which produced unexpected results.
  • Added new Date.toISOString() method used to return dates in ISO 8601 format.
  • Added new Date.removeTimeStamp() method.

Version 1.5.12 3/27/2013

  • Fixed bug parsing schemas in the WSDL Parser class.
  • Added new getText() method to the DOM class used to convert a Node to a String.

Version 1.5.11 3/23/2013

  • Fixed bug parsing SQL keywords inside of quotes in the SQL Parser class.
  • Added support for JDBC URLs with query strings in the Database class (e.g. "jdbc:sqlite::memory:?cache=shared").

Version 1.5.10 3/11/2013

  • Fixed bug parsing "JOIN" statements in the SQL Parser class. This bug was introduced in the 1.5.9 release.
  • Added support for "WHERE" clauses that don't have a left hand operand (e.g. "EXISTS" and "NOT EXISTS" statements).

Version 1.5.9 3/11/2013

  • Fixed bug parsing sql keywords and operators in the SQL Parser class.
  • Removed getSelectedColumns() method from the SQL Parser class. Use the Parser.getSelectStatements() method instead.
  • Cleaned up the File.getXML() method to close the FileInputStream after reading a file.
  • Implemented new equals() method in the DOM class used to compare two XML documents.
  • Fixed bug in the Date.hasTimeStamp() method.

Version 1.5.8 1/26/2013

  • Fixed bug parsing Windows shortcuts (.lnk files). Previous version only returned paths to directories.
  • Fixed bug in the getBytes method in the javaxt.io.File class to ensure that the file input stream is closed in the event of an error/exception.

Version 1.5.7 1/25/2013

  • File/Directory searches are now significantly faster on Windows file systems. Recursive directory searches, for example, are approximately 2x faster on local drives and 10x faster on networked drives. Replaced command line calls to "dir", "net view", and "net use" with JNI code. Search results are no longer serialized to a java.io.File.
  • Fixed bug monitoring directories on Windows file systems. The JNI code was crashing because of threading issues. Also implemented the stop() function to stop monitoring events.
  • Fixed bug monitoring directories on UNIX/LINUX file systems. The file monitor consumes far less CPU and memory than previous versions.
  • Fixed several bugs in the DirectorySearch. Previous versions weren't returning empty folders and hidden files/directories.
  • Fixed bug retrieving unicode paths on Windows file systems.
  • Fixed bug retrieving file attributes on Solaris.
  • Implemented Comparable in the Date class.
  • Fixed null pointer exception in the Recordset class.

Version 1.5.6 1/9/2013

  • Updated logic used to extract/load javaxt-core.dll on Windows file systems. Older versions of javaxt-core.dll will be replaced with newer versions. Also, if the javaxt-core.dll cannot be extracted alongside the javaxt-core.jar file, an attempt will be made to extract the dll to the user's "Application Data" directory ("AppData" on Vista and Windows 7).
  • Fixed bug calculating file sizes greater than 4.2 GB on Windows file systems. Bug was introduced in the 1.5.5 release.
  • Fixed bug retrieving file attributes in the Directory class. File attributes are now cached, just like in the File class. This should yield a performance improvement.
  • Fixed bug parsing file attributes on unix/linux file systems (dates and links).
  • Added new checksum method to the File class that can be used to perform cyclic redundancy check (CRC).
  • Updated the getPath() and toString() methods in the File and Directory classes to return absolute paths instead of a canonical path. This change will only affect symbolic links on unix/linux file systems.
  • Removed getLastWriteTime() method from the File and Directory classes. The method was redundant with both the getDate() and getLastModifiedTime() methods.
  • Minor update to the Jar.Entry class. Added checksum and getDate methods.
  • Minor update to the javaxt.sql.Recordset class for SQLite. The open method now creates a TYPE_FORWARD_ONLY cursor by default.

Version 1.5.5 1/7/2013

  • Major revision to the javaxt.io.File class. Under the hood, the javaxt.io.File class instantiates a java.io.File only when needed. This significantly improves the speed with which file attributes can be accessed on windows file systems, especially when accessing files across a network. Initial tests yielded over 3x performance enhancement.
  • Bug fix parsing extended file attributes on Windows. Found out the hard way that java.text.SimpleDateFormat is not thread safe.
  • Bug fix parsing extended file attributes for Mac OSX.
  • Updated the javaxt.sql.Recordset class. Reduced warnings when updating records without a primary key.

Version 1.5.4 12/13/2012

  • Fixed bug updating records in the javaxt.sql.Recordset class introduced in the 1.5.1 release. Tweaked logic for when to use prepared statements.
  • Fixed bug returning autogenerated keys on insert.

Version 1.5.3 12/12/2012

  • Fixed bug updating records with white spaces in the column name in the javaxt.sql.Recordset class.

Version 1.5.2 12/11/2012

  • Fixed bug creating/updating records in the javaxt.sql.Recordset class. Now supports table names with white spaces and columns with decimal and float values.
  • Added new toFloat() method to the javaxt.utils.Value class.
  • Added new toString() method to the javaxt.utils.Date class to output dates in a specific time zone without having to explicitly update the timezone of a Date.

Version 1.5.1 11/30/2012

  • Fixed bug creating/updating records in the javaxt.sql.Recordset class. All updates/inserts now use prepared statements, regardless of database vendor.
  • Bug fix in the javaxt.utils.DOM.getText() method. The method now encodes the response in the correct character set.
  • Updated logic used to follow redirects when posting data via the javaxt.http.Request class.
  • Updated the getText method in the javaxt.http.Response class to use the character encoding defined the the "Content-Type" response header.
  • Added new javaxt.utils.Compiler class used to dynamically compile code in-memory.

Version 1.5.08/10/2012

  • Image Class
    • Refactored the javaxt.io.Image class by removing dependencies on all other javaxt classes. This should make it easier for developers to integrate the javaxt.io.Image class who don't want any other JavaXT functionality.
  • HTTP Client
    • Added new method to upload files and HTML form data to a server using "multipart/form-data" encoding.
  • Date Utils
    • Implemented clone() and hashCode() methods.
    • Updated the toLong() method to return UTC timestamps.
    • Added new methods to get and set the TimeZone. Added support for Microsoft timezones.

Version 1.4.3 5/5/2012

  • Image Class
    • Tweaked logic in the addImage() method. Added special case for transparent GIFs which the Java BufferedImage.getType() (incorrectly?) identifies as TYPE_BYTE_BINARY (12). This resulted in black and white images for images that should have been ARGB.
  • HTTP Client
    • Updated HTTP Request class to use SSLv3 instead of SSLv2 when dealing with SSL/HTTPS connections. The fix only applies to Java 1.6 and earlier. Java 1.7 uses SSLv3 by default.
    • Deprecated getErrorStream() and getErrorMessage() methods in the HTTP Response class. Use the getInputStream() and getText() methods instead. Use the getStatus() method to distinguish between error and non-error responses.
    • Added new method to the HTTP Request class to write a byte array.
  • File/Directory IO
    • Added methods to set the timestamp of when a file or directory was last modified.
    • Updated logic in the File.exists() method to return false if the underlying File object represents a Directory.
    • Updated the File.write(String Text) method to use UTF-8 encoding.
  • URL Class
    • Fixed bug in the URL class parsing query string parameters delimited with a "&t;" instead of a "&".
    • Added 2 new methods to the URL class to set host and port.
  • Shell Class
    • Added stop() method.

Version 1.4.2 2/7/2012

  • Changed the way the Value class is instantiated in the Recordset class. Now calling rs.getObject() instead of rs.getString(). This is particularly important when dealing with BLOB and CLOB data.
  • Added new toByteArray() method to the Value class.
  • Updated all try/catch blocks that deal with the InterruptedException in the Directory class. Added call to Thread.currentThread().interrupt() in the exception handler to help notify the caller when an InterruptedException occurs. More information on how to deal with InterruptedExceptions can be found here:
    http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html
  • Bug fix in the DOM class. Updated the getText() method used to convert a NodeList to a String. Bug was introduced in the 1.4.0 release.
  • Refactored the parseQueryString() method in the URL class into a public static method so it can be used in other applications (e.g. parse x-www-form-urlencoded data).

Version 1.4.1 12/4/2011

  • Image Class
    • Added new methods to get EXIF, IPTC, GPS, and IIOMetadata metadata.
    • Added new rotate method to automatically rotate an image based on EXIF metadata.
    • Added new trim() method to automatically remove excess pixels around an image.
    • Added new setColor() method to allow users to set a pixel value at a given x/y coordinate.
    • Added new addText() methods.
    • Fixed bug in the getColor() method in the Image class (wasn't returning the alpha value correctly).
    • Changed the way BufferedImages are created when using a File or InputStream as the image source.
  • SQL Package
    • Moved static list of known drivers from the Database class to the Driver class. Also moved the findDriver() method over to the Driver class.
    • Removed the protected connect() method from the Database class. Moved logic associated with loading a driver to the Driver class and opening a database connection to the Connection class.
    • Updated the getTables(), getCatalogs(), and displayDbProperties() methods into static methods. The 3 methods now require an active database Connection as an input.
    • Added new getConnectionPoolDataSource() method to the Database class to help instantiate a ConnectionPoolDataSource a handful of known databases.
    • Added 2 new constructors to the ConnectionPool class to accept a Database object which calls the new getConnectionPoolDataSource() method.
    • Updated the getConnection() method in the ConnectionPool class to return a javaxt.sql.Connection.
    • Renamed the dispose() method in the ConnectionPool class to close().
  • Misc
    • Added new sortDates() and toLong() methods to the Date class.
    • Fixed bugs in the getAttributes() and the getNodeValue() methods in the DOM class. Bug was introduced in the 1.4.0 release.
    • Added new setPath() method to the URL class.
    • Added new getManifest() and getVersion() methods to the Jar class. Also added new constructor to accept a file.

Version 1.4.0 10/22/2011

Warning: Multiple Interface Changes.
  • File/Directory IO
    • Added new methods to the File and Directory classes to return extended file attributes such as when the file was first created and when it was last accessed. Please refer to the javadocs for isLink(), getLink(), getLastAccessTime(), getLastAccessTime(), getLastWriteTime(), getFlags(), and getFileAttributes().
    • Renamed the FileWatcher.dll to javaxt-core.dll and added capability to parse junction points. Removed dependencies on MSVCP71.DLL and MSVCR71.DLL added support for Windows x64!
    • Moved the LnkParser to the File class and deleted the ntfs package.
    • Removed deprecated getFile() methods from the File and Directory classes.
    • Removed deprecated getDirectory() method from the Directory class.
  • SQL Package
    • Updated Connection open(), execute(), and commit() methods to throw an SQLException.
    • Updated Recordset open() and commit() methods to throw an SQLException.
    • Updated Database getConnection() and connect() methods to throw an SQLException.
    • Added isDirty() method to the Recordset and individual Fields.
    • Refactored javaxt.sql.Value class to extend javaxt.utils.Value.
    • Added equals operator to Value.
  • Date Utils
    • Refactored two of the Date constructors to throw an Exception when parsing strings.
    • Added new methods to set and get the current TimeZone in the Date class.
    • Updated equals operator for Dates to handle Strings.
  • DOM Class
    • Bug Fix: Refactored the getNodeValue() method to be thread safe.
    • Bug Fix: Updated the getNameSpaces() method to return all namespaces found in the xml document, not just those found in the outer node.
    • Added new getElementsByTagName() and getNodes() methods.
  • Jar Class
    • Updated the getEntries() method in the Jar class to return all the entries in the jar file.
    • Updated the getEntry method in the Jar class to support null values and zero length string for the package name.
  • WSDL Parser
    • Implemented logic to automatically import schemas (xsd documents) referenced in the WSDL.
    • Added new addSchema() methods and new constructors to allow users to import stand-alone or offline xsd documents.
    • Updated parser to handle "attribute", "attributeGroup", "simpleContent", "complexContent", and "choice" types.
  • SOAP Request/Response
    • Refactored Soap class into two separate SoapRequest and SoapResponse classes.
    • Added new SoapException class to help clients parse Soap error messages.

Version 1.3.8 9/21/2011

  • Updated the getFiles() and getSubDirectories() methods in the Directory class to return immediately after an InterruptedException.
  • Added two new methods to the HTTP Response class to return error messages as text.

Version 1.3.7 9/14/2011

  • Fixed bug in the getChildren() method in the Directory class. The method was relying on a status update from the DirectorySearch which was occasionally returning prematurely.
  • Tweaked sorting logic used when retrieving file and folders in the Directory class. The FileComparer is now properly handling deeply nested/recursive lists of files.
  • Refactored the getFiles() and getSubDirectories() methods to process files as soon as they are found. In theory, the new methods should be faster and use less memory.
  • Deprecated the useCache() method in the Directory class. The updates made to the getFiles() and getSubDirectories() methods have rendered the cache variable unreliable and should not be used.

Version 1.3.6 9/12/2011

  • Updated the directory parser to properly handle Windows Junction Points on network drives. See private dir() method in the javaxt.io.Directory class for more information.
  • Fixed a bug in the javaxt.io.Directory class. Under certain conditions, the Directory class was being thrown into an infinite wait state when monitoring directory changes or recursively searching directories. This seems to occur when the parent thread is interrupted. Updated all try/catch blocks associated with InterruptedExeptions to correct the error.
  • Added new run method to the Shell class with an option to throw InterruptedException and IOExceptions.
  • Added HTTP GET support to the html Form class.
  • Fixed bug in the move() method in the javaxt.sql.Recordset class for TYPE_FORWARD_ONLY cursors.

Version 1.3.5 8/11/2011

  • SQL Updates
    • Added support for SQLite. Supports inserts, updates, and deletes via the javaxt.sql.Recordset object. Conducted extensive testing with Xerial's JDBC driver.
    • Implemented the comparable interface in the Table class so that tables can be sorted alphabetically by name.
    • Refactored the update() method in the Recordset class to use prepared statements for both inserts and updates when usePreparedStatement == true.
    • Removed debug print statements from the sql Database and Connection classes.
  • Date Utils
    • Fixed minor bug in the constructor for the Date class. It wasn't setting the parserFailed flag correctly at the end of the method.
    • Fixed a bug in the ParseDate() method to set/update the timeZone after parsing a date.
    • Added new option to preserve time stamp when setting the timezone in the date class.
    • Added new method to the Date class used to determine whether a date has a timestamp.
  • File/Directory IO
    • Fixed bug in the Directory class. Non-recursive directory searches were not returning a null when wait==false.
    • Updated File class to return the correct mime type for ico files.
    • Added new method to the File class to write a XML Dom Document directly into a File.
  • Misc
    • Added mechanism to pass credentials in http requests
    • Bug fix in the DOM class. Added try catch block to prevent parsing errors when extracting value of the xml encoding.

Version 1.3.4 5/17/2011

  • Added option to validate SSL Certificates in the javaxt.http.Request class. This allows users the option to connect to websites with unsigned or self-signed certificates.
  • Added new method to the java.utils.URL class to return a java.net.URL. See toURL() method for details.

Version 1.3.3 5/16/2011

  • Bug fix in the javaxt.http.Request class to support URLs with whitespaces.

Version 1.3.2 4/15/2011

  • Bug fix in the javaxt.http.Request class to support HTTP POST requests.
  • Removed @Override annotations for the compareTo method in the javaxt.io.File and javaxt.io.Directory classes to maintain compatibility with Java 1.5

Version 1.3.1 4/9/2011

  • Implements Comparable interface in the javaxt.io.Directory and javaxt.io.File classes. File and Directory classes can now be stored in a TreeSet.
  • Updated the getRootDirectories() method in the javaxt.io.Directory to return all mounted drives on Windows file systems, including ones that are disconnected.
  • Added new constructor to the javaxt.io.Image class to use a RenderedImage.
  • Added new ConnectionPool class to the javaxt.sql package. The code is written by Christian d'Heureuse and released here:
    http://www.source-code.biz/snippets/java/8.htm

Version 1.3.0 2/6/2011

  • Moved and renamed javaxt.webservices.wsdl.Parser package to javaxt.webservices.WSDL.
  • Moved classes in the javaxt.webservices.wsdl package to javaxt.webservices.
  • Added new methods to the javaxt.webservice.Soap class to set and add request headers.
  • Critical bug fix in the javaxt.http.Request class. HTTP POST operations are now properly supported.

Version 1.2.21 2/3/2011

  • Critical bug fix in the javaxt.io.Directory class. The getSubDirectories() method was failing with a null pointer exception after the 1.2.18 update.
  • Added new method to the javaxt.utils.URL class to replace the entire URL querystring.
  • Removed unused method in the javaxt.xml.DOM class (replaceIllegalChars).
  • Removed deprecated HTTP class from the javaxt.io package. Please use the Request and Response objects found in the javaxt.http package instead.

Version 1.2.20 1/27/2011

  • Fixed bug in the javaxt.io.Directory class. The getChildren() method was incorrectly parsing directories on Windows with SYMLINKS.
  • Fixed bug in the javaxt.io.Jar class. The constructor was incorrectly parsing jar paths found on Windows UNC directories.

Version 1.2.191/20/2011

  • Critical bug fix in the javaxt.io.Directory class. Failed to list files on root drives in Windows after the 1.2.18 update.

Version 1.2.18 1/15/2011

  • Found major performance issues in the core SUN JDK serializing files on a windows box across a network. Updated the javaxt.io.Directory class to compensate. Improved performance 5x on windows file systems.
  • Added new constructor to the javaxt.io.Image class to allow users to create an image from a String.

Version 1.2.17 12/18/2010

  • Updated the javaxt.sql.Recordset class to use prepared statements for all inserts. Previous versions used conditional logic where a resultset was used for some databases and a prepared statement was used for others.
  • Added new method to return the auto-generated key created after inserting a record in the javaxt.sql.Recordset class. See the getGeneratedKey() method for details.
  • Updated javaxt.xml.DOM class to allow users to specify a character encoding to use when creating a DOM Document from a String.

Version 1.2.16 12/2/2010

  • Updated the javaxt.io.Directory class to return a list of shared drives when the directory is windows server (e.g. "//myserver").
  • Added new static method to the javaxt.io.Directory class to return a list of root folders/directories.
  • Added new class to parse windows shortcuts (.lnk files). See javaxt.ntfs.LnkParser

Version 1.2.15 12/1/2010

  • Updated the javaxt.http.Request class to accept gzip compressed HTTP responses by default.
  • Added logic to automatically decompress gzip encoded responses in the getText(), getXML(), and getImage() methods in the javaxt.http.Response class.
  • Updated the javaxt.http.Response class to return 304 response codes when using cache control.
  • Updated the javaxt.sql.Recordset class to support inserts of geospatial data for Microsoft SQL Server.

Version 1.2.14 10/13/2010

  • Updated java.io.Shell class to accept raw command strings.
  • Expanded parser logic in the javaxt.sql.Value class to better handle booleans.
  • Fixed bug in the JDBC connection string parser.

Version 1.2.13 8/18/2010

  • Updated HTTP Request and Response classes to support HTTP redirects.
  • Fixed memory leak in the java.io.Shell class.

Version 1.2.12 7/15/2010

  • Added setFetchSize() to the javaxt.sql.Recordset class to limit the number of records fetched from the database at one time. This addition was necessary help circumvent a PostgreSQL out of memory exception when fetching a large recordset from the database.

Version 1.2.11 7/13/2010

  • Added new methods to the javaxt.utils.URL class to set and remove parameters in the query string.
  • Exposed the constructor in the javaxt.utils.Value class (flipped from protected to public).

Version 1.2.10 6/12/2010

  • Fixed bug in the directory crawler used in the javaxt.io.Directory class.
    Input java.io.FileFilter now applied to both directories and files (see getChildren() method).
  • Completely revamped the javaxt.utils.URL class to better support non-http URL/URI (e.g. JDBC Connection Strings).

Version 1.2.9 4/17/2010

  • Added new open() method to the javaxt.sql.Connection class to accept a java.sql.Connection.
  • Added new constructor to the javaxt.sql.Database class to accept a java.sql.Connection.

Version 1.2.8 4/14/2010

  • Refactored copy methods in the javaxt.io.File class to use non-blocking IO (NIO).
  • Added new method to the javaxt.io.File class to set the buffer size (see setBufferSize method).
  • Added new method to the javaxt.http.Request class to return the URL used to instantiate the class (see getURL method).

Version 1.2.7 3/23/2010

  • Added new method to the javaxt.io.File class to return a BufferedWriter (see getBufferedWriter method).
  • Added 2 new date formats to the javaxt.utils.Date class.
  • Updated the javaxt.sql.Recordset class to support date fields without a timestamp.

Version 1.2.61/27/2010

  • Updated execute() method in the javaxt.sql.Connection class to return a boolean instead of a void.
  • Fixed bug in the addImage() and setOpacity() methods in the javaxt.io.Image class to set the correct image type.

Version 1.2.5 12/30/2009

  • Updated isOpen() and isClosed() methods in the javaxt.sql.Connection class.
  • Updated documentation in the javaxt.sql package.

Version 1.2.4 12/28/2009

  • Updated logic for terminating threads in the Directory Search (bug fix)
  • Fixed hang in the getChildren() method in the javaxt.io.Directory class (bug fix)

Version 1.2.3 12/19/2009

  • Changed the way Objects are converted to Integers, Longs, and Doubles in the javaxt.sql.Value class (bug fix)
  • Deprecated the javaxt.io.Http class. Use the classes in the javaxt.http package instead.
  • Deprecated the getFile() methods in the File and Directory classes. Please use the toFile() method instead.

Version 1.2.2 12/10/2009

  • Updated the isExecutable() method in the javaxt.io.File class and the isOpen() method in the javaxt.sql.Recordset so the library will compile with JDK 1.5. Read more...

Version 1.2.1 12/9/2009

  • Fixed null pointer exception in the Directory Search.
  • Updated logic for terminating threads in the Directory Search.
  • Fixed bug in the getChildren() method (wasn't filtering files on non-recursive searches).

Version 1.2 12/5/2009

  • Updated the Directory Search so that recursive searches are now thread safe
  • Added new getChildren() method to allow users to process files/directories as soon as they are found.
  • Fixed a bug in the getBytes() method in the File class. The file input stream wasn't being closed.

Version 1.1 11/16/2009

  • Changed the return type on the File rename() and moveTo() methods. Instead of returning booleans, the methods return a handle to the new file.
  • Updated documentation.

Version 1.0 6/14/2009

  • Initial public release.